AWS 命令行界面 - 如何加密凭证

8
使用aws configure时,凭据会以明文形式存储在我的工作站上,这是一个巨大的安全违规行为。我尝试在aws cli github上提出问题,但被简单地关闭了。我使用Terraform和aws cli直接进行操作,因此需要支持对此进行解决。
[MyProfile]
aws_access_key_id = xxxxxxxxxxxxxxx
aws_secret_access_key = yyyyyyyyyyyyyyyyyy
region=us-east-2
output=json

你所关注的攻击向量是什么?我假设你已经采取了保护你的计算机的正常步骤——强密码、加密硬盘、没有其他人拥有管理员权限——并且你不习惯于将其解锁。如果你能更清楚地说明攻击向量,而不是简单地说“一个巨大的安全违规”,那么也许有人可以给你一些不被认为是“hack-job”的建议。 - Parsifal
此外,如果您描述一下您的系统,那会很有帮助。针对Linux和/或Mac的解决方案可能与Windows的不同。 - Parsifal
1
在政府IT领域,明文存储凭证是一种CAT 1违规行为。信息安全人员可以因此阻止您使用某个工具。我的抱怨是,这应该很容易解决,只需对该文件中的值进行加密即可。 - jlo-gmail
AWS提供多种管理凭据的方式。我建议您与IT安全组讨论选项,以找到有效的解决方案,而不是像您下面描述的“使用一组凭据检索另一组凭据”的自制方法。值得一提的是,在受监管环境中最常见的解决方案是使用具有时间限制凭据的外部身份验证提供程序。 - Parsifal
相关链接:https://stackoverflow.com/q/52914310 - djvg
4个回答

1

我找到的最简单的解决方法如下。

参考资料:

https://devblogs.microsoft.com/powershell/secretmanagement-and-secretstore-are-generally-available/

https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-sourcing-external.html

https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.secretmanagement/?view=ps-modules

以下PowerShell代码创建了一个加密保险库。
#This will destroy existing AWS vault
#The Vault will be set accessible to the current User with no password.
#When AWS CLI invokes this there is no way to request a password.

Install-Module Microsoft.PowerShell.SecretManagement
Install-Module Microsoft.PowerShell.SecretStore

Set-SecretStoreConfiguration -Authentication None -Scope CurrentUser -Interaction None

Register-SecretVault -Name "AWS" -ModuleName Microsoft.PowerShell.SecretStore -DefaultVault -AllowClobber

Set-Secret -Vault "AWS" -Name "test" -Secret "test" 

Get-SecretVault

Write-Host "Vault Created"

这个 PowerShell 可以创建密码,注意可以对密码设置过期时间。
$profile = Read-Host -Prompt "Enter AWS Account Number" 
$aws_access_key_id = Read-Host -Prompt "Enter AWS access key"
$aws_secret_access_key = Read-Host -Prompt "Enter AWS secret access key"


$secretIn = @{
  Version=1;
  AccessKeyId= $aws_access_key_id;
  SecretAccessKey=$aws_secret_access_key;
  SessionToken= $null; #"the AWS session token for temporary credentials";
  #Expiration="ISO8601 timestamp when the credentials expire";
} 

$secret = ConvertTo-Json -InputObject $secretIn

Set-Secret -Name $profile -Secret $secret

这个文件名为 credential_process.cmd 的文件需要在路径上或者与terraform.exe放在同一目录下。
@echo off
REM This file needs to be accessible to the aws cli or programs using it.
REM To support other paths, copy it to C:\Program Files\Amazon\AWSCLIV2
Powershell.exe -Command  "Get-Secret -Vault AWS -Name %1 -AsPlainText "

最后,在你的{user}.aws\credentials文件中添加以下条目:
[XXXXX-us-east-1]
credential_process = credential_process.cmd "XXXXX"
region=us-east-1
output=json

现在您可以使用以下命令运行 AWS CLI 命令(或 Terraform):
aws ec2 describe-vpcs --profile XXXXX-us-east-1 

缺点:

  • 无法阻止用户使用简单的aws configure语句并以明文形式存储凭据。
  • 无法强制管理员使用此方法。

像AWS的所有其他内容一样:

  • 复杂性是不必要的。
  • 文档非常详细,但总是缺少重要信息。
  • 一切都是hack-job。

可能性:

  • 可以创建一个只能访问Secret Manager中某个秘密的用户(User1)(User2凭据)。
  • User1凭据存储在本地Vault中。
  • User1将在调用credential_process.cmd时从Secret Manager中获取要使用的User2凭据
  • 人们永远不会直接获得User2凭据。
  • 这将迫使用户使用上述方法。
  • 然而,这应该在aws configure中实现,而不是拼凑在一起。这将允许其他依赖工具在配置完成后正常工作。

1

你实际上可以使用类似 aws-vault 的工具:它将密钥存储在本地钥匙串中,并创建一个临时 shell,其中包含凭据作为环境变量,或者您可以仅执行特定命令而不创建整个 shell。

另外还有一个类似的工具是 vaulted,它将凭据存储在加密文件中,并在需要使用时创建一个临时 shell 会话。


0

它并不告诉你如何加密它们。你仍然需要在“root”帐户中拥有凭据,其他配置文件将从该帐户中假定。 - Viji

-1
这是一个极大的安全违规。我尝试在AWS CLI GitHub上开启问题,但被立刻关闭了。
在AWS上,您可以使用实例角色(适用于EC2、Lambda或ECS)。
在AWS之外运行时,没有更好的选择。如果有人获得了主目录的访问权限,那么这台计算机就不再属于您了。然而,凭据也可以通过 env变量或cli/api参数传递。
它们可以加密和解密,或在需要使用时请求,但仍然需要访问解密密钥或服务。

在Windows中,CLI可以简单地使用DPAPI来加密配置文件中的凭据。Linux必须有类似的东西。 - jlo-gmail
@jlo-gmail 是的,有一些工具可以使用底层的TPM(DPAPI也在使用它)。问题是加密凭据绑定到硬件(主板),在虚拟化或云环境中可能不可行。因此客户端可以使用该选项,但这对于aws cli来说并非本地支持。然而,如果有人进入了用户的上下文,则可以使用相同的工具解密该秘密(是的,比明文文件更安全)。 - gusto2
在政府 IT 部门,明文凭据是绝对不允许的。考虑一个凭据存储在 web.config 中的网站;我们必须以某种方式加密这些值。当涉及到规模集时,这就成为了一个问题,但我们必须这样做。Gusto2 - jlo-gmail
@jlo-gmail,您可以加密凭据,然后将它们解密后作为参数或环境变量传递(不要存储在文件中)。 - gusto2

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