如何在我的项目中使用 Amazon Web 服务凭据(访问密钥)?

How to use the Amazon web services credentials (Access keys) in my project?

我们希望通过 API 调用、CLI 等从我们的本地基础设施以及 AWS 云基础设施使用 AWS 服务。

众所周知,我们可以按如下方式使用AWS访问密钥:

这是示例的片段

// Setup AWS SNS
AWS.config.update({
    region: 'eu-west-1',
    accessKeyId: process.env.AWS_ACCESS_KEY_ID,
    secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY
});

var sns = new AWS.SNS();
var params = {
    Message: "SMS message test",
    MessageStructure: 'string',
    PhoneNumber: '0045xxxxxxxx',
    Subject: 'Alarm',
    MessageAttributes :{
        'AWS.SNS.SMS.SenderID': {
            'DataType': 'String',
            'StringValue': 'MySender'
        },
        'AWS.SNS.SMS.SMSType': 'Transactional'
    }
};

sns.publish(params, function(err_publish, data) {
    if (err_publish) {}
});

此代码通过环境变量使用访问密钥。该方法已部分被接受,因为您必须修改这些环境变量以更新访问密钥。

那么,正确使用访问密钥的最佳实践或不同方法是什么?

AWS Documentation

Access keys consist of an access key ID (for example, AKIAIOSFODNN7EXAMPLE) and a secret access key (for example, wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY). You use access keys to sign programmatic requests that you make to AWS if you use the AWS SDKs, REST, or Query API operations. The AWS SDKs use your access keys to sign requests for you, so that you don't have to handle the signing process. You can also sign requests manually. For more information, see Signing AWS API Requests.

Access keys are also used with command line interfaces (CLIs). When you use a CLI, the commands that you issue are signed by your access keys. You can pass access keys either with the command or store as configuration settings on your computer.

Temporary access keys, known as temporary security credentials

In addition to the access key ID and secret access key, temporary security credentials include a security token that you must send to AWS when you use temporary security credentials

Advantages

  • They are short term.
  • After they expire, they're no longer valid.
  • You can use temporary access keys in less secure environments or distribute them to grant users temporary access to resources in your AWS account.

For example, you can grant entities from other AWS accounts access to resources in your AWS account (cross-account access). You can also grant users who don't have AWS security credentials access to resources in your AWS account (federation). For more information, see Temporary Security Credentials in the IAM User Guide.


使用访问键的方法

  • 环境变量中的访问键

这种方法对于开发和测试环境是最常见的,因为他们将使用近距离测试他们的开发,同样适用于我们的应用程序部署在内部基础设施中的场景。

通过环境变量 (NodeJs) 使用访问键

// Setup AWS SNS
AWS.config.update({
    region: 'eu-west-1',
    accessKeyId: process.env.AWS_ACCESS_KEY_ID,
    secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY
});

var sns = new AWS.SNS();
var params = {...});

sns.publish(params, function(err_publish, data) {...});

  • 通过实例元数据访问密钥

这是在 EC2 或容器中使用访问密钥的最安全方式,因为您不需要在代码或环境变量中放置任何访问密钥。

正在从实例元数据中检索安全凭证

以下命令检索名为 s3access 的 IAM 角色的安全凭证。

curl 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"
}

IAM 角色

IAM 角色提供了一种向您的服务授予权限的良好且安全的方式。

IAM 角色控制台看起来像这样

IAM 角色允许您描述具有特定权限的策略。该角色可以附加到 EC2 实例,并且其中的服务将自动被授予这些权限。因此,我们可以执行 API 调用而无需放置访问键:

var s3 = new AWS.S3({params:{Bucket: 'bucketname', Key: 'filename'}});
var body = fs.createReadStream('file_to_upload');

s3.upload({Body:body})
.on('httpUploadProgress',function(evt){
    console.log(evt);
})
.send(function(err,data){
    console.log(err,data);
});

如您所见,该代码中有任何访问密钥,因为 SDK 将从 /latest/meta-data/iam/security-credentials/s3access.

获取访问密钥
  • 命名配置文件中的访问密钥

命名配置文件用于 CLI(命令行界面),因此您可以创建具有不同用途的配置文件。例如,您可以使用来自特定区域的 AWS 访问密钥。

AWS CLI 支持存储在配置和凭证文件中的命名配置文件。您可以使用带有 --profile 选项的 aws configure 或通过向配置和凭据文件添加条目来配置其他配置文件。

以下示例显示了具有两个配置文件的凭据文件:

~/.aws/credentials

[default]
aws_access_key_id=AKIAIOSFODNN7EXAMPLE
aws_secret_access_key=wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY

[user2]
aws_access_key_id=AKIAI44QH8DHBEXAMPLE
aws_secret_access_key=je7MtGbClwBF/2Zp9Utk/h3yCo8nvbEXAMPLEKEY

每个配置文件使用不同的凭据——可能来自两个不同的 IAM 用户——并且还可以使用不同的区域和输出格式。

~/.aws/config

[default]
region=us-west-2
output=json

[profile user2]
region=us-east-1
output=text

通过 AWS CLI 使用配置文件

$ aws ec2 describe-instances --profile user2

上面的命令将使用配置文件 user2

中的凭据

Best practices for using Access keys

删除(或不生成)帐户访问密钥

需要访问密钥才能签署您使用 AWS 命令​​行工具、AWS 开发工具包或直接 API 调用发出的请求。拥有您的 AWS 账户根用户访问密钥的任何人都可以不受限制地访问您账户中的所有资源,包括账单信息。您不能限制您的 AWS 账户根用户的权限。


使用临时安全凭证(IAM 角色)代替长期访问密钥

在许多情况下,您不需要永不过期的长期访问密钥(与 IAM 用户一样)。相反,您可以创建 IAM 角色并生成临时安全凭证。临时安全凭证由访问密钥 ID 和秘密访问密钥组成,但它们还包括指示凭证何时过期的安全令牌。


正确管理 IAM 用户访问密钥

如果您确实需要为以编程方式访问 AWS 创建访问密钥,请创建一个 IAM 用户并仅授予该用户他或她需要的权限。然后为该用户生成访问密钥。有关详细信息,请参阅 IAM 用户指南中的 Managing Access Keys for IAM Users

使用访问密钥时的注意事项

  • 不要将访问密钥直接嵌入到代码中。
  • 对不同的应用程序使用不同的访问密钥。
  • 定期轮换访问密钥。
  • 删除未使用的访问密钥。
  • 为最敏感的操作配置多重身份验证。

资源