Використання mysqldump у роботі cron без пароля root


14

Якщо я ввійду з паролем root у своєму вікні, я можу просто ввести

mysqldump - всі бази даних, і я отримаю очікуваний "Dump".

Я налаштовую роботу в cron.daily, щоб запустити та скинути це на резервний диск. Проблема у мене полягає в тому, що, хоча користувач працює під керуванням root, я отримую таке повідомлення

mysqldump: Помилка: 1045: Доступ відмовлено користувачеві 'root' @ 'localhost' (з використанням пароля: НІ)

при спробі підключення. Я не хочу жорстко кодувати пароль кореневого пароля mysql у скрипті (хто б).

Зважаючи на те, що я можу просто набрати "mysqldump" в командному рядку в моїй баш-оболонці, треба якось обійтись за допомогою параметра -u. У верхній частині сценарію я вже #! / Bin / bash.

Що мені тут не вистачає, щоб отримати це, щоб не запитувати корінний пароль до бази даних?

Відповіді:


12

Для того, щоб підключитися до сервера mysql, ви повинні надати облікові дані. Ви можете вказати їх у файлі конфігурації, передати їх через командний рядок або просто створити обліковий запис, який не потребує облікових даних.

Звичайно, опція без пароля ніколи не повинна використовуватися, командний рядок "пропуск" не є великим, тому що кожен, хто може запустити ps, може побачити командний рядок.

Рекомендований варіант - створити файл конфігурації mysql з обліковими записами в ньому, а потім захистити цей файл із дозволами файлової системи, щоб тільки ваш резервний користувач міг отримати доступ до нього.

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

Оновлення (2016-06-29) Якщо у вас запущено mysql 5.6.6 або новішої версії, слід переглянути інструмент mysql_config_editor , який дозволяє зберігати облікові дані у зашифрованому файлі. Дякую Джованні за те, що мені це згадали.


1
Цей метод все ще вимагає незашифрованого пароля в простому тексті, щоб бути у системі. Саме цього я намагаюся уникати.
Mech Software

> або у вас немає встановленого пароля root, або у вас є файл конфігурації, який не знайдений вашим сценарієм. Автор чітко заявляє, що існує пароль mysql для root і що він намагається отримати доступ до бази даних, не надаючи її команді mysqldump: "(використовуючи пароль: НІ)". Отже, у доступі відхилена помилка.
мономіт

1
@monomyth, автор також заявляє, що він може входити без пароля під час інтерактивного входу в систему як root. Це говорить мені, що щось не так.
Зоредаче

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

1
Причиною того, що я зміг увійти в систему, був кореневий обліковий запис, у якому вказано .my.cnf з 600 дозволів, тому таким чином оболонка отримувала доступ. cron, однак, повинен ігнорувати файл, тому я використав параметр у цій публікації, щоб вказати на нього.
Mech Software

3

Безпека не повинна здійснюватися через неясність. Якщо ви боїтесь, що хтось має доступ до вашого кореневого акаунта, не має значення, чи зберігається пароль mysql root у скрипті, оскільки у вас є всі ваші дані, доступні на дамських майданчиках або файлах баз даних. Отже, справжнє питання - що ви намагаєтесь захистити?

Якщо ви не хочете, щоб інші отримували пароль, який дозволить їм змінювати дані у вашій базі даних, вам потрібно створити користувача з відповідними дозволами .

Якщо ви не хочете, щоб цей mysql пароль бачив будь-який локальний обліковий запис, за винятком дозволів на встановлення кореневого файлу для цього сценарію, який має бути 0700, а власник - root.


1
Я думаю, що я досі не розумію, це те, що якщо я можу набрати (з кореневої підказки) mysqldump без введення пароля, чому я не можу так само запустити його через роботу cron. Який фрагмент відсутній, для чого потрібен параметр -p. Я не намагаюся «затуляти» пароль, я просто не ввів його. Щось особливе для самого кореневого входу в систему дозволяє отримати доступ, тож чому це не може бути реплікація cron?
Mech Software

Якщо ви бачите, що ви можете увійти без пароля та паролем, використовуючи одного і того ж «root» користувача, можливо, у вашій базі даних mysql є кілька користувачів root. Для деяких з них може не встановлено пароль. Ви можете видалити пароль з 'root' @ 'localhost', але тоді не тільки cron зможе підключитися до вашої бази даних, але й кожен, хто має локальний обліковий запис. Це не відрізняється (або гірше), ніж мати пароль у чіткому текстовому сценарії.
мономіт

Я думаю, що суть у тому, що MechSoftware робила те, що, будучи root, по суті дає вам можливість читати доступ до файлів баз даних, і вони не шифруються. Отже, вимагати кореневого пароля MySQL від кореневого користувача лише для гарного друку даних, до яких вони, по суті, вже можуть отримати доступ, - це "безпека через незрозумілість". Крім того, дозволи дуже легко зіпсувати, наприклад, якщо хтось встановлює їх рекурсивно для каталогу, якщо є символічне посилання на файл тощо.
Септаграма

2

Використання оболонки може зробити це, оскільки у вас є оболонка для запуску, тобто, коли ви входите в систему, всі ваші сценарії оболонки у вашому профілі запускаються.

У Cron немає такої розкоші. Коли він увійде в систему (як root), він увійде з оболонкою за замовчуванням. Це не дозволяє комусь віддалено входити в систему, але це також означає, що немає запущених сценаріїв автоматичного входу.

Ви можете встановити оболонку для запуску cron, відредагувати crontab і додати змінні SHELL і HOME, наприклад.

SHELL=/bin/bash
HOME=/root

якщо вони не встановлені, то cron буде працювати з оболонкою та домашнім каталогом, вказаними в / etc / passwd (які, ймовірно, нічого, можливо, / bin / sh).

Якщо ви хочете побачити, що cron середовища працює як, додайте завдання cron, яке експортує env у файл, наприклад:

$crontab -e
* * * * * env > /tmp/crontabenv.log
:wq

1

Якщо скрипт працює під коренем, ви можете створити файл /root/.my.cnf з дозволами 600 та таким вмістом:

[client]
user = DBUSERNAME
password = DBPASSWORD

(де ви вводите своє ім'я користувача та пароль MySQL, звичайно).

Цей файл автоматично буде прочитаний будь-яким інструментом командного рядка mysql, якщо він запускається як root. Більше не потрібно надавати це в командному рядку. 600 дозволів захищають його від сторонніх очей.


1
Я виявив, що це був випадок, ЯК я міг нам mysqldump без пароля. Таким чином, це вирішило таємницю того, як ШЕЛЬ це робить, то чому хрон не читає його?
Mech Software

1
mysqldump при запуску з cron не може знайти файл .my.cnf. Засіб полягає в тому, щоб додати параметр mysqldump для явного зчитування параметрів у файлі.my.cnf, тобто --defaults-extra-file = / root / .my.cnf Я дізнався про це з двох інших відповідей на переповнення стека. Див stackoverflow.com/a/602054/854680 і stackoverflow.com/a/890554/854680
MikeOnline

1

Cron може дуже засмучувати налагодження. Коли виконуються завдання cron, у них не встановлено оточення, як ви сприймаєте як належне з оболонкою.

Поради щодо крона:

  • використовувати повний шлях до всього - "ECHO = / bin / echo" тощо: (визначте змінні вгорі, щоб зробити це простіше)
  • встановіть MAILTO, щоб ви отримували електронний лист від кожної роботи (або завдання переспрямовували stderr / stdout у файл)

Якщо ваш користувач root може це зробити з оболонки, cron має бути в змозі це зробити. Переконайтеся, що ви чітко вказали конфігураційний файл, який слід використовувати в командному рядку.


0

Хоча декілька з цих відповідей корисні, кілька заплутують, оскільки користувач root Unix і користувач mysql root не є однаковими і в основному не мають жодних стосунків, крім того, що вони обидва використовують ім'я для входу "root". Можливо, це очевидно, але, здається, деякі відповіді суперечать два.

Що може бути корисним варіантом (можливо, він існує?) Для mysqld, було б дозволити клієнтським програмам, таким як mysql або mysqldump і т.д., які працюють як unix root, отримати доступ до root root mysqld @ localhost без пароля, не зберігаючи пароль root @ localhost's (mysql) у файлі my.cnf або подібному.

Я знаю, що це нервує, але міркування - це той, хто працює як локальний (на сервері mysqld) unix root, так чи інакше, може легко обійти безпеку mysqld. А наявність my.cnf з паролем root mysqld 7x24 або навіть створення / видалення my.cnf з паролем root mysql (звідки цей пароль?) На ходу (наприклад, зробити mysqldump) змушує мене нервувати.

Це зажадає певної інфраструктури та роздумів, тому що треба довіряти mysql / mysqldump / тощо, щоб передати mysqld, що він справді вважає, що він управляється локальним кореневим обліковим записом unix.

Але, наприклад, обмеження лише unix-сокета mysqld, жоден TCP, не може допомогти, принаймні, як настійно рекомендований варіант цієї опції. Це може встановити, що клієнт працює локально, що, ймовірно, недостатньо. Але це може стати початком ідеї. Можливо, надсилання дескриптора файлу через unix-сокет може бути ще одним фрагментом (google it, якщо це звучить як божевільна розмова.)

PS Ні, я не збираюся намагатися тут провести мозковий штурм, як що-небудь із цього може працювати на не-Unix операційній системі, тому ідея, ймовірно, перекладається на інші ОС.


1
Встановлення облікових даних /root/.my.cnfз належними дозволами акуратно вирішує проблему.
Майкл Хемптон

Я не згоден, тепер кожен, хто може отримати доступ до цього файлу, в тому числі через якийсь інший недолік системи, має root mysql pw. І це 24x7, на яке слід атакувати, і у фіксованому розташуванні файлу (що, правда, не повинно бути в / root.) Але, наприклад, хто працює з файловою системою, або може отримати доступ до неї, може витягнути її з дамп-файл файлової системи. У цьому випадку це здається спокусою незадоволеного працівника. Я думаю, що цілком розумна мета, щоб паролі явного тексту не існували в системі ніде.
Баррі Шейн

Можливо, і так, але пропозиція, яку ви зробили, набагато гірша, оскільки вона дозволяє будь-якому місцевому користувачеві банально прикидатися коренем.
Майкл Хемптон

Ні, моя пропозиція полягала в тому, що вони вже мають бути Unix root на локальному сервері; в цьому випадку локальний mysqld довіряє mysql або mysqldump тощо (клієнт), який запускається як root root Unix, і дозволяє їм діяти так, ніби вони автентифіковані як root mysql . Як я вже говорив, якщо вони вже є unix root локальними на сервері, вони можуть як-небудь обминути пароль root mysql за допомогою декількох добре задокументованих команд ("відновлення пароля root mysql").
Баррі Шейн
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.