Как безопасно хранить учетные данные аутентификации в клиентских скриптах ruby? - PullRequest
0 голосов
/ 20 января 2019

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

Я создал несколько клиентских скриптов Ruby, которые собирают информацию с различных серверов в моей сети и внедряют эту информацию в базу данных MySQL. Сценарии Ruby должны проходить аутентификацию на этих серверах как пользователи, поэтому для подключения им требуются учетные данные для аутентификации. Рассматриваемые соединения от клиента Ruby к принимающему серверу и через (соответственно):

SOAP (через самоцвет savon):

soap_client = Savon.client(wsdl: '[URL]')
login_response = soap_client.call(:login, message: { 'userName' => [SOAP CLIENT USERNAME], 'password' => [SOAP CLIENT PASSWORD] })

MySQL (через гем mysql2):

@mysql_client = Mysql2::Client.new(:host => [DATABASE HOSTNAME], :username => [DATABASE USERNAME], :password => [DATABASE PASSWORD], :database => [DATABASE NAME])

HTTPS (через гем net / https):

OpenSSL::PKey::RSA.new(pem,"[KEY DECRYPTION PASSWORD]")

Клиенту HTTPS не требуется имя пользователя / пароль для аутентификации на сервере HTTPS. Требуется сертификат с ключом, а пароль, хранящийся в исходном коде, необходим для расшифровки ключа. Я могу хранить ключ в открытом тексте, тем самым исключая этот пароль из исходного кода, но тогда возникает проблема безопасности, заключающаяся в том, как защитить файл ключа в открытом тексте.

Проблема, которую я пытаюсь решить, заключается в том, что в моем исходном коде хранятся пароли в виде открытого текста. Я могу хранить пароли в зашифрованном текстовом файле, затем расшифровывать этот файл во время выполнения, но затем я возвращаюсь к аналогичной проблеме - как безопасно хранить ключи дешифрования?

Окружающая среда:

  • CentOS Linux 7.6.1810
  • ruby ​​2.4.2

Спасибо, что прочитали, и, пожалуйста, дайте мне знать, если мой вопрос требует дополнительной ясности!

1 Ответ

0 голосов
/ 20 января 2019

Вот как мы обрабатываем секретную информацию, которая требуется для сценариев:

Контроль источника:

  1. Мы никогда не храним конфиденциальную информацию в исходном коде.

Разработка:

  1. Вся конфиденциальная информация, которая нужна любому скрипту, поступает из переменных среды (например, в Ruby: some_password = ENV['SOME_PASSWORD'])
  2. У всех разработчиков установлен direnv , и у каждого из них есть файл .envrc в папке проекта, который устанавливает их личные пароли и другие секреты.
  3. Мы удостоверяемся, что .envrc никогда не передает управление исходным кодом, добавляя глобальное gitignore в .envrc (global = не для проекта, а для среды).

Тестирование / CI:

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

Производство:

  1. Зависит от вашей производственной инфраструктуры, эти переменные и секреты среды также вводятся во время развертывания.
...