動的シークレットを使用したストレージ・バケットへのアクセス
このチュートリアルでは、IBM Cloud® Secrets Manager を使用して、Cloud Object Storage 内のバケットへのアクセスに使用できる IAM 資格情報を作成およびリースする方法について学習します。
社内開発者の皆様は、アプリケーション・シークレットのセキュリティーを向上させるための方法を探していることでしょう。 API キーを管理する場合、必要な場合にのみ資格情報が存在するように、資格情報を動的に作成できる必要があります。 また、チーム内の他のメンバーに API キーをリースして、指定した期間が過ぎた後に API キーが自動で取り消されるようにすることも必要です。
Secrets Managerを使用すると、Cloud Object Storageのバケットに格納するデプロイメントログなどの保護されたリソースにアクセスするために使用できる 動的な秘密保護リソースへのアクセスを必要とするアプリケーションのために、動的に作成されてリースされる固有値 (パスワードや API キーなど)。 動的シークレットがリースの終了に達すると、保護リソースへのアクセスが取り消され、そのシークレットが自動的に削除されます。を作成できます。 例えば、以下のシナリオについて考えてみます。
- 管理者ユーザーは、自分のアカウント内の Cloud Object Storage バケットに自分のチームがアクセスするときに使用可能な動的シークレットを作成する必要があります。 Secrets Manager に IAM 資格情報を作成する要求を送信します。
- Secrets Manager は、そのシークレットを作成し、定義済みの IAM アクセス・ポリシーと照合して検証します。
- 続けて、開発者はストレージ・バケットの内容にアクセスする必要があります。 開発者は IAM 資格情報の値を取得する要求を送信します。
- Secrets Manager は要求を検証し、デベロッパーが Cloud Object Storage への認証に使用できるシングル・ユースの API キーを生成します。 この API キーは、リースの期限に達すると自動的に取り消されます。
開始前に
始めに、他のメンバーがサービスのプロビジョニング、アクセス・グループの作成、アクセス・ポリシーのカスタマイズをできるように、必ず管理者プラットフォーム・アクセス権限 を使用してください。 以下の前提条件も必要です。
-
jq
は、JSONデータのスライスとフィルタリングに役立ちます。 このチュートリアルにあるjq
を使用して、保管された環境変数を取得・使用します。
環境を設定する
Secrets Manager および Cloud Object Storage を使用するには、両方のサービスのインスタンスを IBM Cloud アカウントに作成する必要があります。 また、両方のサービスに対して操作を実行できるように許可を構成する必要もあります。
このステップでは、アクセス・グループ、サービス ID、IBM Cloud API キーを作成することにより、アクセス環境をセットアップします。 これ以降、これらのインスタンスが不要な場合は、チュートリアルの終了時に簡単に削除できます。
IBM Cloud アカウントには、Secrets Manager サービス・インスタンスを 1 つだけ持つことができます。
Secrets Manager および Cloud Object Storage インスタンスの作成
まず、Secrets Manager および Cloud Object Storage のテスト・インスタンスを IBM Cloud アカウントに作成します。
-
コマンド・ラインで、IBM Cloud CLI を使用して、IBM Cloud にログインします。
ibmcloud login
ログインに失敗した場合は、
ibmcloud login --sso
コマンドを実行して再試行してください。 フェデレーテッドIDを使用してログインする場合は、--sso
パラメーターが必要です。 このオプションを使用する場合、CLI 出力にリストされているリンクに移動して、ワンタイム・パスコードを生成します。 -
Secrets Manager サービス・インスタンスを作成するアカウント、リージョン、リソース・グループを選択します。
このチュートリアルでは、ダラス地域と対話します。 別の地域にログインしている場合は、次のコマンドを実行して、ダラスをターゲット地域に設定してください。
ibmcloud target -r us-south -g default
-
Cloud Object Storage インスタンスを作成します。
ibmcloud resource service-instance-create test-cos-instance-tutorial cloud-object-storage lite us-south
-
Secrets Manager インスタンスを作成します。
ibmcloud resource service-instance-create test-sm-instance-tutorial secrets-manager lite us-south
Secrets Manager のプロビジョニング・プロセスが完了するまでに 5 分から 15 分かかります。
-
両方のサービス・インスタンスの ID を含む環境変数をエクスポートします。
export COS_INSTANCE_ID=`ibmcloud resource service-instance "test-cos-instance-tutorial" --output json | jq -r ".[].guid"`; echo $COS_INSTANCE_ID
export SM_INSTANCE_ID=`ibmcloud resource service-instance "test-sm-instance-tutorial" --output json | jq -r ".[].guid"`; echo $SM_INSTANCE_ID
-
(オプション) ご使用の IBM Cloud コンソールの**「メニュー」**アイコン
**>「リソース・リスト」**をクリックして、サービスが正常に作成されたことを確認します。
アクセス許可のセットアップ
次に、Secrets Manager サービスおよび Cloud Object Storage サービスに対して操作を実行するために必要なアクセス階層を定義します。
-
IBM Cloud アカウントにテスト・アクセス・グループを作成します。
アクセス・グループを作成すると、Secrets Manager および Cloud Object Storage インスタンスへのアクセスを必要とするユーザーおよびサービス ID のセットへのアクセス権限を割り当てることができます。 コマンド・ラインから、以下のコマンドを実行して、
test-cos-admin-group
という新規アクセス・グループを作成します。export ACCESS_GROUP_ID=`ibmcloud iam access-group-create test-storage-admin-group -d "An access group for testing Secrets Manager and Cloud Object Storage." --output json | jq -r ".id"`; echo $ACCESS_GROUP_ID
-
アカウント資格情報をセットアップします。
サービス ID を作成し、環境変数として設定します。
export SERVICE_ID=`ibmcloud iam service-id-create test-service-id-secrets --description "A service ID for testing Secrets Manager." --output json | jq -r ".id"`; echo $SERVICE_ID
サービス ID に、他のサービス ID を作成および管理するための権限を割り当てます。
ibmcloud iam service-policy-create $SERVICE_ID --roles Operator --service-name "IAM Identity Service"
サービス ID に、アカウントのアクセス・グループを表示および更新するための権限を割り当てます。
ibmcloud iam access-group-policy-create $SERVICE_ID --roles Editor --service-name "IAM Access Groups"
アクセス・グループにサービス ID を追加します。
ibmcloud iam access-group-service-id-add test-secrets-admin-group $SERVICE_ID
サービス ID 用に IBM Cloud API キーを作成します。
export IBM_CLOUD_API_KEY=`ibmcloud iam service-api-key-create test-storage-read-write $SERVICE_ID --description "An API key for testing Secrets Manager and Cloud Object Storage." --output json | jq -r ".apikey"`
後で、この API キーを使用して、Secrets Manager IAM シークレット・エンジンを有効にします。
Cloud Object Storage インスタンスの準備
次に、Cloud Object Storage インスタンスにバケットを作成し、アクセスをセットアップします。
-
インスタンスにテスト・バケットを作成します。
- IBM Cloud コンソールで、**「リソース・リスト」**に移動します。
- ストレージ・サービスのリストから、test-cos-instance-tutorial を選択します。
- Cloud Object Storage UI で **「バケットの作成」**をクリックします。
us-south
リージョンにバケットを作成します。- バケットの ID をコピーします。
-
読み取り権限と書き込み権限を新規 Cloud Object Storage バケットに割り当てます。
- **「管理」 > 「アクセス権限 (IAM)」 > 「アクセス・グループ」**に移動します。
- グループのリストから、test-storage-admin-group を選択します。
- _アクセス」_タブをクリックします。
- 「アクセス権限の割り当て」 をクリックします。
- サービスのリストから Cloud Object Storage を選択し、Next をクリックします。
- 「リソース」セクションで、 「特定のリソース」 を選択します。
- 「属性タイプ」フィールドで、 「サービス・インスタンス」 を選択します。
- サービス・インスタンスのリストから test-cos-instance-tutorial を選択し、 「次へ」 をクリックします。
- 「リーダー」、「コンテンツ・リーダー」、「オブジェクト・リーダー」、「オブジェクト・ライター」 の各種サービス・アクセス・ロールを割り当てます。
- 選択内容を確認し、Add をクリックします。
- 割り当て をクリックします。
-
オブジェクトをストレージ・バケットにアップロードします。
ローカル・システムからどのファイルまたはフォルダーでもドラッグ・アンド・ドロップできます。 例えば、次のようなサンプルテキストを含む「
sample.txt
名前のファイルを作成し、アップロードすることができます。A quick brown fox jumped over the lazy dog.
Secrets Manager インスタンスの準備
最後に、動的シークレットの処理を開始できるように、Secrets Manager インスタンスを構成します。
-
コマンドラインから、Secrets Manager CLI プラグインにアクセスできることを確認します。
ibmcloud secrets-manager --help
プラグインがありませんか? Secrets ManagerCLIプラグインをインストールするには、
ibmcloud plugin install secrets-manager
を実行します。 -
インスタンスのシークレット・グループを作成します。
シークレット・グループ は、インスタンス内の特定の機密情報にアクセスできるチーム内のユーザーを編成、制御するための方法です。 IBM Cloud CLI からシークレット・グループを作成するには、
ibmcloud secrets-manager secret-group-create
コマンドを実行します。export SECRET_GROUP_ID=`ibmcloud secrets-manager secret-group-create --name cloud-object-storage-writers --description "Read and write to Cloud Object storage buckets" --service-url https://${instance-id}.${region}.secrets-manager.appdomain.cloud --output json | jq -r '.id'`; echo $SECRET_GROUP_ID
必ず、
instance_id
およびregion
をご使用のものに更新してください。Windows™コマンド・プロンプト(
cmd.exe
)またはPowerShellを使用していますか? コマンド・ラインで JSON コンテンツを渡す際にエラーが発生する場合、ご使用のオペレーティング・システムに固有の引用符のエスケープ要件に応じて、ストリングを調整する必要がある場合があります。 詳細については、IBM Cloud CLI の文字列の引用符の使用を参照してください。 -
インスタンスの IAM シークレット・エンジンを有効にします。
シークレット・エンジンは、さまざまなタイプのシークレットの操作を処理するために使用される Secrets Manager のコンポーネントです。 これらのエンジンは、それらのシークレットのバックエンドとして機能します。 IAM シークレット・エンジンを有効にすることにより、サービス ID の API キーを動的に作成し、指定したリース期間に基づいてそのキーをユーザーにリースできます。
IBM Cloud CLI から IAM シークレット・エンジンを構成するには、
ibmcloud secrets-manager config-update
コマンドを実行します。最初に、 必要なアクセス・ポリシーを使用して IAM Service ID と API キーを作成してください。 生成された API キーを以下のコマンドで使用します。
ibmcloud secrets-manager configuration-create --config-type iam_credentials_configuration --iam-credentials-apikey $IBM_CLOUD_API_KEY
成功! IAM 資格情報の作成ができるようになった結果、サービス ID および API キーを動的に生成できます。 次のステップに進んでください。
IAM 資格情報の作成
IAM 資格情報は、Cloud Object Storage バケットなどの IBM Cloud リソース・オンデマンドにアクセスするときに使用可能な動的シークレットです。 IAM 資格情報のセットは、保護リソースを読み取るまたはアクセスするときに毎回生成されるサービス ID と API キーで構成されます。 IAM 資格情報の存続時間 (TTL) またはリース期間を作成時に定義することにより、シークレットが存在する時間を短くすることができます。
IBM Cloud CLI から IAM 資格情報を作成するには、ibmcloud secrets-manager secret-create
コマンドを実行します。
export SECRET_ID=`ibmcloud secrets-manager secret-create --secret-name test-iam-credentials --secret-description "Extended description for my secret.",--am-credentials-access_groups $ACCESS_GROUP_ID" --secret_group_id $SECRET_GROUP_ID --iam-credentials-ttl 2h --secret-labels "storage, us-south" --output json --service-url https://${instance-id}.${region}.secrets-manager.appdomain.cloud | jq -r '.id`
必ず、 instance_id
および region
をご使用のものに更新してください。
また、Secrets Manager UI を使用して、IAM 資格情報を作成することもできます。 詳細については、IAM 資格情報の作成を参照してください。
API キーの生成
IAM 資格情報を作成した後、付与されている権限が少ないユーザーは、ストレージ・バケットへのアクセス時にシークレットを取得することができます。
IBM Cloud CLI から IAM 資格情報を取得するには、ibmcloud secrets-manager secret
コマンドを実行します。
-
IAM 資格情報シークレットのコンテンツを取得します。
ibmcloud secrets-manager secret --id $SECRET_ID --output json
次の JSON スニペットは、応答の例を示しています。
{ "metadata": { "collection_type": "application/vnd.ibm.secrets-manager.secret+json", "collection_total": 1 }, "resources": [ { "access_groups": [ "AccessGroupId-e7e1a364-c5b9-4027-b4fe-083454499a20" ], "api_key": "pVTL3W7o1uqIWSE8sSh8ebNhRN4-d1D0W9GcPVgwcLUr", "created_by": "iam-ServiceId-222b47ab-b08e-4619-b68f-8014a2c3acb8", "creation_date": "2020-12-15T14:31:42Z", "crn": "crn:v1:bluemix:public:secrets-manager:us-south:a/a5ebf2570dcaedf18d7ed78e216c263a:f1bc94a6-64aa-4c55-b00f-f6cd70e4b2ce:secret:cb7a2502-8ede-47d6-b5b6-1b7af6b6f563", "description": "Extended description for my secret.", "labels": [ "storage", "us-south" ], "last_update_date": "2020-12-15T14:31:42Z", "name": "test-iam-credentials", "secret_group_id": "432b91f1-ff6d-4b47-9f06-82debc236d90", "secret_type": "IAM_CREDENTIALS", "service_id": "ServiceId-0576925a-9651-4f3e-b8c7-ce1332324aa4", "state": 1, "state_description": "Active", "ttl": 900 } ] }
レスポンスボディには、シークレット用に生成された一回限りの
api_key
値とservice_id
値が表示されます。ttl
値は、資格情報の有効期間(秒単位)を示します。 -
新たに生成された API キーが指定された環境変数をエクスポートします。
前のステップで生成した
api_key
値をコピーし、環境変数として設定します。export API_key="<api_key>"
API キーを使用したアクセス・トークンの生成
前のステップで取得した API キーを使用して、IAM アクセス・トークンを生成できます。 このトークンは、IAM 資格情報に対して最初に定義した期間のみ有効です。
IAM Identity Services APIを呼び出すことで、API キーを IAM アクセストークンと交換できる。 IAM トークンを生成するには、コマンド・ラインから以下の cURL コマンドを実行します。
export IAM_TOKEN=`curl -X POST \
"https://iam.cloud.ibm.com/identity/token" \
-H "Content-Type: application/x-www-form-urlencoded" \
-H "Accept: application/json" \
-d "grant_type=urn%3Aibm%3Aparams%3Aoauth%3Agrant-type%3Aapikey&apikey=$API_KEY" | jq -r ".access_token"`; echo $IAM_TOKEN
成功! Cloud Object Storage バケットにアクセスするために使用できる有効な IAM トークンが生成されました。 次のステップに進んでください。
ストレージ・バケットへのアクセス
付与されている権限が少ないユーザーは、前のステップで生成したアクセス・トークンを使用して Cloud Object Storage バケットの読み取りおよび書き込みを行えるようになりました。 IAM 資格情報のリース期間が切れると、関連付けられた API キーは自動的に取り消されます。
コマンド・ラインで、以下の cURL 要求を実行し、Cloud Object Storage インスタンス内のバケットをリストします。
curl -X GET \
"https://s3.us-south.cloud-object-storage.appdomain.cloud" \
-H "Authorization: Bearer $IAM_TOKEN" \
-H "ibm-service-instance-id: $COS_INSTANCE_ID" \
-H "Accept: application/json"
以下の XML スニペットは応答の例を示しています。
<ListAllMyBucketsResult xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
<Owner>
<ID>cccbd89c-6eb0-4aed-8ffb-899d39bc022e</ID>
<DisplayName>cccbd89c-6eb0-4aed-8ffb-899d39bc022e</DisplayName>
</Owner>
<Buckets>
<Bucket>
<Name>test-secrets-tutorial</Name>
<CreationDate>2020-12-14T21:40:55.739Z</CreationDate>
</Bucket>
</Buckets>
</ListAllMyBucketsResult>
test-secrets-tutorial
バケットの内容を表示するには、以下のコマンドを実行します。
curl -X GET \
"https://s3.us-south.cloud-object-storage.appdomain.cloud/test-secrets-tutorial" \
-H "Authorization: Bearer $IAM_TOKEN" \
-H "ibm-service-instance-id: $COS_INSTANCE_ID" \
-H "Accept: application/json"
以下の XML スニペットは応答の例を示しています。
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ListBucketResult xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
<Name>test-secrets-tutorial</Name>
<Prefix></Prefix>
<Marker></Marker>
<MaxKeys>1000</MaxKeys>
<Delimiter></Delimiter>
<IsTruncated>false</IsTruncated>
<Contents>
<Key>sample.txt</Key>
<LastModified>2020-12-14T21:49:29.502Z</LastModified>
<ETag>"df756a3769fcab0a261880957590c768"</ETag>
<Size>42</Size>
<Owner>
<ID>cccbd89c-6eb0-4aed-8ffb-899d39bc022e</ID>
<DisplayName>cccbd89c-6eb0-4aed-8ffb-899d39bc022e</DisplayName>
</Owner>
<StorageClass>STANDARD</StorageClass>
</Contents>
</ListBucketResult>
最後に、バケツ内のオブジェクトを読み込むには、以下のコマンドを実行すればよい。
curl -X GET \
"https://s3.us-south.cloud-object-storage.appdomain.cloud/test-secrets-tutorial/sample.txt" \
-H "Authorization: Bearer $IAM_TOKEN" \
-H "ibm-service-instance-id: $COS_INSTANCE_ID" \
-H "Accept: application/json"
sample.txt
を、バケットにアップロードしたファイルの名前に置き換えます。 以下の画面は応答の例を示しています。
A quick brown fox jumps over the lazy dog.
(オプション) リソースのクリーンアップ
本チュートリアルで作成したリソースが今後不要な場合は、以下の手順を実行して、アカウントからリソースを削除できます。
-
テスト Cloud Object Storage インスタンスを削除します。
ibmcloud resource service-instance-delete test-cos-instance-tutorial
-
テスト Secrets Manager インスタンスを削除します。
ibmcloud resource service-instance-delete test-sm-instance-tutorial
-
テスト・アクセス・グループを削除します。
ibmcloud resource access-group-delete $ACCESS_GROUP
-
テスト・サービス ID を削除します。
ibmcloud resource service-id-delete $SERVICE_ID
次のステップ
お疲れさまでした。 このチュートリアルでは、動的シークレットを持つ Cloud Object Storage バケットにアクセスするための Secrets Manager のセットアップ方法について学習しました。 Secrets Manager の開始に役立つリソースをさらにチェックしてください。
- シークレット・タイプについて、さらに詳しくご覧ください。
- シークレット・グループでアクセス戦略を設計します。
- Secrets Manager API の詳細をご覧ください。