除了IAM User之外最常用的那一定是IAM的Role实体,Role和User在访问AWS资源是一样也需要一对ACCESS_KEY和SECRET_KEY来对请求进行签名以达到身份验证的目的,Role也需要绑定Policy来定义它可以访问什么资源。Role和User不太一样的地方,一是Role可以赋给某个AWS资源,并不一定要是人类用户。二是Role是被Assumed,它并不能直接登陆使用,不存在用户名和密码,也没有一对长期可用的AWS密钥对,那Role怎么使用呢?Role需要配合AWS Security Token Service (STS)生成的临时凭据来获得访问资源所用的AWS密钥对。简单来说,Assume一个Role,就像要有某个实体来主动提出想要“担任”某个职务,并在被允许的情况下暂时获得了一个临时的证件来行使该职务所拥有的权利。
一个Role如果想要被人或资源来Assume并使用的话,就一定预先定义好这个Role可以“相信”哪些AWS的实体,即定义它的Trust Relationship,因为不能人人都随便给自己提升权利,可以相信的一定要是AWS的Principal类型,例如,某种AWS服务,像是EC2,Lambda,或者是某个具体的IAM User和Role,对的Role也可以Assume另一个Role,不过有个特例,这里会故意跳过不讲。这种信任关系也是通过Policy定义的,比如说这个trust-bob-java.json:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::123456789012:user/bob-java"
},
"Action": "sts:AssumeRole",
"Condition": {}
}
]
}
这里明确指出名为bob-java的User可以进行"sts:AssumeRole"这项动作,如果这个Policy被设置为一个AlicePerlRole的Trust Relationship,那就是说只有bob-java可以主动报名让自己来暂时执行AlicePerlRole中定义的权利,比如在下面的alice-perl.json中,定义了它可以访问alice-perl-bucket中的Object:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "AliceCanGetAllHerObjects",
"Effect": "Allow",
"Action": ["s3:GetObject"],
"Resource": ["arn:aws:s3:::alice-perl-bucket/*"]
}
]
}
并且bob-java自身的权限一定要允许他也可以对于AlicePerlRole这个资源进行"sts:AssumeRole"的动作,才能顺利的让bob-java来Assume成AlicePerlRole。Vault中的AWS Secret引擎也可以配置这套流程来动态的为某个实体来获取这样的临时凭据,上一篇文章中讲述了在创建一个动态的IAM User时我们在创建Vault中对应的Role时,指明了“credential_type=iam_user“,而临时凭据Vault Role需要设置credential_type为assumed_role,其他的流程大体一致。
首先先要配置这个引擎的root credential,即bob-java的凭据,并要确保它可以对AlicePerlRole进行AssumeRole:
vault secrets enable -path my-aws-assume-roles aws
vault secrets list
vault write my-aws-assume-roles/config/root \
access_key=xxxxxxxxxxx \
secret_key=yyyyyyyyyyy \
region=us-east-1 # xxxxx 和 yyyyy即bob-java的密钥对
vault read my-aws-assume-roles/config/root
然后为AlicePerlRole来创建这样的其对应的Vault Role,比如名为alice-perl,和在alice-perl.json中它所定义的权限Policy:
vault write my-aws-assume-roles/roles/alice-perl \
role_arns=arn:aws:iam::ACCOUNT-ID-WITHOUT-HYPHENS:role/AlicePerlRole \
credential_type=assumed_role # replace with your own account
vaule read my-aws-assume-roles/roles/alice-perl
接下来就可以指使Vault来为我们向sts去申请担任AlicePerlRole的职务:
vault write my-aws-assume-roles/sts/alice-perl ttl=15m # min ttl is 15m
# output:
Key Value
--- -----
lease_id my-aws-assume-roles/sts/alice-perl/hNdpF61vKuokSviaKaBs3VLC
lease_duration 15m
lease_renewable false
access_key ASIARPH377BEY7S56VEK
secret_key XRW/sRshXfvHUQiyV0ZSCpcSkEH9Z2LVSq4hmC6g
security_token FwoGZXIvYXdzEIH//////////wEaDFvlgePS8dsEirx2DiLJAduo4pvTHwvY8ASSJNOqXHfpDPx/G4VSIhElkHnIdD0U0Z1EFKvnemxMWCzJdiwAkuZAhBYlhoM0PeV6yXbWhtiE9GxXargM8mNGSFutAQShwEUPwGHXWCUeuE7Luur4AvMFg2pLq2sdUGO5SWmgHDYK2+E61WEVCVGHBZThg/raO3GoxgCf3mSGHQwQchTJFbtnEFZ0kiaYL4mm5mCTZV2lMlD9jdgR6pfZ7Kc+LH9cIHjG7t4+JjsdjJrB+lj5KCJPPcCS0rM4lSizidX4BTItNK7ClUXAGOW6d9uTk14haMKqSL+zfO72AQIP4rjj5yI2WHYaRkGtQ4sKtxue
这是会得到关于这个Role的访问凭据,即ACCESS_KEY, SECRET_KEY, 和一个SECURITY_TOKEN,这三者结合在一起使用就相当于出示了AlicePerlRole的证件,也可以去访问它所允许的资源了。