web-dev-qa-db-ja.com

データベースログオントリガー

Oracleデータベースで特定のユーザーとIPの組み合わせをブロックするために、次のトリガーを作成し、エラーなしでコンパイルしました。

Create or replace trigger you_may_not_login
after logon on database
begin
if sys_context('USERENV','SESSION_USER')='xx' AND     sys_context('USERENV','IP_ADDRESS')='10.0.30.219' then
raise_application_error(-20001,'Denied!  You are not allowed to logon the database');
end if;
end;
/

「xx」ユーザーを使用してログインすると、アラートログに次のエラーが表示されますが、データベースにアクセスISが付与されているため、トリガーはユーザーのログインをブロックできません。

Errors in file /oraarch/core/udump/wfsbi_ora_9338.trc:
ORA-00604: error occurred at recursive SQL level 1
ORA-20001: Sorry, you are not allowed here!
ORA-06512: at line 9

どこがいけないのですか?

5
user996853

SQLPlusでこれを確認することができます。それでも接続が解除されない場合は、トリガーの完了後に次のコマンドを実行して、想定を確認します。

SELECT 'Check This' FROM dual WHERE sys_context('USERENV','SESSION_USER') = 'xx';

SELECT 'Check This' FROM dual WHERE sys_context('USERENV','IP_ADDRESS') <> '10.0.30.219';

SELECT 'Check This' FROM user_role_privs WHERE granted_role='DBA';

SELECT 'Check This' FROM user_objects WHERE Object_Name='YOU_MAY_NOT_LOGIN' AND Object_Type='TRIGGER';

SELECT 'Check This' FROM User_sys_Privs WHERE Privilege='ADMINISTER DATABASE TRIGGER';

これらのいずれかがCheck Thisを返す場合、想定の1つが正しくありません。

私にとって切断する必要があるのはRAISE_APPLICATION_ERRORだけでしたが、 別のサイトEXECUTE IMMEDIATE 'DISCONNECT';も使用します。おそらくこれにより、DBAロールが付与されている場合でも機能します。私はそれを知るためにテストしていません。

また、クライアントが送信するIP_ADDRESSが変更される可能性があるため、これを安全なパスワードやその他の手段の代わりにセキュリティに使用しないでください。

3
Leigh Riffel

この答え からServerFaultの同様の質問へ:

トリガーは、アクセスを拒否しません

  • DBAグループのメンバーは、ON LOGONトリガーで切断することはできません。
  • トリガーの所有者は、ログインしているユーザーです。
  • ユーザーには、データベーストリガーの管理権限があります。