Security Token Service - STS

STS(Security Token Service)是通过创建临时安全密钥(temporary security credentials) 来实现对AWS资源的访问。和长期的AK/SK相比,临时安全密钥有生存期限,在几分钟到几个小时之间不等。另外,临时安全密钥通常是通过程序动态生成的,再提供给用户使用

STS一般有以下几种使用方式:

  • AssumeRole:在自己帐号使用或跨帐号使用
  • AssumeRoleWithSAML: 返回SAML登录的用户凭证
  • AssumeRoleWithWebIdentity:返回IdP(Facebook, Google, OIDC..)登录的用户凭证
  • GetSessionToken:返回MFA用户登录的凭证

STS Assume Role

在自己帐号使用STS Assume Role时,主要流程如下:

image-20230816061250157

  1. 创建一个IAM Role,这个Role里声明了哪些principal可以访问它
  2. 用户使用STS来Assume Role,取回访问密钥
  3. 临时的密钥有15min - 36h的有效期限

跨帐号STS Assume Role

image-20230816061610582

跨帐号STS AssumeRole的流程:

  1. 被访问者的帐号(上图为Production Account)创建IAM Role,并在principal里允许访问者的帐号(上图为Development Account)
  2. 访问者帐号允许下面的用户有Assume该Role的权限
  3. 访问者帐号的用户进行跨帐号AssumeRole的操作
  4. 访问者帐号的用户取回临时密钥访问S3

STS测试

aws sts assume-role --role-arn arn:aws:iam::123456789012:role/role-name --role-session-name "RoleSession1" --profile IAM-user-name > assume-role-output.txt

示例:

❯ aws sts assume-role --role-arn arn:aws:iam::145197526627:role/amazon-dynamodb-labs-DDBInstanceRole-1WVYWX4PPBSYD --role-session-name "RoleSession1" --profile default > assume-role-output.txt
❯ cat assume-role-output.txt
{
    "Credentials": {
        "AccessKeyId": "ASIASDTTSNZRXKZRIXOY",
        "SecretAccessKey": "ygVxImNspGaDy1BpagwJSZwO013CmoFSkRWdbLtq",
        "SessionToken": "IQoJb3JpZ2luX2VjEPf//////////wEaCXVzLWVhc3QtMSJHMEUCIBtam6dhWHVwyl5kqNt5gj+WDtcsDlKyEYltpXv2+5AmAiEAl/Hid20rVxTL9PZzqC9jX8WNjZVTVmq/DrI8qE4pIUwqmQIIcBABGgwxNDUxOTc1MjY2MjciDLURH3vZalWE+2RkqCr2AQy9L1g4UIoSEsnWGpXzL7i3bwM3dBiwso/PlLBSuFmRSuPbzUR1VfuDX7ptQ1D7wOdENpGju7+e/X/vF0g5ek7DWy73v1SuFEhUkb91FiPB24WyeFD7+Z/DS3WSbfIsLwBkckA0FhmCtUrDW3LMPf1YUDPKt5g8IWmCZJLTmujJonqoYGjEDQoP2vQnMK+pLthIx7pECu+LTK9n+hAmS/S2xHSYDARgBMJroFCJYBhRL/x9wLG4eMJntewTpT+oBuejNjac422lW6dyTEKKGLQIIJ4wrlyyLyxFBah4GEALGklvuzEr5C82wjlKky6BLJCq6tz5TzCSrNieBjqdAalLLcUqz7I3lRV0UBEzqaVRwz7y0leQ1QszdoSj+B3yAIOrrlN4cEJJkIdcDnIiGDQODmocYpsB9fo7B+ai4ExcCFm8waxnPURp8z7iyMYpgj/uTTuiZDXI5y6LbC5LDNFSXm3mzESLvsvwtd0Oa+F3JGn/XNRpv55bag0AOaUkXCUe55Wl4zroovxLAEj+9CPaTtYZhS++c98OMfI=",
        "Expiration": "2023-01-29T07:45:38+00:00"
    },
    "AssumedRoleUser": {
        "AssumedRoleId": "AROASDTTSNZR3BYTMBKIK:RoleSession1",
        "Arn": "arn:aws:sts::145197526627:assumed-role/amazon-dynamodb-labs-DDBInstanceRole-1WVYWX4PPBSYD/RoleSession1"
    }
}

STS在APP的使用场景

假设在一个APP里,用户需要将文件上传到S3。此时可以使用STS方案

客户端:

客户在登录成功后有一个身份,比如yy_token_xxxxx

拿这个token访问后端提供的API,后端API验证通过后,调用AWS AssumeRole,返回临时凭证给客户端。 客户端拿到临时凭证后,可以访问aws的各种服务。


服务端:提供一个API。比如 https://xx.com/auth

接收到客户端传来的token后,首先进行内部身份验证,如果验证失败返回false。

验证成功则生成一个临时的token(可参考 https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_use-resources.html#using-temp-creds-sdk-cli ) 返回给客户端。