Рубрики
Uncategorized

Инфраструктурные дрейфы не похожи на покемонов … … вы не можете поймать их все

Этот разговор охватывает три основные темы: инфраструктура как код: все благие намерения и идея … Tagged с DevOps, Terraform, InfrastructureAscode, DevSecops.

Этот разговор охватывает три основные темы:

  1. Инфраструктура как код: все благие намерения и идеальный мир ожидали, когда мы начали использовать ее, и как это происходит в жизни Ops. Мы увидим, что то, как это началось, вероятно, отличается от того, как это происходит и от того, что мы ожидали.

  2. Затем мы будем «дрейфовать» вместе, используя Terraform и AWS и поделимся некоторыми военными историями, которые мы слышали от инфраструктурных команд, и как иногда все пошло не так.

  3. Мы, наконец, представим DriftCtl, наш ответ с открытым исходным кодом на проблемы дрейфа инфраструктуры.

Дрейф инфраструктуры: определение

Давайте сначала договоримся о том, что является дрейфом инфраструктуры: дрейф инфраструктуры — это то, что происходит, когда реальность вашей инфраструктуры не соответствует вашим ожиданиям. Это явление также известно как ** » Боже мой » * * в постановке, когда дела и неожиданно ошибаются.

Инфраструктура как код: идеальный мир

Как все это началось

Когда все это началось, у нас было это видение идеального мира и светлое будущее, которое нам предложила инфраструктура как кодекса, как Республика Платона была для общества некоторое время назад.

С инфраструктурой в качестве кода, мы должны были иметь один источник истины (файл государства в случае терраформ).

Мы должны были иметь версию кода с git. Код должен был быть настолько великим, что он будет самоокументированием.

В этом идеальном мире у нас было бы тестирование повсюду: на трубопроводах до и после TDD, BDD и т. Д., Как и в остальной инженерии. Сотрудничество будет блаженством между командами. Инфраструктура была бы неизбежной: мы могли бы масштабировать ее вверх и вниз и отбросить остальное.

Гитопс будет везде: CI/CD для инфраструктуры, больше не работает на местном уровне. И в основном все полномочия были бы под контролем, а многофункциональный решает все наши проблемы, потому что вы знаете, что они говорят: «API везде»… и у нас будут навыки для решения всех этих API, и время для этого значительно.

Как это на самом деле идет

Маркус Аурелиус, римский император через несколько веков после того, как Платон написал себе: «Не ожидайте идеальной республики Платона» Анкет

Как это происходит, мы не римские императоры, но нашей идеальной республики тоже не следует ожидать. Как это началось, не совсем то, как мы видим, что это происходит.

В нашей команде многие из нас были довольно опытными, но мы хотели больше отзывов о том, что мы строили. Поэтому мы только что спросили сотни инфраструктурных команд, SRES … и т. Д. Во всем мире, где они стояли в своей инфраструктуре в качестве кодового путешествия.

По сути, они сказали нам, что изменения все еще происходили вне их инфраструктуры в качестве кода: в основном ручные изменения и сценарии, которые меняют теги, или лямбдас обновляет вещи после развертывания и т. Д.

Многие изменения все еще происходят вне их инфраструктуры в качестве объема кода, будь то терраформ или пулуми, или какой -либо инструмент инфраструктуры, который они используют, это не имеет значения.

Куча других вещей идет не так для них и для них.

Охват их изменений не очень часто полностью совершается из -за сломанных процессов.

Люди все еще меняют вещи вручную на своей веб -консоли AWS, а затем возвращают изменения в Terraform, пока Terraform не начнет «кричать», что означает, что люди все еще работают на местном уровне с правильными ключами доступа на своем ноутбуке. Ужасные процессы … и все знают, что, как только вы нажимаете везде на свою консоли, на фоне развернуто много других вещей, и поэтому ваш код Terraform не отражает точно то, что на самом деле развернуто в Интернете.

Многие люди, с которыми мы разговаривали, знали о хороших практиках о требованиях к тестированию. Они знали, что структуры, такие как Terratest и т. Д., но у большинства из них никогда не было времени, чтобы изучить или написать эти тесты. Иногда они были слишком дороги, чтобы бежать за ними.

Отсутствие общения, очевидно, усугубляет ситуацию: даже в этих вещах 19 раз, «асинхронное» общение по -прежнему является серьезной проблемой между командами.

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

Многие люди все еще получают доступ к консоли. И угадайте, что ? Люди с доступом к консоли AWS, как правило, меняют вещи Если вы не заблокируете их полностью, что иногда просто невозможно, потому что они являются вашим боссом или вашим клиентом, или потому, что они «этот особенный коллега», которому нужно делать, «особая вещь» вручную на веб-консоли… Вот где возникают проблемы.

Многие люди также сталкиваются с проблемами навыков. Например, если полная команда, очень опытная на GCP, имеет новый проект, который по какой -то причине должен работать на Azure, поскольку все специфики этого поставщика не сразу освоены, они часто заканчивают плохими практиками в своей инфраструктуре в качестве развертывания кода Анкет

И в основном для многих из них все, что имеет API, до сих пор не находится под кодом инфраструктуры: мы слышали ужасные истории о доступе к GitHub, или DNS -записям или о чем -либо, что можно использовать с Terraform, которые еще не развернулись с ним.

Дрейф происходит

Все это поведение имеет что -то общее: они генерируют дрейф. В то время как дрейф довольно круто для автомобилей, расхождение между намерением и реальностью может привести к серьезным проблемам, бедствиям или неправильной службе безопасности.

Дрейф может быть настоящей серьезной болью. Чтобы справиться с этим, большинство людей, которых мы встретили, ставит что -то на месте, например, план терраформ и применять на вкладке Cron или на CI/CD где -то до и после некоторых коммитов, но все еще упускали вещи.

$ terraform apply
Apply complete! Resources: 0 added, 0 changed, 0 destroyed

Мы любим Terraform и все продукты Hashicorp.

Terraform — отличный предварительный проводник, но не справедливо использовать его для чего -то, что это не должно делать. Если что -то находится за пределами его масштаба, это просто нормально, что терраформ не поймает его. Есть много изменений, которые невозможно увидеть Terraform.

Многие из нас ожидали, что план Terraform на вкладках Cron или на CI/CD сообщает об изменениях, потому что некоторые ресурсы управлялись им, но, к сожалению, как мы собираемся увидеть, это не всегда так.

Истории из траншей

Следующие истории основаны на реальных историях, которые мы слышали во время интервьюирования инфраструктурных команд. Мы упростили их, чтобы сделать их легкими для понимания с каким -то кодом.

Как стажер с доступом только к чтению оказался с административным доступом и ключами Rogue (если бы никто не заметил)

Первая история о стажере с доступом только к чтению, в конечном итоге с клавишами доступа, контролируемым никому. Эти ключи были связаны с административной политикой, которую никто не заметил.

Чтобы лучше понять эту историю, давайте посмотрим на этот очень простой файл конфигурации Terraform:

У нас есть пользователь с ключом и вложение политики для только чтения. Давайте применим эту конфигурацию:

$ terraform apply
Apply complete! Resources: 9 added, 0 changed, 0 destroyed

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

История выглядит так:

Этот стажер пошел к ребятам из DevOps и пожаловался, что не может использовать свой ключ по какой -либо причине. Команда была в спешке, поэтому они быстро вошли в консоли управления, они деактивировали первый ключ и создали новый, совершенно уверенный, что собираются запомнить его и добавить его в Terraform всего за несколько минут.

Кроме того, Terraform должен был уведомить их, если они все равно забыли.

Как вы думаете, что случилось? Давайте проверим с Terraform применить этот пользователь.

$ terraform apply
Apply complete! Resources: 0 added, 0 changed, 0 destroyed

В основном ничего …

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

Итак, история продолжается с этим стажером:

Стажер возвращается через час, жалуясь, что он все еще не мог сделать то, что ему нужно сделать. Поскольку у команды инфраструктуры не было времени, чтобы изучить это, они просто дали ему административный доступ, чтобы он мог изменить все, что ему нужно, думая, что они быстро вернутся через его разрешения.

Как вы думаете, что Terraform обнаружил в этом случае с Terraform, так как у нас есть политика, прикрепленная к пользователю IAM, и все управляется Terraform?

Эта команда была уверена, что об этом должно быть сообщено в плане Terraform или Terraform. Но это было не так, потому что в основном это не контролирует терраформ. Это просто прикрепленный ресурс, он так не работает.

$ terraform apply
Apply complete! Resources: 0 added, 0 changed, 0 destroyed

Итак, команда забыла об этом, они продолжили день, и только через несколько недель после этого они поняли, что у них есть стажер с административным ключом в дикой природе, неконтролируемым кем -либо, даже не упоминаемых как «деактивированные» в коде. Анкет

Как стажер с Rogue Administrative Access открыл все для любого на IPv4 и IPv6 (все еще без замечения)

Следующая история начинается с процесса: как вы знаете, вы можете иметь лямбдас, сценарии и т. Д., Которые имеют административный доступ к некоторым ресурсам на очень ограниченном объеме.

В этом случае кто -то с административным доступом только что открыл все для любого на IPv4 и IPv6, и никто ничего не заметил. Так как же дела?

Давайте перейдем к консоли> VPC> US-EAST-1 > Группы безопасности

Таким образом, у нас есть наша супер безопасная группа безопасности, которую мы создали с использованием Terraform, с правилом, которое прилагается к нему.

Как мы можем видеть в консоли AWS, у нас есть «супер безопасная группа безопасности», и у нас есть наше правило SSH для разрешения SSH в эту локальную сеть

Для простоты мы делаем эту демонстрацию вручную здесь, но кто -то или что -то может изменить эту конкретную супер безопасную группу безопасности и может допустить что угодно в любых сетях на IPv4 и т. Д. И назовать ее очень, очень тщательно «температуру» (Вы знаете, как те временные правила, которые мы скоро запомним, чтобы измениться …)

Так что здесь произошло то, что что -то, с правильными правами доступа позволили что угодно, в этой сети за этой группой безопасности.

Эта команда ожидала любых правил, которые были добавлены или изменены, чтобы сообщить о Terraform и Хотя это верно для правила, это не верно для нового правила И в основном команда поддержки проходила недели или месяцы с таким правилом в прямом эфире в своей системе без каких -либо уведомлений.

$ terraform apply
Apply complete! Resources: 9 added, 0 changed, 0 destroyed

Как проблема сценария создала кошмар счетов.

Наша последняя история о команде, которая строила много вещей на S3. Они кладут там много своих двоичных файлов и убирали их. Так что, очевидно, они удалили версию.

По какой -то причине (короткая история) кто -то активировал версии на всех ведрах для компании, включая эту Но они были почти уверены, что это не будет проблемой, потому что это дефолт на Terraform, чтобы не быть версировано. Но код явно не сказал этого.

Позволять Войдите на консоли AWS и перейдите к S3> Bucket

Теперь мы находимся на этом ведре, которое мы создали, используя приведенный выше код Terraform, и в основном мы собираемся делать вручную то, что они сделали с помощью скрипта: мы просто собираемся включить ведение версии.

Так что теперь ведение версии включено. Давайте проверим с терраформой применить то, что было сообщено:

$ terraform apply
Apply complete! Resources: 9 added, 0 changed, 0 destroyed

Ничего такого. Итак, эта плохая команда версировала в течение нескольких недель сотни и сотни терабайт в день двоичных файлов, пока они не получили счет…

Решения под рукой

В нашей экосистеме есть много решений, чтобы обойти то, что мы только что видели:

  • Интеграция CI/CD (Jenkins, Terraform Cloud, Atlantis, Env0…)

  • Статический анализ (Checkov, Tflint, TFSEC,…), есть ли вам помочь вам проанализировать ваш код, прежде чем вы фактически перенесите на свою систему CI (или если они развертывают системы CI/CD, они там, чтобы предотвратить то, чтобы вы нажимали на такие вещи » Разрешить кому -либо кому -либо «непосредственно в коде)

  • Тестирование и проверка, такие как Terratest (написано в Go), Inspec (для «старшего» нас, он написан в Ruby и приходит со дня шеф -повара).

  • Политика и соблюдение (Sentinel…) Это совсем другой набор инструментов, очень крутые и очень защитные.

Входит в DriftCtl

Именно здесь вступает управление дрейфом: мы построили DriftCtl, чтобы управлять этим дрейфом и быть предупрежденными обо всех несоответствиях между государством и реальностью на счетах AWS.

Давайте просто используем тот же терминал и тот же сеанс, что и у нас ранее. Контроль дрейфа в основном сообщает вам обо всех изменениях, которые вы не могли видеть с помощью плана Terraform или применения Terraform.

$ driftctl scan --from tfstate://./s3/terraform.tfstate --from tfstate://./vpc/terraform.tfstate --from tfstate://./iam/terraform.tfstate
Terraform provider initialized (name=aws, alias=us-east-1)
Terraform provider initialized (name=aws, alias=eu-west-3)
Terraform provider initialized (name=aws, alias=eu-north-1)

Found deleted resources:
 - Table: rtb-0c5a9bb483ee6eaaf, Destination: [10.0.1.0/24](https://www.google.com/url?q=http://10.0.1.0/24&sa=D&source=editors&ust=1614683869756000&usg=AOvVaw3mt8mKEET3obX8AAtRPp5D)

Found unmanaged resources:
  aws_security_group_rule:
  - Type: ingress, SecurityGroup: sg-0746ca93f95fcc338, Protocol: All, Ports: All, Source: ::/0
  - Type: ingress, SecurityGroup: sg-0746ca93f95fcc338, Protocol: All, Ports: All, Source: [0.0.0.0/0](https://www.google.com/url?q=http://0.0.0.0/0&sa=D&source=editors&ust=1614683869756000&usg=AOvVaw2umDoMvApX_SsgfP22bUtn)
  aws_iam_access_key:
  - AKIASBXWQ3AYRSNQN5EY (User: INTERN-8mszmf)

Found drifted resources:
  - AKIASBXWQ3AYWWYX72GX (User: INTERN-8mszmf) (aws_iam_access_key):
     ~ Status: "Active" => "Inactive" (computed)

Found 26 resource(s)
- 84% coverage
- 22 covered by IaC
- 3 not covered by IaC
- 1 deleted on cloud provider
- 1/22 drifted from IaC

Теперь мы можем видеть правила, которые допускали «что угодно в любом месте» на IPv4 и IPv6, и мы знаем, что есть правила, которые не ожидались. У нас также есть политическая привязанность этого стажера, о котором мы говорили.

Так что, вероятно, с вашими глазами административных людей, DevOps, что бы вы ни были, это не соответствует. Это должно позвонить в колокол, что на самом деле что -то не так: как насчет этого нового ключа доступа? Даже если вы не являетесь человеком безопасности, если у вас новый ключ доступа, созданный из ниоткуда, сообщается вам, это должно позвонить в колокол.

Давайте продолжим и создадим новое ведро и назовем его «Fosdem 2031».

Очевидно, что это ведро не в Terraform, потому что мы только что создали вживую на консоли. Для Terraform совершенно нормально не сообщать вам, что это конкретное ведро было создано прямо сейчас. Но это работа DriftCtl, чтобы сообщить, что у вас есть Обе неуправляемые ресурсы, которые были созданы, так и дельты из управляемых ресурсов Анкет

$ driftctl scan --from tfstate://./s3/terraform.tfstate --from tfstate://./vpc/terraform.tfstate --from tfstate://./iam/terraform.tfstate
Terraform provider initialized (name=aws, alias=us-east-1)
Terraform provider initialized (name=aws, alias=eu-west-3)
Terraform provider initialized (name=aws, alias=eu-north-1)

Found deleted resources:
  aws_route:
  - Table: rtb-0c5a9bb483ee6eaaf, Destination: [10.0.1.0/24](https://www.google.com/url?q=http://10.0.1.0/24&sa=D&source=editors&ust=1614674194048000&usg=AOvVaw3D80Zc5czyA8iDpAvb61zo)

Found unmanaged resources:
  aws_s3_bucket:
  - fosdem2031
  aws_security_group_rule:
  - Type: ingress, SecurityGroup: sg-0746ca93f95fcc338, Protocol: All, Ports: All, Source: ::/0
  - Type: ingress, SecurityGroup: sg-0746ca93f95fcc338, Protocol: All, Ports: All, Source: [0.0.0.0/0](https://www.google.com/url?q=http://0.0.0.0/0&sa=D&source=editors&ust=1614674194048000&usg=AOvVaw00rswNHGCuK2ZVSP4oVZAl) 
  aws_iam_access_key:
  - AKIASBXWQ3AYRSNQN5EY (User: INTERN-8mszmf)

Found drifted resources:
  - AKIASBXWQ3AYWWYX72GX (User: INTERN-8mszmf) (aws_iam_access_key):
    ~ Status: "Active" => "Inactive" (computed)

Found 27 resource(s)
  - 81% coverage
  - 22 covered by IaC
  - 4 not covered by IaC
  - 1 deleted on cloud provider
  - 1/22 drifted from IaC

Давайте сосредоточимся на VPC здесь: если мы изменим существующее правило …

… мы можем видеть это в различиях в DriftCtl

$ driftctl scan --from tfstate://./s3/terraform.tfstate --from tfstate://./vpc/terraform.tfstate --from tfstate://./iam/terraform.tfstate

Terraform provider initialized (name=aws, alias=us-east-1) 
Terraform provider initialized (name=aws, alias=eu-west-3) 
Terraform provider initialized (name=aws, alias=eu-north-1)

Found deleted resources:
  aws_route: 
  - Table: rtb-0c5a9bb483ee6eaaf, Destination: 10.0.1.0/24

Found unmanaged resources: 
  aws_s3_bucket: 
  - fosdem2031
  aws_security_group_rule: 
  - Type: ingress, SecurityGroup: sg-0746ca93f95fcc338, Protocol: All, Ports: All, Source: ::/0 
  - Type: ingress, SecurityGroup: sg-0746ca93f95fcc338, Protocol: All, Ports: All, Source: 0.0.0.0/0
  aws_iam_access_key: 
  - AKIASBXWQ3AYRSNQN5EY (User: INTERN-8mszmf)

Found drifted resources:
  - AKIASBXWQ3AYWWYX72GX (User: INTERN-8mszmf) (aws_iam_access_key): 
    ~ Status: "Active" => "Inactive" (computed)
  aws_S3_bucket: 
    -fosdem2031

Found 14 resource(s)
- 50% coverage
- 7 covered by IaC 
- 4 not covered by IaC 
- 1 deleted on cloud provider 
- 1/14 drifted from IaC

Другие вещи, которые мы можем сделать с управлением дрейфом, — это игнорировать некоторые ресурсы, которые вы не хотите видеть, сообщаемые по какой -либо причине.

Таким образом, вы также можете отфильтровать, используя ту же систему, что и AWS CLI. Например, вы можете отфильтровать только для ведер S3, если вы не заинтересованы в остальном.

$ driftctl scan --filter "Type=='aws_s3_bucket'"

$ driftctl scan --from tfstate://./s3/terraform.tfstate --from tfstate://./vpc/terraform.tfstate --from tfstate://./iam/terraform.tfstate --filter "Type=='aws_s3_bucket'"
Terraform provider initialized (name=aws, alias=us-east-1)
Terraform provider initialized (name=aws, alias=eu-west-3)
Terraform provider initialized (name=aws, alias=eu-north-1)

Found unmanaged resources:
  aws_s3_bucket:
   — fosdem2031

Found 2 resource(s)
– 50% coverage
– 1 covered by IaC
– 1 not covered by IaC
– 0 deleted on cloud provider
– 0/1 drifted from IaC

Это довольно круто в целях аудита, для целей мониторинга и т. Д.

И это обертка!

Большое спасибо за прочитание всей этой стенограммы разговора. Если вы хотите получить лучшее понимание DriftCtl, пожалуйста, посетите наш Страница продукта или наш Усовершенствованный учебник Анкет У нас также есть серия коротких Демо -видео что вы можете посмотреть, чтобы начать через считанные минуты.

По любым вопросам, не стесняйтесь открыть обсуждение на GitHub или посетить нас раздор Анкет

DriftCtl — это БЕСПЛАТНЫЙ И ОТКРЫТА Cli, что Отслеживание, анализ, приоритеты и предупреждают о дрейфе инфраструктуры

Больше информации о нас

Оригинал: «https://dev.to/driftctl/infrastructure-drifts-aren-t-like-pokemons-you-can-t-catch-em-all-ei6»