9 SQL*Plusのセキュリティ

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

9.1 PRODUCT_USER_PROFILE表について

SQL*Plusで、SYSTEMアカウント内の表の1つであるPRODUCT_USER_PROFILE(PUP)表を使用した製品レベルのセキュリティが提供されています。このセキュリティは、SQLのGRANTとREVOKEコマンドおよびユーザー・ロールによるユーザー・レベルのセキュリティを補います。

SQL*Plus環境では、DBAはPUP表を使用して、特定のSQLおよびSQL*Plusコマンドをユーザー単位で使用禁止にできます。Oracle DatabaseでなくSQL*Plusでこのセキュリティが実行されます。DBAは、GRANT、REVOKEおよびSET ROLEコマンドへのアクセスを制限して、ユーザーによる各自のデータベース権限の変更を制御することもできます。

SQL*Plusでは、ユーザーがSQL*Plusにログインすると、PUP表から制限が読み込まれ、セッションが終了するまでその制限が保持されます。PUP表の変更は、次に対象ユーザーがSQL*Plusにログインするときに有効になります。

SYSTEM、SYS、またはSYSBACKUP、SYSDBA、SYSDG、SYSKMまたはSYSOPER権限で認証するユーザーが接続またはログインする場合、SQL*PlusではPUP表は読み込まれません。そのため、これらのユーザーに制限は適用されません。

PUP表は、ローカル・データベースのみに適用されます。データベース・リンク経由でリモート・データベース上のオブジェクトにアクセスする場合、リモート・データベース用のPUP表は適用されません。リモート・データベースは、データベース・リンクからユーザー名およびパスワードを抽出して、ユーザー・プロファイルおよびユーザー権限を維持することはできません。

9.1.1 PUP表の作成について

PUP表を作成するには、拡張子がSQLのPUPBLDという名前のスクリプトを、SYSTEMで実行します。ファイル拡張子の正確な形式およびファイルの位置は、システムによって異なります。詳細は、DBAに問い合せてください。

注意:

表の作成に誤りがある場合は、権限が付与されたユーザー以外のすべてのユーザーがOracle Databaseに接続するときに、PUP表の情報がロードされていないというアラートが表示されます。

9.1.2 PUP表の構造

PUP表には、次の列が含まれています。

PRODUCT                 NOT NULL VARCHAR2 (30)
USERID                  VARCHAR2(30)
ATTRIBUTE               VARCHAR2(240)
SCOPE                   VARCHAR2(240)
NUMERIC_VALUE           NUMBER(15,2)
CHAR_VALUE              VARCHAR2(240)
DATE_VALUE              DATE
LONG_VALUE              LONG

9.1.3 PUP列の説明および使用方法

次に、PUP表の各列について説明します。

PUP列 説明

PRODUCT

製品名(この場合はSQL*Plus)が含まれている必要があります。この列には、ワイルド・カードまたはNULLは入力できません。

USERID

コマンドを使用禁止にする対象ユーザーのユーザー名(大文字)が含まれている必要があります。複数のユーザーのコマンドを使用禁止にするには、SQLワイルド・カード(%)を使用するか、または複数のエントリを入力します。したがって、次のエントリはすべて有効です。

  • HR

  • CLASS1

  • CLASS%(名前がCLASSで始まるすべてのユーザー)

  • % (すべてのユーザー)

ATTRIBUTE

使用禁止にするSQL、SQL*PlusまたはPL/SQLコマンドの名前(大文字)が含まれている必要があります(たとえば、RUNなど)。ロールを使用禁止にする場合、文字列ROLESが含まれている必要があります。ワイルド・カードは入力できません。使用禁止にできるSQLおよびSQL*Plusコマンドのリストについては、「PUP表の管理」を参照してください。ロールを使用禁止にする方法については、ロールの作成および制御についてを参照してください。

SCOPE

使用されません。NULLを入力してください。他の製品では、特定のファイル制限またはその他のデータがこの列に格納されることがあります。

NUMERIC_VALUE

使用されません。NULLを入力してください。他の製品では、この列に数値が格納されることがあります。

CHAR_VALUE

SQL、SQL*PlusまたはPL/SQLコマンドを使用禁止にするには、文字列DISABLEDが含まれている必要があります。ロールを使用禁止にする場合は、使用禁止にするロールの名前が含まれている必要があります。ワイルド・カードは入力できません。ロールを使用禁止にする方法については、SQLPLUS -RESTRICTでのコマンドの使用禁止についてを参照してください。

DATE_VALUE

使用されません。NULLを入力してください。他の製品では、この列にDATE値が格納されることがあります。

LONG_VALUE

使用されません。NULLを入力してください。他の製品では、この列にLONG値が格納されることがあります。

9.1.4 PUP表の管理

ユーザー名SYSTEMのDBAは、PUP表を所有し、それに関するすべての権限を持っています。他のOracle Databaseのユーザー名では、この表に対してはSELECT権限のみを持つようになります。このアクセス権限を使用すると、ユーザー名に設定された制限およびPUBLICに設定された制限を表示できます。スクリプトPUPBLD.SQLを実行すると、PUP表に対するSELECT権限がPUBLICに付与されます。

9.2 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.3 ロールの作成および制御について

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

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

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

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

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

9.3.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.3.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.4 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.5 プログラム引数のセキュリティについて

オペレーティング・システムによっては、実行中のプログラムをすべてのユーザーが参照することができます。コマンドライン引数も示される場合は、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文字列としてスクリプトの最初の行を使用します。

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

ここはACCEPT HIDEオプションのドキュメントですか?

セキュリティ要件と一致するようコンテンツを更新します