为啥我在 s3 上的访问被拒绝(使用适用于 Node.js 的 aws-sdk)?

Posted

技术标签:

【中文标题】为啥我在 s3 上的访问被拒绝(使用适用于 Node.js 的 aws-sdk)?【英文标题】:Why is my access denied on s3 (using the aws-sdk for Node.js)?为什么我在 s3 上的访问被拒绝(使用适用于 Node.js 的 aws-sdk)? 【发布时间】:2017-01-29 23:01:00 【问题描述】:

我正在尝试从我的 s3 存储桶中读取现有文件,但我不断收到“拒绝访问”的消息,但没有解释或说明如何处理它。 Here 是我正在使用的代码:

'use strict'

var AWS = require('aws-sdk')
const options = 
  apiVersion: '2006-03-01',
  params: 
    Bucket: process.env['IMAGINATOR_BUCKET']
  ,
  accessKeyId: process.env['IMAGINATOR_AWS_ACCESS_KEY_ID'],
  secretAccessKey: process.env['IMAGINATOR_AWS_SECRET_ACCESS_KEY'],
  signatureVersion: 'v4'

console.log('options', options)
var s3 = new AWS.S3(options)

module.exports = exports = 
  get (name, cb) 
    const params = 
      Key: name + '.json'
    
    console.log('get params', params)
    return s3.getObject(params, cb)
  ,
  set (name, body, cb) 
    const params = 
      Key: name + '.json',
      Body: body
    
    console.log('set params', params)
    return s3.putObject(params, cb)
  

这就是我在使用get 方法并记录回调中提供的错误时得到的输出(敏感信息被删掉):

options  apiVersion: '2006-03-01',
  params:  Bucket: CENSORED_BUT_CORRECT ,
  accessKeyId: CENSORED_BUT_CORRECT,
  secretAccessKey: CENSORED_BUT_CORRECT,
  signatureVersion: 'v4' 
get params  Key: 'whitelist.json' 
err  [AccessDenied: Access Denied]
  message: 'Access Denied',
  code: 'AccessDenied',
  region: null,
  time: Wed Sep 21 2016 11:17:50 GMT-0400 (EDT),
  requestId: CENSORED,
  extendedRequestId: CENSORED,
  cfId: undefined,
  statusCode: 403,
  retryable: false,
  retryDelay: 20.084538962692022 
/Users/shawn/git/vigour-io/imaginate/node_modules/aws-sdk/lib/request.js:31
            throw err;
            ^

AccessDenied: Access Denied
    at Request.extractError (/Users/shawn/git/vigour-io/imaginate/node_modules/aws-sdk/lib/services/s3.js:538:35)
    at Request.callListeners (/Users/shawn/git/vigour-io/imaginate/node_modules/aws-sdk/lib/sequential_executor.js:105:20)
    at Request.emit (/Users/shawn/git/vigour-io/imaginate/node_modules/aws-sdk/lib/sequential_executor.js:77:10)
    at Request.emit (/Users/shawn/git/vigour-io/imaginate/node_modules/aws-sdk/lib/request.js:668:14)
    at Request.transition (/Users/shawn/git/vigour-io/imaginate/node_modules/aws-sdk/lib/request.js:22:10)
    at AcceptorStateMachine.runTo (/Users/shawn/git/vigour-io/imaginate/node_modules/aws-sdk/lib/state_machine.js:14:12)
    at /Users/shawn/git/vigour-io/imaginate/node_modules/aws-sdk/lib/state_machine.js:26:10
    at Request.<anonymous> (/Users/shawn/git/vigour-io/imaginate/node_modules/aws-sdk/lib/request.js:38:9)
    at Request.<anonymous> (/Users/shawn/git/vigour-io/imaginate/node_modules/aws-sdk/lib/request.js:670:12)
    at Request.callListeners (/Users/shawn/git/vigour-io/imaginate/node_modules/aws-sdk/lib/sequential_executor.js:115:18)

现在我不确定该怎么做,因为我认为我根据文档正确地做事,但它不起作用,并且错误消息没有说明为什么我的访问被拒绝...知道什么下一步应该是让它工作?

【问题讨论】:

【参考方案1】:

问题是我的新 IAM 用户没有附加策略。我为它分配了AmazonS3FullAccess 策略,现在它可以工作了。

正如 cmets 所指出的,更严格的政策会更安全

【讨论】:

除非您确实需要,否则向您的应用程序提供FullAccess 是不安全的。您应该查看实际需要哪些权限并仅提供所需的权限。 cnvzmxcvmcx@的附录:简称为最小权限原则,见IAM Grant Least Privilege。 在使用 AWS 服务时要有足够的认识。对于 AWS,仅做一些事情来解决问题是不够的。我们必须了解做出改变的背景和后果。在您的情况下,您刚刚添加了 S3FullAccess。这是一种不好的做法。仅允许所需的访问权限。【参考方案2】:

如果您尝试设置 ACL to "public-read" 但存储桶阻止了公共访问,也可能发生这种情况。例如,如果您打算将静态资产上传到配置错误的 S3 存储桶。您可以在存储桶设置中更改它。

【讨论】:

谢谢!!那是我的问题。【参考方案3】:

您的策略中的FullAccess 不是必需的。你可以试试这样:


    "Version": "2012-10-17",
    "Statement": [
        
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": [
                "s3:Put*",
                "s3:Get*",
                "s3:List*",
                "s3:Delete*"
            ],
            "Resource": [
                "arn:aws:s3:::bucket/*",
                "arn:aws:s3:::bucket"
            ]
        ,
        
            "Sid": "VisualEditor1",
            "Effect": "Allow",
            "Action": "s3:ListAllMyBuckets",
            "Resource": "*"
        
    ]

【讨论】:

【参考方案4】:

当您尝试读取的对象不存在时,可能会发生这些错误。据我了解,在这些情况下,AWS 错误并不那么清楚。

验证您的密钥/存储桶是否正确以及您在 API 方法上发送的参数是否正确。

这个问题我已经遇到过两次了:

当我用存储桶参数替换 key 参数时,反之亦然,我试图使用 getObject() 方法读取一个 s3 对象。 当我尝试使用 copyObject() 方法将文件复制到不存在的位置时。

【讨论】:

【参考方案5】:
"code":"AccessDenied","region":null,"time":"2020-05-24T05:20:56.219Z","requestId": ... 

在 s3 aws 控制台中应用了以下策略 > “权限”选项卡的存储桶策略编辑器以消除上述错误,


    "Version": "2012-10-17",
    "Statement": [
        
            "Effect": "Allow",
            "Principal": 
                "AWS": "arn:aws:iam::<IAM-user-ID>:user/testuser"
            ,
            "Action": [
                "s3:ListBucket",
                "s3:ListBucketVersions",
                "s3:GetBucketLocation",
                "s3:Get*",
                "s3:Put*"
            ],
            "Resource": "arn:aws:s3:::srcbucket"
        
    ]

【讨论】:

【参考方案6】:
Steps

1: click on Users in IAM (in AWS)
2: click on permission tab
3: click on add permission then click on add group
4: search s3fullaccess in searchbar
5: select AmazonS3FullAccess and type any group name then click on create
6: perform action through your API again
7: done

【讨论】:

【参考方案7】:

在我的例子中,我更新了.env 文件中保存 s3 存储桶名称的变量,但没有更新程序中的变量,因此程序收到了导致我的程序抛出的存储桶名称变量的 undefinedaccess denied 错误。

因此,如果您将存储桶名称存储在变量中,请确保使用正确的存储桶名称或正确的变量名称

【讨论】:

以上是关于为啥我在 s3 上的访问被拒绝(使用适用于 Node.js 的 aws-sdk)?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我的 lambda 函数在尝试访问 S3 存储桶时会被拒绝访问?

S3 端点访问被拒绝错误

如何解决拒绝访问 aws s3 文件?

尽管用户角色,AWS Batch 作业在 S3 上被拒绝访问

使用 IAM 角色从 ECS 的 S3 存储桶中提取对象被拒绝访问

Amazon S3 上传访问被拒绝