在远程服务器上使用AWS凭证而不将其存储在远程服务器上?

时间:2020-04-13 17:53:16

标签: amazon-web-services amazon-s3 ssh remote-server

是否可以在远程服务器上使用AWS凭证而不显式复制它们?

例如,我可以在ssh-add && ssh -A <server_name>之类的服务器上使用本地ssh密钥,是否可以在不复制~/.aws/credentials~/.aws/config的情况下针对AWS CLI进行类似的操作?

我想使用这些AWS凭证只是为了从S3下载一些文件。

2 个答案:

答案 0 :(得分:1)

为了SSH到远程服务器,您的公共密钥必须已经存在于远程服务器上。您的工具使用私钥来加密通信。因此,您认为在远程服务器上不需要您的凭据的假设是错误的。

EC2支持从元数据中检索凭证。您可以创建一个IAM角色s3access,然后在EC2中承担该角色。您甚至可以使用命令行工具curl来检索这些凭据。示例:

TOKEN=`curl -X PUT "http://169.254.169.254/latest/api/token" -H "X-aws-ec2-metadata-token-ttl-seconds: 21600"`
curl -H "X-aws-ec2-metadata-token: $TOKEN" -v http://169.254.169.254/latest/meta-data/iam/security-credentials/s3access

示例输出:

{
  "Code" : "Success",
  "LastUpdated" : "2012-04-26T16:39:16Z",
  "Type" : "AWS-HMAC",
  "AccessKeyId" : "ASIAIOSFODNN7EXAMPLE",
  "SecretAccessKey" : "wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY",
  "Token" : "token",
  "Expiration" : "2017-05-17T15:09:54Z"
}

有关元数据凭据的更多信息,请参阅此link

您还可以将CLI设置为自动使用元数据凭据。有关更多信息,请参阅此link

如果您的目标是在EC2实例上没有凭据,那么您将需要使用Presigned URL。有关更多信息,请参阅此link

答案 1 :(得分:0)

如果您要做的只是从S3下载一些文件,则persigned URLs可能是一个更简单,更安全的选择。 AWS允许您为仅在特定时间段内可用的任何AWS API操作生成URL。您可以为特定文件生成这些URL,将其发送到服务器,然后让服务器使用它们下载文件。

例如:

aws s3 presign s3://awsexamplebucket/test2.txt --expires-in 604800

boto3和aws-sdk等所有不同的框架也支持生成URL。

另一个选项正在生成temporary credentials。 AWS允许您创建仅在特定时间段内的凭证。例如,它还允许您限制它们的范围,因此您可以要求它们仅允许从特定存储桶下载。使用STS,您将获得一组新的访问密钥和会话令牌,并将它们发送到您的服务器,并让您的服务器使用它们来执行所需的操作。

如果您希望令牌具有与调用角色完全相同的凭据,请使用:

aws sts get-session-token

否则,您将需要创建一个具有适当权限的角色并使用:

aws sts assume-role --role-arn arn:aws:iam::123456789012:role/xaccounts3access --role-session-name s3-access-example

就像预签名的URL一样,这些API在每个SDK中都可用,而不仅仅是在命令行上可用。

相关问题