Какая безопасная альтернатива использованию пароля MySQL в командной строке?

35

У нас есть скрипт командной строки PHP для создания версии базы данных. Мы запускаем этот скрипт всякий раз, когда разработчик добавляет новый патч базы данных.

Скрипт запускает патч с командной строкой MySQL:

system('mysql --user=xxx --password=xxx < patch.sql');

Однако MySQL 5.6 теперь выдает следующее предупреждение:

Предупреждение: использование пароля в интерфейсе командной строки может быть небезопасным

Что, очевидно, верно, но может или не может быть проблемой для пользователя.

  • Какая безопасная альтернатива тогда?
  • Или же можно отключить это предупреждение?

Обратите внимание, что я не хочу полагаться на внешний файл паролей.

Вениамин
источник
2
Наличие ваших учетных данных в файле не такая большая проблема. Если у пользователя есть права root на вашем сервере, он может полностью обойти систему аутентификации, просто перезапустив сервер mysql с определенной опцией.
Зоредаче
Это не та же проблема, что и в дублированном дубликате . MySQL не запрашивает пароль, я предоставляю его, и он работает нормально. Я ищу альтернативы для предоставления пароля, кроме файла паролей.
Бенджамин

Ответы:

17

В последней версии GA MySQL, т.е. версии 5.6 , вы можете сделать это с помощью команды mysql_config_editor, как описано в http://dev.mysql.com/doc/refman/5.6/en/mysql-config-editor.html.

В основном это то, что он делает: шифрует ваши учетные данные пользователя / пароля с помощью псевдонима хоста, а затем вы используете псевдоним хоста, помещаете эту информацию в файл конфигурации в вашем домашнем каталоге, а затем, когда вам это нужно, вместо того, чтобы делать что-то вроде :

mysqldump -uroot --password=mycleartextpass mydatabase > dumpfile.sql

вы вместо этого пишете:

mysqldump --login-path=myhostalias mydatabase > dumpfile.sql

тем самым избегая помещения вашего пароля в какой-либо скрипт в открытом виде.

Чтобы это работало, вы должны сначала (только один раз) определить myhostaliasкак:

mysql_config_editor set --login-path=myhostalias --host=mysqlhost.localnet.com --user=root --password

Вы можете использовать разные пути входа в систему для разных учетных записей и / или хостов, как вам нравится. Довольно хорошая идея, если вы спросите меня.

Как примечание, я считаю, эта функция действительно НЕ существует в любой версии ниже 5.6.

Tuncay Göncüoğlu
источник
примечание: я понимаю, что mysql_config_editor на самом деле создает внешний файл паролей, однако, это не вы сами, это то, как работает система, поэтому вы не можете выполнять ручное en / de / crypting.
Tuncay Göncüoğlu
Спасибо, я использую MySQL 5.6, так что это не проблема. Тем не менее, ваш подход все еще проблематичен (по крайней мере с тем, как мы в настоящее время работаем), потому что я хочу взять пароль из файла конфигурации PHP в режиме реального времени и динамически передать его в командную строку. С тем, что вы предлагаете, мне все равно придется использовать пароль в командной строке при вызове mysql_config_editor, так что, к сожалению, это не приносит гораздо большей пользы. Я также пытаюсь избежать того, чтобы разработчик делал это вручную, поэтому мне приходится поддерживать как конфигурационный файл PHP, так и конфигурацию mysql.
Бенджамин
Мое лучшее решение, вероятно, пока игнорировать предупреждения. Я действительно задаюсь вопросом, есть ли какая-либо проблема безопасности вообще: потому что это вызвано из PHP, я предполагаю, что командная строка не сохранена в истории bash или где-нибудь еще на машине?
Бенджамин
нет, насколько я знаю, нет, история Bash не хранит его. однако пароль, находящийся в виде открытого текста в файле конфигурации php, несет в себе тот же риск, но только в другой форме. Может быть, вы предпочитаете хранить пароль с помощью mysql_config_editor и сохранить путь входа в систему в вашем файле конфигурации php? Таким образом, вы нигде не будете раскрывать свой пароль. (но все равно придется поддерживать внешний пароль).
Tuncay Göncüoğlu
9

Используйте опцию --defaults-fileили --defaults-extra-file. Вы можете указать в нем идентификатор пользователя и пароль. Он имеет тот же формат, что и /etc/my.cnf.

Читая дальше, вы говорите, что не хотите полагаться на внешний файл паролей, но это единственный действительно безопасный способ. Все остальное оставит следы в таблице процессов или что-то в этом роде. Вы даже можете поместить файл паролей в систему контроля версий, если вы действительно этого хотите. Сделайте его 600 (или 400) доступным для чтения только mysql или пользователем, под которым он работает.

ЛСД
источник
1
Я не против файла паролей по соображениям безопасности, просто учетные данные MySQL являются частью глобальной конфигурации в приложении PHP (также используется для подключения к PDO), и это будет означать создание (временного) файла паролей просто ради запуска командной строки mysql на время существования скрипта (несколько секунд).
Бенджамин
Как это сделать на Windows Server 2012? Где находится файл конфигурации, содержащий параметр --defaults-file?
Джейк
Вы просто указываете файл в качестве опции для --defaults-file как в:mysql --defaults-file c:\some\dirs\my.cnf
lsd
@ Benjamin, так что если речь не идет о безопасности, то просто введите пароль в командной строке. Что не так с этим (помимо безопасности)?
Пейсер
@ Бенджамин, если вы уже используете MySQL из PHP, почему вы тогда разветвляете mysqlконсольный клиент?
Иосип Роден
5

У вас есть 4 варианта на http://dev.mysql.com/doc/refman/5.1/ru/password-security-user.html

  • Используйте параметр -pyour_passили --password=your_passв командной строке
  • Используйте параметр -pили --passwordв командной строке без указания пароля. В этом случае клиентская программа запрашивает пароль в интерактивном режиме:
  • Сохраните ваш пароль в файле опций.
  • Сохраните ваш пароль в MYSQL_PWDпеременной среды

Для ваших нужд MYSQL_PWDможет быть вариант, но это не более безопасно. На самом деле вы должны создать интерактивный процесс --passwordи отправить пароль в интерактивном режиме, но это довольно сложное решение этой проблемы.

RS
источник
1
Как MYSQL_PWD будет менее безопасным, чем командная строка? PW никогда не появляется в списке процессов, что, по-видимому, является главной задачей
TheLQ
1
Конечно, это так. man pshas -E Display the environment as well. From url, с которым я связан: Этот метод указания вашего пароля MySQL должен считаться крайне небезопасным и не должен использоваться. Некоторые версии ps включают опцию для отображения среды запущенных процессов. В некоторых системах, если вы установите MYSQL_PWD, ваш пароль будет доступен любому другому пользователю, который запускает ps. Даже в системах без такой версии ps неразумно предполагать, что нет других методов, с помощью которых пользователи могут исследовать среды процессов.
RS
Поднимаясь из этой опции MYSQL_PWD: я предполагаю, что если вы установите переменную окружения в начале некоторого скрипта, затем вызовете командную строку MySQL, а затем очистите, что впоследствии в конце скрипта вы могли бы сократить как минимум время экспозиции . Это звучит разумно?
Superjos
@kormoc, пожалуйста, уточните последний абзац. О каком довольно сложном решении вы говорили?
Пейсер
1
Кажется , что с помощью переменной среды является более безопасным , чем в командной строке. В системе Debian по умолчанию вы можете psвидеть и видеть аргумент командной строки для каждого процесса каждого пользователя. Но ps eотображает только среду для ваших собственных процессов (если, конечно, вы не root). Это лишь немного более безопасно, но все же более безопасно.
июля
4

Если у вашего PHP-скрипта уже есть открытое соединение с базой данных, почему бы вам просто не использовать mysqli_multi_query()для импорта файл .sql? Если синтаксис файла .sql действителен, конечно ...

Майкл Хэмптон
источник
Я не уверен, насколько хорошо это будет работать с довольно большими .sql файлами?
Бенджамин
1
@ Benjamin Я думаю, что не хуже, чем клиент MySQL - если вы действительно беспокоитесь о безопасности, хотя это будет наименее хакерский способ сделать это, а размер - это проблема, которую вы можете решить несколькими способами.
voretaq7
Вы знаете, возможно ли это с PDO?
Бенджамин
Похоже, что PDO не имеет эквивалентной функции для одновременной работы с несколькими запросами в базе данных. Сожалею. Это была идея ...
Майкл Хэмптон