はじめに
たまたま@kenwatanさんと同じ趣旨の記事を作成していたのですが、先を越されてしまいましたw こちらの記事はあちらの記事とは少し趣旨を変えて、既存のアプリケーションでよくある、シェルスクリプトからSQL*Plusを起動させるバッチ処理を意識したサンプルを作成してみました。加えて、あちらの記事の補足的な情報も追記しています。
シークレットでパスワード管理する利点
シークレットを利用すると、OCI CLIのようなAPIを利用して、リモートで管理されているパスワードを取得してからそのパスワードをログインなどで利用する形でアプリケーションを作成することになります。このようにすることで、以下の利点が得られます。
- シークレットの管理の権限を持つ人だけがパスワード管理を集中的に実施することが可能になる
- パスワードが記述されたソースコードを介したパスワードの漏洩を防止できる
- パスワードの変更の際に、アプリケーションの修正が不要になる
シークレットの作成
大きくは以下の手順となります。
- ボールトを作成(ボールトがない場合のみ)
- キーを作成(キーがない場合のみ)
- シークレットを作成
詳細な手順は既存の記事をご確認いただくとして、補足情報を追記します。
既存の記事ではシークレットに格納する情報をすべてBase64でエンコーディングしていますが、シークレットがテキストの場合、シークレット・タイプに「テキスト」を指定して格納することも可能です。この場合でも、シークレット作成後の内容の確認結果はBase64エンコーディングされた値が表示されます(一時的にプレーンテキストで表示させることも可)。OCI CLIで取得したシークレットもBase64エンコーディングされています。
シェルスクリプトからシークレットを取得するサンプル
Computeインスタンスから19cのHigh PerformanceのDBCSインスタンスへ接続するサンプルのシェルスクリプトです。
#!/bin/bash
password=`oci secrets secret-bundle get \
--auth instance_principal \
--secret-id=ocid1.vaultsecret.oc1.ap-osaka-1.amaaaaaassl65iqa4nhkpdf42pd52joedsnnb4kbyen4cw6ztrmrd6s2cb2a \
--query 'data."secret-bundle-content".content' \
--raw-output \
| base64 -d`
sqlplus -s test/${password}@pdb1 <<EOF
select sysdate from dual;
exit
EOF
ociコマンドの戻り値がパスワードのBase64エンコード値なので、base64 -dコマンドで元の値にデコードしています。
以下、2行目のpasswordシェル変数への格納の際に実行しているociコマンドのオプションを解説します。
- --authオプション
インスタンス・プリンシパル認可を利用するために指定しています。 - --secret-idオプション
シークレットのOCIDを指定します。本コマンドに必須のオプションとなります。 - --queryオプション
ociコマンドの戻り値は該当するシークレットに関する情報を連ねたJSONですが、今回必要なのはパスワードの値のみなので、本オプションを利用して、必要な部分だけ抜き出しています。 - --raw-outputオプション
--queryオプションの戻り値を囲んでいるダブルクォーテーションを取り除くオプションです。
$ ./sample.sh
SYSDATE
---------
26-APR-20