究竟"假设"角色在AWS中意味着什么?提供了明确的定义?
假设经常使用角色并试图理解定义及其实际含义.
我想当一个主体(IAM用户,在EC2实例中运行的应用程序等调用访问AWS资源的操作)需要调用访问AWS资源的操作时:
AWS(API?或AWS中的某些授权运行时?)标识可以授予主体的角色.
例如,如果指定EC2用户执行assume-role API调用并运行访问IAM配置文件所附加到的EC2实例中的AWS资源的应用程序,则:
AWS从角色中找到角色,该角色具有允许原则对资源执行操作的策略(操作,资源).
当第3步发生时,就说"委托人承担了这个角色".它是否正确?
在IAM用户,应用程序或服务可以使用您创建的角色之前,您必须授予切换到该角色的权限.您可以使用附加到IAM用户组之一或用户自身的任何策略来授予必要的权限.
我正在尝试使用DynamoDB和Cognito创建一个多租户应用程序.文档非常清楚如何实现细粒度授权,以便用户只能通过向IAM访问策略添加条件来访问自己的记录,如下所示:
"Condition": {
"ForAllValues:StringEquals": {
"dynamodb:LeadingKeys": [
"${cognito-identity.amazonaws.com:sub}"
]
}
}
Run Code Online (Sandbox Code Playgroud)
当Cognito用户id是行的哈希键时,这非常适合允许用户读写自己的记录,但我正在努力解决如何允许其他用户只读访问某些记录的问题.
以一个有多个课程的学生的模型为例:
{
“student_id”: “ABC-1234567”,
“course_name”: “Statistics 101”,
“tutors”: [“Cognito-sub-1”, “Cognito-sub-2”],
“seminar_reviews”: [
{
“seminar_id”: “XXXYYY-12345”
“date”: “2018-01-12”,
“score”: “8”,
“comments”: “Nice class!”
},
{
“seminar_id”: “ABCDEF-98765”
“date”: “2018-01-25”,
“score”: “3”,
“comments”: “Boring.”
}
]
}
Run Code Online (Sandbox Code Playgroud)
(Cognito-sub-1
是导师的Cognito id)
通过将上述策略条件应用于用户的IAM角色,用户可以读取和写入此文档,因为散列键(student_id
)是用户的Cognito id.
我也希望文档中列出的导师具有对某些属性的只读访问权限,但我找不到任何如何完成此操作的示例.我知道我不能使用dynamodb:LeadingKeys
条件因为教师不是表的哈希键.如果我设置使用导师列表作为哈希键的全局二级索引(GSI),是否可以这样做?
如果可以使用索引完成此操作,我认为这只允许对该索引的读访问(因为索引不允许写操作).是否有任何替代方法允许基于非散列键的属性进行写访问?
或者,我可以使用更长的字符串作为散列键,连接类似的属性”owner”:
以及”read-only”:
包含Cognito ID列表的属性,并在我的策略中使用它来创建仅基于散列键的更细粒度的权限模型吗?这假定策略可以解码字符串中的列表,因为DynamoDB不允许散列键是列表,JSON对象或类似物.
我无法找到任何考虑细粒度访问控制的资源,除了允许用户只读取/写入自己的记录,所以如果有人可以指导我,那将是一个很好的开始.
multi-tenant amazon-web-services amazon-dynamodb amazon-cognito aws-iam
我想允许来自不同账户的某些角色在我的账户中担任某个角色。我不想一一指定角色,因为它们容易频繁变化。
我为信任关系提出了这个策略,它应该允许名称以 结尾的任何角色_my_suffix
,但它不起作用(访问被拒绝):
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::ACCOUNT_NR_A:root"
},
"Condition": {
"ArnLike": {
"aws:SourceArn": "arn:aws:iam::ACCOUNT_NR_A:role/*_my_suffix"
}
},
"Action": "sts:AssumeRole"
}
]
}
Run Code Online (Sandbox Code Playgroud)
另一方面,此策略有效但它过于开放,因为它允许帐户 A 中的任何用户/角色承担我的角色:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::ACCOUNT_NR_A:root"
},
"Action": "sts:AssumeRole"
}
]
}
Run Code Online (Sandbox Code Playgroud)
那么,有没有办法只允许一组角色而不被明确指定?
我使用create_user_pool来创建新的 Cognito 用户池。我看到有一个SmsConfiguration
选项需要ExternalId
. 如果您使用 Cognito 门户为您的用户池设置 MFA,则此外部 ID(看起来像 UUID)将用于自动生成的 IAM SMS-Role。
ExternalId
如果我想手动(使用 boto3 或 AWS CLI)创建用户池和 IAM SMS 角色,我在哪里可以找到/生成值?
我不知道如何实现这一点。任何帮助和/或指针将不胜感激。
目前,我的Java / Spring应用程序后端已部署在EC2上,并使用常规的Spring JDBC设置成功访问了RDS上的MySQL。也就是说,存储数据库中的信息application.properties
和配置DataSource
,并JdbcTemplate
在@Configuration类。一切正常。
现在,我需要安全地访问RDS上的MySQL 。RDS实例已启用IAM身份验证。我还成功创建了IAM角色并应用了内联策略。然后,按照此链接上的AWS RDS文档和Java示例,我能够使用身份验证令牌和我创建的用户(而不是常规的db用户名和密码)从独立的Java类成功访问数据库。这个独立的Java类直接处理“ Connection ”对象。
我遇到的困难是如何将其转换为Spring JDBC配置。也就是说,在我的@Configuration类中为此设置DataSource
和JdbcTemplate
bean。
实施此方法的正确/正确方法是什么?
-----编辑-开始-----
我正在尝试将其实现为可用于多个项目的库。也就是说,它将用作JAR,并在项目的POM文件中声明为依赖项。该库将包括可配置的AWS服务,例如使用常规DB用户名和密码的RDS访问,使用IAM身份验证的RDS访问,用于数据加密的KMS(CMK /数据密钥)等。
想法是根据项目在任何Web /应用服务器上使用此库。
希望这可以澄清我的需求。
-----编辑-结束-----
DataSource内部具有getConnection(),因此我基本上可以创建自己的DataSource实现来实现所需的功能。但这是一个好方法吗?
就像是:
public class MyDataSource implements DataSource {
@Override
public Connection getConnection() throws SQLException {
Connection conn = null;
// get a connection using IAM Authentication Token for …
Run Code Online (Sandbox Code Playgroud) 我想知道如何simulate-principal-policy
将 AWS CLI 用于代入角色。
为了提供一些上下文,作为我的应用程序启动的一部分,我想确保应用程序具有访问它需要的所有 AWS 资源的必要权限。我通过获取调用者身份aws sts get-caller-identity
并使用返回的调用者身份作为simulate-principal-policy
请求的策略源来实现这一点。
当我们的应用程序在 EC2 上运行时,它使用一个假定的角色。所以,get-caller-identity
返回一个假定的角色 arn。
如果我尝试simulate-principal-policy
使用我的用户 arn 作为策略源 arn 执行,则该命令可以正常工作。
aws iam simulate-principal-policy --action-names "sqs:Receivemessage" --policy-source-arn "arn:aws:sts::123456789021:user/divesh"
Run Code Online (Sandbox Code Playgroud)
但是,尝试使用假定的角色执行上述命令会报告错误。
aws iam simulate-principal-policy --action-names "sqs:Receivemessage" --policy-source-arn "arn:aws:sts::123456789021:assumed-role/development/development-session"
An error occurred (InvalidInput) when calling the SimulatePrincipalPolicy operation: Invalid Entity Arn: arn:aws:sts::123456789021:assumed-role/development/development-session does not clearly define entity type and name.
Run Code Online (Sandbox Code Playgroud)
我们的应用程序在 Kubernetes 集群上运行,并使用kiam将 IAM 角色与 Pod 相关联。
我是 terraform 的新手,使用 terraform 创建 iam 用户
下面是 .tf 文件
resource "aws_iam_user" "lb" {
name = "Ec2_view"
# path = "/system/"
# tags = {
# tag-key = "tag-value"
# }
}
resource "aws_iam_access_key" "lb" {
user = "${aws_iam_user.lb.name}"
}
resource "aws_iam_user_policy" "lb_ro" {
name = "test"
user = "${aws_iam_user.lb.name}"
policy = <<EOF
{
"Version": "2012-10-17",
"Statement": [
{
"Action": [
"ec2:Describe*"
],
"Effect": "Allow",
"Resource": "*"
}
]
}
EOF
}
resource "aws_iam_user_login_profile" "u" {
user = "${aws_iam_user.lb.name}"
password_reset_required …
Run Code Online (Sandbox Code Playgroud) 我试图允许一个AWS帐户(以下称为“第二个”)在另一个AWS帐户(以下称为“第一个”)的ECR存储库中提取图像。
我正在关注这些文件:
我向ECR存储库添加了以下权限:
{
"Version": "2008-10-17",
"Statement": [
{
"Sid": "AllowCrossAccountPull",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::<second>:root"
},
"Action": [
"ecr:BatchCheckLayerAvailability",
"ecr:BatchGetImage",
"ecr:GetDownloadUrlForLayer"
]
}
]
}
Run Code Online (Sandbox Code Playgroud)
然后运行以下命令: eval "$(aws ecr get-login --no-include-email --region us-east-1 --profile second --registry-ids <second> <first>)"
我得到这个结果:
WARNING! Using --password via the CLI is insecure. Use --password-stdin.
WARNING! Your password will be stored unencrypted in /Users/libby/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store
Login Succeeded
WARNING! Using --password via …
Run Code Online (Sandbox Code Playgroud) 我的 API 网关配置为在授权请求时调用我的自定义授权方 Lambda 函数。
对于带有身份验证令牌的请求,Lambda 函数会在将请求传递给上游之前对 JWT 令牌进行解密和解码,并进行一些验证。如果令牌验证失败,授权者会使用 401 Unauthorized 使请求短路。
对于不带有身份验证令牌的请求,该函数仅允许请求通过(生成一个允许策略。)网关的上游负责决定给定的请求是否需要身份验证(仍然,令牌解密/解码/验证是完全封装在网关中,而不是在每个上游实现。)
我的问题是:对于我的网关/授权方“允许”的未经身份验证的请求,允许策略的主体 ID 的适当值是多少?我似乎没有选择离开它undefined
。
此外,如果我在多个不相关的请求之间重复使用主体 ID 会不会有任何风险?假设 X% 的请求共享'unauthenticated'
主体 ID,作为最坏的例子,这些原本不相关的请求之间是否存在某种行为“冲突”的风险?也许一个规避风险/面向未来的解决方案是简单地附加一个 UUID 后缀:'unauthenticated|{uuid}'
.
https://docs.aws.amazon.com/apigateway/latest/developerguide/use-custom-authorizer.html
除了返回 IAM 策略之外,自定义授权方函数还必须返回调用方的委托人标识符。
我一直在尝试让 MFA 与 kubectl 一起工作,以保护对 AWS 中 EKS 主节点的访问。文档似乎暗示这是可能的,但我遇到了问题,我无法弄清楚。
没有什么特别的,我可以连接到我的 EKS 集群:
kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 172.20.0.1 <none> 443/TCP 2d
Run Code Online (Sandbox Code Playgroud)
如果我将 MFA 添加到 AWS CLI,请遵循以下帖子:
https://docs.aws.amazon.com/cli/latest/userguide/cli-roles.html
我像这样设置我的本地凭据:
[default]
aws_access_key_id = **********************
aws_secret_access_key = **********************
region = us-west-2
[default_role]
mfa_serial = arn:aws:iam::1234567890:mfa/spanktar
role_arn = arn:aws:iam::1234567890:role/test_assumeRole
source_profile = default
Run Code Online (Sandbox Code Playgroud)
...然后我可以看到 AWS CLI 具有 MFA:
aws sts get-caller-identity --profile default_role
Enter MFA code for arn:aws:iam::1234567890:mfa/spanktar: 123456
{
"UserId": "**********************:botocore-session-1234567890",
"Account": …
Run Code Online (Sandbox Code Playgroud) kubernetes kubectl aws-iam multi-factor-authentication amazon-eks
aws-iam ×10
amazon-eks ×1
amazon-iam ×1
amazon-rds ×1
architecture ×1
aws-cli ×1
aws-cognito ×1
aws-ecr ×1
aws-lambda ×1
boto3 ×1
docker ×1
java ×1
kubectl ×1
kubernetes ×1
multi-factor-authentication ×1
multi-tenant ×1
role ×1
spring-jdbc ×1
terraform ×1