IBM Cloud Docs
アクセス・ポリシーの監査

アクセス・ポリシーの監査

アカウント内のポリシーの数を減らし、各ユーザーに必要な最低限のアクセスだけを維持するには、使用頻度の低いアクセスポリシーを特定することができます。 これらを削除するかどうかを決定できます。また、場合によっては、あまり使用されないポリシーが予期されることもあります。

アクセスポリシーは、アカウント内のユーザー、サービスID、アクセスグループ、および信頼されたプロファイルに、アカウントリソースへのアクセスと操作の権限を与える方法です。 ポリシーには、サブジェクト、ターゲット、役割が含まれます。 サブジェクトとは、アクセス権限を提供する対象のユーザー、サービス ID、またはアクセス・グループです。 ポリシーのターゲットとは、権限を付与するアクセス対象リソースです。 また、 IBM Cloud Identity and Access Management (IAM) の役割は、ポリシーの対象に対するアクセスレベルや許可されたアクションを定義します。 ユーザーとサービス ID のアクセス・ポリシーに加えて、特定のサービスまたはサービスのインスタンスが他のサービスにアクセスできるようにする、許可と呼ばれるポリシー・タイプがあります。 サービス間のアクセス権限の割り当てについて詳しくは、許可を使用した、サービス間のアクセス権限の付与を参照してください。 アクセス・ポリシーについて詳しくは、 IAM ポリシーとは何ですか? 誰が割り当てることができますか? を参照してください。

IAM は各ポリシーの許可情報をキャプチャーします。 この情報には、最後にポリシーが使用されて許可が与えられた日時と、その使用回数が含まれます。

コンソールでの非アクティブ・ポリシーの管理

非アクティブなポリシーのレポートには、過去30日以上アクセスが許可されていないポリシーが表示されます。 アクセスを許可したことがないポリシーは含まれません。

非アクティブ・ポリシーを表示するには、AM Insight サービス、IAM アクセス管理サービス、またはすべてのアカウント管理サービスに対するエディター以上の役割が必要です。

コンソールで非アクティブ・ポリシーを管理するには、以下のステップを実行します。

  1. IBM Cloud コンソールで、 [管理] > [アクセス(IAM) ]をクリックし、 [無効なポリシー] を選択します。
  2. レポート内の非アクティブ・ポリシーを削除できるかどうかを判別します。
  3. 非アクティブなポリシーを削除するには、 「アクション」 アイコン 「アクション」アイコン > 「削除」 をクリックします。

ポリシーを削除すると、そのポリシーは許可評価に含まれなくなります。 IAM は、削除されたすべてのポリシーのコピーを 10 日間保持します。 この期間中は、いつでもそれらをリストおよび復元できます。 削除したポリシーを復元するには、 API を使用した削除したポリシーの復元 を参照してください。

ユーザー・アクセス・ポリシー・レポートのエクスポート

アカウント所有者である場合、ユーザー管理サービスに対するエディター以上の役割を持っている場合、または IAM アクセス管理サービスに対するエディター以上の役割を持っている場合は、アカウント内の各ユーザーのアクセス・ポリシー・レポートをエクスポートできます。 アクセス・ポリシー・レポートには、ユーザーが所有するすべてのアクセス・ポリシーがリストされます。これには、そのユーザーがメンバーになっているアクセス・グループに関連付けられているポリシーも含まれます。

ユーザーのアクセス・ポリシーを監査することにより、最小限の特権という原則を使用していることが保証されます。 このレポートを使用して、ユーザーが適切なアクセス・ポリシーに割り当てられているかどうかを判別し、アクセス・ポリシーの数を減らすために必要なアクションを実行します。

レポートをエクスポートするには、以下のステップを実行します。

  1. IBM Cloud コンソールで 、「管理」 > 「アクセス(IAM)」 の順に選択し 、「ユーザー」 を選択します。
  2. 監査するユーザーを決定し、 「アクション」 アイコン 「アクション」アイコン > 「レポートへのアクセス」 をクリックします。
  3. **「JSON のダウンロード」または「CSV のダウンロード」**をクリックします。

API を使用した、最終許可情報を持つポリシーのリスト表示

カウントまたは最終使用でソートされた最終許可情報を含むすべてのアカウント・ポリシーがリストされます。 ポリシー・メタデータは、IAM ポリシー管理 API を使用して取得できます。

curl -X GET https://iam.cloud.ibm.com/v1/policies?account_id=<>&format=include_last_permit&sort=-last_modified_at \
  -H 'Authorization: Bearer $TOKEN' \
  -H 'Content-Type: application/json'
ListPoliciesOptions options = new ListPoliciesOptions.Builder()
    .accountId(exampleAccountId)
    .iamId(exampleUserId)
    .format("include_last_permit")
    .build();

Response<PolicyList> response = service.listPolicies(options).execute();
PolicyList policyList = response.getResult();

System.out.println(policyList);
const params = {
  accountId: exampleAccountId,
  iamId: exampleUserId,
  format: 'include_last_permit',
};

iamPolicyManagementService.listPolicies(params)
  .then(res => {
    console.log('listPolicies() result:\n' + JSON.stringify(res.result, null, 2));
  })
  .catch(err => {
    console.warn(err)
  });
policy_list = iam_policy_management_service.list_policies(
  account_id=example_account_id, iam_id=example_user_id, format='include_last_permit'
).get_result()

print(json.dumps(policy_list, indent=2))
options := iamPolicyManagementService.NewListPoliciesOptions(
  exampleAccountID,
)
options.SetIamID(exampleUserID)
options.SetFormat("include_last_permit")

policyList, response, err := iamPolicyManagementService.ListPolicies(options)
if err != nil {
  panic(err)
}
b, _ := json.MarshalIndent(policyList, "", "  ")
fmt.Println(string(b))
  • format=include_last_permit: 各ポリシーの最終許可情報を含めます。
  • sort=last_permit_at: 日付の昇順にソートします。 どの許可にも使用されていないポリシーと最も古い許可が最初にリストされます。

応答のフォーマットは JSON 形式で表されます。

{
    "policies": [
        {
            "id": "45b226ac-490d-47f3-a785-990e0c729d93",
            "type": "access",
            "subjects": [...],
            "roles": [...],
            "resources": [...],
            ...
            "last_modified_at": "2021-04-09T14:36:30.505Z",
            "last_modified_by_id": "IBMid-310000JVN5",
            "last_permit_at": null,       <-- IAM has no record of this policy ever granting a permit decision. This will be reset when this policy is deleted.
          "last_permit_frequency": 0,
            "state": "active"
        },
        {
            "id": "11155157-afb3-4792-9ebd-b1f5547be224",
            "type": "access",
            "subjects": [...],
            "roles": [...],
            "resources": [...],
            ...
            "last_modified_at": "2019-05-09T15:28:07.045Z",
            "last_modified_by_id": "IAM",
            "last_permit_at": "2021-04-20T19:45:44.058Z",
            "last_permit_frequency": 137,  <-- it has been used this many times since IAM started keeping track
            "state": "active"
        },
...

APIを使用して使用していないポリシーを削除する

しばらくアクセス権限の付与に使用されていない 1 つ以上のポリシーを特定しました。 使用されていないポリシーは、以下の例に示すようにして削除できます。

curl -X DELETE https://iam.cloud.ibm.com/v1/policies/{examplePolicyId} \
    -H 'Authorization: Bearer $TOKEN'
DeletePolicyOptions options = new DeletePolicyOptions.Builder()
    .policyId(examplePolicyId)
    .build();

service.deletePolicy(options).execute();
const params = {
  policyId: examplePolicyId,
};

iamPolicyManagementService.deletePolicy(params)
  .then(res => {
    console.log('deletePolicy() response status code: ' + res.status);
  })
  .catch(err => {
    console.warn(err)
  });
response = iam_policy_management_service.delete_policy(
  policy_id=example_policy_id
).get_result()

print(json.dumps(response, indent=2))
options := iamPolicyManagementService.NewDeletePolicyOptions(
  examplePolicyID,
)

response, err := iamPolicyManagementService.DeletePolicy(options)
if err != nil {
  panic(err)
}

詳しくは、ID によるポリシーの削除を参照してください。

ポリシーは削除され、許可の評価には含まれなくなります。 IAM は、削除されたすべてのポリシーのコピーを 10 日間保持します。

API を使用した削除済みポリシーの復元

最近削除されたポリシーが必要であることが判明しました。 その場合、以下のステップに従ってポリシーを復元できます。

  1. アカウント内の削除されたポリシーをリストし、最終変更時刻でソートします。

    curl -X GET https://iam.cloud.ibm.com/v1/policies?account_id=<>&state=deleted&sort=last_modified_at \
      -H 'Authorization: Bearer $TOKEN' \
      -H 'Content-Type: application/json'
    
    ListPoliciesOptions options = new ListPoliciesOptions.Builder()
          .accountId(exampleAccountId)
          .iamId(exampleUserId)
          .state("deleted")
          .sort("last_modified_at")
          .build();
    
    Response<PolicyList> response = service.listPolicies(options).execute();
    PolicyList policyList = response.getResult();
    
    System.out.println(policyList);
    
    const params = {
      accountId: exampleAccountId,
      iamId: exampleUserId,
      sort: 'last_modified_at',
      state: 'deleted'
    };
    
    iamPolicyManagementService.listPolicies(params)
      .then(res => {
          console.log('listPolicies() result:\n' + JSON.stringify(res.result, null, 2));
      })
      .catch(err => {
          console.warn(err)
      });
    
    policy_list = iam_policy_management_service.list_policies(
      account_id=example_account_id, iam_id=example_user_id, state='deleted', sort='last_modified_at'
    ).get_result()
    
    print(json.dumps(policy_list, indent=2))
    
    options := iamPolicyManagementService.NewListPoliciesOptions(
      exampleAccountID,
    )
    options.SetIamID(exampleUserID)
    options.SetSort("last_modified_at")
    options.SetState("deleted")
    
    policyList, response, err := iamPolicyManagementService.ListPolicies(options)
    if err != nil {
      panic(err)
    }
    b, _ := json.MarshalIndent(policyList, "", "  ")
    fmt.Println(string(b))
    

    応答のフォーマットは JSON 形式で表されます。

    {
        "policies": [
            {
                "id": examplePolicyId1,
                "type": "access",
                "subjects": [...],
                "roles": [...],
                "resources": [...],
                ...
                "last_modified_at": "2021-04-09T14:36:30.505Z",
                "last_modified_by_id": "IBMid-310000JVN5",
                "last_permit_at": null,
                "last_permit_frequency": 0,
                "state": "deleted"  <-- deleted policy
            },
            {
                "id": examplePolicyId2,
                "type": "access",
                "subjects": [...],
                "roles": [...],
                "resources": [...],
                ...
                "last_modified_at": "2019-05-09T15:28:07.045Z",
                "last_modified_by_id": "IAM",
                "last_permit_at": null,
                "last_permit_frequency": 0,
                "state": "deleted"  <-- deleted policy
            },
    ...
    
  2. 以前に取得したポリシー ID を使用して、ポリシーを復元できます。

    curl -X PATCH 'https://iam.cloud.ibm.com/v1/policies/{examplePolicyId}' \
      -H 'Authorization: Bearer $TOKEN' \
      -H 'Content-Type: application/json' \
      -H 'If-Match: $ETAG' \
      -d '{"state": "active"}'
    
    PatchPolicyOptions patchPolicyOptions = new PatchPolicyOptions.Builder()
            .policyId(examplePolicyId)
            .ifMatch(examplePolicyEtag)
            .state("active")
            .build();
    
    Response<Policy> response = service.patchPolicy(patchPolicyOptions).execute();
    Policy policy = response.getResult();
    
    System.out.println(policy);
    
    const params = {
      policyId: examplePolicyId,
      ifMatch: examplePolicyETag,
      state: 'active'
    };
    
    iamPolicyManagementService.patchPolicy(params)
      .then(res => {
        console.log(JSON.stringify(res.result, null, 2));
      })
      .catch(err => {
        console.warn(err)
      });
    
    policy = iam_policy_management_service.patch_policy(
      policy_id=example_policy_id,
      if_match=example_updated_policy_etag,
      state='active'
    ).get_result()
    
    print(json.dumps(policy, indent=2))
    
    options := iamPolicyManagementService.NewPatchPolicyOptions(
      examplePolicyID,
      examplePolicyETag,
    )
    
    options.SetState("active")
    
    policy, response, err := iamPolicyManagementService.PatchPolicy(options)
    if err != nil {
      panic(err)
    }
    b, _ := json.MarshalIndent(policy, "", "  ")
    fmt.Println(string(b))
    

    応答のフォーマットは JSON 形式で表されます。

    {
        "id": examplePolicyId,
        "type": "access",
        "subjects": [...],
        "roles": [...],
        "resources": [...],
        ...
        "last_modified_at": "2021-04-09T14:36:30.505Z",
        "last_modified_by_id": "IBMid-310000JVN5",
        "last_permit_at": null,
        "last_permit_frequency": 0,
        "state": "active"  <-- policy is active again
    }
    

    詳しくは、ID による削除済みポリシーの復元を参照してください。

次のステップ

さまざまな観点から、アカウント内のアクセス権限の割り当てに関する洞察を得ることができます。 特定のリソースにアクセスできる ID とサービスについては、 リソースへのアクセスの監査 を参照してください。