Запуск mysql dump в задании cron без раскрытия паролей

11

Я хочу бежать

mysqldump -u aUser -p P4SSw0rd --all-databases > backup.sql

в постоянной работе. Как я могу сделать это безопасно?

Я знаю, что могу поставить команду прямо там, но любой, у кого есть доступ к машине, сразу увидит ее через crontab. Есть ли лучший способ сделать это?

slycat
источник
1
Ваш пример неверен, он должен быть -pP4SSw0rd без пробелов.
Саймон Вудсайд

Ответы:

14

Как указано в man mysqldump: см. 6.1.2.1. Руководство для конечного пользователя по безопасности паролей в справочном руководстве MySQL.

Файл опций является самой безопасной ставкой, не в последнюю очередь в соответствии с приведенной выше ссылкой. Предоставлять его в виде открытого текста в crontab нехорошо, не в последнюю очередь, поскольку командная строка процесса по умолчанию видна psдругим пользователям. То же самое на самом деле относится к переменным среды, как описано в ссылке.

Соответствующая часть справочного руководства по MySQL:

Сохраните ваш пароль в файле опций. Например, в Unix вы можете указать свой пароль в [client]разделе .my.cnfфайла в вашем домашнем каталоге:

[client]
password=your_pass

Чтобы сохранить пароль в безопасности, файл не должен быть доступен никому, кроме вас самих. Для этого установите режим доступа к файлу на 400или 600. Например:

shell> chmod 600 .my.cnf

Чтобы присвоить в командной строке конкретный файл параметров, содержащий пароль, используйте --defaults-file=file_nameпараметр, где file_nameуказан полный путь к файлу. Например:

shell> mysql --defaults-file=/home/francis/mysql-opts

Раздел 4.2.3.3, «Использование файлов опций» , обсуждает файлы опций более подробно.

Также см. Https://stackoverflow.com/q/10725209 .

Даниэль Андерссон
источник
Похоже, что команда ps обфусцирует пароль одним x: ps: mysqldump -uroot -px xx mydb. Я не говорю, что это хорошая защита (если вы набираете задания, пароль показывается в виде обычного текста).
Лин
4

Запустите cronjob от имени определенного пользователя и используйте простую логику Bash, чтобы извлечь пароль из открытого текста, хранящегося где-то в системе, с разрешениями, которые позволяют только пользователю (или, возможно, группе) получить к нему доступ.

PASS=`cat /path/to/pwdfile`

 mysqldump -u aUser -p $PASS--all-databases > backup.sql

Таким образом, если cronjob запускается от имени пользователя «example», владельцем файла должен быть «example: example» с разрешением 0400.

Вы также можете достичь аналогичной функции, используя пользовательский уровень .my.cnf .

Garrett
источник
1
read PASS < /path/to/pwdfileидиоматически чище, чтобы делать то же самое (возможно, я думаю; superuser.com/q/323060/49184 применимо).
Даниэль Андерссон
* "Идиоматически чище ПУТЬ" ... Потерян в редактировании.
Даниэль Андерссон
Кто-то, обладающий даже самым базовым пониманием Bash, сможет увидеть, что происходит с этой кошкой. :)
Гарретт
1
Правда, я бы даже сказал, что это самый распространенный способ сделать это, но это все еще немного занудство :-). Если сделать UUOC привычкой, которую он будет кусать, когда файл больше чем ARGMAX, он использует дополнительный процесс вместо использования встроенной оболочки, он может соблазнить такие конструкции, как, например, for i in `cat file`; do ...с собственным набором проблем и т. Д. Но, конечно, как с большинством вещей: если кто-то знает, что происходит, он свободен делать по своему усмотрению. Я здесь не в крестовом походе, независимо от того, как это может выглядеть.
Даниэль Андерссон
0

Любой, у кого есть доступ к машине, имеет такой же уровень доступа, /var/spool/cron/crontabs/какой /var/lib/mysqlвы им разрешаете. Итак, установите правильные разрешения на каталоги и все готово. Любой, имеющий root-доступ, имеет прямой доступ к файлам базы данных напрямую. Тот, кому вы не доверяете, чтобы иметь доступ к машине, вообще не должен иметь доступа к машине.

Обычно люди видят только своих cronjobs через crontab -l.

Акира
источник
0

В целях резервного копирования рассмотрите возможность иметь пользователя только для чтения в MySQL, например, так

CREATE USER bUser IDENTIFIED BY 'p4ss';

GRANT SELECT ON *.* TO bUser@localhost;
GRANT LOCK TABLES ON *.* TO bUser@localhost;

mysqldump требует только SELECTи LOCK TABLESпривилегий, чтобы делать свою работу.

Саптарши Бисвас
источник