9 SQL*Plusのセキュリティ

この章では、データベース表およびSQL*Plusコマンドへのアクセスの制御に使用可能な方法について説明します。次のトピックについて説明します。

9.1 SQL*Plus、SQLおよびPL/SQLコマンドの使用禁止

特定のユーザーに対してSQLまたはSQL*Plusコマンドを使用禁止にするには、Userid列にユーザーのユーザー名、Attribute列にコマンド名およびChar_Value列にDISABLEDを入力した行を挿入します。Scope、Numeric_ValueおよびDate_Value列にはNULLを入力します。次に例を示します。

PRODUCT    USERID  ATTRIBUTE  SCOPE   NUMBERIC    CHAR       DATE    LONG
                                      VALUE       VALUE      VALUE   VALUE
-------    ------  ---------  -----   --------    ------     -----   -----
SQL*Plus   HR      HOST                           DISABLED
SQL*Plus   %       INSERT                         DISABLED
SQL*Plus   %       UPDATE                         DISABLED
SQL*Plus   %       DELETE                         DISABLED

コマンドを再度使用可能にするには、制限を含む行を削除します。

使用禁止にできるSQL*Plusコマンド:

  • ACCEPT

  • DEFINE

  • PASSWORD

  • SHUTDOWN

  • APPEND

  • DEL

  • PAUSE

  • SPOOL

  • ARCHIVE LOG

  • DESCRIBE

  • PRINT

  • START (@, @@)

  • ATTRIBUTE

  • DISCONNECT

  • PROMPT

  • STARTUP

  • BREAK

  • EDIT

  • RECOVER

  • STORE

  • BTITLE

  • EXECUTE

  • REMARK

  • TIMING

  • CHANGE

  • EXIT/QUIT

  • REPFOOTER

  • TTITLE

  • CLEAR

  • GET

  • REPHEADER

  • UNDEFINE

  • COLUMN

  • HELP (?)

  • RUN

  • VARIABLE

  • COMPUTE

  • HOST

  • SAVE

  • WHENEVER OSERROR

  • CONNECT

  • INPUT

  • SET

  • WHENEVER SQLERROR

  • COPY

  • LIST (;)

  • SHOW

  • XQUERY

使用禁止にできるSQLコマンド:

  • ALTER

  • ANALYZE

  • ASSOCIATE

  • AUDIT

  • CALL

  • COMMENT

  • COMMIT

  • CREATE

  • DELETE

  • DISASSOCIATE

  • DROP

  • EXPLAIN

  • FLASHBACK

  • GRANT

  • INSERT

  • LOCK

  • MERGE

  • NOAUDIT

  • PURGE

  • RENAME

  • REVOKE

  • ROLLBACK

  • SAVEPOINT

  • SELECT

  • SET CONSTRAINTS

  • SET ROLE

  • SET TRANSACTION

  • TRUNCATE

  • UPDATE

  • VALIDATE

次に、使用禁止にできるPL/SQLコマンドを示します。

  • BEGIN

  • DECLARE

ノート:

  • HOSTを使用禁止にすると、ご使用のオペレーティング・システムのHOSTの別名(Windows環境では$、UNIX環境では!など)も使用禁止になります。

  • LISTを使用禁止にすると、;および番号(スクリプト内の行に移動するために入力した番号)も使用禁止になります。

  • コマンドライン・ヘルプへのアクセスを禁止するには、HELPおよび?を別々に使用禁止にする必要があります。

  • SQL*PlusのSETコマンドを使用禁止にすると、SQLのSET CONSTRAINTS、SET ROLEおよびSET TRANSACTIONコマンドも使用禁止になります。

  • SQL*PlusのSTARTを使用禁止にすると、@および@@も使用禁止になります。

  • BEGINおよびDECLAREコマンドを使用禁止にしても、PL/SQLを実行するSQL*PlusのEXECUTEコマンドは使用可能です。EXECUTEを使用禁止にする場合は、別々に行ってください。

  • EXIT/QUITを使用禁止にすることはお薦めしません。使用禁止にする場合は、EOF文字(UNIXの場合は[Ctrl]+[D]、Windowsの場合は[Ctrl]+[Z]など)を送信してコマンドライン・セッションを終了してください。または、SQL*Plusの処理を終了してセッションを終了してください。また、使用禁止にすると、WHENEVER OSERRORおよびWHENEVER SQLERRORでのEXIT操作も禁止になります。

  1. 次のコマンドを使用して、SYSTEMとしてログインします。
    SQLPLUS SYSTEM
  2. 次のコマンドを使用して、PUP表に行を挿入します。
    INSERT INTO PRODUCT_USER_PROFILE
    VALUES ('SQL*Plus', 'HR', 'SELECT', NULL, NULL, 'DISABLED', NULL, NULL);
  3. 次のようにHRで接続して、SELECTを実行します。
    CONNECT HR 
    SELECT * FROM EMP_DETAILS_VIEW; 

    このコマンドによって、次のエラー・メッセージが表示されます。

    SP2-0544: Command SELECT disabled in Product User Profile
  4. この行を削除し、ユーザーHRから制限を削除するには、SYSTEMで再接続し、次のように入力します。
    DELETE FROM PRODUCT_USER_PROFILE WHERE USERID = 'HR'; 

9.2 ロールの作成および制御について

SQLコマンドを使用して、データベース表に対するセキュリティを確保するために、ロールへのアクセスを作成および制御できます。ロールを作成し、そのロールにアクセスするユーザーを制御することによって、特定のデータベース権限に特定のユーザーのみがアクセスできるようにします。

ロールは、SQLのCREATE、GRANTおよびSETコマンドで作成され、使用されます。

  • ロールを作成するには、CREATEコマンドを使用します。パスワードなしのロールでもパスワード付きのロールでも作成できます。

  • ロールにアクセス権限を付与するには、GRANTコマンドを使用します。この方法で、ロールに関連する権限にアクセスするユーザーを制御します。

  • ロールにアクセスするには、SET ROLEコマンドを使用します。パスワード付きのロールを作成した場合、ユーザーがそのロールにアクセスするには、そのパスワードを知っている必要があります。

9.2.1 SET ROLEの使用禁止について

ユーザーは、SQL*Plusから任意のSQLコマンドを送ることができます。特定の状況下では、これはセキュリティ上の問題の原因になります。適切な予防手段を取っておかないと、ユーザーがSET ROLEを使用して、アプリケーション・ロールで取得した権限にアクセスするおそれがあります。これらの権限を使用して、ユーザーがSQL*PlusからSQL文を発行し、その結果データベース表が誤って変更されてしまう可能性があります。

アプリケーション・ユーザーによるSQL*Plus内のアプリケーション・ロールへのアクセスを防止するには、PUP表を使用して、SET ROLEコマンドを使用禁止にします。BEGINおよびSQL*PlusのEXECUTEコマンドも使用禁止にして、アプリケーション・ユーザーがPL/SQLブロックを使用してアプリケーション・ロールを設定できないようにする必要があります。これによって、SQL*Plusユーザーは、SQL*Plusの起動時に使用可能なロールに関連した権限のみを使用できるようになります。ユーザー・ロールの作成および使用方法の詳細は、『Oracle Database SQL言語リファレンス』および『Oracle Database管理者ガイド』を参照してください。

9.2.2 ユーザー・ロールの使用禁止について

特定のユーザーに対して特定のロールを使用禁止にするには、Userid列にユーザーのユーザー名、Attribute列にROLESおよびChar_Value列にロール名を入れた行をPUP表に挿入します。

ノート:

Userid列にPUBLICまたは%を入力する場合は、すべてのユーザーに対してロールを使用禁止にします。PUBLICに付与されるロールに対して%またはPUBLICのみを使用するようにします。ユーザーに付与されていないロールを使用禁止にしようとする場合、そのユーザーのロールはすべて使用禁止にされません。

Scope、Numeric_ValueおよびDate_Value列にはNULLを入力します。次に例を示します。

PRODUCT    USERID  ATTRIBUTE  SCOPE   NUMERIC     CHAR      DATE     LONG
                                      VALUE       VALUE     VALUE    VALUE
-------    ------  ---------  -----   --------    ------    -----    -----
SQL*Plus   HR      ROLES                          ROLE1
SQL*Plus   PUBLIC  ROLES                          ROLE2

ログイン時には、前述の表の行は次のコマンドに変換されます。

SET ROLE ALL EXCEPT ROLE1, ROLE2

ユーザーがログイン後にSET ROLEコマンドを使用してロールを変更できないようにするには、SET ROLEコマンドを使用禁止にします。

ロールを再度使用可能にするには、制限を含む行を削除します。

詳細は、SET ROLEの使用禁止についてを参照してください。

9.3 SQLPLUS -RESTRICTでのコマンドの使用禁止について

PUP表と同様に、RESTRICTオプションで、オペレーティング・システムと対話する特定のコマンドを使用禁止にすることができます。ただし、-RESTRICTオプションで使用禁止にされたコマンドは、サーバーと接続していないときにも使用できず、SQL*Plusを終了するまで使用禁止のままです。

次の表に、各制限レベルでの使用禁止コマンドを示します。

コマンド レベル1 レベル2 レベル3

EDIT

使用禁止

使用禁止

使用禁止

GET

使用禁止

HOST

使用禁止

使用禁止

使用禁止

SAVE

使用禁止

使用禁止

SPOOL

使用禁止

使用禁止

START

使用禁止

STORE

使用禁止

使用禁止

ノート:

  • HOSTを使用禁止にすると、ご使用のオペレーティング・システムのHOSTの別名(Windows環境では$、UNIX環境では!など)も使用禁止になります。

  • SQL*PlusのSTARTコマンドを使用禁止にすると、SQL*Plusの@および@@コマンドも使用禁止になります。

RESTRICTオプションの詳細は、SQLPLUSの「RESTRICTオプション」を参照してください。

9.4 プログラム引数のセキュリティについて

オペレーティング・システムによっては、実行中のプログラムをすべてのユーザーが参照することができます。コマンドライン引数も示される場合は、SQL*Plusユーザーのユーザー名およびパスワードも表示できます。

たとえば、ほとんどのUNIXまたはLinuxシステムでは、psコマンドはプログラム引数を示します。パスワードが表示されないようにするかどうかは、SQL*Plusの使用方法によって異なります。

  • SQL*Plusを対話形式で実行する場合は、常に、SQL*Plusに接続情報(特にパスワード)の入力を求めるプロンプトが表示されるまで待機します。

  • UNIXのシェル・スクリプトからSQLスクリプトのバッチを実行する場合は、環境変数MYUSERNAMEおよびMYPASSWORDに適切な値を設定します。次の文字列を含むシェル・スクリプトを実行します。

    sqlplus /nolog <<EOF
    connect $MYUSERNAME/$MYPASSWORD
    select ...
    EOF
  • バッチのSQLスクリプトを実行する場合は、ユーザー名とパスワードをSQLスクリプトの最初の行としてハード・コードします。その後、次のコマンドでスクリプトをコールします。

    sqlplus @myscript.sql

このようにSQL*Plusを起動した場合、SQL*Plusはusername/password@connection_identifier文字列としてスクリプトの最初の行を使用します。

ユーザー名およびパスワードは、ファイルまたはスクリプトに格納しないようにします。ユーザー名およびパスワードをファイルまたはスクリプトに格納する場合は、そのファイルまたはスクリプトが不正なアクセスから保護されていることを確認してください。