OCI VaultのシークレットとObject Storageの使い方を図解:動的グループで読み、Service Gateway経由で置く
※当ページにはAmazonアソシエイト等の広告リンクを含みます。
公式ドキュメントで検証最終検証 2026-11-01編集部出典 17件
当ページの解説・制限値・構成図は、一般公開されている Oracle Cloud Infrastructure (OCI) 公式ドキュメント、Oracle Cloud Price List、および Oracle University 公開試験ガイドを一次根拠として検証し、独自のSVG視覚図解として作成しています。
- Overview of Vaults and Key Management
- Creating a Vault
- Creating a Master Encryption Key
- Creating a Secret
- Secret Rules
- Details for Vault, Key Management, and Secret Management Service
- Writing Matching Rules to Define Dynamic Groups
- Calling Services from an Instance
- Object Storage Buckets
- Changing the Visibility of a Bucket
- Securing Object Storage
- Details for Object Storage and Archive Storage
- Access to Oracle Services: Service Gateway
- Using Object Lifecycle Management
- Object Versioning
- Object Storage Storage Tiers
- Always Free Resources
1. 全体の流れ:Computeに鍵を置かない
今回のCompute 2台は、起動時にVaultからDBのパスワードを読み、領収書をObject Storageへ置きます。どちらも同じ仕組みで動きます。動的グループの節で見たとおり、インスタンスがグループの一員となり、ポリシーで権限を受け取ります。
- インスタンスとして名乗る:鍵ファイルを置かず、インスタンス・プリンシパルで呼び出します。
- 権限の確認:一致ルールで動的グループの一員と分かり、ポリシーの範囲だけ許可されます。
- シークレットを読む:インターネットを通らず、Service Gateway経由でVaultへ届きます。
- DBへ接続:受け取ったパスワードで接続します。パスワードはコードやログに残しません。
2. パスワードをVaultに置き、動的グループで読む
シークレットを保管する
シークレットの機能は、公式では Secret Management Service として案内されています。
security コンパートメントにVaultを置きます。Vaultの種類は作成後に変更できません。今回は専用のパーティションが要る要件がないので、仮想プライベート・ボールトにはしません。
- Vaults の一覧で Create Vault を選びます。Make it virtual private vault は選びません。
- Vaultの中でマスター暗号化キーを作ります。Key Shape: Algorithm は AES にします。シークレットには対称キーが必要で、非対称キーは使えません。保護モードも作成後に変更できません。Always Free の枠は HSM のキー・バージョンが計20個、Software は無制限です(2026-11-01確認)。シークレットで選べるモードは画面で確かめます。
- Secrets の一覧で Create secret を選びます。名前は
expense-db-passwordとし、同じVaultのキーを選びます。 - 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のネットワーク内で届きます。
- 宛先で分かれる:Oracleのサービス宛てはService Gatewayへ、それ以外はNAT Gatewayへ流れます。
- インターネットを通らない:同じリージョンのObject StorageへOracleのネットワーク内で届きます。
- 入口も閉じる:バケットは非公開にし、認証と認可を通った要求だけを受けます。
設定は3か所です。
- Service Gatewayに
All NRT Services in Oracle Services Networkを設定します。 private-appのルート表に、宛先がこのラベル、ターゲットがService Gatewayのルールを足します。- 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'}
次に読むページ
- ロードマップの次の項目:LBの後ろにComputeを置く
- 動的グループの基本:Dynamic Groupの節
- 全体の順番:学習ロードマップ
よくある質問(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を渡す必要もありません。