我正在编写python测试以确保Amazon S3(通常是该服务)按预期工作。
设置:CodePipeline使用CodeBuild使用CloudFormation模板创建S3存储桶,然后启动另一个CodeBuild作业,以针对上一步中创建的S3运行python测试。
我需要针对这两个要求编写测试:
“未经授权的用户在尝试修改S3存储桶时将收到403响应。”
和
“授权用户应能够成功访问和修改S3存储桶。”
第二个测试不是问题,但是我不确定如何编写第一个测试。
我的问题是:如何获得python测试来以未经授权的用户身份测试S3存储桶 ? CodeBuild已经具有访问S3存储桶的权限,所以我不确定如何使测试(使用CodeBuild运行)没有权限访问它们并获取我需要的403。
这里有更多详细信息,对那些人来说会有所帮助:
管道有4个阶段:源,构建,部署,buildtest和删除。部署阶段是使用CloudFormation堆栈站起我需要测试的S3存储桶。在buildtest阶段,我实际上正在运行这些python测试,因此,我认为这是我需要实现此问题的解决方案的地方。
最终,将使用CloudFormation模板来启动整个过程,该模板将形成一个具有所有这些阶段的管道。但就目前而言,它仅使用AWS控制台中的管道。我仅在出现这种情况的情况下提及该问题,因为CloudFormation可能(或不可能)使此工作正常进行,而CodeBuild中可能没有。
不幸的是,我在这里没有太多可以共享的python代码,因为这是我需要编写的第一个测试,而且我也不知道如何实现。但是我可以告诉您的是,我正在使用Boto3,并使用unittest运行测试。我通过检查CloudFormation中的当前堆栈并查看与测试堆栈名称匹配的堆栈,然后从该堆栈中获取S3资源来找到存储桶。这就是我正在测试的存储桶。因此,以某种方式,我需要查看该存储桶,尝试访问它,并拒绝进行一项测试,然后在另一项测试中进行访问。
#python 3.6
import os
import boto3
import unittest
rootstack = os.getenv('RootStackName') # environment variable in the build
region = 'us-west-2'
buckets = {}
class TestS3(unittest.TestCase):
def setUp(self):
self.customBucket = None
self.customBucket = buckets['customBucket']
if self.customBucket is None:
raise ValueError('Test bucket not found in test setUp!')
def test_bucket_accessible_if_authorized(self):
# Authorized user can access the bucket
self.assertEqual(????)
def test_bucket_cant_be_accessed_if_unauthorized(self):
# Unauthorized user CANNOT access the bucket
self.assertEqual(????)
if __name__=='__main__':
try:
cfn = boto3.client('cloudformation', region_name=region)
response = cfn.describe_stack_resources(StackName=rootstack)
resources = response['StackResources']
for resource in resources:
if resource['ResourceType'] == 'AWS::S3::Bucket':
print('FOUND THE CUSTOM BUCKET')
buckets['customBucket'] = resource
unittest.main(verbosity=2)
except Exception as e:
print("Unknown Error, %s" %(e))
答案 0 :(得分:0)
我最终采用了仅在尝试访问S3存储桶和对象之前修改代码中的凭据的方法。如果我获得了AccessDenied,则确认安全性正在按预期工作。
例如:
def test_unauthorized_read(self):
# unauthorized users will 'Access Denied' if attempting to list the S3 bucket
cantListBuckets = False
# the user assigned in the next line has NO permissions to access any service
client = boto3.client(service_name='s3',
aws_access_key_id='AKIBI6SPIAUZ6LTGA4BQ',
aws_secret_access_key='HyqAJOXgqt6kCOSay/2eH6J3FYcbwjNTjTyhtHOQ'
)
try:
buckets = client.list_buckets()
except botocore.exceptions.ClientError as e:
if 'AccessDenied' in str(e):
cantListBuckets = True
self.assertTrue(cantListBuckets)
不理想...随时发布任何更好的方法。