PDBごとに共通ユーザーの接続を制御する(CREATE SESSION)
対応バージョン
Oracle Database 12.1.0
2016-07-04記事公開
12cより導入されたCDB(コンテナ・データベース)では、共通ユーザーという各PDB(プラガブル・データベース)で同じ名前のユーザー(スキーマ)を管理できる概念があります。ここでは共通ユーザーを使用した場合にPDBログイン時のセキュリティについて記載します。
共通ユーザーとは
まずは共通ユーザーのPDB接続時のセキュリティを説明するにあたり、以下について知る必要があります。
- ・ユーザーが作成する全ての共通ユーザーには接頭辞"C##"(又は"c##")が付与されている。(Oracleが内部で作成するものはこの限りではありません)
- ・共通ユーザーの作成は、ルート・コンテナ(CDB$ROOT)のみで作成できる。
- ・共通ユーザーは各PDBで作成できず、C##を頭に指定してCREATE USER を実行した場合エラーとなる。(ORA-65094: invalid local user or role name)
- ・共通ユーザーのパスワードはルート・コンテナと各PDBで同じものを使用する。
PDBごとの共通ユーザー接続制御
各PDBのコンテナ変更の制御
一度CDBにログインした後に、alter session set container=
PDB名はPDBORCL、テストするユーザはC##SHAREDUSERとします。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 |
$ sqlplus / as sysdba SQL> show con_name CON_NAME ------------------------------ CDB$ROOT SQL> create user C##SHAREDUSER identified by C##SHAREDUSER; User created. SQL> grant create session to C##SHAREDUSER; Grant succeeded. SQL> -------------------------------------------------------------- SQL> -- 初期状態ではコンテナの変更が出来ないことを確認 SQL> conn C##SHAREDUSER/C##SHAREDUSER SQL> alter session set container=PDBORCL; ERROR: ORA-01031: insufficient privileges SQL> -------------------------------------------------------------- SQL> -- 権限の付与 SQL> conn / as sysdba SQL> alter session set container=PDBORCL; Session altered. SQL> show con_name CON_NAME ------------------------------ PDBORCL SQL> -- grant の container 句は ALL か CURRENT のみ指定可能です。 CDB$ROOT から直接権限付与できません。 SQL> grant SET CONTAINER to C##SHAREDUSER container=CURRENT; Grant succeeded. SQL> -------------------------------------------------------------- SQL> -- コンテナの変更が出来ることを確認 SQL> -- CDB$ROOT の C##SHAREDUSER に接続しなおします。 SQL> conn C##SHAREDUSER/C##SHAREDUSER Connected. SQL> alter session set container=PDBORCL; Session altered. SQL> -- セッションの変更に成功しました。 |
上記の内容で、セッションの変更によるローカルからのログインが出来るようになりました。
各PDBのリモートログインの制御
上記までの設定内容では、リモートからの接続は出来ません。
以下の設定により、リモート接続を可能にします。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
SQL> conn / as sysdba SQL> show con_name CON_NAME ------------------------------ CDB$ROOT SQL> -- リモートからログインする場合は CREATE SESSION も必要になります。 SQL> -- 逆に言えば CREATE SESSION を付与しなければリモートからのログインを制限できます。 SQL> conn C##SHAREDUSER/C##SHAREDUSER@PDBORCL ERROR: ORA-01045: user C##SHAREDUSER lacks CREATE SESSION privilege; logon denied Warning: You are no longer connected to ORACLE. SQL> conn / as sysdba SQL> alter session set container=PDBORCL; SQL> show con_name CON_NAME ------------------------------ PDBORCL SQL> -- PDB に CREATE SESSION を付与することで、リモート接続可能となる。 SQL> grant CREATE SESSION to C##SHAREDUSER; SQL> conn C##SHAREDUSER/C##SHAREDUSER@PDBORCL Connected. SQL> show con_name CON_NAME ------------------------------ PDBORCL SQL> show user USER is "C##SHAREDUSER" |
全PDBに対して実施したい場合
全てのPDBに対して共通ユーザを利用可能としたい場合、ルート・コンテナ(CDB$ROOT)にてgrant時にcontainer=ALLを指定することで、全てのPDBへ権限を付与することが出来ます。
各PDBで実行すると、エラーとなります。(ORA-65050: Common DDLs only allowed in CDB$ROOT)
1 2 3 4 5 6 7 8 |
SQL> conn / as sysdba SQL> grant CREATE SESSION to C##SHAREDUSER container=ALL; Grant succeeded. SQL> grant SET CONTAINER to C##SHAREDUSER container=ALL; Grant succeeded. |
参考資料
https://docs.oracle.com/cd/E49329_01/server.121/b71299/cdblogic.htm#CIHFIAAA
Oracle Database概要
12cリリース1 (12.1)
B71299-02
CDBでの権限およびロール付与の概要
関連記事
関連記事が存在しません