Как лучше всего хранить пароли и ключи API в Chef? Очень заманчиво хранить пароли к базам данных, ключи API AWS и другие конфиденциальные учетные данные в качестве атрибутов сервера Chef для использования в рецептах, но как насчет соображений безопасности? Какова наилучшая практика для этого?
Хранение паролей в Chef?
Ответы (9)
С IRC-канала #chef многие люди хранят такие данные в пакете данных на сервере шеф-повара.
Например, пакет данных может называться «aws» с элементом «main», относящимся к основной учетной записи AWS. Отдельные ключи в элементе будут для каждого конкретного значения. Например.:
{
"id": "main",
"aws_secret_key": "The secret access key",
"aws_access_key": "The access key"
}
Вас также могут заинтересовать зашифрованные пакеты данных. Я написал о них более подробно для управления постфиксная аутентификация SASL.
Обновление: я написал сообщения в блоге о Chef Vault на мой блог и sysadvent.
Этот вопрос устарел и не имеет принятого ответа, однако правильный ответ на этот вопрос заключается в том, что Chef разрешает использование Зашифрованные пакеты данных для хранения конфиденциальных данных в пакетах данных< /а>.
Я думаю, что хранилище Hashicorp действительно перспективно как способ динамического извлечения зашифрованной информации и избавления от некоторых странностей рабочего процесса Chef в этой области.
Это интересный пост, который начинает касаться темы. https://www.hashicorp.com/blog/using-hashicorp-vault-with-chef.html
Лучше всего хранить ключи и пароли в пакетах данных шеф-повара. Пакет данных содержит элементы пакета данных. Отдельный элемент data_bag находится в формате json.
Например:
{
/* This is a supported comment style */
// This style is also supported
"id": "ITEM_NAME",
"key": "value"
}
Зашифровать элемент пакета данных: элемент пакета данных может быть зашифрован с использованием общего секретного шифрования. Это позволяет каждому элементу пакета данных хранить конфиденциальную информацию (например, пароль базы данных или ключи ssh) или управлять им в системе управления версиями (без появления данных в виде обычного текста в истории изменений). Это можно сделать следующим образом:
Секретные ключи Крита: создайте секретный ключ с именем, например, encrypted_data_bag_secret.
$ openssl rand -base64 512 | tr -d '\r\n' > encrypted_data_bag_secret
где protected_data_bag_secret — это имя файла, который будет содержать секретный ключ
Зашифровать пакет данных. Элемент пакета данных шифруется с помощью команды ножа, похожей на:
$ knife data bag create passwords mysql --secret-file /tmp/my_data_bag_key
где «пароли» — это имя пакета данных, «mysql» — это имя элемента пакета данных, а «/tmp/my_data_bag_key» — это путь к местоположению, в котором находится файл, содержащий секретный ключ.
Подтвердить шифрование. Когда содержимое элемента пакета данных зашифровано, его нельзя будет прочитать, пока оно не будет расшифровано. Шифрование можно проверить с помощью команды ножа, похожей на:
$ knife data bag show passwords mysql
Расшифровать пакет данных. Зашифрованный элемент пакета данных расшифровывается с помощью команды ножа, похожей на:
$ knife data bag show --secret-file /tmp/my_data_bag_key passwords mysql
Chef Encrypted data_bags — действительно законное решение. Кроме того, вы также можете использовать ruby Gem, который позволяет вам шифровать элемент Chef Data Bag Item, используя открытые ключи списка узлов Chef. Это позволяет только тем узлам шеф-повара расшифровывать зашифрованные значения. ср. https://github.com/Nordstrom/chef-vault
Chef Vault может быть хорошим выбором. Предоставляет простой интерфейс для хранения зашифрованных данных на шеф-сервере, управления доступом. Загружайте, редактируйте, обновляйте данные с помощью knife vault ...
команд.
Для получения данных из рецепта используйте команду ChefVault::Item.load
chef_gem "chef-vault"
require 'chef-vault'
item = ChefVault::Item.load("passwords", "root")
item["password"]
Для установки пользователей, которые могут обновлять данные, используйте свойство ножа vault_admins
.
knife[:vault_admins] = [ 'example-alice', 'example-bob', 'example-carol' ]
Я никогда не пробовал мешки данных, но это, вероятно, потому, что я нахожу все, кроме повара-соло, слишком сложным. Вот почему я использую рецепты от шеф-повара с сервисом под названием Scalarium.
Таким образом, проблема с паролями или, например. закрытые ключи и всевозможные другие учетные данные — довольно сложная задача. У меня тоже есть куча рецептов, где пароли нужно создавать или правильно ставить.
Обычно я указываю то, что разработчики скалярии называют custom json. Этот json похож на node.json
, который некоторые люди дают повару-соло, используя chef-solo -j node.json
.
Так, например. в моем пользовательском json в веб-интерфейсе Scalarium у меня есть следующее:
{"super_secure_password":"foobar"}
Это означает, что мой суперзащищенный пароль доступен во время моего шеф-повара в node[:super_secure_password]
, и я могу использовать его в рецептах или шаблонах.
Это прекрасно работает, пока я развертываю свой сервер только с помощью Scalarium, но мы также используем наши рецепты в локальных бродячих ящиках для среды разработки и упрощения тестирования. И когда я использую vagrant (или даже шеф-соло сам по себе), у меня нет доступа к пользовательскому json в Scalarium.
Вот что я делаю, чтобы исправить это, в my_recipe/attributes/default
:
set_unless[:super_secure_password] = "test123"
Это означает, что когда мой рецепт запускается вне скалариума, пароль по-прежнему доступен в node[:super_secure_password]
и мои рецепты работают и так далее. Когда рецепт выполняется в контексте скалярия, он не переопределяет то, что они предоставляют.
В настоящее время наиболее широко используемым подходом и в большинстве случаев достаточно безопасным является использование chef-vault.
Он использует общий секрет для шифрования ваших данных (аналогично зашифрованному шеф-поваром пакету данных). Этот общий секрет шифруется для каждого клиента и/или пользователя, который будет его использовать (если вы разрешите его использовать).
Выгоды:
- в тестовой среде вы можете использовать незашифрованные данные
- Общий секрет не хранится в виде простого текста
- Можно предоставить доступ только нескольким своим серверам для чтения и записи некоторых пакетов данных.
Пример
export EDITOR=vi #sets your favourite text editor
knife vault create secret_data john_doe --admins "admin" --search "*:*" --mode client
Команда выше создает в secret_data
элемент базы данных: john_doe
, который может быть изменен admin
и использоваться всеми клиентами. После этого откроется команда EDITOR
, чтобы вы могли ввести или вставить свои секретные данные (в json).
Поисковый запрос может быть: "role:basic"
- Это означает, что только серверы с ролью basic
могут читать эти данные knife vault
требуется дополнительная установка
В вашей кулинарной книге
chef_gem 'chef-vault' do
compile_time true if respond_to?(:compile_time)
end
require 'chef-vault'
item = ChefVault::Item.load("secret_data", "john_doe")
item["password"]
а в metadata.rb
: depends 'chef-vault', '1.3.0'
больше информации здесь: https://blog.chef.io/2016/01/21/chef-vault-what-is-it-and-what-can-it-do-for-you/
и здесь: https://github.com/chef/chef-vault
Я бы предложил использовать роль IAM с настройкой шеф-повара
require 'chef/provisioning/aws_driver'
iam = AWS::Core::CredentialProviders::EC2Provider.new
puts iam.credentials.inspect
with_driver(
'aws:IAM:eu-west-1',
:aws_credentials => { 'IAM' => iam.credentials }
)