web-dev-qa-db-ja.com

dblinkなしでリモートデータベースをクエリできるのはなぜですか?

セキュリティの懸念を調査しているときに、ユーザーがdblinkを必要とせずにリモートデータベースにクエリを実行できることがわかりました。

ただし、これはDB_DOMAINの値を持たないデータベースにのみ当てはまります。 localデータベースのDB_DOMAINが "foo.com"で修飾されている場合、ユーザーはnotでクエリremote DBを実行する必要がありますdblink。

これが発生する理由を説明するドキュメントが見つからず、非常に新しいDBAです。これを可能にするのはOracleの何ですか?これを防止して、すべてのデータベースのDB_DOMAINを「foo.com」で修飾する唯一の方法はありますか?

以下のdblinkなしでリモートDBから情報にアクセスする例:

DBから:FooB

SQL*Plus: Release 10.2.0.5.0 - Production on Thu Feb 26 16:05:21 2015

Copyright (c) 1982, 2010, Oracle.  All Rights Reserved.


Connected to:
Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options

SQL> show parameter db_domain;

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
db_domain                            string

From DB:FooA

SQL*Plus: Release 10.2.0.5.0 - Production on Thu Feb 26 16:08:25 2015

Copyright (c) 1982, 2010, Oracle.  All Rights Reserved.


Connected to:
Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options

SQL> show parameter db_domain;

NAME                                 TYPE        VALUE
------------------------------------ ----------- -----------------------------
db_domain                            string
SQL> select sysdate from dual@FooB;

SYSDATE
---------
26-FEB-15


SQL> select db_link from all_db_links;

no rows selected
1
exit_1

ここで説明した内容は、まったく正常で意図されたものです。この機能はglobalデータベースリンクと呼ばれます。

http://docs.Oracle.com/cd/E24693_01/server.11203/e17120/ds_concepts002.htm#i1007888

これは、たとえばOracle Internet Directoryを使用している場合の「副作用」です。これは、多くのデータベースを所有しているいくつかの企業で見られました。

より詳細な説明はサポートノートにあります:グローバルデータベースリンクとは何ですか?どのように無効にしますか? (ドキュメントID 1632329.1)

データベースリンクを使用して分散接続を作成できますが、使用するデータベースリンクを作成していません。

データベースリンクオブジェクト自体は存在しませんが、何らかの理由で接続が機能するため、ORA-2019が必要です。これはどのようにして可能ですか?

これは、GLOBAL DATABASE LINKSと呼ばれるデフォルト機能が原因です。この機能はLDAPの使用によるものです。

グローバルデータベースリンクは、Oracle Names Serverが使用されていたときに、以前のバージョンのOracleで導入されました。 Oracle Names Serverに格納され、Oracle Names Serverにアクセスしたユーザーがアクセスするデータベースリンクを作成できます。 Oracle Namesが非推奨になった後、この機能は代わりのLDAPネーミングに移動しました。

データベースリンクが呼び出されると、データベースリンク名がPRIVATEリンク、次にPUBLICリンク、次にGLOBALリンクに対してチェックされます。 データベースリンク名がLDAPサーバーにリストされているエントリと一致する場合、実際のデータベースリンクオブジェクトは必要ありません。 DBLINKは現在のユーザーを使用して接続するため、ユーザーが両方のインスタンスにアクセスでき、両方で同じユーザーIDと同じパスワードを持っている場合にのみ機能します。

これは、LDAP命名が使用されている場合のデフォルトの動作です。

現在、この機能を無効にする唯一の方法は、LDAP命名の使用を停止することです。

2
Balazs Papp

Balaszも解決策を提供していることがわかりました。私の解決策は、データベースの名前がFooBである場合に機能しますが、ここではそうではないことがわかりました。だからバラスは正しいでしょう。しかし、これが機能することは広く知られていないようですので、この投稿は残します。


管理者ガイド 1分散データベースの概念

ループバックデータベースリンクとしてのグローバル名データベースリンクを明示的に作成しなくても、データベースのグローバル名をループバックデータベースリンクとして使用できます。 SQLステートメントのデータベースリンクが現在のデータベースのグローバル名と一致する場合、データベースリンクは事実上無視されます。

たとえば、データベースのグローバル名がdb1.example.comであるとします。このデータベースで次のSQLステートメントを実行できます。

SELECT * FROM [email protected];

この場合、SQLステートメントの@db1.example.com部分は事実上無視されます。


ディレクトリサービスが使用されている場合(LDAPサーバー) グローバルデータベースリンク は、データベース外のネットワーク全体で定義できます。

グローバルデータベースリンクを所有しているユーザーはいません。グローバルデータベースリンクはディレクトリサービスに存在します。

1
miracle173