[Oracle] 11gでUTL_INADDRパッケージを使用するとORA-24247が発生 | Archive Redo Blog

Archive Redo Blog

DBエンジニアのあれこれ備忘録

Oracle サーバーの IP アドレスを取得するため、以下のような SQL を実行すると、

SELECT UTL_INADDR.GET_HOST_ADDRESS('server1') FROM DUAL;

10g では正常に IP アドレスが取得できますが、11g では以下のようなエラーが発生するようになりました。

ORA-24247: アクセス制御リスト(ACL)によりネットワーク・アクセスが拒否されました
ORA-06512: "SYS.UTL_INADDR", 行19
ORA-06512: "SYS.UTL_INADDR", 行40
ORA-06512: 行1

これは 11g から UTL_TCP、UTL_SMTP、UTL_MAIL、UTL_HTTP、UTL_INADDR といったパッケージを使用する際にファイングレイン・アクセス制御が効くようになったためだで、10g 以前のバージョンと同じようにエラーなく動作させるには、アクセス制御リスト(ACL)を構成しなければなりません。


ACL は DBMS_NETWORK_ACL_ADMIN パッケージを使用して対象ホストごとに構成します。

現在構成されている ACL を確認するには DBA_NETWORK_ACLS データ・ディクショナリ・ビューを検索します。

SELECT * FROM DBA_NETWORK_ACLS;

また、現在構成されている ACL で定義されている権限を確認するには DBA_NETWORK_ACL_PRIVILEGES データ・ディクショナリ・ビューを検索します。

SELECT * FROM DBA_NETWORK_ACL_PRIVILEGES;


対象ホストに対する ACL が存在しない場合は CREATE_ACL プロシージャを実行して ACL を追加し、ACL が存在する場合は ADD_PRIVILEGE プロシージャを実行して権限を追加し、最後に ASSIGN_ACL プロシージャを実行して ACL を対象ホストに割り当てます。

例えば、SCOTT ユーザーに対して connect 権限と resolve 権限を付与した ACL を新規に作成し、server1 に対して割り当てる場合、以下のような流れになります。

BEGIN
    DBMS_NETWORK_ACL_ADMIN.CREATE_ACL('ACL_server1.xml','ACL for server1', 'SCOTT', TRUE, 'connect');
    DBMS_NETWORK_ACL_ADMIN.ADD_PRIVILEGE('ACL_server1.xml','SCOTT', TRUE, 'resolve');
    DBMS_NETWORK_ACL_ADMIN.ASSIGN_ACL('ACL_server1.xml','server1');
END;
/

このようにして ACL を構成することによって、上記のエラーは解消します。

対象ホスト、ユーザーごとにこのような設定を行わなければならないのはかなり面倒ですが、セキュリティを考慮するとこれくらい敷居が高いほうがいいのかもしれませんね。