【问题标题】:How to get/put S3 encrypt object in nodejs with KMS?如何使用 KMS 在 nodejs 中获取/放置 S3 加密对象?
【发布时间】:2018-06-16 07:22:02
【问题描述】:

我有一些问题。我的 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'?

【问题讨论】:

  • 能否请您发布整个错误消息?我猜 CloudWatch Logs 中还有更详细的错误信息,而不仅仅是“拒绝访问”。

标签: node.js amazon-web-services amazon-s3 aws-lambda


【解决方案1】:

这是解决方案:

  1. 转到 S3 控制台,打开存储桶,查看 KMS 密钥 用于服务器端加密的内容。

  2. 转到 Lambda 控制台,打开您的 lambda 函数并查看执行角色是什么。

  3. 进入 KMS 控制台,从 1. 打开密钥,向下滚动到 Key Users 部分并从 2 添加执行角色。

那么您只需要PutObject 权限即可。

【讨论】:

    【解决方案2】:

    这听起来像是您的 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": ["*"]
      }]
    }
    

    【讨论】:

    • 谢谢,我正在解决 GET 对象的问题,但 PUT 对象 --- 不起作用。 PUT 对象方法的此问题状态
    猜你喜欢
    • 2019-09-03
    • 1970-01-01
    • 2019-09-21
    • 2016-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-31
    • 2018-06-22
    相关资源
    最近更新 更多