利用基于时间和资源属性的条件限制访问
您可以设置基于时间的条件,以指定对账户中资源的临时访问权限,或允许在特定时间窗口内访问资源;还可以设置基于资源属性的条件,以避免创建多个访问策略来满足您的访问需求。
您可以创建基于时间的条件,在特定时间和日期范围内授予一次性临时访问权限,也可以设置每周定期访问权限。 例如,您可能希望通过指定经常性访问权限,让用户只能在工作时间访问账户资源,或者您可能需要让承包商或用户演示服务功能,而他们只需要临时访问权限。
基于时间的条件不考虑遵守夏令时的时区的夏令时变化。 管理员必须根据 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) 的访问。
必须至少有 2 个条件使用 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))
有关访问策略基于时间条件的更多信息,请参阅 使用政策中的条件。
使用控制台创建基于资源属性的条件
您可以通过指定资源属性来分配访问权限,该属性决定了条件允许访问哪些资源。 例如,用户可能需要使用特定资源在账户中进行演示。 有关可用操作符的更多信息和示例,请参阅 基于属性的资源条件。
通过使用 OR,您最多可以拥有 10 个条件,嵌套最多可以达到 2 层。
完成以下步骤,为访问策略指定一个基于属性资源的条件:
-
在 IBM Cloud 控制台中,转到管理 > 访问 (IAM)
-
根据要分配访问权限的实体,选择用户、受信任的配置文件、服务 ID 或访问组。
-
单击列表中的实体名称并转到“访问”。
-
单击分配访问权。
-
选择一项服务,然后单击下一步。
并非所有服务都支持基于资源属性的条件。 要继续,请选择支持基于资源属性条件的服务。 例如,Cloud Object Storage。
-
选择要为用户分配访问权限的资源,或选择所有资源。 单击下一步。
-
(可选)选择资源组访问角色。 单击下一步。
-
选择服务访问和平台访问角色的任意组合,然后单击下一步。
-
单击添加条件并选择高级条件生成器 > 下一步。
-
添加资源条件,然后单击创建。
举例来说,如果你要为一个开发人员创建一个条件策略,该开发人员需要访问 dev/David/ 和 dev/Secret/ 文件夹下的所有内容,或者以 devOps/ 或 cicd/ 开头的任何路径。 在这种情况下,选择“前缀”,字符串匹配任意一个,然后添加 dev/David/* 和
dev/Secret/*。 然后,添加一个 OR 条件并选择路径,字符串匹配任意一个,并添加 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/ 文件夹开头的任何路径。
通过使用 OR,您最多可以拥有 10 个条件,嵌套最多可以达到 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": "/"
}
]
}
]
}