Oracle Databaseの認証をActive Directoryで行う②

[前回](https://qiita.com/western24/items/499e59821c920b81946a)は、AD認証の環境構築から実際にAD認証できるところまで紹介しました。今回は、そのユーザーに対するデータベース・ロールの付与から始めます。

## ADグループによるデータベース権限の管理
グローバル・ユーザーに直接データベース・ロールを付与するのではなく、ADのグループを使った動的なロール付与の方法を試します。ここでは、testusrにデータベースのDBAロールを付与します

Active Directoryにdbaroleグループを作成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562423/0e66c6b5-6dff-f087-4f55-642405684e9a.png)

```
#PDBに接続し、ロールをADのdbaroleグループにマッピングするように作成。そのロール自身にDBA権限を付与
SQL> create role dbarole identified globally as 'cn=dbarole,cn=users,dc=cmutest,dc=com';
SQL> grant dba to dbarole;

#ADユーザで接続し、今のtestusrが保持している権限を確認
connect "testusr@cmutest.com"@PDB
SQL> select * from session_roles;
no rows selected
```
Active Directoryのdbaroleグループにtestusrを追加
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562423/676d428c-92dc-8137-4d47-89a3653c316b.png)

ADユーザで再ログインし、testusrにDBAロールが付与されていることを確認
```
connect "testusr@cmutest.com"@PDB
SQL> select * from session_roles;
ROLE
-----------------------------------------
DBA
23 rows selected.
```

上記の通り、DatabaseのロールとActive Directoryのグループをマッピングし、ADユーザーのグループの追加/削除に応じて、動的にユーザーの権限が変更されます。予めいくつかの権限レベル分けしたロールを作成し、ADグループにマッピングしておけば、ADだけの操作でユーザーに対応する権限付与が可能です

## Databaseのグローバル・ユーザーとADユーザーのマッピング
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562423/aa240e9f-e92a-db02-c666-e8f8afc6725d.png)
今までは、Databaseのグローバル・ユーザー = Active Directoryのユーザーが1:1でマッピングをする設定でした。(上記のスライドのDedicated Database Schemaの部分)
ただこれは、ADユーザーと同数のグローバル・ユーザが必要になるので、実際の運用では共有のグローバル・ユーザーにADグループをマッピングし、グローバル・ユーザー数を最小限にする方法も有効です。(スライドのShared Database Schema)
説明だけだとピンと来ないかと思うので、次はこの共有データベース・スキーマの設定を試します

## 共有グローバル・ユーザーを使用したAD認証

３つのADユーザー(emp_mgr,emp1,emp2)を作成し、ORA_VFR_12Cグループに追加。追加後にパスワードをリセットし再設定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562423/f94050c6-e69d-ee0a-df81-8d70b868edae.png)

emp_commonグループを作成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562423/ac8bb688-464c-7a0e-cfab-96db7694420b.png)

emp_commonグループに作成したユーザーを追加
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562423/29acb84b-3294-0f2f-3120-0acb7b862ceb.png)

```
#共有グローバル・ユーザーの作成。emp_commonのグローバル・ユーザーに対して、ADのemp_commonグループをマッピングしている点に注目（ユーザーではない）
create user emp_common identified globally as 'cn=emp_common,cn=users,dc=cmutest,dc=com';
#権限を付与
grant create session, resource to emp_common;
```

ADユーザー(emp1)で接続
```
SQL> connect "emp1@cmutest.com"@PDB
Enter password:
Connected.

#保持している権限
SQL> select * from session_roles;
ROLE
--------------------------------------------------------------------------------
RESOURCE
SODA_APP

#セッション情報を確認。実際には、Databaseのemp_commonユーザーで接続していることが分かる
select SYS_CONTEXT('USERENV','NETWORK_PROTOCOL') net_proto,sys_context('USERENV', 'AUTHENTICATED_IDENTITY') auth_identity,SYS_CONTEXT('USERENV','SESSION_USER') db_user,sys_context('USERENV','ENTERPRISE_IDENTITY') ent_identity from dual;
NET_PROTO  AUTH_IDENTITY     DB_USER     ENT_IDENTITY
---------  ----------------  ----------  ----------------------------------
tcp        emp1@cmutest.com  EMP_COMMON  cn=emp1,cn=Users,dc=cmutest,dc=com

他のempユーザでも同様の結果となる
```

ADでemp_mgrだけをdbaroleグループに追加し、emp_mgrで接続
```
connect "emp_mgr@cmutest.com"@PDB

SQL> select * from session_roles;
ROLE
--------------------------------------------------------------------------------
RESOURCE
SODA_APP
DBAROLE
DBA
25 rows selected.
↑DBAロールが追加されているのが確認できる
```

AD認証時の二つの方法 Dedicated Database SchemaとSharad Database Schemaを紹介しました。
いずれもデータベース側はグローバル・ユーザーを使用していますので、DMLやDDLなどの権限付与を直接付与したり、または、ADのグループを経由での付与など運用に合わせた柔軟な設計ができます。
Oracle Databaseには、Virtual Private DatabaseやDatabase Vaultなどのアクセス制御機能がありますが、AD認証の場合でも同じように利用可能です。