AWS 身份和访问管理建构库
AWS CDK v1在2023-06-01上达到了支持结束. 此软件包不再更新,用户应该迁移到 AWS CDK v2.
关于如何移徙的更多信息,请参见: 移动到 AWS CDK v2 指南。 。 。 .
定义一个角色并添加权限到它 。 这将自动创建和 在角色上附上IAM政策:
确定一项政策,并将其附加于团体、用户和角色。 请注意,可以附上
政策通过电话 xxx.attachInlinePolicy(policy) 或者说 policy.attachToXxx(xxx)。 。 。 .
管理后的政策可使用 xxx.addManagedPolicy(ManagedPolicy.fromAwsManagedPolicyName(policyName))数字 :
授予资源许可
许多 AWS CDK 资源有 grant* 允许其他资源访问该资源的方法。 例如,下面的代码给一个DynamoDB表一个Lambda函数写权限(Put, Update, Dext).
declare const fn: lambda.Function;
declare const table: dynamodb.Table;
table.grantWriteData(fn);
比较普通 grant 方法允许您对资源给予特定权限 :
declare const fn: lambda.Function;
declare const table: dynamodb.Table;
table.grant(fn, 'dynamodb:PutItem');
这个 grant* 方法接受一个 IGrantable 对象。 这个接口由IAM principlal资源(组,用户和角色)和资源执行,这些资源承担了Lambda函数,EC2实例或代码构建项目等角色.
你可以找到哪个 grant* 资源方法 AWS CDK API 参考。 。 。 .
作用
许多AWS资源需要 作用 操作。 这些角色定义了 AWS API 允许调用实例或其他 AWS 服务.
创建角色, 并使用正确的权限 发言 实值 建立AWS基础设施的必要但乏味的部分。 为了 帮助您关注您的商业逻辑, CDK 将负责创建 角色并自动向它们充斥最少特权权限.
所有需要角色的构造,如果不指定,将会为您创建一个
一个在施工时间。 该角色将增加权限
如果将构造与来自
AWS 构造库(例如,如果您告诉一个 AWS 代码管道 触发
a 一个 AWS Lambda 函数,管道的作用会自动得到
lambda:InvokeFunction 关于该 Lambda 函数的权限,
或者如果您明确允许使用 grant 函数(参见
上一节).
选择退出自动权限管理
你可能更喜欢自己管理角色权限 而不是拥有 CDK自动为你管理它们. 这可能发生在其中之一 下列情况:
- 您不喜欢 CDK 自动生成和 想要替换您的组合 .
- CDK 生成的最小许可政策也正在变成 需要添加一些通配符才能保存 政策规模缩小.
为了防止构造更新您的角色策略, 传递对象
返回时间 myRole.withoutPolicyUpdates() 改为 myRole 自己来.
例如, 拥有 AWS 代码Pipeline 没有 自动添加所需 允许触发预期目标时,执行下列操作:
const role = new iam.Role(this, 'Role', {
assumedBy: new iam.ServicePrincipal('codepipeline.amazonaws.com'),
// custom description if desired
description: 'This is a custom role...',
});
new codepipeline.Pipeline(this, 'Pipeline', {
// Give the Pipeline an immutable view of the Role
role: role.withoutPolicyUpdates(),
});
// You now have to manage the Role policies yourself
role.addToPolicy(new iam.PolicyStatement({
actions: [/* whatever actions you want */],
resources: [/* whatever resources you intend to touch */],
}));
利用现有角色
如果在您的账户中存在已经创建的角色
想要在您的 CDK 应用程序中使用, 您可以使用 Role.fromRoleArn 改为
导入它们如下:
const role = iam.Role.fromRoleArn(this, 'Role', 'arn:aws:iam::123456789012:role/MyExistingRole', {
// Set 'mutable' to 'false' to use the role as-is and prevent adding new
// policies to it. The default is 'true', which means the role may be
// modified as part of the deployment.
mutable: false,
});
配置外部图像
如果需要创建第三方将承担的角色,一般认为 需要一个 ExternalId
假设他们配置
a 一个 ExternalId 这样的工作:
校长与身份
当我们说 校长我们是指你允许的实体 这个
实体可以是AWS Service,一个角色,或者更抽象的东西如"All
此账户中的用户,甚至"本组织的所有用户". 一个
身份 代表一个能够拥有
附加政策,其中一项 Role, (中文(简体) ), User,或 Group。 。 。 .
IAM 校长
在界定政策声明作为AssumeRole政策的一部分或作为A
资源政策,报表通常是指一个具体的IAM主
下级 Principal。 。 。 .
学院校长以班级为模式 iam.PolicyPrincipal
抽象阶级. 主要对象包括主类型(字符串)和值
(字符串阵列),可选的一组条件和本主的行动
要求它用于承担角色政策文件.
要在政策说明中添加本金,您可以使用抽象
statement.addPrincipal一个混凝土 addXxxPrincipal 方法:
addAwsPrincipal, (中文(简体) ),addArnPrincipal或者说new ArnPrincipal(arn)页:1{ "AWS": arn }addAwsAccountPrincipal或者说new AccountPrincipal(accountId)页:1{ "AWS": account-arn }addServicePrincipal或者说new ServicePrincipal(service)页:1{ "Service": service }addAccountRootPrincipal或者说new AccountRootPrincipal()页:1{ "AWS": { "Ref: "AWS::AccountId" } }addCanonicalUserPrincipal或者说new CanonicalUserPrincipal(id)页:1{ "CanonicalUser": id }addFederatedPrincipal或者说new FederatedPrincipal(federated, conditions, assumeAction)页:1{ "Federated": arn }和一组可选条件 以及角色扮演动作.addAnyPrincipal或者说new AnyPrincipal页:1{ "AWS": "*" }
如果在政策说明中增加多个主要负责人,将合并:
const statement = new iam.PolicyStatement();
statement.addServicePrincipal('cloudwatch.amazonaws.com');
statement.addServicePrincipal('ec2.amazonaws.com');
statement.addArnPrincipal('arn:aws:boom:boom');
将导致:
{
"Principal": {
"Service": [ "cloudwatch.amazonaws.com", "ec2.amazonaws.com" ],
"AWS": "arn:aws:boom:boom"
}
}
这个 CompositePrincipal 类也可以用来定义复杂的主因,例如:
const role = new iam.Role(this, 'MyRole', {
assumedBy: new iam.CompositePrincipal(
new iam.ServicePrincipal('ec2.amazonaws.com'),
new iam.AccountPrincipal('1818188181818187272')
),
});
这个 PrincipalWithConditions 类可用于添加条件到一个
校长,尤其是那些不拿 conditions 参数
建筑师。 这个 principal.withConditions() 方法可用于创建
PrincipalWithConditions 例如:
const principal = new iam.AccountPrincipal('123456789000')
.withConditions({ StringEquals: { foo: "baz" } });
注:如果需要定义使用符号(例如: 在 JSON 映射密钥中, 使用
CfnJson改为 做这个条件。 见 此测试 页:1 一个例子.
这个 WebIdentityPrincipal 类可以用作网络身份的特等,例如:
例如:
const principal = new iam.WebIdentityPrincipal('cognito-identity.amazonaws.com', {
'StringEquals': { 'cognito-identity.amazonaws.com:aud': 'us-east-2:12345678-abcd-abcd-abcd-123456' },
'ForAnyValue:StringLike': {'cognito-identity.amazonaws.com:amr': 'unauthenticated' },
});
如果您的身份提供者被配置为角色 第二届会议
标记,你吗
需要打电话 .withSessionTags() 在角色中添加所需的权限
政策文件:
new iam.Role(this, 'Role', {
assumedBy: new iam.WebIdentityPrincipal('cognito-identity.amazonaws.com', {
'StringEquals': {
'cognito-identity.amazonaws.com:aud': 'us-east-2:12345678-abcd-abcd-abcd-123456',
},
'ForAnyValue:StringLike': {
'cognito-identity.amazonaws.com:amr': 'unauthenticated',
},
}).withSessionTags(),
});
分析 JSON 政策文件
这个 PolicyDocument.fromJson 财务报告和审定财务报表 PolicyStatement.fromJson 静态方法可用于剖析JSON对象. 例如:
const policyDocument = {
"Version": "2012-10-17",
"Statement": [
{
"Sid": "FirstStatement",
"Effect": "Allow",
"Action": ["iam:ChangePassword"],
"Resource": "*"
},
{
"Sid": "SecondStatement",
"Effect": "Allow",
"Action": "s3:ListAllMyBuckets",
"Resource": "*"
},
{
"Sid": "ThirdStatement",
"Effect": "Allow",
"Action": [
"s3:List*",
"s3:Get*"
],
"Resource": [
"arn:aws:s3:::confidential-data",
"arn:aws:s3:::confidential-data/*"
],
"Condition": {"Bool": {"aws:MultiFactorAuthPresent": "true"}}
}
]
};
const customPolicyDocument = iam.PolicyDocument.fromJson(policyDocument);
// You can pass this document as an initial document to a ManagedPolicy
// or inline Policy.
const newManagedPolicy = new iam.ManagedPolicy(this, 'MyNewManagedPolicy', {
document: customPolicyDocument,
});
const newPolicy = new iam.Policy(this, 'MyNewPolicy', {
document: customPolicyDocument,
});
允许边界
权限
边界
可以通过创建新的
Roles. 许可边界是一项管理政策,附属于角色或
用户,代表 上限 他们可以拥有的一系列权限。 这个
角色(或用户)的有效权限集将是
身份政策和与角色相关的权限边界
用户). 权限边界通常由账户创建
管理员及其在新创建中的用途 Roles 将由
IAM政策.
可以将权限边界附加到构造中创建的所有角色 一次全部树 :
// This imports an existing policy.
const boundary = iam.ManagedPolicy.fromManagedPolicyArn(this, 'Boundary', 'arn:aws:iam::123456789012:policy/boundary');
// This creates a new boundary
const boundary2 = new iam.ManagedPolicy(this, 'Boundary2', {
statements: [
new iam.PolicyStatement({
effect: iam.Effect.DENY,
actions: ['iam:*'],
resources: ['*'],
}),
],
});
// Directly apply the boundary to a Role you create
declare const role: iam.Role;
iam.PermissionsBoundary.of(role).apply(boundary);
// Apply the boundary to an Role that was implicitly created for you
declare const fn: lambda.Function;
iam.PermissionsBoundary.of(fn).apply(boundary);
// Apply the boundary to all Roles in a stack
iam.PermissionsBoundary.of(this).apply(boundary);
// Remove a Permissions Boundary that is inherited, for example from the Stack level
declare const customResource: CustomResource;
iam.PermissionsBoundary.of(customResource).clear();
OpenID 连接供应商
OIDC 身份提供者是IAM中描述外部身份的实体 用于支持 OpenID 连接 (OIDC)标准,例如 作为谷歌或销售力量。 您需要时使用 IAM OIDC 身份提供者 在 OIDC 兼容的 IdP 和您的 AWS 账户之间建立信任 。 这是 创建需要访问 AWS 的移动应用程序或网络应用程序时有用 资源,但您不想创建自定义的签名代码或管理自己的代码 用户身份。 关于这一设想的更多信息,请参见: 关于网络 身份联合会 和报告中的有关文件 亚马逊-科尼奥托 身份池开发者指南。 。 。 .
以下示例定义了 OpenID 连接提供者. 两个客户身份 (观众)将能够向 https://openid/连接。 。 。 .
const provider = new iam.OpenIdConnectProvider(this, 'MyProvider', {
url: 'https://openid/connect',
clientIds: [ 'myclient1', 'myclient2' ],
});
您可以指定可选列表 thumbprints未指定时
将自动获得根证书权威( CA) 的拇指印
从主机如所述
这里。 。 。 .
一旦定义了 OpenID 连接提供者, 您可以用 AWS 服务使用 需要IAM OIDC的供应商。 例如,当您定义一个 亚马逊 认知身份 组合 您可以引用提供者的 ARN 如下:
import * as cognito from '@aws-cdk/aws-cognito';
declare const myProvider: iam.OpenIdConnectProvider;
new cognito.CfnIdentityPool(this, 'IdentityPool', {
openIdConnectProviderArns: [myProvider.openIdConnectProviderArn],
// And the other properties for your identity pool
allowUnauthenticatedIdentities: false,
});
这个 OpenIdConnectPrincipal 类可用作主要用法 OpenIdConnectProvider,例如:
const provider = new iam.OpenIdConnectProvider(this, 'MyProvider', {
url: 'https://openid/connect',
clientIds: [ 'myclient1', 'myclient2' ],
});
const principal = new iam.OpenIdConnectPrincipal(provider);
SAML 供应商
IAM SAML 2.0 身份提供商是IAM中描述外部实体 支持 SAML 2.0 (安全请求) 的身份提供商( IdP) 服务 Markup Language 2.0)标准. 您需要时使用 IAM 身份提供者 以建立 SAML 兼容的 IdP 如 Shibboleth 或 Active 之间的信任 Directory Federal Services and AWS,以便您的组织的用户可以 访问 AWS 资源。 IAM SAML 身份提供商在 IAM信托政策.
new iam.SamlProvider(this, 'Provider', {
metadataDocument: iam.SamlMetadataDocument.fromFile('/path/to/saml-metadata-document.xml'),
});
这个 SamlPrincipal 类可用作本金,带有 SamlProvider数字 :
const provider = new iam.SamlProvider(this, 'Provider', {
metadataDocument: iam.SamlMetadataDocument.fromFile('/path/to/saml-metadata-document.xml'),
});
const principal = new iam.SamlPrincipal(provider, {
StringEquals: {
'SAML:iss': 'issuer',
},
});
当创建程序角色和 AWS 管理控制台访问时,使用 SamlConsolePrincipal
类 :
const provider = new iam.SamlProvider(this, 'Provider', {
metadataDocument: iam.SamlMetadataDocument.fromFile('/path/to/saml-metadata-document.xml'),
});
new iam.Role(this, 'Role', {
assumedBy: new iam.SamlConsolePrincipal(provider),
});
用户
IAM 管理您的 AWS 账户的用户 。 要创建新用户 :
const user = new iam.User(this, 'MyUser');
以名称导入已有用户 有路径数字 :
const user = iam.User.fromUserName(this, 'MyImportedUserByName', 'johnsmith');
要通过 ARN 导入已有的用户 :
const user = iam.User.fromUserArn(this, 'MyImportedUserByArn', 'arn:aws:iam::123456789012:user/johnsmith');
要通过属性导入已有用户:
const user = iam.User.fromUserAttributes(this, 'MyImportedUserByAttributes', {
userArn: 'arn:aws:iam::123456789012:user/johnsmith',
});
访问密钥
用户通过 CLI 或 SDK 进行 API 调用的能力,由有 访问密钥对 。 要创建访问密钥 :
const user = new iam.User(this, 'MyUser');
const accessKey = new iam.AccessKey(this, 'MyAccessKey', { user: user });
您可以通过提供单调递增来强制 CloudFormation 旋转访问密钥 serial
属性。 简单地提供比以前使用的任何数字更高的序列值:
const user = new iam.User(this, 'MyUser');
const accessKey = new iam.AccessKey(this, 'MyAccessKey', { user: user, serial: 1 });
一个访问密钥可能只与单一用户相关联,不能在用户之间"移动". 变化 与访问密钥相关的用户替换访问密钥(及其ID和秘密值).
组
一个IAM用户组是IAM用户的集合. 用户组允许您为多个用户指定权限.
const group = new iam.Group(this, 'MyGroup');
要通过 ARN 导入一个已存在的组 :
const group = iam.Group.fromGroupArn(this, 'MyImportedGroupByArn', 'arn:aws:iam::account-id:group/group-name');
按名称导入已存在的组 有路径数字 :
const group = iam.Group.fromGroupName(this, 'MyImportedGroupByName', 'group-name');
要将一个用户添加到一个组( 既针对新用户, 也针对导入用户/ 组) :
const user = new iam.User(this, 'MyUser'); // or User.fromUserName(stack, 'User', 'johnsmith');
const group = new iam.Group(this, 'MyGroup'); // or Group.fromGroupArn(stack, 'Group', 'arn:aws:iam::account-id:group/group-name');
user.addToGroup(group);
// or
group.addUser(user);
特征
- 政策名称独有性得到强制执行。 如果将两个同名政策附在同一个上 校长,附件将失败.
- 不需要政策名称 - 将使用和确保 CDK 逻辑ID 以独有性.
- 政策在综合过程中得到验证,以确保其有行动,并确保政策 附属于机构间委员会负责人的指定相关资源,而附属于资源的政策 具体说明它们适用于哪一种IMA原则.