対応バージョン
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とします。
$ 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のリモートログインの制御
上記までの設定内容では、リモートからの接続は出来ません。
以下の設定により、リモート接続を可能にします。
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)
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/E57425_01/121/ADMQS/GUID-36B21D72-1BBB-46C9-A0C9-F0D2A8591B8D.htm
Oracle Database 2日でデータベース管理者
12cリリース1 (12.1)
B71307-08
7.2.2 CDBでの権限およびロール付与の概要
