OCI VaultのシークレットとObject Storageの使い方を図解:動的グループで読み、Service Gateway経由で置く

※当ページにはAmazonアソシエイト等の広告リンクを含みます。

公式ドキュメントで検証最終検証 2026-11-01編集部出典 17件

1. 全体の流れ:Computeに鍵を置かない

今回のCompute 2台は、起動時にVaultからDBのパスワードを読み、領収書をObject Storageへ置きます。どちらも同じ仕組みで動きます。動的グループの節で見たとおり、インスタンスがグループの一員となり、ポリシーで権限を受け取ります。

Secret Read FlowComputeがパスワードを受け取ってDBへ接続する順序
private-appCompute2台とも同じ流れIAM動的グループdg-expense-appポリシーread secret-bundlessecurity コンパートメントVaultシークレットDBパスワードprivate-dbAutonomous閉域接続SGWTLSで接続1234
  1. インスタンスとして名乗る:鍵ファイルを置かず、インスタンス・プリンシパルで呼び出します。
  2. 権限の確認:一致ルールで動的グループの一員と分かり、ポリシーの範囲だけ許可されます。
  3. シークレットを読む:インターネットを通らず、Service Gateway経由でVaultへ届きます。
  4. DBへ接続:受け取ったパスワードで接続します。パスワードはコードやログに残しません。
図1:動的グループとポリシーで権限を確かめ、Vaultから読んでDBへ接続する

2. パスワードをVaultに置き、動的グループで読む

シークレットを保管する

シークレットの機能は、公式では Secret Management Service として案内されています。

security コンパートメントにVaultを置きます。Vaultの種類は作成後に変更できません。今回は専用のパーティションが要る要件がないので、仮想プライベート・ボールトにはしません。

  1. Vaults の一覧で Create Vault を選びます。Make it virtual private vault は選びません。
  2. Vaultの中でマスター暗号化キーを作ります。Key Shape: Algorithm は AES にします。シークレットには対称キーが必要で、非対称キーは使えません。保護モードも作成後に変更できません。Always Free の枠は HSM のキー・バージョンが計20個、Software は無制限です(2026-11-01確認)。シークレットで選べるモードは画面で確かめます。
  3. Secrets の一覧で Create secret を選びます。名前は expense-db-password とし、同じVaultのキーを選びます。
  4. Manual secret generation を選び、Secret Contents にDBのアプリ用ユーザーのパスワードを入れます。コンソールなら平文で入れられ、base64へ自動で変換されます。

表1:小規模で押さえるVaultの決まり(2026-11-01確認。最新は公式で確認)

項目内容
シークレットの上限シークレット・バンドルは最大25KB
Always Freeシークレットは合計150個、HSM保護のキー・バージョンは合計20個、ソフトウェア保護のキーは無料。仮想プライベート・ボールトは対象外
パスワードの更新新しいシークレット・バージョンを作る。シークレットのOCIDは変わらない
有効期限のルールSecret Expiry Ruleで1〜90日、または作成から1〜365日の期限を付けられる。このルール自体は中身を変えない。自動で更新するなら別に自動ローテーションを設定する(Autonomous AI Database と Functions に対応)。題材では手動で更新する

動的グループとポリシーを作る

まず動的グループ dg-expense-app を作ります。一致ルールは、app コンパートメントのインスタンスを指定します。OCIDは自分の環境の値に置き換えます。

instance.compartment.id = '<app_compartment_ocid>'

次に、読むシークレットを1つに絞ったポリシーを書きます。

Allow dynamic-group dg-expense-app to read secret-bundles in compartment security where target.secret.name = 'expense-db-password'

中身を返すAPIの権限は read secret-bundles です。read secrets はメタデータを読む権限で、パスワードは取れません。

Computeにログインして、キーなしで読めるか確かめます。OCI CLIが入っていなければ、先に入れます。画面やログにパスワードを残さないよう、結果は捨てて成否だけを見ます。

oci secrets secret-bundle get-secret-bundle-by-name \
  --secret-name expense-db-password \
  --vault-id <vault_ocid> \
  --auth instance_principal > /dev/null && echo OK

アプリではSDKのインスタンス・プリンシパルの認証を使います。返された内容はbase64でエンコードされているので、デコードして使います。

3. 領収書のバケットを閉じ、キーなしで書き込む

バケットの公開設定を切る

領収書は社員の個人情報も含むので、公開しません。app コンパートメントにバケット expense-receipts を作ります。新しいバケットは既定で非公開です。作成後に、設定を確かめる手順も入れておきます。

oci os bucket get -ns <namespace> --bucket-name expense-receipts | grep "public-access-type"

NoPublicAccess なら非公開です。もし公開になっていたら、バケットの Actions から Edit visibility で Private にするか、次のコマンドで戻します。

oci os bucket update --name expense-receipts --public-access-type NoPublicAccess

キーなしで書き込む

アプリの動的グループに、このバケットだけの権限を渡します。manage objects に条件を付けて、必要な権限だけにします。

Allow dynamic-group dg-expense-app to read buckets in compartment app where target.bucket.name = 'expense-receipts'
Allow dynamic-group dg-expense-app to manage objects in compartment app where all {target.bucket.name = 'expense-receipts', any {request.permission = 'OBJECT_CREATE', request.permission = 'OBJECT_INSPECT', request.permission = 'OBJECT_READ'}}

表2:領収書のアプリに渡す権限

権限できること判断
OBJECT_CREATE新しい名前でオブジェクトを置く渡す
OBJECT_READ、OBJECT_INSPECT読み取りと一覧渡す
OBJECT_OVERWRITE同じ名前のオブジェクトを上書きする渡さない。ファイル名を一意にする。ただしマルチパートアップロードには必要なので、大きなファイルを扱うときは見直す
OBJECT_DELETEオブジェクトを削除する渡さない。公式も最小限のグループに限るよう勧めている

Computeから試します。

oci os object put -bn expense-receipts --file ./test.jpg --name 2026/11/test.jpg --auth instance_principal

アプリでも鍵ファイルは置かず、SDKのインスタンス・プリンシパルで呼び出します。

4. Service Gateway経由にする

private-app からObject Storageへ行く経路を、インターネットを通らない形にします。Service Gatewayの通信は、同じリージョンのOracleのサービスへOracleのネットワーク内で届きます。

Service Gateway Path領収書がObject Storageへ届く経路
VCN 10.0.0.0/16private-appCompute公開IPなしルート表All NRT Services → SGW0.0.0.0/0 → NATOracle Services NetworkObject Storageexpense-receipts公開なしNoPublicAccessインターネットSGWで届かない宛先未認証の利用者拒否SGWNAT123
  1. 宛先で分かれる:Oracleのサービス宛てはService Gatewayへ、それ以外はNAT Gatewayへ流れます。
  2. インターネットを通らない:同じリージョンのObject StorageへOracleのネットワーク内で届きます。
  3. 入口も閉じる:バケットは非公開にし、認証と認可を通った要求だけを受けます。
図2:ルート表で宛先ごとに分かれ、Object Storage宛てはService Gatewayを通る

設定は3か所です。

  1. Service Gatewayに All NRT Services in Oracle Services Network を設定します。
  2. private-app のルート表に、宛先がこのラベル、ターゲットがService Gatewayのルールを足します。
  3. ComputeのNSGの送信ルールで、宛先に同じラベル、TCP 443を許可します。ステートレスのルールなら受信ルールも必要です。

より強く絞りたいときは、ネットワーク・ソースを使って、指定したVCNのService Gateway経由の要求だけをバケットで許可するIAMポリシーを書けます。ただし、公式の注記のとおりコンソールからバケットを見られなくなります。小規模な最初の構成では、運用の手間と比べて判断します。

5. ライフサイクルは小さく始める

領収書の量を見積もります。社員30人が月に10枚、1枚2MBなら月600MB、年7.2GBです。Always Freeは合計20GBで、有料アカウントかクレジットの残るFree Trialでは階層ごとに10GB、APIは月5万回です(2026-11-01確認)。最新は公式で確認してください。

表3:小規模で入れるもの、見送るもの

機能判断理由と設定
オブジェクト・バージョニング入れる誤った上書きや削除に備える。有効にすると無効へは戻せず、一時停止だけになる。古い版も課金される
未完了マルチパートの削除入れるバケット作成時の項目を有効にすると、7日後に削除するルールが作られる
古い版の削除ルール入れる例:古い版になってから120日で削除。費用が増え続けないようにする
Infrequent Access、Archiveへの移動量が増えてからInfrequent Accessは最低31日と取り出し料金、Archiveは最低90日で読むには復元が要る
領収書本体の自動削除保存年数を確かめてからライフサイクルで消したオブジェクトは戻せない。保存年数は社内の規程と税理士などに確認する
レプリケーション、顧客管理キー今回は見送り必要な要件が出てから検討する
Allow service objectstorage-ap-tokyo-1 to manage object-family in compartment app where any {request.permission = 'BUCKET_INSPECT', request.permission = 'BUCKET_READ', request.permission = 'OBJECT_INSPECT', request.permission = 'OBJECT_UPDATE_TIER', request.permission = 'OBJECT_DELETE', request.permission = 'OBJECT_VERSION_DELETE'}

次に読むページ

よくある質問(FAQ)

シークレットを読むには、どの権限が要りますか?
中身を読むには read secret-bundles が必要です。read secrets はメタデータ用で、中身は取れません。可能なら、シークレットの名前やOCIDの条件で1つに絞ります。
Service GatewayのラベルはObject Storage用とAll Servicesのどちらにしますか?
今回はVaultも使うので All NRT Services in Oracle Services Network を選びます。1つのService Gatewayが使えるのは、どちらか一方のラベルです。
領収書をアプリの利用者に見せるときは、バケットを公開しますか?
公開しません。公式は、認証情報のない相手には事前認証済みリクエストを勧めています。URLを知る人は誰でも対象にアクセスできるので、対象を1オブジェクトに絞り、期限を短くします。アプリが読んで返す形なら、URLを渡す必要もありません。
目次