【问题标题】:Verifying S3 credentials w/o GET or PUT using boto3使用 boto3 验证不带 GET 或 PUT 的 S3 凭据
【发布时间】:2017-11-02 07:10:59
【问题描述】:

有没有办法验证一组给定的 S3 凭证是否可以访问特定的存储桶,而无需执行某种明确的 PUT 或 GET 操作?

实例化 s3.Client、s3.Resource 或 s3.Bucket 对象似乎根本无法验证凭据,更不用说存储桶访问了。

boto3 1.4.7。 蟒蛇2.7.13。

我们有自动创建存储桶的自动化和编排功能,我想包含一个验证用户访问密钥和秘密的部分。我知道存储桶在我创建后就存在了。桶是空的。

我想验证用户是否有权访问而不执行 PUT 操作。

感谢您的帮助。

* 更新 *

我最终使用了一个 s3.Client 对象:

objects = client.list_objects(Bucket=cfg['bucket'])

由于桶是空的,这是一个轻量级的操作,并且大部分是单行的。 (包装在 try 块中)

【问题讨论】:

  • 小心 list_objects 方法,它将返回前 1000 个。作为替代方案,您可以首先使用 s3_bucket = s3.Bucket(my_bucket) 从 S3 资源 s3 = boto3.resource('s3') 实例化存储桶 my_bucket = cfg['bucket'],然后您可以使用 .objects.all() 方法,该方法将提供一个 ObjectSummary 迭代器,它允许您获取所有对象,例如all_objects = [s3.Object(my_bucket, s3_object.key) for s3_object in s3_bucket.objects.all()]

标签: python-2.7 amazon-web-services amazon-s3 boto3


【解决方案1】:

是的,您可以为此使用IAM policy simulation。这是一个例子:

import boto3

iam = boto3.client('iam')
sts = boto3.client('sts')

# Get the arn represented by the currently configured credentials
arn = sts.get_caller_identity()['Arn']

# Create an arn representing the objects in a bucket
bucket_objects_arn = 'arn:aws:s3:::%s/*' % 'my-test-bucket'

# Run the policy simulation for the basic s3 operations
results = iam.simulate_principal_policy(
    PolicySourceArn=arn,
    ResourceArns=[bucket_objects_arn],
    ActionNames=['s3:PutObject', 's3:GetObject', 's3:DeleteObject']
)
for result in results['EvaluationResults']:
    print("%s - %s" % (result['EvalActionName'], result['EvalDecision']))

你可以找到所有的s3动作here

对此的一个警告是 IAM 最终是一致的,因此如果您正在动态创建用户,您可能仍然需要等待一段时间才能传播更改。

【讨论】:

  • 感谢您发布此示例。我之前没有在自定义代码中使用过策略模拟器,这在使用 IAM 策略时给了我很多想法。
  • 感谢您的信息,非常有用。我最终做了一些不同的事情,到目前为止似乎还在工作。请参阅上面的编辑。
  • 一个问题......我正在使用这段代码,它抱怨没有区域。我在与 S3 兼容的 COS 交谈的内部 heroku 集群中运行它。实际上并未使用 AWS。这段代码对我有用吗?
  • @BenH 您只需要在环境、代码或配置文件中指定区域。例如,在创建客户端时,您可以说 boto3.client('us-west-2')。您还可以在配置文件中设置AWS_DEFAULT_REGIONregion。您需要从类似 s3 的服务中获取有效区域。另请注意,我上面提出的代码仅适用于 AWS,除非您还拥有与您的 s3 类服务一起使用的 IAM 和 STS 兼容服务。
  • 我只是设置了一个虚拟值,我已经过了那个点,但现在我遇到了一些“UnknownError”问题。从那以后我就没怎么看它了。
【解决方案2】:

使用head_bucket

head_bucket(**kwargs)

此操作可用于确定是否 存储桶存在并且您有权访问它。

如果你没有访问权限,你会得到一个异常:

botocore.exceptions.ClientError:调用时发生错误(403) HeadBucket 操作:禁止

修改此 Python 2.7 代码以满足您的需要:

import boto3
s3 = boto3.client('s3')
try:
  s3.head_bucket(Bucket='mybucket')
  print 'Can access the bucket'
except:
  print 'Cannot access the bucket'

【讨论】:

  • 请注意,这仅保证您拥有s3:ListBucket 权限。您可以在未授予该权限的情况下对存储桶中的任何对象子集进行读/写访问。您也可以只拥有列出权限而没有任何编辑权限。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-09
  • 1970-01-01
  • 2018-08-08
  • 1970-01-01
相关资源
最近更新 更多