Відповідь: Як змінити кореневий пароль сервера MySQL шляхом повторного надання сервера


14

Я забезпечив свій сервер програмою Ansible playbook. Я використовував програму « root / bedrock-Ansible» .

Одним із завдань було налаштування сервера mysql разом із паролем користувача root mysql.

Тепер мені терміново потрібно змінити цей пароль. Кроки, які я вжив:

  1. Я оновив змінні для ролей Ansible
  2. Я виконав команду ansible-playbook -i hosts/staging server.ymlдля того, щоб перепрофілювати сервер

Усі завдання виконувались, як очікувалося (жодних змін), але сценарій не вдався [mariadb | Set root user password]до цього повідомлення:

msg: unable to connect to database, check login_user and login_password are correct or ~/.my.cnf has the credentials

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

Чи взагалі можливо змінити кореневий пароль MySQL, перепрофілювавши сервер з Ansible? Які мої варіанти?

Відповіді:


15

Проблема у вас полягає в тому, що Ansible намагається використовувати той самий кореневий пароль для входу, як ви хочете змінити його на:

- name: Set root user password
  mysql_user: name=root
              host="{{ item }}"
              password="{{ mysql_root_password }}"
              check_implicit_admin=yes
              login_user="{{ mysql_user }}"
              login_password="{{ mysql_root_password }}"
              state=present

Очевидно, що це ніколи не вийде, якщо ви хочете використовувати цю гру, щоб змінити її.

Натомість слід змінити вищезазначену гру, щоб стати чимось на зразок:

- name: Set root user password
  mysql_user: name=root
              host="{{ item }}"
              password="{{ mysql_root_password }}"
              check_implicit_admin=yes
              login_user="{{ mysql_user }}"
              login_password="{{ mysql_old_root_password }}"
              state=present

А потім оновіть відповідні файли інвентаря, щоб додати цю нову змінну.

Отже, ваші group_vars/productionтепер повинні містити:

mysql_old_root_password: productionpw
mysql_root_password: newproductionpw

Схоже, що ця книжка використовує корінний пароль і в програмі, roles/mariadb/tasks/main.ymlі, roles/wordpress-setup/tasks/database.ymlможливо, ви хочете запустити всю програму, server.ymlщоб переконатися, що вона налаштована належним чином.


Дякую за чудову відповідь. Це, безумовно, шлях. Я закінчив скидання кореневого пароля в консолі mysqladmin- але це було до того, як я побачив вашу відповідь
luqo33

7

Ви можете неправильно використовувати ~ / .my.cnf для можливості зміни mysql-root-пароля.

Хитрість полягає в тому, щоб мати завдання "Встановити пароль root" (nr.1), яке встановить пароль. Після цього у вас є завдання, яке створює ~ / .my.cnf з правильними обліковими записами (nr.2).

У новій системі ~ / .my.cnf немає. Завдання №1 створить mysql-root-користувача із заданими обліковими записами. У теперішній системі облікові дані від ~ / .my.cnf використовуються для входу та встановлення пароля для mysql_root_password . Завдання №2 створить ~ / .my.cnf, oroverwrite існуючі старі облікові дані ~ / .my.cnf з новими.

Великою перевагою такого підходу є наявність лише однієї змінної "mysql_root_password", яка завжди є правильною з точки зору ігрової книги. У теперішніх системах ~ / .my.cnf є своєрідним сховищем для поточних локальних облікових даних mysql.

- name: Set root user password
  # If .my.cnf already exists, this will cause an mysql-root-password update.
  mysql_user:
    name: root
    password: "{{ mysql_root_password}}"
    check_implicit_admin: true

- name: Create .my.cnf
  template:
   src: "client.my.cnf.j2"
   dest: "/root/.my.cnf"
   owner: root
   group: root
   mode: 0600

з client.my.cnf.j2:

[client]
user=root
password={{ mysql_root_password }}

Подальше читання

Відповідні примітки з ansible-mysql_user_module-документації :

  • Примітка1:

    Щоб захистити цього користувача як частину ідентичної книги, потрібно створити щонайменше дві задачі: перша повинна змінити пароль користувача root, не надаючи жодних даних login_user / login_password. Другий повинен видалити файл ~ / .my.cnf, що містить нові кореневі облікові дані. Подальші запуски книги будуть успішними, прочитавши нові дані з файлу. ansible-mysql_user_module, примітки

  • Примітка2:

    Під час передачі облікових даних вам потрібні і login_password, і login_user. Якщо такої немає, модуль спробує прочитати облікові дані з ~ / .my.cnf, і, нарешті, повернеться до використання логін 'root' за замовчуванням MySQL без пароля. ansible-mysql_user_module, примітки


Мені дуже подобається такий підхід, і він набагато кращий, ніж версія у моїй відповіді. Мабуть, це має бути прийнята відповідь.
ydaetskcoR

2
Це зручно, але в багатьох системах фактично створено 4 користувачів «root», з Hosts 127.0.0.1, localhost, :: 1 і будь-яким локальним іменем хоста. Вищезгадане змінює лише root @ localhost, залишаючи три інші кореневі акаунти з порожніми паролями.
робо

Список всіх користувачів , кореневі: mysql --database mysql --execute "select host from user where user = 'root';". Ця публікація робить те саме, що ця відповідь, але має код для встановлення всіх паролів.
hlovdal

2

Для наступної людини, яка приходить шукати відповіді тут. Хоча прийнята відповідь відповідає дійсності, ви повинні бути дуже ретельними, якщо ви використовуєте MySQL 5.7, оскільки в mysqld в демонізованому режимі (сервіс) не допускається анонімний вхід. Натомість ви ОБОВ'ЯЗКОВО зішкрібайте /var/log/mysqld.log на ТЕМПОРАРІЙНІЙ пароль, який хтось вирішив створити та використовувати його на login_password = ydaetskcoR. Це було особливістю, яку вони вирішили застосувати у версії 5.7 репозиторію розробників, тому, якщо ви хочете уникнути цього, використовуйте старішу версію (5.6).

Документація тут: https://dev.mysql.com/doc/refman/5.7/en/server-options.html#option_mysqld_initialize-insecure

http://mysqlserverteam.com/initialize-your-mysql-5-7-in вещества-with-ease/


1

Існує ігрова книга Ansible, яка використовується для загартування MySQL.

https://github.com/dev-sec/ansible-mysql-hardening

Це не тільки змінило кореневий пароль, але й виконує деякі додаткові кроки для загартовування сервера.

Погляньте на файл readme.


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