Безопасное заполнение программы паролем

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опцию и процедуру. C.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.

Runium
источник
Есть ли способ изменить токен в 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
Брюс Эдигер
источник