Написание тестов Python для неавторизованных пользователей сервисов AWS - PullRequest
0 голосов
/ 09 ноября 2018

Я пишу тесты на Python, чтобы убедиться, что Amazon S3 (сервис в целом) работает как задумано.

Настройка: CodePipeline использует CodeBuild для создания корзины S3 с использованием шаблона CloudFormation, а затем запускает другое задание CodeBuild для запуска тестов python для S3, созданного на предыдущем шаге.

Мне нужно написать тесты для этих двух требований:

«Неавторизованные пользователи должны получить ответ 403 при попытке изменить корзину S3».

и

«Авторизованные пользователи должны иметь возможность успешно получить доступ и изменить корзину S3.»

Второй тест не проблема, но я не уверен, как написать первый тест.

Мой вопрос: как я могу получить тест python для проверки корзины S3 как неавторизованного пользователя ? У CodeBuild уже есть разрешения на доступ к корзинам S3, поэтому я не уверен, как заставить тесты (которые запускаются с CodeBuild) НЕ иметь разрешения на доступ к ним и получить нужные мне 403.

Вот еще несколько подробностей, которые могут оказаться полезными:

Конвейер имеет 4 фазы: источник, сборка, развертывание, тестирование сборки и удаление. Этап развертывания - это этап, на котором блоки S3, которые мне нужно протестировать, устанавливаются с использованием стека CloudFormation. На этапе сборки теста я на самом деле запускаю эти тесты на 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 голосов
/ 30 ноября 2018

В итоге я решил просто изменить учетные данные в коде, прежде чем пытаться получить доступ к корзинам 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)

Не идеально ... не стесняйтесь размещать любые лучшие подходы.

...