Какова наилучшая практика хранения паролей и ключей API с шеф-поваром? Это действительно заманчиво хранить пароли базы данных, ключи AWS api и другие чувствительные учетные данные в качестве атрибутов сервера шеф-повара для использования в рецептах - но как насчет соображений безопасности? Какая лучшая практика для этого?
Хранение паролей в шеф-поваре?
Ответ 1
Из канала #chef IRC многие люди хранят этот вид данных в пакете данных на сервере шеф-повара.
Например, сумка данных может быть "aws" с элементом "main", ссылаясь на основную учетную запись AWS. Отдельные ключи в элементе будут для каждого конкретного значения. Например:.
{
"id": "main",
"aws_secret_key": "The secret access key",
"aws_access_key": "The access key"
}
Вы также можете быть заинтересованы в зашифрованных пакетах данных. Я писал о них более подробно для управления постфиксацией аутентификации SASL.
Обновление: я написал сообщения в блоге о Шеф-повар на мой блог и sysadvent.
Ответ 2
Этот вопрос старый и не имеет принятого ответа, однако правильный ответ на этот вопрос заключается в том, что Шеф позволяет использовать Encrypted Data Bags для хранения конфиденциальных данных в Data Bags.
Ответ 3
Я думаю, что Hashicorp Vault действительно многообещающе, как способ динамического получения зашифрованной информации и оставлять позади некоторые странности рабочего процесса Chef в этой области.
Это интересный пост, который начинает касаться предмета. https://www.hashicorp.com/blog/using-hashicorp-vault-with-chef.html
Ответ 4
Chef Зашифрованные data_bags действительно являются законным решением. Добавляя к этому, вы также можете использовать рубиновый драгоценный камень, который позволяет вам зашифровать элемент суммарного суммарного предмета с помощью открытых ключей списка узлов шеф-повара. Это позволяет только тем шеф-поварам расшифровать зашифрованные значения. ср https://github.com/Nordstrom/chef-vault
Ответ 5
Я никогда не пробовал databags, но это, вероятно, потому, что я считаю все, кроме шеф-пова, слишком сложным. Вот почему я использую рецепты шеф-повара со службой Scalarium.
Итак, проблема с паролями или, например, закрытые ключи и всевозможные другие учетные данные являются довольно сложными. У меня тоже есть куча рецептов, где пароли нужно создавать или устанавливать правильно.
Обычно то, что я делаю, я указываю, что люди в скалярном режиме называют пользовательский json. Этот json похож на node.json
, который некоторые люди дают шеф-повару с помощью chef-solo -j node.json
.
Так, например, в моем пользовательском json на веб-интерфейсе Scalarium у меня есть следующее:
{"super_secure_password":"foobar"}
Что это значит, мой супер безопасный пароль доступен во время моего шеф-повара в node[:super_secure_password]
, и я могу использовать его в рецептах или шаблонах.
Это отлично работает, пока я использую только сервер Scalarium, но мы также используем наши рецепты в локальных брандмауэрах для среды разработки и более простого тестирования. И когда я использую бродягу (или даже шеф-повара сам по себе), у меня нет доступа к пользовательскому json на Scalarium.
Это то, что я делаю, чтобы исправить это, в my_recipe/attributes/default
:
set_unless[:super_secure_password] = "test123"
Это означает, что когда мой рецепт запускается за пределами скаляриума, пароль по-прежнему доступен в node[:super_secure_password]
, и мои рецепты работают и так далее. Когда рецепт выполняется в контексте scalary, он не будет переопределять то, что они предоставляют.
Ответ 6
Шеф-повар может быть хорошим выбором. Он обеспечивает простой интерфейс для хранения зашифрованных данных на сервере chef-server, управлении доступом. Загружайте, редактируйте, обновляйте данные с помощью команд knife vault ...
.
Чтобы получить данные из рецепта, используйте команду ChefVault::Item.load
chef_gem "chef-vault"
require 'chef-vault'
item = ChefVault::Item.load("passwords", "root")
item["password"]
Чтобы установить пользователей, которые могут обновлять данные, используйте свойство knife vault_admins
.
knife[:vault_admins] = [ 'example-alice', 'example-bob', 'example-carol' ]
Ответ 7
Я бы предложил использовать роль 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 }
)
Ответ 8
В настоящее время наиболее широко используемый подход и в большинстве случаев достаточно безопасен для использования chef-vault.
Он использует общий секрет для шифрования ваших данных (сходство с зашифрованным зашифрованным файлом). Этот общий секрет зашифрован для каждого клиента и/или пользователя, который будет использовать его (если вы разрешите его использовать).
Преимущества:
- в тестовой среде вы можете использовать незашифрованные данные
- Один не хранит общий секрет как обычный текст
- Можно предоставить доступ только нескольким серверам для чтения и записи некоторых баз данных.
Пример
export EDITOR=vi #sets your favourite text editor
knife vault create secret_data john_doe --admins "admin" --search "*:*" --mode client
Команда выше создает в элементе secret_data
databag: john_doe
, который может быть изменен admin
и использован всеми клиентами. После этого команда EDITOR
откроется, чтобы вы могли ввести o вставить секретные данные (в 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
Ответ 9
Лучшей практикой является сохранение ключей и паролей в chef data_bags. Мешок данных содержит элементы базы данных. Отдельный элемент data_bag находится в формате json.
Для exmaple:
{
/* 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
где encrypted_data_bag_secret - это имя файла, который будет содержать секретный ключ
Шифровать data_bag: Элемент пакета данных зашифрован с использованием команды ножа, аналогичной:
$ knife data bag create passwords mysql --secret-file /tmp/my_data_bag_key
где "пароли" - это имя пакета данных, "mysql" - это имя элемента пакета данных, а "/tmp/my_data_bag_key" - это путь к местоположению, в котором находится файл, содержащий секретный ключ находится
Проверить шифрование: Когда содержимое элемента пакета данных зашифровано, они не будут доступны для чтения до тех пор, пока они не будут дешифрованы. Шифрование можно проверить с помощью команды knife, аналогичной:
$ knife data bag show passwords mysql
Расшифровать данные Сумка: Зашифрованный элемент мешка данных расшифровывается с помощью команды ножа, аналогичной:
$ knife data bag show --secret-file /tmp/my_data_bag_key passwords mysql