セキュリティの懸念を調査しているときに、ユーザーが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
ここで説明した内容は、まったく正常で意図されたものです。この機能は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命名の使用を停止することです。
Balaszも解決策を提供していることがわかりました。私の解決策は、データベースの名前がFooBである場合に機能しますが、ここではそうではないことがわかりました。だからバラスは正しいでしょう。しかし、これが機能することは広く知られていないようですので、この投稿は残します。
管理者ガイド 1分散データベースの概念 、
ループバックデータベースリンクとしてのグローバル名データベースリンクを明示的に作成しなくても、データベースのグローバル名をループバックデータベースリンクとして使用できます。 SQLステートメントのデータベースリンクが現在のデータベースのグローバル名と一致する場合、データベースリンクは事実上無視されます。
たとえば、データベースのグローバル名が
db1.example.com
であるとします。このデータベースで次のSQLステートメントを実行できます。SELECT * FROM [email protected];
この場合、SQLステートメントの
@db1.example.com
部分は事実上無視されます。
ディレクトリサービスが使用されている場合(LDAPサーバー) グローバルデータベースリンク は、データベース外のネットワーク全体で定義できます。
グローバルデータベースリンクを所有しているユーザーはいません。グローバルデータベースリンクはディレクトリサービスに存在します。