基于时间和资源属性的条件限制访问
您可以设置基于时间的条件,指定临时访问您帐户中的资源,或允许在特定时间段内访问资源,还可以设置基于资源属性的条件,避免为满足访问需求而创建多个访问策略。
您可以创建基于时间的条件,在特定的时间段内一次性临时访问,也可以设置每周重复访问。 例如,您可能希望仅在工作时间通过指定重复访问权限来授予用户访问帐户资源的权限,或者您可能有承包商或用户需要演示服务的功能,而他们只需要临时访问权限。
对于实行夏令时的时区,基于时间的条件不考虑夏令时(DST)的变化。 管理员必须根据夏令时调整更新策略,以准确执行基于时间的条件。 例如,东部时区在夏令时期间为 UTC-4 小时,而在标准时间期间则为 -5 小时。 标准时间从11月开始,到3月夏令时开始时结束。
Kubernetes Service 不遵守基于时间的条件。 例如,一项基于时间的条件政策允许访问所有启用身份识别和访问权限的服务,包括访问 Kubernetes Service 资源。 保单对象可在指定时间条件外使用部分 Kubernetes Service 资源。
访问策略的时间条件有助于您应用最小权限原则来分配访问权限,并在发生安全漏洞时减少攻击面。
当您创建基于资源属性的访问策略时,可以避免创建多个访问策略来满足您的访问需求。 相反,您可以使用 OR
/ AND
运算符的组合创建一个策略,这些运算符应用于具有文本或通配符值的资源属性。 您可以同时满足多个条件(AND)或满足其中一个条件(OR)的情况下授予访问权限。 例如,使用基于资源属性的条件,您可以创建一个允许基于以下条件进行访问的策略:Service instance: abc
,或者attribute-1: xyz
,或者**(attribute-2: def
和attribute-3: hij
)**。
您必须至少满足两个条件,即使用 OR
/ AND
和基于资源的属性条件。 如果您需要添加一个条件,请参阅 控制台中的资源访问权限分配,并在选择特定资源后添加条件。
要查看用户的访问权限,请 参阅在控制台中查看分配的访问权限。
条件模式
基于时间的条件模式
以下模式表示允许的条件排列:
模式 | 示例 |
---|---|
时间条件:一次 | 特定日期上午9点至下午5点临时开放 UTC-5。 |
时间条件:每周:全天 | 周一至周五全天可访问 UTC-5。 |
基于时间的条件:每周:自定义时间 | 周一至周五上午9点至下午5点,UTC-5。 |
IAM可防止在同一保单定义中合并一次性临时条件和每周重复性条件。
基于资源属性的条件模式
以下模式表示允许的条件排列:
模式 | 示例 |
---|---|
attribute-based-condition:resource:literal-and-wildcard |
基于资源属性的条件,带有字面值或通配符值(取决于所使用的操作符) |
通过控制台创建一个临时的时间条件
您可以通过指定日期和时间范围来限定访问权限,从而确定授予和终止访问权限的条件。 例如,您的某个用户可能需要使用您的账户进行几个小时的演示,或者您的某个承包商可能需要临时访问几天的服务。 请完成以下步骤,以指定一个基于时间的临时访问策略:
-
在 IBM Cloud 控制台中,依次选择 “管理” > “访问(IAM)”
-
根据您要为其分配访问权限的实体,选择用户、可信配置文件、服务ID 或访问组。
-
点击列表中的实体名称,进入访问页面。
-
单击分配访问权。
-
选择一项服务,然后点击 “下一步”。
- 如果您希望用户能够创建任何服务,请选择 “所有启用身份和访问权限的服务”。
- 如果您想为用户分配对特定服务的访问权限,请从列表中选择。
-
选择您希望为用户分配访问权限的资源,或选择“所有资源”。 单击下一步。
-
(可选)选择资源组访问角色。 单击下一步。
-
选择任意服务访问和平台访问角色组合,然后点击 “下一步”。
-
点击添加条件,选择一次性。
-
选择时区。
举个例子,假设您要为都柏林的开发人员创建一个条件策略。 在这种情况下,请选择
UTC+1
,以便在下一步中选择的日期和时间范围能够确保在正确的时间访问该位置。 -
请填写日期和时间范围,以确定条件何时允许和终止访问。
-
单击创建。
-
点击 “评论”。
-
点击 “添加” 将您的保单配置添加到保单摘要中。
-
单击分配。
临时政策不会自动删除。 为避免账户达到保单限额,管理员可以在保单到期后手动将其删除。
有关访问策略的时间条件的更多信息,请参阅 访问策略中的条件。
准备工作
请确保您拥有最新版本的 IBM Cloud CLI,以便在访问策略中使用条件。
要确定 IBM Cloud CLI 版本,请运行以下命令:
ibmcloud -v
您必须使用 CLI 的最新版本。 如果使用的不是最新版本,请运行以下命令来更新 CLI:
ibmcloud update
如果运行的是当前发行版,那么将显示以下输出:
Checking for updates...
No update required. Your CLI is already up-to-date.
更多信息,请参阅 安装独立 IBM Cloud CLI。
使用CLI创建一个临时的时间条件
您可以通过指定日期和时间范围来限定访问权限,从而确定授予和终止访问权限的条件。 例如,您的某个用户可能需要使用您的账户进行几个小时的演示,或者您的某个承包商可能需要临时访问几天的服务。 以下示例向您展示如何通过授予用户临时访问权限,使其作为操作员访问所有账户管理服务,从而为您的账户创建一个基于时间的单次条件。
-
登录 IBM Cloud® CLI。 如果您有多个帐户,系统会提示您选择要使用的帐户。 如果未使用
-r
标志指定区域,那么还必须选择区域。ibmcloud login
如果凭证被拒绝,说明您可能使用的是联合标识。 要使用联合标识登录,请使用
--sso
标志。 有关更多详细信息,请参阅使用联合标识进行登录。如果您是第一次使用 IBM Cloud CLI,请查看 入门教程。
-
使用以下命令创建访问策略并将其分配给用户或服务ID:
ibmcloud iam user-policy-create
。 -
为
Operator
角色分配所有账户管理服务的访问权限:ibmcloud iam service-policy-create [your service ID here] --roles Operator --account-management --api-version v2
-
请参考以下基于时间的临时策略JSON架构示例,创建您自己的条件:
{ "type": "access", "description": "time-based conditions policy example restricting access to the full day of 2022-12-23 UTC", "control": { "grant": { "roles": [ { "role_id": "crn:v1:bluemix:public:iam::::role:Operator" } ] } }, "resource": { "attributes": [ { "operator": "stringEquals", "value": "d4b763ad0cbd4dca8dd1edb427d7a77e", "key": "accountId" }, { "value": "platform_service", "operator": "stringEquals", "key": "serviceType" } ] }, "pattern": "time-based-conditions:once", "rule": { "operator": "and", "conditions": [ { "key": "{{environment.attributes.current_date_time}}", "operator": "dateTimeGreaterThanOrEquals", "value": "2022-12-23T00:00:00+00:00" }, { "key": "{{environment.attributes.current_date_time}}", "operator": "dateTimeLessThanOrEquals", "value": "2022-12-23T23:59:59+00:00" } ] }, "subject": { "attributes": [ { "key": "iam_id", "operator": "stringEquals", "value": "IBMid-550000HFVV" } ] } }
使用模式 time-based-conditions:once
的临时政策不会自动删除。 为避免账户达到保单限额,管理员可以在保单到期后手动将其删除。
有关访问策略的时间条件的更多信息,请参阅 访问策略中的条件。
准备工作
请确保您拨打 v2/policies
URI,即 https://iam.coud.ibm.com/v2/policies
,以便在访问策略中使用条件。 更多信息,请参阅 IAM策略管理API 和 变更日志。
通过使用API创建一个临时的时间条件
您可以通过指定日期和时间范围来限定访问权限,从而确定授予和终止访问权限的条件。 例如,您的某个用户可能需要使用您的账户进行几个小时的演示,或者您的某个承包商可能需要临时访问几天的服务。 以下示例向您展示如何通过授予用户临时访问权限,使其作为操作员访问所有账户管理服务,从而为您的账户创建一个基于时间的临时条件。
subjectAttribute := &iampolicymanagementv1.V2PolicyAttribute{
Key: core.StringPtr("iam_id"),
Operator: core.StringPtr("stringEquals"),
Value: &exampleUserID,
}
policySubject := &iampolicymanagementv1.V2PolicyBaseSubject{
Attributes: []iampolicymanagementv1.V2PolicyAttribute{*subjectAttribute},
}
policyRole := &iampolicymanagementv1.PolicyRole{
RoleID: core.StringPtr("crn:v1:bluemix:public:iam::::role:Operator"),
}
v2PolicyGrant := &iampolicymanagementv1.V2PolicyBaseControlGrant{
Roles: []iampolicymanagementv1.PolicyRole{*policyRole},
}
v2PolicyControl := &iampolicymanagementv1.V2PolicyBaseControl{
Grant: v2PolicyGrant,
}
accountIDResourceAttribute := &iampolicymanagementv1.V2PolicyAttribute{
Key: core.StringPtr("accountId"),
Operator: core.StringPtr("stringEquals"),
Value: core.StringPtr(exampleAccountID),
}
serviceNameResourceAttribute := &iampolicymanagementv1.V2PolicyAttribute{
Key: core.StringPtr("serviceType"),
Operator: core.StringPtr("stringEquals"),
Value: core.StringPtr("service"),
}
policyResource := &iampolicymanagementv1.V2PolicyBaseResource{
Attributes: []iampolicymanagementv1.V2PolicyAttribute{
*accountIDResourceAttribute, *serviceNameResourceAttribute},
}
startConditionAttribute := &iampolicymanagementv1.V2PolicyAttribute{
Key: core.StringPtr("{{environment.attributes.current_time}}"),
Operator: core.StringPtr("dateTimeGreaterThanOrEquals"),
Value: core.StringPtr("2022-12-23T00:00:00+00:00"),
}
endConditionAttribute := &iampolicymanagementv1.V2PolicyAttribute{
Key: core.StringPtr("{{environment.attributes.current_time}}"),
Operator: core.StringPtr("dateTimeLessThanOrEquals"),
Value: core.StringPtr("2022-12-23T23:59:59+00:00"),
}
policyRule := &iampolicymanagementv1.V2PolicyBaseRule{
Operator: core.StringPtr("and"),
Conditions: []iampolicymanagementv1.V2PolicyAttribute{
*startConditionAttribute, *endConditionAttribute},
}
options := iamPolicyManagementService.NewV2CreatePolicyOptions(
"access",
v2PolicyControl,
)
options.SetSubject(policySubject)
options.SetResource(policyResource)
options.SetRule(policyRule)
options.SetPattern(*core.StringPtr("time-based-conditions:once"))
policy, response, err := iamPolicyManagementService.V2CreatePolicy(options)
if err != nil {
panic(err)
}
b, _ := json.MarshalIndent(policy, "", " ")
fmt.Println(string(b))
V2PolicyAttribute subjectAttribute = new V2PolicyAttribute.Builder()
.key("iam_id")
.value(EXAMPLE_USER_ID)
.operator("stringEquals")
.build();
V2PolicyBaseSubject policySubject = new V2PolicyBaseSubject.Builder()
.addAttributes(subjectAttribute)
.build();
V2PolicyAttribute accountIdResourceAttribute = new V2PolicyAttribute.Builder()
.key("accountId")
.value(exampleAccountId)
.operator("stringEquals")
.build();
V2PolicyAttribute serviceNameResourceAttribute = new V2PolicyAttribute.Builder()
.key("serviceName")
.value("iam-groups")
.operator("stringEquals")
.build();
V2PolicyBaseResource policyResource = new V2PolicyBaseResource.Builder()
.addAttributes(accountIdResourceAttribute)
.addAttributes(serviceNameResourceAttribute)
.build();
PolicyRole policyRoles = new PolicyRole.Builder()
.roleId("crn:v1:bluemix:public:iam::::role:Operator")
.build();
V2PolicyBaseControlGrant policyGrant = new V2PolicyBaseControlGrant.Builder()
.roles(Arrays.asList(policyRoles))
.build();
V2PolicyBaseControl policyControl = new V2PolicyBaseControl.Builder()
.grant(policyGrant)
.build();
V2PolicyAttribute startConditionAttribute = new V2PolicyAttribute.Builder()
.key("{{environment.attributes.current_time}}")
.value("2022-12-23T00:00:00+00:00")
.operator("dateTimeGreaterThanOrEquals")
.build();
V2PolicyAttribute endConditionAttribute = new V2PolicyAttribute.Builder()
.key("{{environment.attributes.current_time}}")
.value("2022-12-23T23:59:59+00:00")
.operator("dateTimeLessThanOrEquals")
.build();
V2PolicyBaseRuleV2RuleWithConditions policyRule = new V2PolicyBaseRuleV2RuleWithConditions.Builder()
.operator("and")
.conditions(new ArrayList<V2PolicyAttribute>(Arrays.asList(startConditionAttribute, endConditionAttribute)))
.build();
V2CreatePolicyOptions options = new V2CreatePolicyOptions.Builder()
.type("access")
.subject(policySubject)
.control(policyControl)
.resource(policyResource)
.rule(policyRule)
.pattern("time-based-conditions:once")
.build();
Response<V2Policy> response = service.v2CreatePolicy(options).execute();
V2Policy policy = response.getResult();
const policySubject = {
attributes: [
{
key: 'iam_id',
operator: 'stringEquals',
value: exampleUserId,
},
],
};
const policyResourceAccountAttribute = {
key: 'accountId',
value: exampleAccountId,
operator: 'stringEquals',
};
const policyResourceServiceAttribute = {
key: 'serviceName',
operator: 'stringEquals',
value: 'iam-groups',
};
const policyResource = {
attributes: [policyResourceAccountAttribute, policyResourceServiceAttribute]
};
const policyControl = {
grant: {
roles: [{
role_id: 'crn:v1:bluemix:public:iam::::role:Operator',
}],
}
};
const policyRule = {
operator: 'and',
conditions: [
{
key: '{{environment.attributes.current_time}}',
operator: 'dateTimeGreaterThanOrEquals',
value: '2022-12-23T00:00:00+00:00',
},
{
key: '{{environment.attributes.current_time}}',
operator: 'dateTimeLessThanOrEquals',
value: '2022-12-23T23:59:59+00:00',
},
],
}
const policyPattern = 'time-based-conditions:once'
const params = {
type: 'access',
subject: policySubject,
control: policyControl,
resource: policyResource,
rule: policyRule,
pattern: policyPattern,
};
try {
const res = await iamPolicyManagementService.v2CreatePolicy(params);
examplePolicyId = res.result.id;
console.log(JSON.stringify(res.result, null, 2));
} catch (err) {
console.warn(err)
}
policy_subject = V2PolicyBaseSubject(
attributes=[V2PolicyAttribute(key='iam_id', value=example_user_id, operator='stringEquals')]
)
policy_role = PolicyRole(role_id='crn:v1:bluemix:public:iam::::role:Operator')
account_id_resource_attribute = V2PolicyAttribute(
key='accountId', value=example_account_id, operator='stringEquals'
)
service_name_resource_attribute = V2PolicyAttribute(
key='serviceType', value='service', operator='stringEquals'
)
policy_resource = PolicyResource(
attributes=[account_id_resource_attribute, service_name_resource_attribute],
)
policy_control = V2PolicyBaseControl(grant=V2PolicyBaseControlGrant(roles=[policy_role]))
policy_rule = V2PolicyBaseRuleV2RuleWithConditions(
operator='and',
conditions=[
V2PolicyAttribute(
key='{{environment.attributes.current_time}}',
operator='dateTimeGreaterThanOrEquals',
value='2022-12-23T00:00:00+00:00',
),
V2PolicyAttribute(
key='{{environment.attributes.current_time}}',
operator='dateTimeLessThanOrEquals',
value='2022-12-23T23:59:59+00:00',
),
],
)
policy_pattern = 'time-based-conditions:once'
policy = iam_policy_management_service.v2_create_policy(
type='access',
subject=policy_subject,
control=policy_control,
resource=policy_resource,
rule=policy_rule,
pattern=policy_pattern,
).get_result()
print(json.dumps(policy, indent=2))
使用模式 time-based-conditions:once
的临时政策不会自动删除。 为避免账户达到保单限额,管理员可以在保单到期后手动将其删除。
有关访问策略的时间条件的更多信息,请参阅 访问策略中的条件。
使用控制台创建一个重复出现的基于时间的条件
您可以按周指定重复访问权限。 您可能希望仅在用户的工作时间允许其访问账户资源。 请完成以下步骤,以指定一个基于时间条件的重复访问策略:
-
在 IBM Cloud 控制台中,依次选择 “管理” > “访问(IAM)”
-
根据您要为其分配访问权限的实体,选择用户、可信配置文件、服务ID 或访问组。
-
点击列表中的身份名称,进入访问页面。
-
单击分配访问权。
-
选择一项服务,然后点击 “下一步”。
- 如果您希望用户能够创建任何服务,请选择 “所有启用身份和访问权限的服务”。
- 如果您想为用户分配对特定服务的访问权限,请从列表中选择。
-
选择您希望为用户分配访问权限的资源,或选择“所有资源”。 单击下一步。
-
(可选)选择资源组访问角色。 单击下一步。
-
选择任意服务访问和平台访问角色组合,然后点击 “下一步”。
-
点击添加条件,选择每周。
-
选择有条件策略的时区。
举个例子,假设您要为都柏林的开发人员创建一个条件策略。 在这种情况下,请选择
UTC+1
,以便在正确的时间为该地点设置您接下来选择的日期和时间范围。 -
选择您希望条件允许访问的星期几。
- (可选) 将全天 切换为否,以指定所选日期的时间范围。
-
单击创建。
-
点击 “评论”。
-
点击 “添加” 将您的保单配置添加到保单摘要中。
-
单击分配。
有关访问策略的时间条件的更多信息,请参阅 访问策略中的条件。
使用CLI创建一个基于时间的重复条件
您可以按周指定重复访问权限。 您可能希望仅在用户的工作时间允许其访问账户资源。 以下示例向您展示如何为用户创建一个基于时间的重复条件。 该政策规定,周一至周五的工作时间,所有账户管理服务的访问权限均分配给编辑。
-
登录 IBM Cloud® CLI。 如果您有多个帐户,系统会提示您选择要使用的帐户。 如果未使用
-r
标志指定区域,那么还必须选择区域。ibmcloud login
如果凭证被拒绝,说明您可能使用的是联合标识。 要使用联合标识登录,请使用
--sso
标志。 有关更多详细信息,请参阅使用联合标识进行登录。如果您是第一次使用 IBM Cloud CLI,请查看 入门教程。
-
使用以下命令创建访问策略并将其分配给用户或服务ID:
ibmcloud iam user-policy-create
。 -
为
Editor
角色分配所有账户管理服务的访问权限:ibmcloud iam service-policy-create [your service ID here] --roles Editor --account-management --api-version v2
-
请参考以下基于时间的重复性策略JSON架构示例,创建您自己的条件:
ibmcloud iam service-policy-create [your service ID here] --file [your JSON file name]
{ "type": "access", "description": "time-based conditions policy example restricting access to the full day of 2022-12-23 UTC", "control": { "grant": { "roles": [ { "role_id": "crn:v1:bluemix:public:iam::::role:Editor" } ] } }, "resource": { "attributes": [ { "operator": "stringEquals", "value": "d4b763ad0cbd4dca8dd1edb427d7a77e", "key": "accountId" }, { "value": "platform_service", "operator": "stringEquals", "key": "serviceType" } ] }, "pattern": "time-based-conditions:weekly", "rule": { "operator": "and", "conditions": [ { "key": "{{environment.attributes.day_of_week}}", "operator": "dayOfWeekAnyOf", "value": [ 1, 2, 3, 4, 5 ] }, { "key": "{{environment.attributes.current_time}}", "operator": "timeGreaterThanOrEquals", "value": "00:00:00+00:00" }, { "key": "{{environment.attributes.current_time}}", "operator": "timeLessThanOrEquals", "value": "23:59:59+00:00" } ] }, "subject": { "attributes": [ { "key": "iam_id", "operator": "stringEquals", "value": "IBMid-550000HFVV" } ] } }
有关访问策略的时间条件的更多信息,请参阅 访问策略中的条件。
通过使用API创建一个基于时间的重复条件
您可以按周指定重复访问权限。 您可能希望仅在用户的工作时间允许其访问账户资源。 以下示例向您展示如何为用户创建一个基于时间的重复条件。 该政策规定,周一至周五的工作时间,所有账户管理服务的访问权限均分配给编辑。
subjectAttribute := &iampolicymanagementv1.V2PolicyAttribute{
Key: core.StringPtr("iam_id"),
Operator: core.StringPtr("stringEquals"),
Value: &exampleUserID,
}
policySubject := &iampolicymanagementv1.V2PolicyBaseSubject{
Attributes: []iampolicymanagementv1.V2PolicyAttribute{*subjectAttribute},
}
policyRole := &iampolicymanagementv1.PolicyRole{
RoleID: core.StringPtr("crn:v1:bluemix:public:iam::::role:Editor"),
}
v2PolicyGrant := &iampolicymanagementv1.V2PolicyBaseControlGrant{
Roles: []iampolicymanagementv1.PolicyRole{*policyRole},
}
v2PolicyControl := &iampolicymanagementv1.V2PolicyBaseControl{
Grant: v2PolicyGrant,
}
accountIDResourceAttribute := &iampolicymanagementv1.V2PolicyAttribute{
Key: core.StringPtr("accountId"),
Operator: core.StringPtr("stringEquals"),
Value: core.StringPtr(exampleAccountID),
}
serviceNameResourceAttribute := &iampolicymanagementv1.V2PolicyAttribute{
Key: core.StringPtr("serviceType"),
Operator: core.StringPtr("stringEquals"),
Value: core.StringPtr("service"),
}
policyResource := &iampolicymanagementv1.V2PolicyBaseResource{
Attributes: []iampolicymanagementv1.V2PolicyAttribute{
*accountIDResourceAttribute, *serviceNameResourceAttribute},
}
weeklyConditionAttribute := &iampolicymanagementv1.V2PolicyAttribute{
Key: core.StringPtr("{{environment.attributes.day_of_week}}"),
Operator: core.StringPtr("dayOfWeekAnyOf"),
Value: []int{1,2,3,4,5},
}
startConditionAttribute := &iampolicymanagementv1.V2PolicyAttribute{
Key: core.StringPtr("{{environment.attributes.current_time}}"),
Operator: core.StringPtr("timeGreaterThanOrEquals"),
Value: core.StringPtr("09:00:00+00:00"),
}
endConditionAttribute := &iampolicymanagementv1.V2PolicyAttribute{
Key: core.StringPtr("{{environment.attributes.current_time}}"),
Operator: core.StringPtr("timeLessThanOrEquals"),
Value: core.StringPtr("17:00:00+00:00"),
}
policyRule := &iampolicymanagementv1.V2PolicyBaseRule{
Operator: core.StringPtr("and"),
Conditions: []iampolicymanagementv1.V2PolicyAttribute{
*weeklyConditionAttribute, *startConditionAttribute, *endConditionAttribute},
}
options := iamPolicyManagementService.NewV2CreatePolicyOptions(
"access",
v2PolicyControl,
)
options.SetSubject(policySubject)
options.SetResource(policyResource)
options.SetRule(policyRule)
options.SetPattern(*core.StringPtr("time-based-conditions:weekly"))
policy, response, err := iamPolicyManagementService.V2CreatePolicy(options)
if err != nil {
panic(err)
}
b, _ := json.MarshalIndent(policy, "", " ")
fmt.Println(string(b))
V2PolicyAttribute subjectAttribute = new V2PolicyAttribute.Builder()
.key("iam_id")
.value(EXAMPLE_USER_ID)
.operator("stringEquals")
.build();
V2PolicyBaseSubject policySubject = new V2PolicyBaseSubject.Builder()
.addAttributes(subjectAttribute)
.build();
V2PolicyAttribute accountIdResourceAttribute = new V2PolicyAttribute.Builder()
.key("accountId")
.value(exampleAccountId)
.operator("stringEquals")
.build();
V2PolicyAttribute serviceNameResourceAttribute = new V2PolicyAttribute.Builder()
.key("serviceName")
.value("iam-groups")
.operator("stringEquals")
.build();
V2PolicyBaseResource policyResource = new V2PolicyBaseResource.Builder()
.addAttributes(accountIdResourceAttribute)
.addAttributes(serviceNameResourceAttribute)
.build();
PolicyRole policyRoles = new PolicyRole.Builder()
.roleId("crn:v1:bluemix:public:iam::::role:Editor")
.build();
V2PolicyBaseControlGrant policyGrant = new V2PolicyBaseControlGrant.Builder()
.roles(Arrays.asList(policyRoles))
.build();
V2PolicyBaseControl policyControl = new V2PolicyBaseControl.Builder()
.grant(policyGrant)
.build();
V2PolicyAttribute weeklyConditionAttribute = new V2PolicyAttribute.Builder()
.key("{{environment.attributes.day_of_week}}")
.value(new ArrayList<Integer>(Arrays.asList(1, 2, 3, 4, 5)))
.operator("dayOfWeekAnyOf")
.build();
V2PolicyAttribute startConditionAttribute = new V2PolicyAttribute.Builder()
.key("{{environment.attributes.current_time}}")
.value("09:00:00+00:00")
.operator("timeGreaterThanOrEquals")
.build();
V2PolicyAttribute endConditionAttribute = new V2PolicyAttribute.Builder()
.key("{{environment.attributes.current_time}}")
.value("17:00:00+00:00")
.operator("timeLessThanOrEquals")
.build();
V2PolicyBaseRuleV2RuleWithConditions policyRule = new V2PolicyBaseRuleV2RuleWithConditions.Builder()
.operator("and")
.conditions(new ArrayList<V2PolicyAttribute>(Arrays.asList(weeklyConditionAttribute, startConditionAttribute, endConditionAttribute)))
.build();
V2CreatePolicyOptions options = new V2CreatePolicyOptions.Builder()
.type("access")
.subject(policySubject)
.control(policyControl)
.resource(policyResource)
.rule(policyRule)
.pattern("time-based-conditions:weekly")
.build();
Response<V2Policy> response = service.v2CreatePolicy(options).execute();
V2Policy policy = response.getResult();
System.out.println(policy);
const policySubject = {
attributes: [
{
key: 'iam_id',
operator: 'stringEquals',
value: exampleUserId,
},
],
};
const policyResourceAccountAttribute = {
key: 'accountId',
value: exampleAccountId,
operator: 'stringEquals',
};
const policyResourceServiceAttribute = {
key: 'serviceName',
operator: 'stringEquals',
value: 'iam-groups',
};
const policyResource = {
attributes: [policyResourceAccountAttribute, policyResourceServiceAttribute]
};
const policyControl = {
grant: {
roles: [{
role_id: 'crn:v1:bluemix:public:iam::::role:Editor',
}],
}
};
const policyRule = {
operator: 'and',
conditions: [
{
key: '{{environment.attributes.day_of_week}}',
operator: 'dayOfWeekAnyOf',
value: [1, 2, 3, 4, 5],
},
{
key: '{{environment.attributes.current_time}}',
operator: 'timeGreaterThanOrEquals',
value: '09:00:00+00:00',
},
{
key: '{{environment.attributes.current_time}}',
operator: 'timeLessThanOrEquals',
value: '17:00:00+00:00',
},
],
}
const policyPattern = 'time-based-conditions:weekly'
const params = {
type: 'access',
subject: policySubject,
control: policyControl,
resource: policyResource,
rule: policyRule,
pattern: policyPattern,
};
try {
const res = await iamPolicyManagementService.v2CreatePolicy(params);
examplePolicyId = res.result.id;
console.log(JSON.stringify(res.result, null, 2));
} catch (err) {
console.warn(err)
}
policy_subject = V2PolicyBaseSubject(
attributes=[V2PolicyAttribute(key='iam_id', value=example_user_id, operator='stringEquals')]
)
policy_role = PolicyRole(role_id='crn:v1:bluemix:public:iam::::role:Editor')
account_id_resource_attribute = V2PolicyAttribute(
key='accountId', value=example_account_id, operator='stringEquals'
)
service_name_resource_attribute = V2PolicyAttribute(
key='serviceName', value='iam-groups', operator='stringEquals'
)
policy_resource = PolicyResource(
attributes=[account_id_resource_attribute, service_name_resource_attribute],
)
policy_control = V2PolicyBaseControl(grant=V2PolicyBaseControlGrant(roles=[policy_role]))
policy_rule = V2PolicyBaseRuleV2RuleWithConditions(
operator='and',
conditions=[
V2PolicyAttribute(
key='{{environment.attributes.day_of_week}}', operator='dayOfWeekAnyOf', value=[1, 2, 3, 4, 5]
),
V2PolicyAttribute(
key='{{environment.attributes.current_time}}',
operator='timeGreaterThanOrEquals',
value='09:00:00+00:00',
),
V2PolicyAttribute(
key='{{environment.attributes.current_time}}',
operator='timeLessThanOrEquals',
value='17:00:00+00:00',
),
],
)
policy_pattern = 'time-based-conditions:weekly'
policy = iam_policy_management_service.v2_create_policy(
type='access',
subject=policy_subject,
control=policy_control,
resource=policy_resource,
rule=policy_rule,
pattern=policy_pattern,
).get_result()
print(json.dumps(policy, indent=2))
有关访问策略的时间条件的更多信息,请参阅 访问策略中的条件。
使用控制台创建基于资源属性的条件
您可以通过指定资源属性来分配访问权限,该属性决定条件授予访问权限的资源。 例如,您的某个用户可能需要使用特定资源在您的账户中进行演示。 有关可用运算符的更多信息和示例,请参阅 基于资源属性的条件。
您最多可以设置10个条件,并使用 OR
进行最多2层的嵌套。
请完成以下步骤,以基于属性的资源条件指定访问策略:
-
在 IBM Cloud 控制台中,依次选择 “管理” > “访问(IAM)”
-
根据您要为其分配访问权限的实体,选择用户、可信配置文件、服务ID 或访问组。
-
点击列表中的实体名称,进入访问页面。
-
单击分配访问权。
-
选择一项服务,然后点击 “下一步”。
并非所有服务都支持基于资源属性的条件。 要继续,请选择支持基于资源属性的条件的服务。 例如,Cloud Object Storage。
-
选择您希望为用户分配访问权限的资源,或选择 “所有资源”。 单击下一步。
-
(可选)选择资源组访问角色。 单击下一步。
-
选择任意服务访问和平台访问角色组合,然后点击 “下一步”。
-
点击 “添加条件”,选择 “高级条件生成器”,然后点击“下一步”。
-
添加资源条件并点击创建。
举个例子,假设您要为需要访问 dev/David/
和 dev/Secret/
文件夹下所有内容或以 devOps/
或 cicd/
开头的任何路径的开发者创建一个条件策略。 在这种情况下,请选择前缀,字符串匹配任意,并添加 dev/David/*
和 dev/Secret/*
。
然后添加一个或条件,选择路径,字符串匹配任意,并添加 devOps/*
和 cicd/*
。
- 点击 “创建” > “审核”> “添加”,将您的访问配置添加到访问摘要中。
- 单击分配。
服务专用文件
有关 Cloud Object Storage 如何使用基于资源属性的条件的更多信息,请参阅 “控制对存储桶中单个对象的访问”。
准备工作
请确保您拨打 v2/policies
URI,即 https://iam.coud.ibm.com/v2/policies
,以便在访问策略中使用条件。 更多信息,请参阅 IAM策略管理API 和 变更日志。
通过使用API创建基于资源属性的条件
您可以通过指定资源属性来分配访问权限,该属性决定条件授予访问权限的资源。 举个例子,假设您要为需要访问 dev/David/*
和 devA/*
文件夹下所有内容或以 dev/David/*
或 devA/*
开头的任何路径的开发者创建一个条件策略。 以下示例演示了如何创建基于资源属性的条件,允许用户访问 dev/David/
文件夹下的所有内容以及以
devA
或 devA/
文件夹开头的任何路径。
您最多可以设置10个条件,并使用 OR
进行最多2层的嵌套。
有关可用运算符的更多信息和示例,请参阅 基于资源属性的条件。
"pattern": "attribute-based-condition:resource:literal-and-wildcard",
"rule": {
"operator": "or",
"conditions": [
{
"key": "{{resource.attributes.prefix}}",
"operator": "stringMatchAnyOf",
"value": [
"dev/David/*",
"devA*"
]
},
{
"key": "{{resource.attributes.path}}",
"operator": "stringMatchAnyOf",
"value": [
"dev/David/*",
"devA/*"
]
},
{
"operator": "and",
"conditions": [
{
"key": "{{resource.attributes.prefix}}",
"operator": "stringMatchAnyOf",
"value": [
"dev/David/*",
"devA/*"
]
},
{
"key": "{{resource.attributes.delimiter}}",
"operator": "stringEquals",
"value": "/"
}
]
}
]
}