Рубрики
Uncategorized

Использование хранилища, чтобы обеспечить ваши секреты развертывания

Vault — это один из инструментов, которые могут обеспечить приемлемый уровень безопасности для инженеров Enterposs для Enterprise Scestrios, а также для небольших команд, таких как запуски, поэтому вот руководство быстрого поставок о том, как начать работу с Vault

Автор оригинала: Vyacheslav.

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

Пароли всегда должны быть введены пользователем, выполняющим развертывание. Существует несколько приемлемых способов обработки аутентификации для многослойной системы. Вы можете использовать сертификаты, сервис каталогов или единую систему входа ».

Эта цитата берется из главы 2 Непрерывная доставка: надежные программные выпуски через сборку, тестирование и Автоматизация развертывания (Addison-Wesley Signature Series (Fowler)) Книга Дэвида Фарли и Джез Смирена.

Хранилище Hashicorp является одним из инструментов, которые могут обеспечить приемлемый уровень безопасности для инженеров DevOps, и он подходит для корпоративных сценариев, а также для небольших команд, таких как запуска.

Проблемы для решения

В конце статьи мы должны быть в состоянии к

  • Установите Vault на Ubuntu 14.04: TS Server
  • инициализировать хранилище
  • Магазин секретов в хранилище
  • Секреты доступа в хранилище

Формальные шаги установки покрыты этой статьей: https://vaultproject.IO/docs/install/ Для целей демонстрационной статьи позвольте мне предоставить полуавтоматический скрипт, который устанавливает хранилище 0.1.2 в папку/OPT/Vault_0.1.2, настраивает его для прослушивания порта Localhost 8200 и регистрирует его как служба под названием Vault-Server

#!/bin/sh

VAULT_VERSION=${VAULT_VERSION-0.1.2}
VAULT_PATH=/opt/vault_$VAULT_VERSION
UNAME=`uname -m`

if [ "$UNAME" != "x86_64" ]; then
  PLATFORM=386
else
  PLATFORM=amd64
fi


if [ "$(id -u)" != "0" ]; then
  echo "Installation must be done under sudo"
  exit 1
fi

test -x $VAULT_PATH/vault
if [ $? -eq 0 ]; then
    echo vault already installed
    exit 1
fi

apt-get install -y curl unzip

rm /opt/vault_${VAULT_VERSION}_linux_${PLATFORM}.zip

curl -L "https://dl.bintray.com/mitchellh/vault/vault_${VAULT_VERSION}_linux_${PLATFORM}.zip" > /opt/vault_${VAULT_VERSION}_linux_${PLATFORM}.zip

mkdir -p $VAULT_PATH

unzip /opt/vault_${VAULT_VERSION}_linux_${PLATFORM}.zip -d $VAULT_PATH

chmod 0755 $VAULT_PATH/vault
chown root:root $VAULT_PATH/vault

echo create config

cat <$VAULT_PATH/vault-config.hcl
backend "file" {
  path = "$VAULT_PATH/storage"
}

listener "tcp" {
  address = "127.0.0.1:8200"
  tls_disable = 1
}
EOF

echo create run script
cat <$VAULT_PATH/vault-server
#!/bin/sh
if [ -z \$1 ]
then
  echo syntax: vault-server /PATH/TO/VAULT/HCL/CONFIG optional_flags
  exit 1
fi
BASEDIR=\$(dirname \$0)
cd \$BASEDIR
./vault server -config=\$1 \$2 \$3 \$4 \$5 \$6 \$7 \$8 \$9
EOF

chmod 0755 $VAULT_PATH/vault-server
chown root:root $VAULT_PATH/vault-server

echo create upstart script
cat </etc/init/vault-server.conf
description "Vault server"
start on runlevel [2345]
stop on runlevel [!2345]
respawn
script
  # Make sure to use all our CPUs, because Vault can block a scheduler thread
  export GOMAXPROCS=`nproc`
  exec $VAULT_PATH/vault-server ${VAULT_PATH}/vault-config.hcl >>/var/log/vault.log 2>&1
end script
EOF

service vault-server start
cat /var/log/vault.log

Проверьте установку:

./vault_status.sh
Error checking seal status: Error making API request.

URL: GET http://localhost:8200/v1/sys/seal-status
Code: 400. Errors:

* server is not yet initialized

Сообщение означает, что хранилище было установлено и настроено правильно, но необходимо инициализировать. Инициализация происходит после начала сервера против новой бэкенда, который никогда не использовался с хранилищем ранее. Во время инициализации клавиши шифрования генерируются, создаются uneet keys, а начальный токен root настроен. Инициализировать использование хранилища Vault init Отказ Это неаутентифицированный запрос, но он работает только на новых хранилищах без данных

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

Как это работает? Ключ, используемый для шифрования данных, также зашифрован с использованием 256-битных AES в режиме GCM. Это известно как главный ключ. Зашифрованный ключ шифрования хранится на запоминающемся состоянии. Затем главный ключ разделен с использованием секретного обмена Шамира. Секретный расчет Шамира гарантирует, что ни одного человека (включая хранилище) не обладают способностью расшифровать данные. Чтобы расшифровать данные, пороговое количество ключей (по умолчанию три, но настраиваемых) необходимы для отключения хранилища. Ожидается, что эти ключи будут с тремя различными местами/отдельными лицами.

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

Для демонстрационных целей я буду использовать только один ключ.

./vault_init.sh
The number of key shares to split the master key into: 1
The number of key shares required to reconstruct the master key 1
Key 1: af29615803fc23334c3a93f8ad58353b587f50eb0399d23a6950721cbae94948
Initial Root Token: 98df443c-65ee-d843-7f4b-9af8c426128a

Vault initialized with 1 keys and a key threshold of 1!

Please securely distribute the above keys. Whenever a Vault server
is started, it must be unsealed with 1 (the threshold) of the
keys above (any of the keys, as long as the total number equals
the threshold).

Vault does not store the original master key. If you lose the keys
above such that you no longer have the minimum number (the
threshold), then your Vault will not be able to be unsealed.

Начальный корневой токен должен быть немедленно сохранен в безопасном месте.

Используя хранилище

Неразвитый

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

Давайте отменить:

./vault_ unseal af29615803fc23334c3a93f8ad58353b587f50eb0399d23a6950721cbae94948
Sealed: false
Key Shares: 1
Key Threshold: 1
Unseal Progress: 0

ПРИМЕЧАНИЕ Если у вас был набор более высокого порогового значения, все ключевые держатели должны будут выполнить отключенную операцию со своими частями ключа. Это обеспечивает дополнительный уровень безопасности для доступа к данным.

Авторизация

Чтобы продолжить работу с хранилищем, вы должны сначала идентифицировать себя. Давайте использовать команду auth, чтобы сделать это, предоставляя наш начальный токен root

./vault_ auth 98df443c-65ee-d843-7f4b-9af8c426128a
Successfully authenticated! The policies that are associated
with this token are listed below:

root

Политика

Политики контроля доступа в управлении хранилищем, какой пользователь может получить доступ. При инициализации Vault присутствует только политика «root». Это дает дополнительный доступ ко всему в хранилище.

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

Политики в хранилище отформатированы с HCl. HCl — это читаемое формат конфигурации, который также совместим с JSON, поэтому вы также можете использовать JSON. Пример политики показан ниже:

path "secret/project/name" {
  policy = "read"
}

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

Политика зарегистрирована в политика — напиши команда

./vault_ policy-write demo demo.hcl
vault policy-write -address=http://localhost:8200 demo demo.hcl
Policy 'demo' written.

Токены развертывания

Теперь пришло время создать токен развертывания. В нашем случае, Этот токен, который позволит нам прочитать секретное значение развертывания от Vault, и не имеет никаких дополнительных привилегий, кроме этого.

Для этого мы создаем токены с помощью команды политики

./vault_create_token_with_policy.sh demo
vault token-create -address=http://localhost:8200 -policy=demo
4d79adad-a4ec-de8b-3f85-5467b3e8536a

Хранение данных

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

Вот команда, используемая для написания секретов

./vault_write.sh secret/project/name/apikey BLABLABLA
vault write -address=http://localhost:8200 secret/project/name/apikey value=BLABLABLA
Success! Data written to: secret/project/name/apikey

./vault_write_file.sh secret/project/name/id_rsa ./demo_rsa
Success! Data written to: secret/project/name/id_rsa

Важный

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

Получение данных

Есть два способа доступа к вашим данным. Сначала использует сам клиент Vault

./vault_read.sh secret/project/name/apikey
vault read -address=http://localhost:8200 secret/project/name/apikey
Key            	Value
lease_id       	secret/project/name/apikey/a74dd189-de4b-1c98-ba24-6b29258c511b
lease_duration 	2592000
lease_renewable	false
value          	BLABLABLA

./vault_read.sh secret/project/name/id_rsa
vault read -address=http://localhost:8200 secret/project/name/id_rsa
Key            	Value
lease_id       	secret/project/name/id_rsa/204ba657-9648-4fa5-8f82-ede992a054b4
lease_duration 	2592000
lease_renewable	false
value          	-----BEGIN RSA PRIVATE KEY-----
MIIEpgIBAAKCAQEApiLCR2sgf5unedMk1a2maL22PsoPwQWpGTDFZgCvhSVWvnBs
...

Второй использует API на основе HTTP. Для этого сценария вам нужно будет разрешать через токен развертывания, который мы распределяли ранее.

./vault_curl.sh 4d79adad-a4ec-de8b-3f85-5467b3e8536a secret/project/name/apikey
curl -H X-Vault-Token: 4d79adad-a4ec-de8b-3f85-5467b3e8536a -X GET http://localhost:8200/v1/secret/project/name/apikey
{"lease_id":"secret/project/name/apikey/2189c6c4-1fa7-0f4d-2598-bded29a4ce6b","renewable":false,"lease_duration":2592000,"data":{"value":"BLABLABLA"},"auth":null}

./vault_curl.sh 4d79adad-a4ec-de8b-3f85-5467b3e8536a secret/project/name/id_rsa
curl -H X-Vault-Token: 4d79adad-a4ec-de8b-3f85-5467b3e8536a -X GET http://localhost:8200/v1/secret/project/name/id_rsa
{"lease_id":"secret/project/name/id_rsa/ec509e1f-09a7-6aee-54e2-f3364720c7de","renewable":false,"lease_duration":2592000,"data":{"value":"-----BEGIN RSA PRIVATE KEY-----\nMIIEpgI......-----END RSA PRIVATE KEY-----"},"auth":null}

Обеспечение хранилища HTTP API

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

Ниже приведен пример конфигурации Nginx

server {
  listen 443 ssl;
  server_name vault.YOURDOMAIN.COM;

  ssl_certificate YOUR_SSL_CERTIFICATE.crt;
  ssl_certificate_key YOUR_SSL_CERTIFICATE_KEY.key;

  location / {
    proxy_pass http://127.0.0.1:8200;
    proxy_set_header Host $host;
    expires -1;
  }

  #ssl config per https://raymii.org/s/tutorials/Strong_SSL_Security_On_nginx.html
  ssl_protocols TLSv1 TLSv1.1 TLSv1.2;

  ssl_ciphers "EECDH+ECDSA+AESGCM:EECDH+aRSA+AESGCM:EECDH+ECDSA+SHA256:EECDH+aRSA+SHA256:EECDH+ECDSA+SHA384:EECDH+ECDSA+SHA256:EECDH+aRSA+SHA384:EDH+aRSA+AESGCM:EDH+aRSA+SHA256:EDH+aRSA:EECDH:!aNULL:!eNULL:!MEDIUM:!LOW:!3DES:!MD5:!EXP:!PSK:!SRP:!DSS:!RC4:!SEED";
  ssl_prefer_server_ciphers on;

  ssl_dhparam dhparam.pem;

  #only supported since 1.3.7
  ssl_stapling on;
  ssl_stapling_verify on;

  # Optimize SSL by caching session parameters for 10 minutes. This cuts down on the number of expensive SSL handshakes.
  # The handshake is the most CPU-intensive operation, and by default it is re-negotiated on every new/parallel connection.
  # By enabling a cache (of type "shared between all Nginx workers"), we tell the client to re-use the already negotiated state.
  # Further optimization can be achieved by raising keepalive_timeout, but that shouldn't be done unless you serve primarily HTTPS.
  ssl_session_cache    shared:SSL:10m; # a 1mb cache can hold about 4000 sessions, so we can hold 40000 sessions
  ssl_session_timeout  10m;

  add_header Strict-Transport-Security max-age=63072000;
  add_header X-Frame-Options DENY;
  add_header X-Content-Type-Options nosniff;
}

Код в действии

Этот код может быть загружен из репозитория https://github.com/voronenko/hashi_vault_utils.

Некоторые файлы просто помогают использовать существующие функциональные возможности хранилища более удобным способом:

  • vault_status.sh — Получает статус хранилища
  • vault_policy.sh — Перечисляет известные политики или показывает детали политики, предоставленной в качестве первого параметра
  • vault_create_token_with_policy.sh Создает и возвращает токен с помощью политики, предоставленной в качестве первого параметра.
  • vault_read.sh Читает секрет по ключу (первый параметр)
  • vault_write.sh Пишет секреты по ключам (первый параметр) и устанавливает свои значения (второй параметр)
  • vault_write \ _file.sh Пишет секреты по ключам (первый параметр) и сохраняет содержимое текстовых файлов, предусмотренных в качестве второго параметра
  • vault_curl.sh Может использоваться для проверки HTTP API. Первый параметр — это токен доступа, а второй параметр — это секретный ключ для чтения.

Точки интереса

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

Оригинал: «https://www.codementor.io/@slavko/how-to-install-vault-hashicorp-secure-deployment-secrets-du107xlqd»