Рубрики
Uncategorized

Скрытый Git Backdoor в AWS CodePipipeline и AWS CodeBuild

Лично я думаю, что режущие углы неизбежно связаны с тем, как мы работаем как люди. Это все … Помечено с aws, git, devops.

Лично я думаю, что режущие углы неизбежно связаны с тем, как мы работаем как люди. Это все о следующем Желаемый путь Отказ В моей голове я часто говорю по проблеме и ее решениям и в то же время, я считаю компромиссы всех вариантов. Обычно этот процесс состоит в том, чтобы найти правильный баланс между ценностью и усилиями. Например, для одноразовой работы часто не стоит ставить огромные усилия в автоматизацию.

Однако время от времени вы спотыкаетесь на то, что вы думали, что вы хорошо рассмотрели. Через несколько недель, давая ваше решение второй мыслью, вы можете чувствовать, что вы попадаете на молнии.

Давайте прийти к точке

Одна из первых вещей, которые вы узнаете на AWS, это Чтобы следить за стандартным консультированием безопасности предоставления наименее привилегии . Это простое правило, но это не значит, что это легко реализовать. Когда мы начали создавать AWS CodePipelines некоторое время назад, мы придумали следующий код CloudFation, описывающий нашу инфраструктуру:

  DeliveryPipeline:
    Type: AWS::CodePipeline::Pipeline
    Properties:
      ArtefactStores:
        - Region: eu-west-1
          ArtifactStore:
            Location: !Ref ArtefactBucketName
            Type: S3
      Name: some-project-pipeline
      RoleArn: !GetAtt CodePipelineServicenRole.Arn
      Stages:
        - Name: Source
          Actions:
            - Name: GitSource
              ActionTypeId:
                Category: Source
                Owner: ThirdParty
                Provider: GitHub
                Version: "1"
              Configuration:
                Owner: !Ref GitHubOwner
                Repo: !Ref GitRepo
                Branch: !Ref GitBranch
                PollForSourceChanges: False
                OAuthToken: !Ref GitHubOAuthToken
              OutputArtifacts:
                - Name: SourceZip
        ...
        - Name: Deploy
          Actions:
            - Name: DeployPersistantStack
              ActionTypeId:
                Category: Deploy
                Owner: AWS
                Provider: CloudFormation
                Version: "1"
              Configuration:
                ActionMode: CREATE_UPDATE
                Capabilities: CAPABILITY_NAMED_IAM
                RoleArn: !GetAtt CloudFormationExecutionRole.Arn
                StackName: some-stack-cfn
                TemplatePath: BuildArtifactAsZip::cfn-template.yaml
                TemplateConfiguration: BuildArtifactAsZip::dist/config/cloudformation/stack-config.json
              InputArtifacts:
                - Name: BuildArtifactAsZip
              RunOrder: 1
        ...

  CloudFormationExecutionRole:
    Type: AWS::IAM::Role
    Properties:
      AssumeRolePolicyDocument:
        Version: 2012-10-17
        Statement:
          Action:
            - sts:AssumeRole
          Effect: Allow
          Principal:
            Service:
              - cloudformation.amazonaws.com
      Path: /
      ManagedPolicyArns:
        - arn:aws:iam::aws:policy/AdministratorAccess

Я думаю, что угла, который был вырезан в код выше, легко найти. А CloudFormationExecutaRole Наличие АдминистраторCCess не соответствует наименее правилу привилегии. Причина взять ярлык — в этом случае — это тот факт, что стопки облака часто делают много разных вещей. Применение наименее правила привилегии в этом контексте будет означать долгое и хорошо продуманное политику. Так что для простоты и скорости мы решили порезать угол. Компромисс? Позволяя трубопроводу тапу больше доступа, то он должен, не иметь большого значения, я мог бы жить с этим.

Оборонные линии

Когда дело доходит до безопасности, я думаю, что мы сделали довольно хорошую крепость нашей среды AWS: хороший IDP, AWS WAF, AWS Security Hub, AWS Inspector и бесконечный список других инструментов для закрытия ворот. Мы сделали AWS безопасное место, чтобы пойти. Однако репозиторий Git часто живет за пределами экосистемы AWS. Github, Gitlab и Bitbucket являются наиболее распространенными местами, чтобы поставить свой код. Следующий вопрос: ваш репозиторий Git, как и крепость? Если ответ нет, то позвольте мне создать ужас. Если кто-то может получить доступ к вашему репозитории Git, он может сделать одно из следующих действий, если бы трубопровод был предоставлен АдминистраторCCess Для облачной информации:

  • Измените имя DNS для повторного маршрута трафика (на сайт фишинга)
  • Изменить свой Делитицироватьpolicy и выбросить все ваши ресурсы
  • Изменить профиль экземпляра или группы безопасности
  • Я думаю, что это уже показало вам достаточно ужаса

Если я сейчас повторяю свой вопрос: могу ли я жить с этим? Ответ является полным противоположным. Это большое дело, никак не могу принять это!

Так что это также записка для себя. Всегда думайте дважды при резке углов, особенно если безопасность может подвергаться риску. Иногда нелегко понимать радиус взрывных решений сначала. Чтобы сделать вещи еще хуже: во многих случаях это будет очень сложно или даже невозможно для инструментов безопасности AWS, чтобы определить правильный уровень тяжести. В этом конкретном случае AWS даст вам предупреждение, но не может описать все основные риски.

Мне повезло, что я получил это еще, прежде чем это может превратиться в реальную проблему.

Дополнительное предупреждение: самообслуживание трубопроводов

Хотя я никогда не был фанатом трубопроводов, которые поддерживают себя в этом случае, мне нужно дать дополнительное предупреждение. Для ясности: по самообслуживающим трубопроводами я имею в виду трубопроводы, которые имеют сцену для обновления себя. Наличие такого трубопровода, слушающего Git, означает, что сама политика трубопровода может быть изменена, толкая коммит к Git. Так что, если ваш самообслуживающий трубопровод не имеет АдминистраторCCess , это легко изменяется, имея доступ к его репозиторию Git. По этой причине я бы удалил логику самообузы от трубопровода. Мы используем Makefiles, которые нуждаются в клиенте для аутентификации, чтобы сделать изменения трубопроводов.

Решение

В конце концов, лучший способ закрыть эту дыру безопасности — применить правило наименее привилегии к вашему конвейеру. Недостатком этого подхода является введение дополнительной работы. Всякий раз, когда кто-то внесет изменения в стек облака, который не понравится изменения контекста безопасности, ему нужно сначала обновить политику трубопровода. Будьте готовы к людям, которые действительно расстроены этим.

Если вы находитесь в ситуации, когда ваша текущая трубопроводная политика слишком расслаблена, вы уже можете рассмотреть вопрос с промежуточного решения. Вы могли бы начать с отрицания всех IAM и маршрута 53 доступа и/или отрицать удаление доступа для всех ресурсов. Хотя это уже более безопасный, этот подход имеет некоторые недостатки. Так что это просто чтобы купить вам немного больше времени до применения наименее привилегированного правила.

Распределение заботятся 😉

До скорого.

ПРИМЕЧАНИЕ. То же самое отверстие безопасности может быть создано на AWS CodeBuild.

Оригинал: «https://dev.to/glnds/the-hidden-git-backdoor-in-aws-codepipeline-and-aws-codebuild-2cb0»