ヘッダーをスキップ
SQL*Plus®ユーザーズ・ガイドおよびリファレンス
リリース11.2
B56314-03
  目次へ移動
目次
索引へ移動
索引

前
 
次
 

9 SQL*Plusのセキュリティ

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

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、またはSYSDBAまたはSYSOPER権限で認証されたユーザーが接続またはログインする場合、SQL*PlusではPUP表は読み込まれません。そのため、これらのユーザーに制限は適用されません。

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

PUP表の作成

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


注意:

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

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

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値が格納されることがあります。

PUP表の管理

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

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 DELETE MERGE SET CONSTRAINTS
ANALYZE DISASSOCIATE NOAUDIT SET ROLE
ASSOCIATE DROP PURGE SET TRANSACTION
AUDIT EXPLAIN RENAME TRUNCATE
CALL FLASHBACK REVOKE UPDATE
COMMENT GRANT ROLLBACK VALIDATE
COMMIT INSERT SAVEPOINT na
CREATE LOCK SELECT na

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

使用禁止にできるPL/SQLコマンド
BEGIN DECLARE na na


注意:

  • 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操作も禁止になります。


例9-1 PUP表の制限の設定

次に、PUP表に、ユーザーHRのSELECT文の使用を制限する行を挿入する例を示します。

  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'; 
    

ロールの作成および制御

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

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

ロールの詳細は、『Oracle Database SQL言語リファレンス』『Oracle Database管理者ガイド』および『Oracle Database概要』を参照してください。

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管理者ガイド』を参照してください。

ユーザー・ロールの使用禁止

特定のユーザーに対して特定のロールを使用禁止にするには、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の使用禁止」を参照してください。

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オプション」を参照してください。

プログラム引数のセキュリティ

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

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

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

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