
目次
はじめに
こんにちは、クラウド事業部の齋藤です。
パスワード等の機密情報を暗号化して管理したい、変数を外出ししたい、そんな要望あったりしますよね。
OCIでは、コンピュート・インスタンスの場合はボールトというサービスでシークレットとして管理できるみたいなので、やってみました。
※単純に変数を外出しするだけならインスタンス・メタデータに設定したりオブジェクトストレージにテキストファイルを置いたりできるみたいです。
どんなひとに読んで欲しい
- OCIでコンピュート・インスタンスを使っている人、使う予定の人
手順
前提
- シークレットの値を取得するコンピュート・インスタンスが作成済みであること
- シークレットの値を取得するコンピュート・インスタンスがインターネット(またはサービス・ゲートウェイ)経由でボールトのAPIにアクセスできること
動的グループの作成
[アイデンティティとセキュリティ]-[ドメイン]画面に進み、シークレットを参照するコンピュート・インスタンス用の動的グループを作成してください。
ドメインのあるルートコンパートメントや子コンパートメントで作成してくださいね。
一致ルール:
Any {instance.id = 'ocid1.instance.oc1.ap-tokyo-1.<シークレットを参照するコンピュートインスタンスのOCID>'}

ポリシーの作成
[アイデンティティとセキュリティ]-[ポリシー]画面に進み、シークレットを参照するコンピュート・インスタンスに付与する権限を設定します。
今回はシークレットが取得できれば良いので読み取り権限のみにしています。
また、コンピュート・インスタンスやシークレットを作成するコンパートメントで作成しましたが、環境によってinの後ろの定義方法は変わるためご注意ください。私はドメインと同じルートコンパートメントにこのポリシーを作成してしまいハマってしまいました。。。
ステートメント:
Allow dynamic-group '<ドメイン名>'/'<動的グループ名>' to read secret-bundle in compartment <コンパートメント名>

シークレットの作成
まず初めにボールトを作成します。
[アイデンティティとセキュリティ]-[ボールト]画面に進み、マスター暗号化キーやシークレットを格納するためのボールトを作成します。

次にシークレットを暗号化するためのマスター暗号化キーを作成します。

最後にシークレットを作成します。
今回は変数の名前と値を自分で定義しますが、パスワード生成など自動で行うことも可能です。
* 名前:<変数名>
* 暗号化キー:<先程作成した暗号化キー>
* シークレット・コンテンツ:<変数の値>
以降の項目はデフォルトで問題ないです。

envというシークレットができました。
シークレットでは変数名と値が1セットのみ定義可能です。

コンソールから値を確認するには[バージョン]タブ → バージョンを選択 → 三点リーダーの[シークレット・コンテンツの表示]をクリックすると表示できます。
暗号化された値が表示されるので、[デコードされたBase64桁の表示]スイッチをOnにしてください。

作成されたシークレットのOCIDをコピーしてメモしておいてください。

コンピュート・インスタンスからシークレットの値を取得
コンピュート・インスタンスに接続し、OCI CLIでシークレットの値を取得します。
プライベートサブネットのインスタンスへの接続やOCIコマンドのインストール方法は以下のブログに詳しく書いてありますので参考まで。
OCI CLIインストールと事前設定
以下コマンド実行例です。
--secret-id の値には事前にメモしておいたシークレットのOCIDを指定してください。
値はBase64でエンコードされてされているので、デコードが必要になります。
コマンドを実行すると、無事にシークレットに設定した値が返ってきました!
$ oci secrets secret-bundle get --secret-id <シークレットのOCID> | jq '.data["secret-bundle-content"].content' -r | base64 -d dev
おわりに
OCIでパスワードや変数を扱うときにはシークレットが便利そうです。
OCIコンテナサービスやOKEは異なる方法になるようなので、機会があればブログに書こうと思います!
お知らせ
私達クラウド事業部はクラウド技術を活用したSI/SESのご支援をしております。
また、一緒に働いていただける仲間も募集中です!
今年もまだまだ組織規模拡大中なので、ご興味持っていただけましたらぜひお声がけください。