如何测试 AWS 命令行工具的凭据

294

有没有一种可以传递给aws实用程序的命令/子命令,可以1)验证~/.aws/credentials文件中的凭据是否有效,并2)提供一些指示凭据属于哪个用户?我正在寻找一些通用的东西,不做任何关于用户具有IAM或任何特定服务权限的假设。

这种用例是在部署时进行的合理性检查,以确保凭据是好的。理想情况下,应该有一种方法来检查返回值并在存在无效凭据时中止部署。


3
我可以建议您在http://serverfault.com/上提出这个问题,因为Stack Overflow专门用于编程问题。 - Tripp Kinetics
6
是的,我曾经犹豫在哪里提问。在我看来,问题的重点更多地集中在编程式地查询 API 而不是管理服务器本身上。 - smitelli
3个回答

466

使用GetCallerIdentity
aws sts get-caller-identity

与其他API/CLI调用不同,它将始终工作,而不考虑您的IAM权限。

您将以以下格式获得输出:

{
    "Account": "123456789012", 
    "UserId": "AR#####:#####", 
    "Arn": "arn:aws:sts::123456789012:assumed-role/role-name/role-session-name"
}

确切的 ARN格式取决于凭证类型,但通常包括(人类)用户的名称。

它使用标准的 AWS CLI错误代码,成功时返回0,如果您没有凭据则返回255。


8
这是一个很好的答案,但如果您使用MFA,请注意——它更加复杂。使用MFA时,您需要使用工作凭证(i)以及MFA令牌来获取不同的工作临时凭证(ii),并且通过这种解决方案,您可以获得凭证(i)或(ii)相同的结果。 - Mark Chackerian
5
@MarkChackerian 这并不总是适用的。我创建了一个用户,使用 Trek10 的策略 强制执行 MFA。如果 MFA 会话令牌未激活,当我执行 aws iam get-user --profile test-mfa 时,会出现 An error occurred (AccessDenied) when calling the GetUser operation。然而,aws sts get-caller-identity --profile test-mfa 输出(同样,在没有 MFA 会话令牌的情况下)test-mfa 的帐户、ARN 和 UserId。 - Ville
1
出现错误代码254(在您的链接中未描述)和消息“调用GetCallerIdentity操作时发生错误(InvalidClientTokenId):请求中包含的安全令牌无效。” - jangorecki
@jangorecki 当我的默认区域不受支持时,我遇到了这个错误(在尝试aws iam get-user后,我得到了更清晰的消息)。在切换我的默认区域后,建议的命令正常工作。 - Cory
我喜欢这个答案。如果你经常使用它,你可以创建一个别名来使它更容易,就像这样:alias aws-ping='aws sts get-caller-identity'。然后你就有了一个简单的命令行缩写。 - BrianV

101

有一种简单的方法 - aws iam get-user 将告诉您关于您自己(当前IAM用户)的详细信息 - 假设该用户具有 iam 权限。

有几个CLI调用支持--dry-run标志,例如aws ec2 run-instances,它会告诉您是否拥有执行操作所需的必要配置/凭据。

还有一个--auth-dry-run选项,可以检查您是否拥有执行命令所需的权限,而无需实际运行命令。如果您具有所需的权限,则命令返回DryRunOperation;否则,它将返回UnauthorizedOperation。[来自AWS文档 - 常用选项]

您可以从管理控制台列出IAM访问密钥,并交叉检查以查看谁被分配了哪个密钥。

了解哪个用户/角色具有哪些特权的最佳方法是利用IAM策略模拟器


21
具有讽刺意味的是,我作为测试执行者的用户收到了一个“AccessDenied”错误消息——其中包含完整的“arn:aws:iam::123...890:user/somebody”字符串作为错误输出的一部分。 - smitelli
9
用户可能没有权限获取自己的信息。 :-/ - Jason
1
是的,我遇到了这种情况。在 AWS 控制台中,用户 ARN 旁边显示为 N/A,并且悬停说明“User arn:aws:iam:...:user/steve 未被授权在资源 user steve 上执行 iam:GetUser”。 - Steve Bennett

0

我也有同样的需求,所以我写了aws-role

我还希望该命令输出会话时间,在注销之前保持不变:

enter image description here

我在许多shell脚本中使用它来自动化我的AWS使用-对我很有效。

我的脚本解析~/.aws/credentials

PS:还考虑增强它以支持JSON输出


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,