この章では、データベース表およびSQL*Plusコマンドへのアクセスの制御に使用可能な方法について説明します。 ここでは、次の項目について説明します。
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表を作成するには、拡張子がSQLのPUPBLDという名前のスクリプトを、SYSTEMで実行します。 ファイル拡張子の正確な形式およびファイルの位置は、システムによって異なります。 詳細は、DBAに問い合せてください。
注意: 表の作成に誤りがある場合は、権限が付与されたユーザー以外のすべてのユーザーがOracle Databaseに接続するときに、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列 | 説明 |
---|---|
PRODUCT | 製品名(この場合はSQL*Plus)が含まれている必要があります。 この列には、ワイルド・カードまたはNULLは入力できません。 |
USERID | コマンドを使用禁止にする対象ユーザーのユーザー名(大文字)が含まれている必要があります。 複数のユーザーのコマンドを使用禁止にするには、SQLワイルド・カード(%)を使用するか、または複数のエントリを入力します。 したがって、次のエントリはすべて有効です。
|
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値が格納されることがあります。 |
ユーザー名SYSTEMのDBAは、PUP表を所有し、それに関するすべての権限を持っています。 他のOracle Databaseのユーザー名では、この表に対してはSELECT権限のみを持つようになります。このアクセス権限を使用すると、ユーザー名に設定された制限およびPUBLICに設定された制限を表示できます。 スクリプトPUPBLD.SQLを実行すると、PUP表に対するSELECT権限がPUBLICに付与されます。
特定のユーザーに対して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 | 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 |
注意:
|
次のコマンドを使用して、SYSTEMとしてログインします。
SQLPLUS SYSTEM
次のコマンドを使用して、PUP表に行を挿入します。
INSERT INTO PRODUCT_USER_PROFILE VALUES ('SQL*Plus', 'HR', 'SELECT', NULL, NULL, 'DISABLED', NULL, NULL);
次のようにHRで接続して、SELECTを実行します。
CONNECT HR SELECT * FROM EMP_DETAILS_VIEW;
このコマンドによって、次のエラー・メッセージが表示されます。
SP2-0544: Command SELECT disabled in Product User Profile |
この行を削除し、ユーザーHRから制限を削除するには、SYSTEMで再接続し、次のように入力します。
DELETE FROM PRODUCT_USER_PROFILE WHERE USERID = 'HR';
SQLコマンドを使用して、データベース表に対するセキュリティを確保するために、ロールへのアクセスを作成および制御できます。 ロールを作成し、そのロールにアクセスするユーザーを制御することによって、特定のデータベース権限に特定のユーザーのみがアクセスできるようにします。
ロールは、SQLのCREATE、GRANTおよびSETコマンドで作成され、使用されます。
ロールを作成するには、CREATEコマンドを使用します。 パスワードなしのロールでもパスワード付きのロールでも作成できます。
ロールにアクセス権限を付与するには、GRANTコマンドを使用します。 この方法で、ロールに関連する権限にアクセスするユーザーを制御します。
ロールにアクセスするには、SET ROLEコマンドを使用します。 パスワード付きのロールを作成した場合、ユーザーがそのロールにアクセスするには、そのパスワードを知っている必要があります。
ロールの詳細は、『Oracle Database SQL言語リファレンス』、『Oracle Database管理者ガイド』および『Oracle Database概要』を参照してください。
ユーザーは、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の使用禁止」を参照してください。
PUP表と同様に、RESTRICTオプションで、オペレーティング・システムと対話する特定のコマンドを使用禁止にすることができます。 ただし、-RESTRICTオプションで使用禁止にされたコマンドは、サーバーと接続していないときにも使用できず、SQL*Plusを終了するまで使用禁止のままです。
次の表に、各制限レベルでの使用禁止コマンドを示します。
コマンド | レベル1 | レベル2 | レベル3 |
---|---|---|---|
EDIT | 使用禁止 | 使用禁止 | 使用禁止 |
GET | 使用禁止 | ||
HOST | 使用禁止 | 使用禁止 | 使用禁止 |
SAVE | 使用禁止 | 使用禁止 | |
SPOOL | 使用禁止 | 使用禁止 | |
START | 使用禁止 | ||
STORE | 使用禁止 | 使用禁止 |
注意:
|
RESTRICTオプションの詳細は、SQLPLUSの「RESTRICTオプション」を参照してください。
オペレーティング・システムによっては、実行中のプログラムをすべてのユーザーが参照することができます。 コマンドライン引数も示される場合は、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文字列としてスクリプトの最初の行を使用します。
ユーザー名およびパスワードは、ファイルまたはスクリプトに格納しないようにします。 ユーザー名およびパスワードをファイルまたはスクリプトに格納する場合は、そのファイルまたはスクリプトが不正なアクセスから保護されていることを確認してください。