LoginSignup
6
0

More than 3 years have passed since last update.

[OCI] OCIシークレットを使ってシェルスクリプトからOracle Databaseに接続してみた

Posted at

はじめに

たまたま@kenwatanさんと同じ趣旨の記事を作成していたのですが、先を越されてしまいましたw こちらの記事はあちらの記事とは少し趣旨を変えて、既存のアプリケーションでよくある、シェルスクリプトからSQL*Plusを起動させるバッチ処理を意識したサンプルを作成してみました。加えて、あちらの記事の補足的な情報も追記しています。

シークレットでパスワード管理する利点

シークレットを利用すると、OCI CLIのようなAPIを利用して、リモートで管理されているパスワードを取得してからそのパスワードをログインなどで利用する形でアプリケーションを作成することになります。このようにすることで、以下の利点が得られます。

  1. シークレットの管理の権限を持つ人だけがパスワード管理を集中的に実施することが可能になる
  2. パスワードが記述されたソースコードを介したパスワードの漏洩を防止できる
  3. パスワードの変更の際に、アプリケーションの修正が不要になる

シークレットの作成

大きくは以下の手順となります。

  1. ボールトを作成(ボールトがない場合のみ)
  2. キーを作成(キーがない場合のみ)
  3. シークレットを作成

詳細な手順は既存の記事をご確認いただくとして、補足情報を追記します。
既存の記事ではシークレットに格納する情報をすべてBase64でエンコーディングしていますが、シークレットがテキストの場合、シークレット・タイプに「テキスト」を指定して格納することも可能です。この場合でも、シークレット作成後の内容の確認結果はBase64エンコーディングされた値が表示されます(一時的にプレーンテキストで表示させることも可)。OCI CLIで取得したシークレットもBase64エンコーディングされています。

シェルスクリプトからシークレットを取得するサンプル

Computeインスタンスから19cのHigh PerformanceのDBCSインスタンスへ接続するサンプルのシェルスクリプトです。

sample.sh
#!/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
6
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
0