Що є безпечною альтернативою для використання пароля MySQL у командному рядку?


35

У нас є сценарій командного рядка PHP для версії бази даних. Цей сценарій ми запускаємо щоразу, коли розробник додає новий патч бази даних.

Сценарій запускає виправлення з командного рядка MySQL:

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

Однак тепер MySQL 5.6 видає таке попередження:

Попередження: Використання пароля в інтерфейсі командного рядка може бути небезпечним

Це, очевидно, правда, але може бути або не бути проблемою для користувача.

  • Яка тоді безпечна альтернатива?
  • Або можна відключити це попередження?

Зауважте, що я не хочу покладатися на зовнішній файл пароля.


2
Наявність облікових даних у файлі не є великою проблемою. Якщо людина має кореневі привілеї на вашому сервері, вона може повністю обійти систему аутентифікації, просто перезавантаживши сервер mysql з певною опцією.
Зоредаче

Це не та сама проблема, як у доданому дублікаті . MySQL не запитує пароль, я його надаю, і він працює чудово. Я шукаю альтернативи для введення пароля, виключаючи файл пароля.
Бенджамін

Відповіді:


17

В останній версії GA MySQL, тобто версії 5.6 , ви можете це зробити за допомогою команди mysql_config_editor, як описано в http://dev.mysql.com/doc/refman/5.6/uk/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.


Примітка: Я розумію, що mysql_config_editor насправді створює зовнішній файл пароля, однак, це ви не робите ви, як працює система, тому немає ніякого керівництва en / de / crypting, яке б ви не робили.
Tuncay Göncüoğlu

Дякую, я використовую MySQL 5.6, тому це не проблема. Однак, ваш підхід все ще проблематичний (принаймні, з тим, як ми працюємо в даний час), тому що я хочу взяти пароль з файлу конфігурації PHP в режимі реального часу і динамічно передати його в командний рядок. Що ви пропонуєте, мені все одно доведеться використовувати пароль у командному рядку під час виклику mysql_config_editor, тому він, на жаль, не приносить набагато більшої цінності. Я також намагаюся уникати того, щоб розробник робив це вручну, таким чином потрібно підтримувати як файл конфігурації PHP, так і конфігурацію mysql.
Бенджамін

Моє найкраще рішення - це, мабуть, ігнорування попереджень на даний момент. Мені насправді цікаво, чи взагалі є якась проблема безпеки: оскільки вона викликається з PHP, я думаю, командний рядок не зберігається в історії 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. Отже, якщо справа не в безпеці, просто введіть пароль у командному рядку. Що поганого в цьому (крім безпеки)?
Pacerier

@Benjamin, якщо ви вже використовуєте MySQL з PHP, чому ви тоді розгалужуєте mysqlконсольний клієнт?
Йосип Родін

5

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

  • У командному рядку скористайтесь опцією -pyour_passабо--password=your_pass
  • Використовуйте -pабо --passwordпараметр у командному рядку без вказаного значення пароля. У цьому випадку клієнтська програма інтерактивно вимагає пароль:
  • Збережіть свій пароль у файлі опцій.
  • Зберігайте свій пароль у MYSQL_PWDзмінній оточення

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


1
Як би MYSQL_PWD був менш захищеним, ніж командний рядок? PW ніколи не відображається у списку процесів, що, здається, є основним питанням
TheLQ

1
Звичайно, це і є. man psмає -E Display the environment as well. Із URL-адреси, до якого я пов’язаний: Цей метод визначення вашого пароля MySQL повинен вважатися надзвичайно небезпечним і не повинен використовуватися. Деякі версії ps містять опцію відображення середовища запущених процесів. У деяких системах, якщо ви встановили MYSQL_PWD, ваш пароль піддається будь-якому іншому користувачеві, який працює з ps. Навіть у системах, що не мають такої версії ps, нерозумно вважати, що не існує інших методів, за допомогою яких користувачі можуть досліджувати середовище процесів.
RS 11

Вибираючи цей параметр MYSQL_PWD: я думаю, що якщо ви встановите змінну середовища на початку якогось сценарію, тоді виклик командного рядка MySQL, то зрозумійте, що після цього в кінці сценарію ви можете зменшити мінімум час експозиції . Це звучить розумно?
superjos

@kormoc, Будь ласка, докладно докладніше про останній абзац. Що таке досить складне рішення, про яке ви говорили?
Pacerier

1
Здається, що використання змінної середовища є більш безпечним, ніж командний рядок. У системі debian за замовчуванням ви можете зробити psта переглянути аргумент командного рядка для кожного процесу кожного користувача. Але ps eвідображається лише середовище для ваших власних процесів (якщо ви, звичайно, не користуєтесь). Це лише незначно безпечніше, але все-таки більш безпечно.
jlh

4

Якщо ваш сценарій PHP вже має відкрите підключення до бази даних, чому б вам просто mysqli_multi_query()не імпортувати файл .sql? Якщо синтаксис .sql-файла дійсний, звичайно ...


Я не впевнений, наскільки добре це буде працювати з досить великими .sql файлами?
Бенджамін

1
@Benjamin Я думаю, що не гірше, ніж мій клієнт MySQL - якщо ви дійсно стурбовані безпекою, хоча це був би найменш хакерський спосіб вирішити це, а розмір - це проблема, яку ви можете вирішити різними способами.
voretaq7

Чи знаєте ви, чи можливо це із PDO?
Бенджамін

Здається, PDO не має еквівалентної функції для викидання купою запитів у базу даних відразу. Вибачте. Це була ідея ...
Майкл Хемптон
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.