Безопасно ли хранить сценарии оболочки EC2 User-Data в приватной корзине S3?
У меня есть EC2 ASG на AWS, и я заинтересован в хранении сценария оболочки, который используется для создания экземпляра любого данного экземпляра в корзине S3, и его загрузки и запуска при создании экземпляра, но все это кажется немного шатким, хотя я использую IAM Instance Role
, передача по HTTPS и шифрование самого скрипта в покое в корзине S3 с использованием KMS
с помощью S3 Server Side Encryption
( потому что KMS
метод выбрасывал ошибку "Неизвестно").
Настройка
- Создано
IAM Instance Role
который назначается любому экземпляру в моей ASG при создании экземпляра, в результате чего мои кредиты AWS запекаются в этом экземпляре какENV
вары - Загрузил и зашифровал мой
Instance-Init.sh
сценарий для 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
также предоставляет моему экземпляру разрешения, необходимые для расшифровки файла. - Делает его исполняемым
- Запускает скрипт
- Удаляет скрипт после его завершения.
Instance-Init.sh
скрипт
Сам скрипт будет делать такие вещи, как установка env
вары и 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
переходит из вашей кодовой базы в узкое, контролируемое пространство (Instance-Init.sh
сам скрипт).
Но все это кажется немного небезопасным. Идея поместить мои основные кредиты БД в файл на S3 по меньшей мере тревожит.
Вопросы
- Это обычная практика или я мечтаю о плохой идее?
- Является ли тот факт, что файл загружен и сохранен (хотя и кратко) на свежем экземпляре, вообще представляет собой уязвимость?
- Есть ли лучший способ удаления файла более безопасным способом?
- Имеет ли значение, будет ли файл удален после запуска? Учитывая, что секреты передаются
env
Vars почти кажется ненужным, чтобы удалитьInstance-Init.sh
файл. - Есть ли что-то, чего мне не хватает в мои зарождающиеся дни?
Спасибо за любую помощь заранее.
2 ответа
То, что вы описываете, это почти то, что мы используем для создания контейнеров Docker из нашего реестра (теперь мы используем v2 самодостаточный / закрытый, поддерживаемый s3 докер-реестр вместо Quay) в производство. FWIW, у меня было то же чувство "это чувствует себя рахитичным", которое вы описали, когда впервые шли по этому пути, но после почти годового прохождения - и по сравнению с альтернативой хранения этих конфиденциальных данных конфигурации в репо или запекания в изображение - я уверен, что это один из лучших способов обработки этих данных. Теперь, как говорится, в настоящее время мы рассматриваем использование нового программного обеспечения Vault от Hashicorp для развертывания секретов конфигурации для замены этого "общего" зашифрованного контейнера сценариев секретной оболочки (скажем, пять раз быстрее). Мы думаем, что Vault будет эквивалентом аутсорсинга криптографии сообществу открытого исходного кода (где он принадлежит), но для хранения конфигурации.
Короче говоря, мы не сталкивались со многими проблемами с очень похожей ситуацией, которую мы использовали около года, но сейчас мы рассматриваем использование внешнего проекта с открытым исходным кодом (хранилище Hashicorp) для замены нашего собственного метода. Удачи!
Альтернативой Vault является использование credstash, которое использует AWS KMS и DynamoDB для достижения аналогичной цели.
Я на самом деле использую credstash для динамического импорта конфиденциальных данных конфигурации при запуске контейнера с помощью простого сценария точки входа - таким образом, конфиденциальные данные не отображаются через проверку док-станции или в журналах докера и т. Д.
Вот пример сценария точки входа (для приложения 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 $@