Безпечно подавати програму паролем


9

Розуміючи проблему з використанням пароля в командному рядку , мені потрібно знайти спосіб подачі програми з паролем, не будучи проблемою (без пароля десь записаний).

У мене є сценарій bash, який автоматично встановлює весь LAMP-сервер з джерела: Apache, FastCGI, PHP & MySQL. Для цих установок потрібен пароль, особливо MySQL.

Як я можу зробити сценарій повністю автоматизованим, не розкриваючи пароль?

Редагувати (9 червня, 3:55 UTC):
я викликаю mysql паролем у командному рядку через root:

root@dor-desktop:/home/dor# PASS=`cat /home/dor/tmpf/pass`
root@dor-desktop:/home/dor# mysql -u root -p"$PASS"
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 6

(PASS = "p4ssw0rd" у нашому випадку)
І я виконую ps aux | grep mysqlчерез свого постійного користувача (dor), який не показує мені пароль !
(Деякі з) psвихід:

USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root      3562  0.0  0.0  34156  2864 pts/0    S+   05:53   0:00 mysql -u root -px xxxxxx

Як це можливо?


Також дивіться unix.stackexchange.com/q/385339/135943 , але зауважте, що це не робить його безпечним!
Wildcard

Відповіді:


11

Що стосується Вашого оновлення:

Коли процес запускається, він має виділену область пам’яті, де зберігаються аргументи, та int, який повідомляє, скільки аргументів було передано.

MEMORY
argc    2
argv[0] program_name
argv[1] foo
argv[2] bar

MySQL перевіряє, чи був пароль переданий у командному рядку -p, і якщо він був скопійований у нову змінну, яка не видно, то перезапишіть цю область пам'яті з x'es.

Простими словами, наприклад:

argc 2
argv[1] -p
argv[2] p4ssw0rd

new_var = copy(argv[2]);
argv[2] = "xxxxx";

Ви можете знайти його, наприклад, у client/mysqladmin.ccвихідному коді:

  case 'p':
      ...
      opt_password=my_strdup(argument,MYF(MY_FAE));
      while (*argument) 
          *argument++= 'x';     /* Destroy argument */

Під час psзапуску він зчитує область пам'яті аргументів, ( argv[N]), і таким чином вона є xxxx.

Дуже короткий час пароль видно, але лише протягом декількох циклів процесора.


Ви можете оновити пароль MySQL за допомогою спеціальної --init-fileопції та процедури. С.5.4.1.2. Скидання пароля Root: Unix Systems

mysqld_safe --init-file=/home/me/mysql-init &

Редагувати:

Як @Gilles сказати, що ви можете echo,printf або використовувати hereдокумент зі сценарію.

Ви також можете додати це .my.cnfу свій домашній каталог або у ( тимчасовий ) файл та скористатися --defaults-extra-fileопцією. (Повірте, ви повинні додати цю опцію рано в командному рядку.) Необов’язково також включати користувача. Також відзначте додаткове ім'я опції, якщо ви не хочете використовувати лише цей файл як конфігурацію:

[client]
user=foo
password='password!'
shell> chmod 400 my_tmp.cnf
shell> mysql --defaults-extra-file=my_tmp.conf -...

Необов'язково [client]групування робить mysqldпропуск конфігурації.

Можна також використовувати MYSQL_PWDзмінну середовища, але це ніколи не слід використовувати, оскільки ви можете перераховувати середовище, у багатьох psреалізаціях ps -e, у /proc/<PID>/environфайлі на Linux тощо.

tr '\0' '\n' < /proc/<PID>/environ

Більше про тему тут .

Ви також можете подивитися на утиліту MySQL Configuration Utility, яка дозволяє зберігати пароль у зашифрованому файлі у вашому домашньому каталозі - .mylogin.cnf.


Чи є спосіб змінити маркер у mysql-initфайлі з паролем, який зберігається у змінній bash? (не розкриваючись)
Др

4
@Dor Щось подібне echo 'password=p4ssw0rd' >>mysql.cnfє безпечним, оскільки echoце вбудований, тому пароль не відображається в командному рядку жодного процесу. Тут також безпечний документ.
Жил "ТАК - перестань бути злим"

4

Типовим рішенням є зчитування пароля з файлу або зі стандартного вводу (або з іншого дескриптора файлу, який повинен бути переданий як параметр).


3

Деякі програми (наприклад, командний рядок ftp) зчитують паролі зі /dev/ttyспеціального файлу для кожного процесу, який представляє процес, що контролює TTY. Це дозволяє програмі не повторювати пароль назад на екран, а також мати певну впевненість у тому, звідки походить пароль.

#!/bin/bash

stty -F /dev/tty -echo 
read PASSWORD < /dev/tty

echo $PASSWORD
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.