我们希望通过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
访问密钥包括访问密钥ID(例如,AKIAIOSFODNN7EXAMPLE)和秘密访问密钥(例如,wJalrXUtnFEMI / K7MDENG / bPxRfiCYEXAMPLEKEY)。如果您使用AWS软件开发工具包,REST或查询API操作,则使用访问密钥签署您对AWS所做的编程请求。 AWS开发工具包使用您的访问密钥为您签署请求,因此您无需处理签名过程。您也可以手动签署请求。有关更多信息,请参阅Signing AWS API Requests。
访问密钥也与命令行界面(CLI)一起使用。使用CLI时,您发出的命令由访问密钥签名。您可以使用命令传递访问密钥,也可以将其存储为计算机上的配置设置。
Temporary access keys, known as temporary security credentials
除了访问密钥ID和秘密访问密钥之外,临时安全凭证还包括在使用临时安全凭证时必须发送给AWS的安全令牌
Advantages
- 它们是短期的。
- 它们到期后,它们将不再有效。
- 您可以在安全性较低的环境中使用临时访问密钥,也可以将其分发以授予用户对AWS账户中资源的临时访问权限。
例如,您可以授予其他AWS账户中的实体访问您的AWS账户中的资源(跨账户访问权限)。您还可以授予没有AWS安全凭证的用户访问您的AWS账户(联盟)中的资源的权限。有关更多信息,请参阅IAM用户指南中的Temporary Security Credentials。
这种方法在开发和测试环境中最常见,因为它们将使用近距离范围测试其开发,同样适用于我们的应用程序部署在内部部署基础架构中的情况。
通过环境变量(NodeJs)使用Access键
// 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或容器中使用Access密钥的最安全方式,因为您不需要在代码和环境变量中放置任何Access密钥。
从实例元数据中检索安全凭证
以下命令检索名为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角色允许您描述具有特定权限的策略。该角色可以附加到EC2实例,并自动使用这些权限授予其中的服务。因此,我们可以执行API调用而无需放入Access键:
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);
});
如您所见,该代码中有任何Access键,因为SDK将从/latest/meta-data/iam/security-credentials/s3access
获取Access密钥。
命名配置文件用于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
中的凭据
需要访问密钥才能使用AWS Command Line Tools,AWS开发工具包或直接API调用对您发出的请求进行签名。拥有AWS账户root用户访问密钥的任何人都可以无限制地访问您帐户中的所有资源,包括结算信息。您无法限制AWS账户root用户的权限。
在许多情况下,您不需要永不过期的长期访问密钥(与IAM用户一样)。相反,您可以创建IAM角色并生成临时安全凭证。临时安全证书由访问密钥ID和秘密访问密钥组成,但它们还包括一个安全令牌,用于指示凭据何时到期。
如果确实需要创建用于以编程方式访问AWS的访问密钥,请创建IAM用户并仅向该用户授予他或她所需的权限。然后为该用户生成访问密钥。有关详细信息,请参阅IAM用户指南中的Managing Access Keys for IAM Users。
使用访问键时的注意事项