サービス間のアクセスを許可する権限の管理
IBM Cloud®'Identity and Access Management(IAM)を使用して、'IBM Cloud Metrics Routing'IBM Cloud Monitoringサービスへのアクセスを許可する権限を作成または削除する。
IAMの機能の多くは、IBM Cloudリソースへのユーザーとアプリケーションのアクセスを管理・強制することに重点を置いている。 しかし、あるサービスに別のサービス内のユーザーのリソースへのアクセス権限を提供する必要があるような他のシナリオが発生する場合もあります。 このタイプのアクセスは、許可と呼ばれます。
許可におけるソース・サービスとは、ターゲット・サービスへのアクセス権限を付与されたサービスです。 選択した役割によって、ソース・サービスのアクセス・レベルが定義されます。 ターゲット・サービスとは、割り当てる役割に基づいて、ソース・サービスがアクセスする許可を付与するサービスです。 ソース・サービスは、許可が作成されたのと同じアカウントに含めることも、別のアカウントに含めることもできます。 ターゲット・サービスは常に、許可が作成されたアカウント内にあります。 ソース・サービスが現在のアカウントにあるのか、別のアカウントにあるのかは、IBM Cloudコンソールの Authorizations ページで特定の権限の Source account 列を表示することで確認できます。
権限を管理するための権限
サービス間の認可を管理するには、対象サービスへのアクセス権が必要です。
IBM Cloud Metrics Routingサービスに対して定義する承認には、 IBM Cloud Monitoringサービスに対する Administrator
ロールが必要です。
次の表は、承認を定義するためにターゲット サービスで必要な権限の概要を示しています。
アクション | 管理者 | オペレーター | エディター | ビューアー |
---|---|---|---|---|
アカウントに設定されているすべての権限を表示する | ||||
承認を作成する | ||||
権限を削除する |
ユーザーは、アカウントで設定した承認のみを表示できます。
コンソールでの許可の作成
以下のステップを実行します。
-
IBM Cloud コンソールで、「管理」 > **「アクセス (IAM)」をクリックし、「許可」**を選択します。
-
「作成」 をクリックします。
-
ソース・アカウントを選択します。
ターゲット・サービスへのアクセスを必要とするソース・サービスがこのアカウント内にある場合は、**「このアカウント」**を選択します。
ターゲット・サービスへのアクセスを必要とするソース・サービスが別のアカウント内にある場合は、**「他のアカウント」**を選択します。 次に、ソース・アカウントのアカウント ID を入力します。
-
ソース・サービスとしてIBM Cloud Metrics Routingを選択します。 次に、アクセスの範囲を 「すべてのリソース」 に設定します。
-
対象サービスとしてIBM Cloud Monitoringを選択します。 次に、選択した属性に基づいてリソース>サービス インスタンスを構成して、アクセスの範囲をすべてのリソースまたは単一のインスタンスに設定します。
このタイプの承認では他の属性はサポートされていません。
-
[*サービス アクセス]*セクションで、 [スーパーテナント メトリック パブリッシャー] を選択して、ターゲット サービスにアクセスするソース サービスへのアクセス権を割り当てます。
-
「許可」 をクリックします。
別のアカウントのサービスと現在のアカウントのターゲット・サービスの間に許可を作成する場合は、ターゲット・リソースへのアクセス権限のみが必要です。 ソース・アカウントの場合は、アカウント番号のみが必要です。
CLI を使用した許可の作成
サービス間の許可を作成するには、ターゲット・サービスにアクセスできる必要があります。 IBM Cloud Metrics Routingサービスに対して定義する承認には、 IBM Cloud Monitoringサービスに対する Administrator
ロールが必要です。
ポリシーと承認を作成するための IAM 権限がある場合は、対象サービスのユーザーとして持っているアクセス レベルのみを付与できます。 例えば、対象サービスのビューアアクセスを持っている場合、ビューアロールのみを権限に割り当てることができます。 管理者などの上位の権限を割り当てようとすると、権限が付与されたように見えますが、割り当てられるのは対象サービスに対して持っている最高レベルの権限、つまり閲覧者のみです。
次のコマンドを実行して、 IBM Cloud Metrics Routingサービスの承認を作成します。
ibmcloud iam authorization-policy-create metrics-router sysdig-monitor "Supertenant Metrics Publisher"
[--target-service-instance-name TARGET_SERVICE_INSTANCE_NAME | --target-service-instance-id TARGET_SERVICE_INSTANCE_ID]
を使用して、特定のIBM Cloud Monitoringインスタンスのスコープを設定できます。- 他のスコープ オプションは提供しないでください。
このコマンドで利用可能なすべてのパラメーターについて詳しくは、ibmcloud iam authorization-policy-create を参照してください。
Terraform を使用した許可の作成
Terraform を使用して承認を作成する前に、次の作業が完了していることを確認してください。
- Terraform CLI をインストールし、Terraform のIBM Cloudプロバイダー プラグインを構成します。 詳細については、 IBM Cloud®での Terraform の使用開始 に関するチュートリアルを参照してください。 このプラグインは、以下のタスクを実行するために使用される IBM Cloud API を抽象化します。
main.tf
という名前の Terraform 構成ファイルを作成します。 このファイルでは、 HashiCorp構成言語を使用してリソースを定義します。 詳しくは Terraformのドキュメントを参照。
以下の手順で、Terraformを使って認可を作成する:
-
main.tf
ファイルのibm_iam_authorization_policy
リソース引数を使用して、サービス間の承認ポリシーを作成します。次の例では、サービス間の承認を作成します。
resource "ibm_iam_authorization_policy" "policy" { source_service_name = "metrics-router" target_service_name = "sysdig-monitor" roles = ["Supertenant Metrics Publisher"] description = "Authorization Policy" transaction_id = "terraformAuthorizationPolicy" }
ibm_iam_authorization_policy
リソースには、ソース サービス、ターゲット サービス、およびロールが必要です。 ソース サービスにはターゲット サービスへのアクセス権が付与され、ロールはアクセスによって許可される権限のレベルです。 必要に応じて、承認の説明とトランザクション ID を追加できます。- 特定のIBM Cloud Monitoringインスタンスをスコープするには、
target_resource_instance_id
を指定できます。 - その他の例については、認可リソースに関する Terraform ドキュメントを参照してください。
- 特定のIBM Cloud Monitoringインスタンスをスコープするには、
-
構成ファイルの構築が完了したら、Terraform CLI を初期化します。 詳細については、 「作業ディレクトリの初期化」を参照してください。
terraform init
-
main.tf
ファイルからリソースをプロビジョニングします。 詳細については、 「Terraform を使用したインフラストラクチャのプロビジョニング」を参照してください。-
terraform plan
を実行して Terraform 実行プランを生成し、提案されたアクションをプレビューします。terraform plan
-
terraform apply
を実行して、プランで定義されているリソースを作成します。terraform apply
-
API を使用した許可の作成
サービス間の許可を作成するには、ターゲット・サービスにアクセスできる必要があります。 ターゲット・サービスのユーザーとして保持しているアクセス・レベルのみを付与できます。 IBM Cloud Metrics Routingサービスに対して定義する承認には、 IBM Cloud Monitoringサービスに対する Administrator
ロールが必要です。
ソース・サービスからターゲット・サービスへのアクセスを許可するには、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": "metrics-router"
}
]
}
],
"roles": [
{
"role_id": "crn:v1:bluemix:public:sysdig-monitor::::serviceRole:Publisher"
}
],
"resources": [
{
"attributes": [
{
"name": "accountId",
"value": "<account-id>"
},
{
"name": "serviceName",
"value": "sysdig-monitor"
}
]
}
]
}'
SubjectAttribute accountSubjectAttribute = new SubjectAttribute.Builder()
.name("accountId")
.value(exampleAccountId)
.build();
SubjectAttribute serviceNameSubjectAttribute = new SubjectAttribute.Builder()
.name("serviceName")
.value("metrics-router")
.build();
PolicySubject policySubjects = new PolicySubject.Builder()
.addAttributes(accountSubjectAttribute)
.addAttributes(serviceNameSubjectAttribute)
.build();
PolicyRole policyRoles = new PolicyRole.Builder()
.roleId("crn:v1:bluemix:public:sysdig-monitor::::serviceRole:Publisher")
.build();
ResourceAttribute accountIdResourceAttribute = new ResourceAttribute.Builder()
.name("accountId")
.value(exampleAccountId)
.operator("stringEquals")
.build();
ResourceAttribute serviceNameResourceAttribute = new ResourceAttribute.Builder()
.name("serviceName")
.value("sysdig-monitor")
.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)
.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: "metrics-router",
}
],
},
];
const policyRoles = [
{
role_id: 'crn:v1:bluemix:public:sysdig-monitor::::serviceRole:Publisher',
},
];
const accountIdResourceAttribute = {
name: 'accountId',
value: exampleAccountId,
operator: 'stringEquals',
};
const serviceNameResourceAttribute = {
name: 'serviceName',
value: "sysdig-monitor"",
operator: 'stringEquals'
};
const policyResources = [
{
attributes: [
accountIdResourceAttribute,
serviceNameResourceAttribute
],
},
];
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="metrics-router")
])
policy_roles = PolicyRole(
role_id='crn:v1:bluemix:public:sysdig-monitor::::serviceRole:Publisher')
account_id_resource_attribute = ResourceAttribute(
name='accountId', value=example_account_id)
service_name_resource_attribute = ResourceAttribute(
name='serviceName', value="sysdig-monitor")
policy_resources = PolicyResource(
attributes=[account_id_resource_attribute,
service_name_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,
Operator: core.StringPtr("stringEquals"),
}
serviceNameSubjectAttribute := &iampolicymanagementv1.SubjectAttribute{
Name: core.StringPtr("serviceName"),
Value: "metrics-router",
Operator: core.StringPtr("stringEquals"),
}
policySubjects := &iampolicymanagementv1.PolicySubject{
Attributes: []iampolicymanagementv1.SubjectAttribute{*accountSubjectAttribute,
*serviceNameSubjectAttribute},
}
policyRoles := &iampolicymanagementv1.PolicyRole{
RoleID: core.StringPtr("crn:v1:bluemix:public:sysdig-monitor::::serviceRole:Publisher"),
}
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("sysdig-monitor"),
Operator: core.StringPtr("stringEquals"),
}
policyResources := &iampolicymanagementv1.PolicyResource{
Attributes: []iampolicymanagementv1.ResourceAttribute{
*accountIDResourceAttribute, *serviceNameResourceAttribute},
}
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))
コンソールでの許可の削除
対象のサービスに「Administrator
ロールが割り当てられている場合、アカウント内のサービス間の権限を削除することができます。 依存サービスのソース・サービスによって作成されたアクセス・ポリシーを削除すると、ソース・サービスはワークフローを完了したり、ターゲット・サービスにアクセスしたりできなくなります。
- IBM Cloud コンソールで、「管理」 > **「アクセス (IAM)」をクリックし、「許可」**を選択します。
- アカウントから削除する許可の行を識別します。
- アクション・アイコン
> 削除をクリックします。
- **「削除」**を選択します。
アカウントからソース・サービスが削除されると、そのサービスによってその依存サービスに対して作成されたポリシーはすべて自動的に削除されます。 同様に、依存サービスがアカウントから削除されると、そのサービスに委任されたアクセス・ポリシーも削除されます。
CLI を使用した許可の削除
対象のサービスに「Administrator
ロールが割り当てられている場合、アカウント内のサービス間の権限を削除することができます。 依存サービスのソース・サービスによって作成されたアクセス・ポリシーを削除すると、ソース・サービスはワークフローを完了したり、ターゲット・サービスにアクセスしたりできなくなります。
許可ポリシーを削除する例を以下に示します。
ibmcloud iam authorization-policy-delete 12345678-abcd-1a2b-a1b2-1234567890ab
このコマンドで利用可能なすべてのパラメーターについて詳しくは、ibmcloud iam authorization-policy-delete を参照してください。
アカウントからソース・サービスが削除されると、そのサービスによってその依存サービスに対して作成されたポリシーはすべて自動的に削除されます。 同様に、依存サービスがアカウントから削除されると、そのサービスに委任されたアクセス・ポリシーも削除されます。
API を使用した許可の削除
対象のサービスに「Administrator
ロールが割り当てられている場合、アカウント内のサービス間の権限を削除することができます。 依存サービスのソース・サービスによって作成されたアクセス・ポリシーを削除すると、ソース・サービスはワークフローを完了したり、ターゲット・サービスにアクセスしたりできなくなります。
以下のサンプル要求に示すように、許可ポリシーを削除するには、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
ファイルから引数を削除する必要があります。 引数を削除した後、次の手順に従ってファイルをプロビジョニングします。
-
terraform plan
を実行して Terraform 実行プランを生成し、提案されたアクションをプレビューします。terraform plan
-
terraform apply
を実行して、プランで定義されているリソースを作成します。terraform apply