Skip to content

2. トークンを取得してアクセスする

このセクションでは、OCI CLI を使用して DBトークンを取得し、そのトークンを使って Autonomous Database に接続します。

実施内容

  • DBトークンの取得
  • DB接続設定の編集
  • adminユーザーのトークンで接続し権限を確認
  • devユーザーのトークンで接続し権限を確認

次のコマンドを実行し、DBトークンを取得します。
ここで使用する OCI CLI のプロファイルは、iamuser-hr-admin-01 のものを使用してください。

oci iam db-token get
# または以下を実行
oci iam db-token get --profile iamuser-hr-admin-01

コマンドの実行結果として、DBトークンとそれに対応する秘密鍵が保存されたパスが表示されます。

Terminal window
Private key written at /home/ubuntu/.oci/db-token/oci_db_key.pem
db-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/ ディレクトリに生成されます。

Terminal window
$ tree .oci/db-token/
.oci/db-token/
├── oci_db_key.pem
├── oci_db_key_public.pem
└── token

DBトークンは 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ユーザーであることが確認できます。

DBトークンを使用して接続するために、Wallet に含まれる tnsnames.ora の接続記述子に TOKEN_AUTH=OCI_TOKEN を追加します。 Wallet を unzip して内容を確認します。

Terminal window
$ adb-wallet unzip Wallet_UQG5XBZV5LIND8ZF.zip
Archive: 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 files

tnsnames.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 を設定した接続記述子に対して、ユーザー名なし(/)で接続します。

Terminal window
$ ~ sql /nolog
SQL> connect /@db-token
Connected.

接続後、ユーザー名、付与されているロールおよび権限を確認してみます。

-- DBユーザー名を確認
SQL> show user
USER 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 number
3* );
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トークンを取得してみます。

Terminal window
$ oci iam db-token get --profile iamuser-hr-dev-01
Private key written at /home/ubuntu/.oci/db-token/oci_db_key.pem
db-token written at: /home/ubuntu/.oci/db-token/token
db-token is valid until 2025-11-08 22:29:05

接続してみます。

Terminal window
$ ~ sql /nolog
SQL> connect /@db-token
Connected.

ロールと権限を確認し、iamuser-hr-admin-01 の時と異なるロールが付与されているかを確認します。

-- DBユーザー名を確認
SQL> show user
USER 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 number
3* );
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トークンを使用したデータベース接続は終了です。