2. トークンを取得してアクセスする
このセクションでは、OCI CLI を使用して DBトークンを取得し、そのトークンを使って Autonomous Database に接続します。
実施内容
- DBトークンの取得
- DB接続設定の編集
- adminユーザーのトークンで接続し権限を確認
- devユーザーのトークンで接続し権限を確認
2-1. DBトークンを取得する
Section titled “2-1. DBトークンを取得する”次のコマンドを実行し、DBトークンを取得します。
ここで使用する OCI CLI のプロファイルは、iamuser-hr-admin-01 のものを使用してください。
oci iam db-token get
# または以下を実行oci iam db-token get --profile iamuser-hr-admin-01コマンドの実行結果として、DBトークンとそれに対応する秘密鍵が保存されたパスが表示されます。
Private key written at /home/ubuntu/.oci/db-token/oci_db_key.pemdb-token written at: /home/ubuntu/.oci/db-token/token作成されたファイルを確認します。デフォルトでは、秘密鍵 (oci_db_key.pem)、公開鍵 (oci_db_key_public.pem)、そしてDBトークン本体 (token) の3つのファイルが $HOME/.oci/db-token/ ディレクトリに生成されます。
$ tree .oci/db-token/.oci/db-token/├── oci_db_key.pem├── oci_db_key_public.pem└── tokenDBトークンは JWT (JSON Web Token) 形式です。中身を JSON Web Tokens - jwt.io <https://www.jwt.io/ja>__ などのデコーダーツールで確認することができます。
トークンをデコードした例
{ "kid": "scoped_sk_db_token_syd_1713219551687", "alg": "RS256"}{ "sub": "ocid1.user.oc1..aaaaaaaaaaaaaaaaaaaaaaaaaa", "iss": "authService.oracle.com", "ptype": "user", "sess_exp": "Sat, 08 Nov 2025 17:19:55 UTC", "dbUserName": "iamuser-hr-admin-01", "userName": "iamuser-hr-admin-01", "aud": "urn:oracle:db:ocid1.tenancy.oc1..xxxxxxxxxxxxxxxxxxxxxx", "domain_name": "domain-db", "pstype": "natv", "ttype": "scoped_access", "scope": "urn:oracle:db::id::*", "exp": 1762604395, "iat": 1762600795, "jti": "f5a3618f-4b3b-43d8-b679-0eaea2853ca3", "tenant": "ocid1.tenancy.oc1..xxxxxxxxxxxxxxxxxxxxxx", "jwk": "{\"kid\":\"ocid1.tenancy.oc1..xxxxxxxxxxxxxxxxxxxxxx\",\"n\":\"qsx0rUB6MREieANpIYe0y1TCYb70uNuJgPOommm9aYGrOqomDW5Hgh1U08mGvPsr9AgewCExUQZdnxLegyo6QYi0y2xlD49zn5BMW-sk9m-U0IdmpFGIHHFd3NYwfxEBSxOhdjE86XObZypHtPQetxHRTLtwLt5Cjak91aEwSCUbKPaoaRkFE7ZBI3K7bNxKayey8AebXfZyzADKivYIqEtHOntu6d0kvLZ-WXDTJTOy7Ybds2uBg0adrls4h-lF1IRYyjXZEsETtVDJ788jkWVGMnCgBOlVdyFUrT60mVTsh6mlD5VZVPsSukdHQFyDJj62D5u9ckaPpF3Iz7LaSw\",\"e\":\"AQAB\",\"kty\":\"RSA\",\"alg\":\"RS256\",\"use\":\"sig\"}"}userName より adminユーザーであることが確認できます。
2-2. DB接続設定を編集する
Section titled “2-2. DB接続設定を編集する”DBトークンを使用して接続するために、Wallet に含まれる tnsnames.ora の接続記述子に TOKEN_AUTH=OCI_TOKEN を追加します。
Wallet を unzip して内容を確認します。
$ adb-wallet unzip Wallet_UQG5XBZV5LIND8ZF.zipArchive: Wallet_UQG5XBZV5LIND8ZF.zip
$ adb-wallet tree.├── README├── Wallet_UQG5XBZV5LIND8ZF.zip├── cwallet.sso├── ewallet.p12├── ewallet.pem├── keystore.jks├── ojdbc.properties├── sqlnet.ora├── tnsnames.ora└── truststore.jks
1 directory, 10 filestnsnames.ora を開き、使用したい接続記述子に security=(TOKEN_AUTH=OCI_TOKEN) パラメータを追記します。接続記述子名は、任意で db-token などに変更しても構いません。
# 変更前(before)uqg5xbzv5lind8zf_medium = ( description= (retry_count=20) (retry_delay=3) (address=(protocol=tcps)(port=1522)(host=adb.ap-sydney-1.oraclecloud.com)) (connect_data=(service_name=g884bffdded7d8c_uqg5xbzv5lind8zf_medium.adb.oraclecloud.com)) (security=(ssl_server_dn_match=yes)) )
# 変更後(after)db-token = ( description= (retry_count=20) (retry_delay=3) (address=(protocol=tcps)(port=1522)(host=adb.ap-sydney-1.oraclecloud.com)) (connect_data=(service_name=g884bffdded7d8c_uqg5xbzv5lind8zf_medium.adb.oraclecloud.com)) (security=(ssl_server_dn_match=yes)(TOKEN_AUTH=OCI_TOKEN)) )2-3. 2-3. adminユーザーのトークンで接続し権限を確認
Section titled “2-3. 2-3. adminユーザーのトークンで接続し権限を確認”接続する準備ができたら、トークン認証で接続します。
TOKEN_AUTH=OCI_TOKEN を設定した接続記述子に対して、ユーザー名なし(/)で接続します。
$ ~ sql /nolog
SQL> connect /@db-tokenConnected.接続後、ユーザー名、付与されているロールおよび権限を確認してみます。
-- DBユーザー名を確認SQL> show userUSER is "DBUSER_IAM"
-- 持っている権限を確認SQL> select * from session_privs;
PRIVILEGE______________CREATE SESSION
-- 持っているロールを確認するSQL> select * from session_roles;
ROLE_______________GLROLE_HR_ADMIN
-- HRスキーマの管理権限を持つため、表作成・削除が成功するSQL> create table hr.test (2 id number3* );
Table HR.TEST created.
SQL> drop table hr.test;
Table HR.TEST dropped.トークンを発行したユーザー(iamuser-hr-admin-01)が、Database側でグローバルユーザーとしてマッピングされ、対応する GLROLE_HR_ADMIN ロールでログインできていることが確認できます。
2-4. devユーザーのトークンで接続し権限を確認
Section titled “2-4. devユーザーのトークンで接続し権限を確認”次に、権限の異なるユーザーのトークンを使用し、接続時の権限の違いを確認します。セットアップ時に用意した iamuser-hr-dev-01 ユーザーのAPIキーを使用してDBトークンを取得してみます。
$ oci iam db-token get --profile iamuser-hr-dev-01Private key written at /home/ubuntu/.oci/db-token/oci_db_key.pemdb-token written at: /home/ubuntu/.oci/db-token/tokendb-token is valid until 2025-11-08 22:29:05接続してみます。
$ ~ sql /nolog
SQL> connect /@db-tokenConnected.ロールと権限を確認し、iamuser-hr-admin-01 の時と異なるロールが付与されているかを確認します。
-- DBユーザー名を確認SQL> show userUSER is "DBUSER_IAM"
-- 持っている権限を確認SQL> select * from session_privs;
PRIVILEGE______________CREATE SESSION
-- 持っているロールを確認SQL> select * from session_roles;
ROLE_____________GLROLE_HR_DEV
-- HRスキーマへのSELECTは成功するSQL> select * from hr.departments;
DEPT_ID DEPT_NAME LOCATION_______ __________ ________ 10 Accounting Tokyo 20 Reserch Osaka 30 Sales Nagoya 40 HR Fukuoka
-- HRスキーマへの表作成は権限が足りないため失敗するSQL> create table hr.test (2 id number3* );
Error starting at line : 1 in command -create table hr.test (id number)Error report -ORA-01031: insufficient privileges
https://docs.oracle.com/error-help/db/ora-01031/1. 00000 - "insufficient privileges"*Document: YES*Cause: A database operation was attempted without the required privilege(s).*Action: Ask your database administrator or security administrator to grant you the required privilege(s).これでトークンを発行したユーザー(iamuser-hr-dev-01)が、同じマッピング先のDBユーザー(DBUSER_IAM)でログインしましたが、付与されたロールは (GLROLE_HR_DEV) となり、権限が分離されていることが確認できました。
以上、これでDBトークンを使用したデータベース接続は終了です。