Безопасно ли хранить сценарии оболочки User-Data EC2 в частном ведро S3?

У меня есть AS2 ASG на AWS, и я заинтересован в хранении оболочки script, которая использовалась для создания экземпляра любого экземпляра в ведре S3, и он загружался и запускался при создании экземпляра, но все это чувствует себя немного шатким даже хотя я использую IAM Instance Role, передавая через HTTPS и шифруя сам script, находясь в состоянии покоя в ведре <3 > с помощью KMS, используя S3 Server Side Encryption (потому что метод KMS выбрал ошибку "Неизвестно" ).

Настройка

  • Создан IAM Instance Role, который присваивается любому экземпляру в моей ASG после создания экземпляра, в результате мои AWS-кредиты запекаются в экземпляр как ENV vars
  • Загружено и зашифровано my Instance-Init.sh script до S3, что приводит к частной конечной точке, например: https://s3.amazonaws.com/super-secret-bucket/Instance-Init.sh

В поле User-Data

Я ввожу следующее в поле User Data при создании Launch Configuration Я хочу, чтобы моя ASG использовала:

#!/bin/bash

apt-get update
apt-get -y install python-pip
apt-get -y install awscli
cd /home/ubuntu
aws s3 cp s3://super-secret-bucket/Instance-Init.sh . --region us-east-1
chmod +x Instance-Init.sh
. Instance-Init.sh
shred -u -z -n 27 Instance-Init.sh

Вышеописанное делает следующее:

  • Списки пакетов обновлений
  • Устанавливает Python (требуется для запуска aws-cli)
  • Устанавливает aws-cli
  • Изменения в каталоге /home/ubuntu
  • Использует aws-cli для загрузки файла Instance-Init.sh из S3. Из-за IAM Role, назначенного моему экземпляру, мои AWS-кредиты автоматически обнаруживаются aws-cli. IAM Role также предоставляет моему экземпляру разрешения, необходимые для дешифрования файла.
  • Делает его исполняемым
  • Запускает script
  • Удаляет script после его завершения.

Instance-Init.sh script

script сам будет делать такие вещи, как установка ENV vars и docker run контейнеров, которые мне нужно развернуть на моем экземпляре. Своего рода:

#!/bin/bash

export MONGO_USER='MyMongoUserName'
export MONGO_PASS='Top-Secret-Dont-Tell-Anyone'

docker login -u <username> -p <password> -e <email>
docker run - e MONGO_USER=${MONGO_USER} -e MONGO_PASS=${MONGO_PASS} --name MyContainerName quay.io/myQuayNameSpace/MyAppName:latest


Очень удобно

Это создает очень удобный способ обновления сценариев User-Data без необходимости создавать новый Launch Config каждый раз, когда вам нужно внести незначительные изменения. И он отлично справляется с получением ENV vars из вашей кодовой базы и в узкое контролируемое пространство (сам Instance-Init.sh script).

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

Вопросы

  • Является ли это обычной практикой или я вижу здесь плохую идею?
  • Является ли факт, что файл загружен и хранится (хотя и ненадолго) в новом экземпляре, является уязвимостью вообще?
  • Есть ли лучший способ для удаления файла более безопасным способом?
  • Неважно, удаляется ли файл после его запуска? Учитывая, что секреты передаются в ENV vars, кажется почти излишним удалить файл Instance-Init.sh.
  • Есть ли что-то, что мне не хватает в мои зарождающиеся дни?

Спасибо за любую помощь заранее.

Ответ 1

То, что вы описываете, - это почти то, что мы используем для создания экземпляров контейнеров Docker из нашего реестра (теперь мы используем v2 self-hosting/private, s3-backed-docker-registry вместо Quay). FWIW, у меня было такое же ощущение "это кажется рискованным", что вы описываете, когда сначала наступаете на этот путь, но уже через год после этого - и сравниваете с альтернативой хранения этих конфиденциальных данных конфигурации в репо или запекались в image - Я уверен, что это один из лучших способов обработки этих данных. Теперь, когда мы говорим, мы в настоящее время смотрим на использование Hashicorp нового программного обеспечения Vault для развертывания секретов конфигурации для замены этой "общей" зашифрованной секретной оболочки script контейнер (скажем, пять раз быстрее). Мы думаем, что Vault будет эквивалентом аутсорсинга криптографии для сообщества с открытым исходным кодом (где он принадлежит), но для хранения конфигурации.

В меньшем количестве слов мы не сталкиваемся со многими проблемами с очень похожей ситуацией, которую мы используем в течение года, но теперь мы рассматриваем использование внешнего проекта с открытым исходным кодом (Hashicorp Vault) для замены нашего доморощенного метод. Удачи!

Ответ 2

Альтернативой Vault является использование credstash, который использует AWS KMS и DynamoDB для достижения аналогичной цели.

Я фактически использую credstash для динамического импорта конфиденциальных данных конфигурации при запуске контейнера через простую точку входа script - таким образом, конфиденциальные данные не отображаются через докеревую проверку или в журналах докеров и т.д.

Здесь примерная точка входа script (для приложения Python) - красота здесь заключается в том, что вы все равно можете передавать учетные данные через переменные среды для сред, отличных от AWS/dev.

#!/bin/bash
set -e

# Activate virtual environment
. /app/venv/bin/activate

# Pull sensitive credentials from AWS credstash if CREDENTIAL_STORE is set with a little help from jq
# AWS_DEFAULT_REGION must also be set
# Note values are Base64 encoded in this example
if [[ -n $CREDENTIAL_STORE ]]; then
  items=$(credstash -t $CREDENTIAL_STORE getall -f json | jq 'to_entries | .[]' -r)
  keys=$(echo $items | jq .key -r)
  for key in $keys
  do
    export $key=$(echo $items | jq 'select(.key=="'$key'") | .value' -r | base64 --decode)
  done
fi

exec [email protected]