为未经授权的AWS服务用户编写python测试

时间:2018-11-09 16:24:06

标签: python-3.x amazon-web-services amazon-cloudformation amazon-iam aws-codebuild

我正在编写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))

1 个答案:

答案 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)

不理想...随时发布任何更好的方法。