※本記事は、Nirmala Sundarappa による“Accessing Autonomous Database with IAM token using Java”を翻訳したものです。
2022年 1月 11日
アイデンティティ・アクセス管理(IAM)トークン認証
データベースのパスワードを一元的に簡素化し、安全に管理する方法として、オラクルはAutonomous Database-Shared(ADBS)のIdentity and Access Management(IAM)トークンベース認証をサポートするようになりました。
IAM認証されたユーザーは、既存のセキュリティセッショントークンまたはAPI-keyを使用してデータベーストークンの生成を要求することができます。このトークンは1時間有効です。Javaアプリケーションは、このIAMデータベーストークンを使ってAutonomous Databaseに接続することができます。IAMデータベーストークンを取得すると、Javaアプリケーションはトークンに埋め込まれた公開鍵と対になる秘密鍵を渡すことができる。データベースサーバーはIAMからの公開鍵で署名を復号化し、トークンがIAMによって作成されたかどうかを検証します。トークンと署名が有効で、IAMユーザーとデータベーススキーマユーザーの間にマッピングが存在する場合、データベーススキーマユーザーへのアクセスが許可されます。
IAMトークン認証には、19.13.0.0.1 または 21.4.0.0.1 JDBC ドライバー (またはそれ以降) が必要です。これらは、Central Mavenから入手するか、OTNダウンロード・ページからダウンロードすることができます。このブログでは、JavaアプリケーションがIAM-tokenを生成して認証に使用し、Oracle Autonomous Databaseに正常に接続するために必要な手順を説明します。
ステップ1:IAM-Token認証に対応したJDBCドライバをダウンロードする
19.13.0.0.1 または 21.4.0.0.1 JDBC ドライバと UCP (UCP を使用している場合) を Central Maven または OTN からダウンロードしてください。クラスパスをJDBCドライバーのjarファイルで更新していることを確認してください。
ステップ2:データベースサーバーの外部認証としてIAMを有効化し、データベースユーザーを作成
自律型データベースで、IAM-token認証を「許可された外部認証」として有効にする必要があります。相互TLSまたは片方向TLS(有効な場合)を使用して自律型データベースにログオンし、以下のSQLステートメントを実行します。
これを実現する方法はたくさんありますが、最も簡単な方法は、クラウドコンソールにログオンして、自律型データベースに移動し、「データベースアクション」をクリックし、ADMINとパスワードでログインする方法です。開発」セクションで「SQL」をクリックし、以下のSQLステートメントを実行します。
なお、Identity_provider_typeは最初から「NONE」になっています。外部認証を有効にすると、”OCI_TOKEN “と表示されるはずです。
新しいデータベースユーザー(example:db_token_user)は、以下のようにIAM_PRINCIPAL_NAMEと関連付ける必要があります。クラウドコンソールから、「ユーザー設定」→「データベースパスワード」→「データベースユーザー名」で、IAM_PRINCIPAL_NAMEを取得します。
または、「iam_admin_grp」というIAMグループを作成し、このグループのメンバーが「autonomous-database-family」というリソースを利用できるようにポリシーを定義しています。db_token_user」というデータベースユーザーは、以下のように「iam_admin_grp」グループに所属するIAMユーザーであれば誰でも利用することが可能です。IAMユーザー、グループ、およびポリシーの作成の詳細については、『Oracle Autonomous DatabasesにおけるIAMユーザーの認証と認可』を参照してください。
ステップ3:Oracle CLI Utility または OCI-SDK API を使用して DB トークンを作成する
Autonomous Database に接続するための IAM データベーストークンを要求するには、2 つの方法があります。これらのオプションを選択する前に、上記のステップ1およびステップ2を完了していることを確認してください。
オプション 1: OCI SDK API を使用してデータベース トークンを要求する。以下のサンプルコードでは、トークンを生成し、Autonomous Database への接続を確立しています。GitHub から JDBCTokenAuthentication.java をダウンロードし、DATABASE_URL を Autonomous Database を指すように、OCI_PROFILE を “DEFAULT” に更新してください。これは ~$HOME/.oci/config ファイルからラベル付けされた設定を拾います。ADBがウォレットを必要とする場合、TNS_ADMINはウォレットの場所を指すように設定されなければなりません。
オプション2:ローカルファイルの場所にデータベーストークンを取得するためにOCI-CLIを使用します。Oracle Cloud Infrastructure (OCI) Command Line Interface (CLI) をコンピューターにローカルにインストールします。最新バージョンのOCI-CLI v3.4.1以降を使用していることを確認してください。($oci -v を実行すると、バージョンが表示されます)
OCI-CLIは、IAMデータベース・トークンおよび関連する公開鍵と秘密鍵を取得する際、~$HOME/.oci/ロケーション(別名OCI_HOME)を使用します。アクセスしたい自律型データベースを指すクラウド認証情報で ~$HOME/.oci/config ファイルを作成したことを確認します。DEFAULT]とマークされたものは、デフォルトでIAMトークンが関連付けられるものになります。以下のガイドを参照して、クライアントの資格情報を使用して設定ファイルを入力してください。次のコマンドを使用して、1時間有効なIAMデータベーストークンを生成します。
➜ oci iam db-token get
Output: Private key written at /Users/test/.oci/db-token/oci_db_key.pem
db-token written at: /Users/test/.oci/db-token/token
db-token is valid until 2021-12-13 20:02:49
ステップ4:IAMデータベース・トークン認証を示す接続プロパティをパスする
データベースのユーザー名やパスワードの提供は必須ではありません。ただし、接続文字列と一緒に、IAM データベーストークン認証を示す接続プロパティを指定する必要があります。(ステップ 3 のオプション 1 を使用する場合は、このステップを省略できます)
オプション1:IAMトークン関連のプロパティは、例に示すように、接続URLの一部(oracle.jdbc.tokenAuthentication=OCI_TOKEN)として渡すことができる。
例:一方向TLSが有効であると仮定し、Autonomous Databaseに移動し、「DB Connection」をクリックして「Connection Strings」セクションで、ドロップダウンで「TLS」を選択して接続URLをコピーし、接続プロパティoracle.jdbc.tokenAuthentication=OCI_TOKENをURLに付加する。
Connection URL: jdbc:oracle:thin:@dbname_medium?TNS_ADMIN=/Users/test/Wallet/dbname_high&oracle.jdbc.tokenAuthentication=OCI_TOKEN
オプション 2: あるいは、IAMトークン関連のプロパティは、以下のように接続プロパティとして設定することも可能です。
ステップ5:Javaサンプルコードによる検証
JDBCDBTokenSample.java または UCPDBTokenSample.java のコードをダウンロードし、DB_URL を Autonomous Database を指すように更新してください。サンプルを実行する前に、コマンド oci iam db-token get を使用して IAM データベーストークンを取得したことを確認してください。これらのサンプルをコンパイルして実行します。出力は以下のようになるはずです。
* * * * * * * * * * * * *

Nirmala Sundarappa
Oracle Databaseで使用されるOracle Java Database Connectivity (JDBC) ドライバーとUniversal Connection Pool (UCP)のプロダクトマネージャーです。
