9 SQL*Plusのセキュリティ
この章では、データベース表およびSQL*Plusコマンドへのアクセスの制御に使用可能な方法について説明します。次のトピックについて説明します。
9.1 SQL*Plus、SQLおよびPL/SQLコマンドの使用禁止
ノート:
Oracle Database 19c以降、SQL*Plus表PRODUCT_USER_PROFILE (PUP表)はサポート対象外です。Oracle Databaseの設定を使用してデータを保護し、すべてのクライアント・アプリケーション間で一貫したセキュリティを確保することをお薦めします。
特定のユーザーに対して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
-
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操作も禁止になります。
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でのコマンドの使用禁止について
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文字列としてスクリプトの最初の行を使用します。
ユーザー名およびパスワードは、ファイルまたはスクリプトに格納しないようにします。ユーザー名およびパスワードをファイルまたはスクリプトに格納する場合は、そのファイルまたはスクリプトが不正なアクセスから保護されていることを確認してください。