Vaultには、ユーザー名やパスワード、APIキーといった機密情報をシークレットとして管理することができます。シークレット情報は最大25KBの文字情報を保存でき、APIによる読み書きが可能です。プログラムにDBの接続情報をハードコーディングする、パスワードやSSHキーなどをメールやチャットなどで平文のままやり取りするなど、Vaultを一旦経由することでそのような漏洩リスクを減少させることができます。
また、シークレットはHSMではなく、Vault内のソフトウェア領域に保存され、5000シークレットまでは無償で利用できます。
ここでは、プログラムのDB接続情報をVaultのシークレット経由で取得する方法を紹介します
##Vaultにシークレットを作成する
同じようにパスワードと接続情報のためのシークレットをdbpassword, connectstrという名前で2つ作成します。
以降は、Pythonのサンプルコードですが、cx_OracleとOracle Instance Clientのインストールと設定は済ませておいてください。
シークレットの値でDBに接続する
アプリケーションのコードの中では、以下のようにDB接続に必要な設定を直接ハードコーディングしている場合があるかと思います
connection = cx_Oracle.connect("ユーザー名", "パスワード", "接続文字列またはサービス名")
以下のコードでは、接続に必要な情報はVaultのシークレットから呼びだすように変更しています。それぞれのシークレットのOCIDを追記して下さい
import cx_Oracle,os,oci,base64
cx_Oracle.init_oracle_client(r"C:\Program Files\instantclient_21_3")
config = oci.config.from_file("~/.oci/config","DEFAULT")
secret_client = oci.secrets.SecretsClient(config)
#シークレットのDBUserを取得
response = secret_client.get_secret_bundle('<dbuserシークレットのOCID>')
dbuser = base64.b64decode(response.data.secret_bundle_content.content)
#シークレットのDBPasswordを取得
response = secret_client.get_secret_bundle('<dbpasswordシークレットのOCID>')
dbpasswd = base64.b64decode(response.data.secret_bundle_content.content)
#シークレットのconnectstrを取得
response = secret_client.get_secret_bundle('<connectstrシークレットのOCID>')
connectstr = base64.b64decode(response.data.secret_bundle_content.content)
#Oracle Databaseに接続
connection = cx_Oracle.connect(dbuser, dbpasswd, connectstr)
cur = connection.cursor()
cur.execute("select sysdate from dual")
rows=cur.fetchall()
print("DB接続成功")
print(row)
サンプルコードをdbconnect.pyとして保存し実行します。
接続が成功すれば、select sysdate from dualの結果が返ります。
#実行例
python .\dbconnect.py
DB接続成功
2021-11-15 11:52:03
シークレットは削除したり、バージョンを作成するなどして、漏洩リスクをコントロールすることができます。
DBだけでなく、OCIのFunctionsやバッチのシェルスクリプトなど、機密情報を外だしで管理したい利用ケースが多いと思うので、比較的お手軽に利用できます。