対応バージョン

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での権限およびロール付与の概要