如何使用KMS get/put S3加密nodejs中的对象?
How to get/put S3 encrypt object in nodejs with KMS?
我有一些问题。我有几个 lambda 函数,如果我在本地创建脚本,并且 运行 它,一切正常,但如果我的代码在远程 lambda 上工作,我有错误:访问被拒绝
S3Service.prototype.PutFile = function (bucket, key, body, type, callback) {
var s3 = new this.AWS.S3({region: awsConfig.region,"signatureVersion":"v4"});
var params = {
Bucket: bucket,
Key: key,
Body: body,
ContentType: type,
ACL: 'public-read-write',
ServerSideEncryption: 'aws:kms',
SSEKMSKeyId: awsConfig.kmsKeyId
};
s3.putObject(params, function (err, res) {
if (err) {
callback(new InternalServerError(err));
} else {
callback(null);
}
});
};
S3Service.prototype.GetFile = function (params, callback) {
var s3 = new this.AWS.S3({ region: awsConfig.region,"signatureVersion":"v4"});
s3.getObject(params, function (err, data) {
if (err) {
callback(new InternalServerError(err));
} else {
callback(null, data.Body, data.ContentType);
}
});
};
存储桶策略:
var policy = {
"Version": "2012-10-17",
"Statement":[{
"Sid":"DenyUnEncryptedObjectUploads",
"Effect":"Deny",
"Principal": "*",
"Action":["s3:PutObject"],
"Resource": "arn:aws:s3:::" + name + "/*",
"Condition":{
"StringNotEquals":{
"s3:x-amz-server-side-encryption":"aws:kms"
}
}
}
]
};
正在生成 kms 密钥:
kms.createKey({ Description: 'qwe', KeyUsage: 'ENCRYPT_DECRYPT' }, function (err, data) {
//var keyId = data.KeyMetadata.KeyId
});
如何正确地将加密对象放入和获取到 S3:ServerSideEncryption:'aws:kms'?
这听起来像是您的 lambda 角色策略有问题。 lambda 的作用是什么?
尤其要确保它具有以下效果:
"PolicyDocument": {
"Version": "2012-10-17",
"Statement": [{
"Effect": "Allow",
"Action": [
"s3:*"
],
"Resource": [
"arn:aws:s3:::s3bucket",
"arn:aws:s3:::s3bucket/*"
]
}, {
"Effect": "Allow",
"Action": [
"kms:Decrypt",
"kms:Encrypt"
],
"Resource": ["*"]
}]
}
这是解决方案:
转到 S3 控制台,打开存储桶并查看 KMS 密钥 用于服务器端加密的内容。
转到 Lambda 控制台,打开您的 lambda 函数并查看什么是 执行角色 .
转到 KMS 控制台,打开 1. 中的密钥,向下滚动到 Key Users 部分并添加 2. 中的执行角色。
那么你只需要 PutObject
权限就可以了。
我有一些问题。我有几个 lambda 函数,如果我在本地创建脚本,并且 运行 它,一切正常,但如果我的代码在远程 lambda 上工作,我有错误:访问被拒绝
S3Service.prototype.PutFile = function (bucket, key, body, type, callback) {
var s3 = new this.AWS.S3({region: awsConfig.region,"signatureVersion":"v4"});
var params = {
Bucket: bucket,
Key: key,
Body: body,
ContentType: type,
ACL: 'public-read-write',
ServerSideEncryption: 'aws:kms',
SSEKMSKeyId: awsConfig.kmsKeyId
};
s3.putObject(params, function (err, res) {
if (err) {
callback(new InternalServerError(err));
} else {
callback(null);
}
});
};
S3Service.prototype.GetFile = function (params, callback) {
var s3 = new this.AWS.S3({ region: awsConfig.region,"signatureVersion":"v4"});
s3.getObject(params, function (err, data) {
if (err) {
callback(new InternalServerError(err));
} else {
callback(null, data.Body, data.ContentType);
}
});
};
存储桶策略:
var policy = {
"Version": "2012-10-17",
"Statement":[{
"Sid":"DenyUnEncryptedObjectUploads",
"Effect":"Deny",
"Principal": "*",
"Action":["s3:PutObject"],
"Resource": "arn:aws:s3:::" + name + "/*",
"Condition":{
"StringNotEquals":{
"s3:x-amz-server-side-encryption":"aws:kms"
}
}
}
]
};
正在生成 kms 密钥:
kms.createKey({ Description: 'qwe', KeyUsage: 'ENCRYPT_DECRYPT' }, function (err, data) {
//var keyId = data.KeyMetadata.KeyId
});
如何正确地将加密对象放入和获取到 S3:ServerSideEncryption:'aws:kms'?
这听起来像是您的 lambda 角色策略有问题。 lambda 的作用是什么?
尤其要确保它具有以下效果:
"PolicyDocument": {
"Version": "2012-10-17",
"Statement": [{
"Effect": "Allow",
"Action": [
"s3:*"
],
"Resource": [
"arn:aws:s3:::s3bucket",
"arn:aws:s3:::s3bucket/*"
]
}, {
"Effect": "Allow",
"Action": [
"kms:Decrypt",
"kms:Encrypt"
],
"Resource": ["*"]
}]
}
这是解决方案:
转到 S3 控制台,打开存储桶并查看 KMS 密钥 用于服务器端加密的内容。
转到 Lambda 控制台,打开您的 lambda 函数并查看什么是 执行角色 .
转到 KMS 控制台,打开 1. 中的密钥,向下滚动到 Key Users 部分并添加 2. 中的执行角色。
那么你只需要 PutObject
权限就可以了。