IBM Cloud Docs
許可を使用した、サービス間のアクセス権限の付与

許可を使用した、サービス間のアクセス権限の付与

IBM Cloud® Identity and Access Management (IAM) を使用して、あるサービスに別のサービスへのアクセス権限を付与する許可を作成または削除します。 許可の委任を使用して、依存サービスへのアクセス権限を付与するアクセス・ポリシーを自動的に作成します。

IAMの機能の多くは、 IBM Cloud リソースへのユーザーおよびアプリケーションのアクセスを管理し、強制することに重点が置かれています。 しかし、あるサービスに別のサービス内のユーザーのリソースへのアクセス権限を提供する必要があるような他のシナリオが発生する場合もあります。 このタイプのアクセスは、許可と呼ばれます。

許可におけるソース・サービスとは、ターゲット・サービスへのアクセス権限を付与されたサービスです。 選択した役割によって、ソース・サービスのアクセス・レベルが定義されます。 ターゲット・サービスとは、割り当てる役割に基づいて、ソース・サービスがアクセスする許可を付与するサービスです。 ソース・サービスは、許可が作成されたのと同じアカウントに含めることも、別のアカウントに含めることもできます。 ターゲット・サービスは常に、許可が作成されたアカウント内にあります。 IBM Cloud® コンソールの「許可」ページで特定の許可の「ソース・アカウント」列を表示することにより、ソース・サービスが現在のアカウントに配置されているか、別のアカウントに配置されているかを確認できます。

従属サービスの許可

場合によっては、ソース・サービスに加えて依存サービスを許可できます。 ターゲット・サービスへのアクセスが有効になっているソース・サービスは、別のサービスに依存しています。 ワークフローを完了するには、依存サービスにアクセス権限を割り当てる必要があります。 以下の図は、ソース・サービス、ターゲット・サービス、および従属サービスの間でアクセス権限を委任するプロセスを示しています。

従属サービスでの

S2S 許可。
S2Sオーソライゼーションと依存サービスの関係

役割の詳細については 、「サービスアクセス権限 」を参照してください。

次の例では、ソース、ターゲット、従属サービスの関係について説明します。 例えば、データを保管するために IBM Cloud Object Storage のインスタンスに依存する IBM Watson® サービスがあるとします。 IBM Watson サービスと IBM® Key Protect サービスの間で許可を有効にするときに、Object Storage インスタンスがユーザーの Key Protect インスタンスのキーにアクセスする必要が生じる場合があります。 したがって、許可は IBM Watson サービスと Key Protect サービスの間であると同時に、Object Storage サービスには IBM Watson サービスの依存サービスとしてのアクセス権限も与えられます。 依存サービスの許可を有効にするオプションを選択すると、依存サービスに対してポリシーが自動的に作成されるため、追加のアクションを実行する必要はありません。

ソース・サービスの依存サービスがソース・サービスのアカウントにある可能性があります。これは、アカウントで可視ではないことを意味します。 ただし、依存サービスのソース・サービスによって作成されたアクセス・ポリシーは、常に可視です。 ユーザーが作成した許可や、作成されたソース・サービスは、「許可」ページの特定の許可の「タイプ」列で確認できます。

コンソールでの許可の作成

サービス間の許可を作成するには、ターゲット・サービスにアクセスできる必要があります。 ターゲット・サービスのユーザーとして保持しているアクセス・レベルのみを付与できます。 例えば、ターゲット・サービスでビューアー権限がある場合、許可に割り当てることができるのはビューアーの役割のみです。

  1. IBM Cloud コンソールで、「管理」 > **「アクセス (IAM)」をクリックし、「許可」**を選択します。

  2. 「作成」 をクリックします。

  3. ソース・アカウントを選択します。

    • 対象にアクセスする必要があるソースがこのアカウントにある場合は、 このアカウントを選択します。
    • ターゲットへのアクセスが必要なソースが別のアカウントにある場合は 、「別のアカウント」 を選択します。 次に、ソース・アカウントのアカウント ID を入力します。
  4. アクセスが必要なサービス (複数可) を選択します。

    • 個々のサービスを選択し、ソースにすべてのリソースを含めるか、特定のリソース・グループ内のインスタンスのみを含めるか、アカウント内の特定のインスタンスのみを含めるかを指定できます。
    • 新規 「すべての ID およびアクセス対応サービス」 を選択して、リソース・グループ ID を選択または入力することもできます。

    新規 ソースとしてリソース・グループを入力すると、リソース・グループ内のサービス・インスタンスに、アカウント内のターゲット・リソースへのアクセス権限が付与されます。 リソースへの直接アクセスを許可しない場合は、このレベルのアクセスをセットアップすることをお勧めします。

  5. ターゲットを選択します。

  6. ターゲットにすべてのリソースを含めるか、特定のリソースを含めるかを指定します。 特定のリソースをターゲットとして選択した場合は、属性を追加して、アクセス権限をさらにスコープすることができます。 属性のタイプは、選択したターゲット・サービスによって異なります。

  7. (オプション) ソース サービスが依存サービスにアクセスを委任できるようにするには、[ソース サービスと依存サービスによる承認の委任を有効にする] を選択します。 このオプションは、ソース・サービスに依存サービスがある場合にのみ表示されます。 このオプションを選択すると、依存サービスのソース・サービスによってポリシーが自動的に作成されます。

  8. ターゲット・サービスにアクセスするソース・サービスに対して、アクセス権限を割り当てるための役割を選択します。

  9. 「許可」 をクリックします。

別のアカウントのサービスと、現在のアカウントのターゲットサービスとの間で認証を作成する場合は、ターゲットリソースへのアクセス権限のみが必要です。 ソース・アカウントの場合は、アカウント番号のみが必要です。

CLI を使用した許可の作成

ソース・サービスからターゲット・サービスへのアクセスを許可するには、ibmcloud iam authorization-policy-create コマンドを実行します。

次のサンプルでは、モック・データを使用して、IBM Cloud Object Storage の特定のソース・サービス・インスタンスが IBM Key Protect の特定のターゲット・サービス・インスタンスにアクセスすることを許可するポリシーを作成します。

ibmcloud iam authorization-policy-create cloud-object-storage kms Reader --source-service-instance-id 123123 --target-service-instance-id 456456

このコマンドで利用可能なすべてのパラメーターについて詳しくは、ibmcloud iam authorization-policy-create を参照してください。

Terraform を使用した許可の作成

サービス間の許可を作成するには、ターゲット・サービスにアクセスできる必要があります。 ターゲット・サービスのユーザーとして保持しているアクセス・レベルのみを付与できます。 例えば、ターゲット・サービスでビューアー権限がある場合、許可に割り当てることができるのはビューアーの役割のみです。

Terraform を使用して許可を作成する前に、以下を完了していることを確認してください。

  • Terraform CLI をインストールし、Terraform 用の IBM Cloud プロバイダー・プラグインを構成します。 詳しくは、 IBM Cloud® のチュートリアルを参照してください。 このプラグインは、以下のタスクを実行するために使用される IBM Cloud API を抽象化します。
  • main.tfという名前の Terraform 構成ファイルを作成します。 このファイルでは、 HashiCorp 構成言語を使用してリソースを定義します。 詳細については 、Terraformのドキュメントを参照してください。

Terraformを使用して認証を作成するには、以下の手順に従います

  1. main.tf ファイルで ibm_iam_authorization_policy リソース引数を使用して、サービス間の許可ポリシーを作成します。

    以下の例では、サービス間の許可を作成します。

    resource "ibm_iam_authorization_policy" "policy" {
    source_service_name = "cloud-object-storage"
    target_service_name = "kms"
    roles               = ["Reader"]
    description         = "Authorization Policy"
    transaction_id     = "terraformAuthorizationPolicy"
    }
    

    ibm_iam_authorization_policy リソースには、ソース・サービス、ターゲット・サービス、および役割が必要です。 ソース・サービスにはターゲット・サービスへのアクセス権限が付与され、役割はアクセスが許可する許可のレベルになります。 オプションで、許可およびトランザクション ID の説明を追加できます。

    その他の例については、 許可リソースに関する Terraform の資料を参照してください。

  2. 構成ファイルの作成が完了したら、Terraform CLI を初期化します。 詳しくは、 作業ディレクトリーの初期化を参照してください。

    terraform init
    
  3. main.tf ファイルからリソースをプロビジョンします。 詳しくは、 Terraform を使用したインフラストラクチャーのプロビジョニングを参照してください。

    1. terraform plan を実行して、提案されたアクションをプレビューするための Terraform 実行プランを生成します。

      terraform plan
      
    2. terraform apply を実行して、計画に定義されているリソースを作成します。

      terraform apply
      

API を使用した許可の作成

ソース・サービスからターゲット・サービスへのアクセスを許可するには、IAM Policy Management API を使用します。 type=authorization を指定してポリシー・メソッドを作成する方法については、次の API の例を参照してください。

許可ポリシーの作成でサポートされる属性は、それぞれのサービスが何をサポートしているかによって異なります。 各サービスでサポートされる属性について詳しくは、使用しているサービスの資料を参照してください。

curl --request POST \
  --url https://iam.cloud.ibm.com/v1/policies \
  --header 'Authorization: Bearer <token>' \
  --header 'Content-Type: application/json' \
  --data '{
    "type": "authorization",
    "subjects": [
        {
            "attributes": [
                {
                    "name": "accountId",
                    "value": "<account-id>"
                },
                {
                    "name": "serviceName",
                    "value": "<service-name>"
                },
                {
                    "name": "serviceInstance",
                    "value": "<instance-id>"
                }
            ]
        }
    ],
    "roles": [
        {
            "role_id": "crn:v1:bluemix:public:iam::::serviceRole:Reader"
        }
    ],
    "resources": [
        {
            "attributes": [
                {
                    "name": "accountId",
                    "value": "<account-id>"
                },
                {
                    "name": "serviceName",
                    "value": "<service-name>"
                },
                {
                    "name": "serviceInstance",
                    "value": "<instance-id>"
                },
                {
                    "name": "resourceType",
                    "value": "<resource-type>"
                },
                {
                    "name": "resource",
                    "value": "<id>"
                }
            ]
        }
    ]
}'
SubjectAttribute accountSubjectAttribute = new SubjectAttribute.Builder()
      .name("accountId")
      .value(exampleAccountId)
      .build();

SubjectAttribute serviceNameSubjectAttribute = new SubjectAttribute.Builder()
      .name("serviceName")
      .value(exampleSourceServiceName)
      .build();

SubjectAttribute serviceInstanceSubjectAttribute = new SubjectAttribute.Builder()
      .name("serviceInstance")
      .value(exampleSourceServiceInstanceId)
      .build();

PolicySubject policySubjects = new PolicySubject.Builder()
      .addAttributes(accountSubjectAttribute)
      .addAttributes(serviceNameSubjectAttribute)
      .addAttributes(serviceInstanceSubjectAttribute)
      .build();

PolicyRole policyRoles = new PolicyRole.Builder()
      .roleId("crn:v1:bluemix:public:iam::::serviceRole:Reader")
      .build();

ResourceAttribute accountIdResourceAttribute = new ResourceAttribute.Builder()
      .name("accountId")
      .value(exampleAccountId)
      .operator("stringEquals")
      .build();

ResourceAttribute serviceNameResourceAttribute = new ResourceAttribute.Builder()
      .name("serviceName")
      .value(exampleTargetServiceName)
      .operator("stringEquals")
      .build();

ResourceAttribute serviceInstanceResourceAttribute = new ResourceAttribute.Builder()
      .name("serviceInstance")
      .value(exampleTargetInstanceId)
      .operator("stringEquals")
      .build();

ResourceAttribute resourceTypeResourceAttribute = new ResourceAttribute.Builder()
      .name("resourceType")
      .value(exampleResourceType)
      .operator("stringEquals")
      .build();

ResourceAttribute resourceResourceAttribute = new ResourceAttribute.Builder()
      .name("resource")
      .value(exampleResourceId)
      .operator("stringEquals")
      .build();

PolicyResource policyResources = new PolicyResource.Builder()
      .addAttributes(accountIdResourceAttribute)
      .addAttributes(serviceNameResourceAttribute)
      .addAttributes(serviceInstanceResourceAttribute)
      .addAttributes(resourceTypeResourceAttribute)
      .addAttributes(resourceResourceAttribute)
      .build();

CreatePolicyOptions options = new CreatePolicyOptions.Builder()
      .type("authorization")
      .subjects(Arrays.asList(policySubjects))
      .roles(Arrays.asList(policyRoles))
      .resources(Arrays.asList(policyResources))
      .build();

Response<Policy> response = service.createPolicy(options).execute();
Policy policy = response.getResult();

System.out.println(policy);
const policySubjects = [
  {
    attributes: [
      {
        name: 'accountId',
        value: exampleAccounId,
      },
      {
        name: 'serviceName',
        value: exampleSourceServiceName,
      },
      {
        name: 'serviceInstance',
        value: exampleSourceServiceInstaceId,
      },
    ],
  },
];
const policyRoles = [
  {
    role_id: 'crn:v1:bluemix:public:iam::::serviceRole:Reader',
  },
];
const accountIdResourceAttribute = {
  name: 'accountId',
  value: exampleAccountId,
  operator: 'stringEquals',
};
const serviceNameResourceAttribute = {
  name: 'serviceName',
  value: exampleTargetServiceName,
  operator: 'stringEquals',
};
const serviceInstanceResourceAttribute = {
  name: 'serviceInstance',
  value: exampleTargetServiceInstanceId,
  operator: 'stringEquals',
};
const resourceTypeResourceAttribute = {
  name: 'resourceType',
  value: exampleResourceType,
  operator: 'stringEquals',
};
const resourceResourceAttribute = {
  name: 'resource',
  value: exampleResourceId,
  operator: 'stringEquals',
};

const policyResources = [
  {
    attributes: [
      accountIdResourceAttribute,
      serviceNameResourceAttribute,
      serviceInstanceResourceAttribute,
      resourceTypeResourceAttribute,
      resourceResourceAttribute,
    ],
  },
];
const params = {
  type: 'authorization',
  subjects: policySubjects,
  roles: policyRoles,
  resources: policyResources,
};

iamPolicyManagementService.createPolicy(params)
  .then(res => {
    examplePolicyId = res.result.id;
    console.log(JSON.stringify(res.result, null, 2));
  })
  .catch(err => {
    console.warn(err)
  });
policy_subjects = PolicySubject(
    attributes=[SubjectAttribute(name='accountId', value=example_account_id),
                SubjectAttribute(name='serviceName', value=example_source_service_name),
                SubjectAttribute(name='serviceInstance', value=example_source_service_instance_id)])
policy_roles = PolicyRole(
    role_id='crn:v1:bluemix:public:iam::::serviceRole:Reader')
account_id_resource_attribute = ResourceAttribute(
    name='accountId', value=example_account_id)
service_name_resource_attribute = ResourceAttribute(
    name='serviceName', value=example_target_service_name)
service_instance_resource_attribute = ResourceAttribute(
    name='serviceInstance', value=example_target_service_instance_id)
resource_type_resource_attribute = ResourceAttribute(
    name='resourceType', value=example_resource_type)
resource_resource_attribute = ResourceAttribute(
    name='resource', value=example_resource_id)
policy_resources = PolicyResource(
    attributes=[account_id_resource_attribute,
                service_name_resource_attribute,
                service_instance_resource_attribute,
                resource_type_resource_attribute,
                resource_resource_attribute])

policy = iam_policy_management_service.create_policy(
    type='authorization',
    subjects=[policy_subjects],
    roles=[policy_roles],
    resources=[policy_resources]
).get_result()

print(json.dumps(policy, indent=2))
accountSubjectAttribute := &iampolicymanagementv1.SubjectAttribute{
    Name:  core.StringPtr("accountId"),
    Value: &exampleAccountID,
}
serviceNameSubjectAttribute := &iampolicymanagementv1.SubjectAttribute{
    Name:  core.StringPtr("serviceName"),
    Value: &exampleSourceServiceName,
}
serviceInstanceSubjectAttribute := &iampolicymanagementv1.SubjectAttribute{
    Name:  core.StringPtr("serviceInstance"),
    Value: &exampleSourceServiceInstanceId,
}
policySubjects := &iampolicymanagementv1.PolicySubject{
    Attributes: []iampolicymanagementv1.SubjectAttribute{*accountSubjectAttribute,
        *serviceNameSubjectAttribute, *serviceInstanceSubjectAttribute},
}
policyRoles := &iampolicymanagementv1.PolicyRole{
    RoleID: core.StringPtr("crn:v1:bluemix:public:iam::::serviceRole:Reader"),
}
accountIDResourceAttribute := &iampolicymanagementv1.ResourceAttribute{
    Name:     core.StringPtr("accountId"),
    Value:    core.StringPtr(exampleAccountID),
    Operator: core.StringPtr("stringEquals"),
}
serviceNameResourceAttribute := &iampolicymanagementv1.ResourceAttribute{
    Name:     core.StringPtr("serviceName"),
    Value:    core.StringPtr(exampleTargetServiceName),
    Operator: core.StringPtr("stringEquals"),
}
serviceInstanceResourceAttribute := &iampolicymanagementv1.ResourceAttribute{
    Name:     core.StringPtr("serviceInstance"),
    Value:    core.StringPtr(exampleTargetServiceInstanceId),
    Operator: core.StringPtr("stringEquals"),
}
resourceTypeResourceAttribute := &iampolicymanagementv1.ResourceAttribute{
    Name:     core.StringPtr("resourceType"),
    Value:    core.StringPtr(exampleResourceType),
    Operator: core.StringPtr("stringEquals"),
}
resourceResourceAttribute := &iampolicymanagementv1.ResourceAttribute{
    Name:     core.StringPtr("resource"),
    Value:    core.StringPtr(exampleResourceId),
    Operator: core.StringPtr("stringEquals"),
}
policyResources := &iampolicymanagementv1.PolicyResource{
    Attributes: []iampolicymanagementv1.ResourceAttribute{
        *accountIDResourceAttribute, *serviceNameResourceAttribute,
        *serviceInstanceResourceAttribute, *resourceTypeResourceAttribute,
        *resourceResourceAttribute},
}

options := iamPolicyManagementService.NewCreatePolicyOptions(
    "authorization",
    []iampolicymanagementv1.PolicySubject{*policySubjects},
    []iampolicymanagementv1.PolicyRole{*policyRoles},
    []iampolicymanagementv1.PolicyResource{*policyResources},
)

policy, response, err := iamPolicyManagementService.CreatePolicy(options)
if err != nil {
    panic(err)
}
b, _ := json.MarshalIndent(policy, "", "  ")
fmt.Println(string(b))

すべてのサービスが resourceType および個別の resource レベルでポリシーをサポートするわけではありません。 一例として、これらの属性をサポートするサービスには IBM Cloud Object Storage と IBM Key Protect があり、バケットと鍵はリソース・タイプで、ID は特定のリソースを指定するためにリストされます。

resourceType として resource-group を使用する許可の作成

resource-group をソースまたはターゲットとして使用する許可を作成するには、 IAM ポリシー管理 API を使用します。

ソースとしての resource-group

resource-group をソースとして指定してポリシー・メソッドを作成する方法については、以下の API の例を参照してください。

{
 "type": "authorization",
    "subjects": [
        {
            "attributes": [
                {
                    "name": "resourceGroupId",
                    "value": "<rgId>"
                },
                {
                    "name": "accountId",
                    "value": "<sourceAccountId>"
                }
            ]
        }
    ],
    "roles": [
        {
            "role_id": "crn:v1:bluemix:public:iam::::role:Viewer"
        }
    ],
    "resources": [
        {
            "attributes": [
                {
                    "name": "accountId",
                    "value": "<targetAccountId>"
                },
                {
                    "name": "serviceName",
                    "value": "<targetService>"
                },
                {
                    "name": "serviceInstance",
                    "value": "<targetServiceInstance>"
                }
            ]
        }
    ]
}

ターゲットとしての resource-group

resource-group をターゲットとして指定してポリシー・メソッドを作成する方法については、以下の API の例を参照してください。

{
 "type": "authorization",
    "subjects": [
        {
            "attributes": [
                {
                    "name": "accountId",
                    "value": "<sourceAccountId>"
                },
                {
                    "name": "serviceName",
                    "value": "<sourceService>"
                },
                {
                    "name": "serviceInstance",
                    "value": "<sourceServiceInstance>"
                }
            ]
        }
    ],
    "roles": [
        {
            "role_id": "crn:v1:bluemix:public:iam::::role:Viewer"
        }
    ],
    "resources": [
        {
            "attributes": [
                {
                    "name": "accountId",
                    "value": "<targetAccountId>"
                },
                {
                    "name": "resourceType",
                    "value": "resource-group"
                }
            ]
        }
    ]
}

コンソールでの許可の削除

ターゲット・サービスの管理者の役割が割り当てられている場合は、アカウント内のサービス間の許可を削除できます。 依存サービスのソース・サービスによって作成されたアクセス・ポリシーを削除すると、ソース・サービスはワークフローを完了したり、ターゲット・サービスにアクセスしたりできなくなります。

  1. IBM Cloud コンソールで、「管理」 > **「アクセス (IAM)」をクリックし、「許可」**を選択します。
  2. アカウントから削除する許可の行を識別します。
  3. アクション・アイコンアクション・アイコン > 削除をクリックします。
  4. **「削除」**を選択します。

アカウントからソース・サービスが削除されると、そのサービスによってその依存サービスに対して作成されたポリシーはすべて自動的に削除されます。 同様に、依存サービスがアカウントから削除されると、そのサービスに委任されたアクセス・ポリシーも削除されます。

CLI を使用した許可の削除

ターゲット・サービスの管理者の役割が割り当てられている場合は、アカウント内のサービス間の許可を削除できます。 依存サービスのソース・サービスによって作成されたアクセス・ポリシーを削除すると、ソース・サービスはワークフローを完了したり、ターゲット・サービスにアクセスしたりできなくなります。

ソース・サービスにターゲット・サービスへのアクセスを許可するには、ibmcloud iam authorization-policy-create コマンドを実行します。

許可ポリシーを削除する例を以下に示します。

ibmcloud iam authorization-policy-delete 12345678-abcd-1a2b-a1b2-1234567890ab

このコマンドで利用可能なすべてのパラメーターについて詳しくは、ibmcloud iam authorization-policy-delete を参照してください。

アカウントからソース・サービスが削除されると、そのサービスによってその依存サービスに対して作成されたポリシーはすべて自動的に削除されます。 同様に、依存サービスがアカウントから削除されると、そのサービスに委任されたアクセス・ポリシーも削除されます。

API を使用した許可の削除

ターゲット・サービスの管理者の役割が割り当てられている場合は、アカウント内のサービス間の許可を削除できます。 依存サービスのソース・サービスによって作成されたアクセス・ポリシーを削除すると、ソース・サービスはワークフローを完了したり、ターゲット・サービスにアクセスしたりできなくなります。

以下のサンプル要求に示すように、許可ポリシーを削除するには、IAM Policy Management API を使用します。

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

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

iamPolicyManagementService.deletePolicy(params)
  .then(res => {
    console.log(JSON.stringify(res, null, 2));
  })
  .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)
}

アカウントからソース・サービスが削除されると、そのサービスによってその依存サービスに対して作成されたポリシーはすべて自動的に削除されます。 同様に、依存サービスがアカウントから削除されると、そのサービスに委任されたアクセス・ポリシーも削除されます。

Terraformを使用して認証を削除する

Terraform を使用して許可を削除する場合は、 main.tf ファイルから引数を削除する必要があります。 引数を削除した後、以下のステップを使用してファイルをプロビジョンします。

  1. terraform plan を実行して、提案されたアクションをプレビューするための Terraform 実行プランを生成します。

    terraform plan
    
  2. terraform apply を実行して、計画に定義されているリソースを作成します。

    terraform apply