シークレットのロック

IBM Cloud® Secrets Manager で作業する場合、シークレットにロックを作成して、アプリケーションで使用中にシークレットが削除されたり変更されたりするのを防ぐことができます。

デフォルトでは、許可されたユーザーまたはアプリケーションは、 Secrets Manager で管理するシークレットをいつでも変更できます。 場合によっては、例えば、セキュリティー監査中に、チーム内の誰かが誤ってシークレットを削除しないようにしたいことがあります。 または、シークレットを定期的にローテートする予定の場合は、ローテーションの実行後にシークレットの最新バージョンを安全にデプロイする方法を探している可能性があります。 ロックを使用すると、以下のことに役立つ自動化ワークフローを作成できます。

  • シークレットが 1 つ以上のアプリケーションまたはサービスによって使用されていることを示します。
  • シークレットの有効期限が切れた後でもシークレット・データが削除されないようにします。
  • 最新バージョンがアプリケーションに完全にデプロイされたら、古いバージョンのシークレットを安全に削除してください。
  • アプリケーションの不注意によるダウン時間を回避します。

アプリケーションのダウン時間を回避するためにロックを使用する際に推奨されるガイドラインについては、 シークレットのローテーションとロックのベスト・プラクティス を参照してください。

開始前に

始める前に、必要なレベルのアクセス権限を持っていることを確認してください。 シークレットのロックを管理するには、 「管理者」 サービス役割 が必要です。

シークレットのロック

シークレットをロックすると、そのシークレット・データが変更または削除される可能性がある操作が防止されます。 シークレットをロックするには、現在のバージョンまたは以前のバージョンに 1 つ以上のロックを付加します。

シークレットがロックされている間にそのシークレットを変更または削除しようとすると、 Secrets Manager は HTTP 412 Precondition Failed 応答でそのリクエストを拒否する。 次のようなエラーメッセージが表示されます:

The requested action can't be completed because the secret version is locked.

IAM 資格情報などの 動的シークレット保護リソースへのアクセスを必要とするアプリケーションのために、動的に作成されてリースされる固有値 (パスワードや API キーなど)。 動的シークレットがリースの終了に達すると、保護リソースへのアクセスが取り消され、そのシークレットが自動的に削除されます。で作業している場合、シークレットをロックすると、デフォルトでそれらのシークレットを読み取ることもアクセスすることもできなくなります。 詳しくは、 ロックされた IAM 資格情報のシークレットを読み取ることができないのはなぜですか? を参照してください。

カスタム認証情報の秘密鍵は、そのタスクがすべて完了した時点でのみロックできる。

ロックされたシークレットが有効期限に達すると、そのシークレットは アクティブ 状態のままになり、そのデータはアプリケーションからアクセス可能な状態のままになります。 Secrets Manager は、シークレットを 破棄 状態に移行し、シークレットのすべてのロックが解除された後にのみ、有効期限が切れたシークレット・データを完全に削除します。

SSL / TLS 証明書は、ロックされていても、定められた有効期限に達し、 Destroyed 状態に移行する。 詳しくは、 ロックされた証明書が破棄済み状態に移行した理由 を参照してください。

  • 現行バージョンがロックされていて、前のバージョンがアンロックされているときにシークレットをローテートしようとすると (または自動ローテーションがスケジュールされている場合)、シークレットをローテートする要求が許可されます。 現在のシークレット・バージョンが新しい前のバージョンになり、既存のロックが保持されます。 新しい現行バージョンがロックなしで作成されます。
  • 以前のバージョンがロックされているときにシークレットをローテートしようとすると (または自動ローテーションがスケジュールされている場合)、シークレットをローテートする要求は拒否されます。 ローテーションは、前のシークレット・バージョンのすべてのロックが削除された後にのみ許可されます。

UIでのロックの作成

Secrets Manager UI を使用して、1 つのシークレットに対して最大 1000 個のロックを作成できます。 各ロックは、シークレットを使用する単一のアプリケーションまたはサービスを表すために使用できます。

シークレットに 1 つ以上のロックを付加すると、そのシークレットはロックされていると見なされます。 ロックは、アクティブなペイロードまたはシークレット・データを含むシークレット・バージョンにのみ適用できます。

新しいロックを作成し、1 回の操作で古いロックを削除するのに役立つように、ロック作成時にオプション・モードを指定することもできます。

オプションのロック・モードとその説明
モード 説明
以前のロックの削除 指定した名前と一致する他のロックをすべて除去します。 シークレットの前のバージョンで一致するロックが検出された場合、それらのロックは新しいロックの作成時に削除されます。

たとえば、秘密情報の以前のバージョンに、 lock-x というロックが含まれていると仮定します。 シークレットの現行バージョンに対するロックを作成し、 「一致するロックを削除」 オプションを有効にすると、前のバージョンから lock-x が削除されます。

前のロックを解除し、前のバージョンのデータを削除する 前のオプションと同じですが、さらに、関連付けられているロックがない場合、以前のシークレットバージョンのデータも完全に削除します。

秘密情報の以前のバージョンに、 lock-z というロックが含まれていると仮定します。 「一致するロックを削除 (Delete matching locks)」 オプションと 「前のバージョンのデータを削除 (Delete previous version data)」 オプションの両方を使用して、シークレットの現行バージョンに対するロックを作成すると、前のバージョンから lock-z が削除されます。 また、前のバージョンには他のロックが関連付けられていないため、前のバージョンに関連付けられている秘密データも削除されます。

現在のシークレットバージョンにロックを設定する

Secrets Manager UI を使用して、シークレットの現行バージョンをロックできます。 要求が成功すると、選択したシークレットの現行バージョンに新しいロックが付加されるか、同じ名前のロックが既に存在する場合はそのロックが置き換えられます。

  1. コンソールで、**「メニュー」**アイコン「メニュー」アイコン **>「リソース・リスト」**をクリックします。
  2. サービスのリストから、Secrets Manager のインスタンスを選択します。
  3. Secrets Manager UI で、**「シークレット」**リストに移動します。
  4. ロックしたい秘密の行で、[アクション]メニューの![アクション]アイコン > [ロック] > [ロックの作成] をクリックします。
  5. ロックを簡単に識別できるよう、名前と説明を追加してください。
  6. ロックするバージョンのリストから、 「現在」 を選択します。
  7. オプション: JSON 属性をロックに付加します。 自動化フローに必要な情報を保持するために、各ロックに JSON オブジェクトを含めることができます。 例えば、このロックに関連付けたいリソースを識別するキーと値のペアです。
  8. オプション: ロックを排他的にします。 指定した名前と一致する他のロックを削除するには、このオプションを選択します。 シークレットの前のバージョンで一致するロックが検出された場合、それらのロックは新しいロックの作成時に削除されます。
  9. オプション:以前のバージョンのデータを削除します。 以前のシークレット・バージョンに関連付けられているロックがない場合に、そのバージョンのデータも完全に削除するには、このオプションを選択します。
  10. 「作成」 をクリックします。 選択したシークレット・バージョンに対して新しいロックが作成されます。

前のシークレット・バージョンでのロックの作成

Secrets Manager の UI を使用して、以前のバージョンのシークレットをロックできます。 要求が成功すると、選択したシークレットの前のバージョンに新しいロックが付加されるか、同じ名前のロックが既に存在する場合はそのロックが置き換えられます。

  1. Secrets Manager UI で、**「シークレット」**リストに移動します。
  2. ロックしたい秘密の行で、[アクション]メニューの![アクション]アイコン > [ロック] > [ロックの作成] をクリックします。
  3. ロックを簡単に識別できるよう、名前と説明を追加してください。
  4. ロックするバージョンのリストから、 「前へ」 を選択します。
  5. オプション: JSON 属性をロックに付加します。 自動化フローに必要な情報を保持するために、各ロックに JSON オブジェクトを含めることができます。 例えば、このロックに関連付けたいリソースを識別するキーと値のペアです。
  6. 「作成」 をクリックします。 選択したシークレット・バージョンに対して新しいロックが作成されます。

CLI からのロックの作成

Secrets Manager CLI を使用して、1 つのシークレットに対して最大 1000 個のロックを作成できます。 各ロックは、シークレットを使用する単一のアプリケーションまたはサービスを表すために使用できます。

シークレットに 1 つ以上のロックを付加すると、そのシークレットはロックされていると見なされます。 ロックは、アクティブなペイロードまたはシークレット・データを含むシークレット・バージョンにのみ適用できます。

新しいロックを作成し、1 回の操作で古いロックを削除するのに役立つように、ロック作成時にオプション・モードを指定することもできます。

オプションのロック・モードとその説明
モード 説明
以前のロックの削除 指定した名前と一致する他のロックをすべて除去します。 シークレットの前のバージョンで一致するロックが検出された場合、それらのロックは新しいロックの作成時に削除されます。

たとえば、秘密情報の以前のバージョンに、 lock-x というロックが含まれていると仮定します。 シークレットの現行バージョンに対するロックを作成し、 「一致するロックを削除」 オプションを有効にすると、前のバージョンから lock-x が削除されます。

前のロックを解除し、前のバージョンのデータを削除する 前のオプションと同じですが、さらに、関連付けられているロックがない場合、以前のシークレットバージョンのデータも完全に削除します。

秘密情報の以前のバージョンに、 lock-z というロックが含まれていると仮定します。 「一致するロックを削除 (Delete matching locks)」 オプションと 「前のバージョンのデータを削除 (Delete previous version data)」 オプションの両方を使用して、シークレットの現行バージョンに対するロックを作成すると、前のバージョンから lock-z が削除されます。 また、前のバージョンには他のロックが関連付けられていないため、前のバージョンに関連付けられている秘密データも削除されます。

現在のシークレットバージョンにロックを設定する

Secrets Manager CLI を使用して、シークレットの現行バージョンをロックできます。 要求が成功すると、選択したシークレットの現行バージョンに新しいロックが付加されるか、同じ名前のロックが既に存在する場合はそのロックが置き換えられます。

Secrets Manager CLI プラグインを使用してシークレットの現行バージョンに対するロックを作成するには、 ibmcloud secrets-manager secret-locks-bulk-create コマンドを実行します。 シークレットのタイプ、シークレット ID、およびモードを指定できます。

ibmcloud secrets-manager secret-locks-bulk-create \
    --id=exampleString \
    --locks='[{"name": "lock-example-1", "description": "lock for consumer 1", "attributes": {"anyKey": "anyValue"}}]' \
    --mode=remove_previous

API を使用したロックの作成

Secrets Manager API を使用して、1 つのシークレットに対して最大 1000 個のロックを作成できます。 各ロックは、シークレットを使用する単一のアプリケーションまたはコンシューマーを表すために使用できます。 要求が成功すると、シークレットに新しいロックが付加されるか、同じ名前のロックが既に存在する場合はそのロックが置き換えられます。

シークレットに 1 つ以上のロックを付加すると、そのシークレットはロックされていると見なされます。 ロックは、アクティブなペイロードまたはシークレット・データを含むシークレット・バージョンにのみ適用できます。

新しいロックを作成し、1 回の操作で古いロックを削除するのに役立つように、ロック作成時にオプション・モードを指定することもできます。

オプションのロック・モードとその説明
モード 照会パラメーター 説明
以前のロックの削除 mode=remove_previous 指定した名前と一致する他のロックをすべて除去します。 シークレットの前のバージョンで一致するロックが検出された場合、それらのロックは新しいロックの作成時に削除されます。

たとえば、秘密情報の以前のバージョンに、 lock-x というロックが含まれていると仮定します。 現行のシークレット・バージョンでロックを作成し、 remove_previous モードを有効にすると、前のバージョンから lock-x が削除されます。

以前のロックの削除 mode=remove_previous_and_delete remove_previous 」オプションと同様ですが、さらに、関連付けられているロックがない場合、以前のシークレットバージョンのデータも完全に削除します。

秘密情報の以前のバージョンに、 lock-z というロックが含まれていると仮定します。 現行のシークレット・バージョンでロックを作成し、 remove_previous_and_delete モードを有効にすると、前のバージョンから lock-z が削除されます。 また、前のバージョンには他のロックが関連付けられていないため、前のバージョンに関連付けられている秘密データも削除されます。

現在のシークレット・バージョンでのロックの作成

以下の要求は、シークレットの現行バージョンに対して 2 つのロックを作成します。 API を呼び出す場合は、ID 変数と IAM トークンを、ご使用の Secrets Manager インスタンス固有の値で置き換えます。

curl -X POST
-H "Authorization: Bearer {iam_token}" \
-H "Accept: application/json" \
-H "Content-Type: application/json" \
-d '{
      "locks": [
        {
          "name": "lock-1",
          "description": "Lock for consumer 1.",
          "attributes": {
            "key": "value"
          }
        },
        {
          "name": "lock-2",
          "description": "Lock for consumer 2.",
          "attributes": {
            "key": "value"
            }
          }
        ]
      }' \
    "https://{instance_ID}.{region}.secrets-manager.appdomain.cloud/api/v2/secrets/{id}/locks_bulk"

自動化フローを作成する場合は、 attributes オブジェクトを使用して、シークレットに対する各ロックでキー値データを指定できます。 例えば、ID やクラウド・リソース名 (CRN) などのリソース ID を含めることができます。

成功すると、新しいロックに関する詳細と、その他のメタデータが応答で返されます。

{
  "secret_id": "0cf4addb-7a90-410b-a3a7-a15bbe2b7909",
  "secret_group_id": "d8371728-95c8-4c12-b2af-1af98adb9e41",
  "versions": [
    {
      "version_id": "7bf3814d-58f8-4df8-9cbd-f6860e4ca973",
      "version_alias": "current",
      "locks": [
        "lock-3",
        "lock-4"
      ],
      "payload_available": true
    },
    {
      "version_id": "5bf89b0c-df55-c8d5-7ad6-8816951c6784",
      "version_alias": "previous",
      "locks": [
        "lock-1",
        "lock-2"
      ],
      "payload_available": true
    }
  ]
}

必須およびオプションの要求パラメーターについて詳しくは、API リファレンスをチェックしてください。

前のシークレット・バージョンでのロックの作成

以下の要求は、前のバージョンのシークレットに対して 2 つのロックを作成します。 API を呼び出す場合は、ID 変数と IAM トークンを、ご使用の Secrets Manager インスタンス固有の値で置き換えます。

curl -X POST
    -H "Authorization: Bearer {iam_token}" \
    -H "Accept: application/json" \
    -H "Content-Type: application/json" \
    -d '{
      "locks": [
        {
          "name": "lock-1",
          "description": "Lock for consumer 1.",
          "attributes": {
            "key": "value"
            }
          },
          {
            "name": "lock-2",
            "description": "Lock for consumer 2.",
            "attributes": {
              "key": "value"
              }
            }
          ]
        }' \ "https://{instance_ID}.{region}.secrets-manager.appdomain.cloud/api/v2/secrets/{id}/versions/{version_id}/locks_bulk"

成功すると、新しいロックに関する詳細と、その他のメタデータが応答で返されます。

{
  "secret_id": "0cf4addb-7a90-410b-a3a7-a15bbe2b7909",
  "secret_group_id": "d8371728-95c8-4c12-b2af-1af98adb9e41",
  "versions": [
    {
      "version_id": "7bf3814d-58f8-4df8-9cbd-f6860e4ca973",
      "version_alias": "current",
      "locks": [
        "lock-3",
        "lock-4"
      ],
      "payload_available": true
    },
    {
      "version_id": "5bf89b0c-df55-c8d5-7ad6-8816951c6784",
      "version_alias": "previous",
      "locks": [
        "lock-1",
        "lock-2"
      ],
      "payload_available": true
    }
  ]
}

必須およびオプションの要求パラメーターについて詳しくは、API リファレンスをチェックしてください。

シークレットのアンロック

シークレットは、関連するロックがすべて取り除かれた後にのみ、ロックが解除され、変更または削除が可能になるとみなされる。 Secrets Manager UI または API を使用して、シークレットに関連付けられているロックを削除できます。

UIでのロックの削除

Secrets Manager UI を使用して、既存のシークレットに付加されているロックを削除できます。

  1. コンソールで、**「メニュー」**アイコン「メニュー」アイコン **>「リソース・リスト」**をクリックします。
  2. サービスのリストから、Secrets Manager のインスタンスを選択します。
  3. Secrets Manager UI で、**「シークレット」**リストに移動します。
  4. 更新したい秘密の行で、 [アクション]メニューの [アクション]アイコン > [ロック ] をクリックします。
  5. 削除したいロックの行で、 [アクション] メニューの![アクション]アイコン をクリックし 、[削除] を選択します
  6. 削除を確認するには、シークレットの名前を入力します。 **「削除」**をクリックします。

これでロックが削除されました。 シークレットを完全にアンロックするには、既存のロックをすべて解除します。

API を使用したロックの削除

Secrets Manager API を使用して、特定のシークレット・バージョンに関連付けられている 1 つ以上のロックを削除できます。

要求が成功すると、指定したロックが削除されます。 すべてのロックを解除するには、要求本体で {"locks": ["*"]} を渡すことができます。 それ以外の場合は、削除するロックの名前を指定します。 例えば、{"locks": ["lock-1", "lock-2"]} です。

シークレットにロックが含まれているかどうかを確認するには、シークレットのメタデータの一部として返される locks_total フィールドを確認します。

curl -X DELETE  
  -H "Authorization: Bearer {iam_token}" \
  -H "Accept: application/json" \
  "https://{instance_ID}.{region}.secrets-manager.appdomain.cloud/api/v2/secrets/{secret_id}/versions/{id}/locks_bulk?name=[ "lock-example-1" ]"

必須およびオプションの要求パラメーターについて詳しくは、API リファレンスをチェックしてください。