Odpowiedź: Jak zmienić hasło roota do serwera MySQL poprzez zmianę serwera

14

Zaopatrzyłem mój serwer w poradnik Ansible. Korzystałem z poradnika root / bedrock-Ansible .

Jednym z zadań było skonfigurowanie serwera mysql wraz z hasłem użytkownika root mysql.

Teraz muszę pilnie zmienić to hasło. Kroki, które podjąłem:

  1. Zaktualizowałem zmienne dla Roli Ansible
  2. ansible-playbook -i hosts/staging server.ymlWykonałem polecenie w celu ponownego uruchomienia serwera

Wszystkie zadania zostały wykonane zgodnie z oczekiwaniami (bez zmian), ale skrypt nie powiódł się przy [mariadb | Set root user password]tym komunikacie:

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

Domyślam się, że po ustawieniu hasła root MySQL, zmiana serwera nie może go zmienić.

Czy w ogóle można zmienić hasło roota MySQL, ponownie konfigurując serwer za pomocą Ansible? Jakie są moje opcje?

luqo33
źródło

Odpowiedzi:

15

Problemem jest to, że Ansible próbuje użyć tego samego hasła roota, aby się zalogować, aby zmienić je na:

- 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

Oczywiście to nigdy nie zadziała, jeśli chcesz użyć tej gry, aby to zmienić.

Zamiast tego powinieneś zmienić powyższą grę na coś w stylu:

- 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

A następnie zaktualizuj odpowiednie pliki zapasów, aby dodać tę nową zmienną.

Więc group_vars/productionpowinieneś teraz zawierać:

mysql_old_root_password: productionpw
mysql_root_password: newproductionpw

Wygląda na to, że ten podręcznik używa hasła roota zarówno w roles/mariadb/tasks/main.ymlplaybooku, jak i roles/wordpress-setup/tasks/database.ymldlatego możesz chcieć uruchomić cały server.ymlplaybook, aby upewnić się, że jest poprawnie skonfigurowany.

ydaetskcoR
źródło
Dziękuję bardzo za świetną odpowiedź. To zdecydowanie najlepsza droga. W końcu zresetowałem hasło roota w konsoli za pomocą mysqladmin- ale to było zanim zobaczyłem twoją odpowiedź
luqo33
7

Możesz użyć ~ / .my.cnf do zmiany hasła root-mysql.

Sztuką jest mieć zadanie „Ustaw hasło roota” (nr.1), które ustawi hasło. Następnie masz zadanie, które tworzy ~ / .my.cnf z prawidłowymi poświadczeniami (nr.2).

W nowym systemie ~ / .my.cnf nie jest obecny. Zadanie nr.1 utworzy użytkownika root-mysql z podanymi poświadczeniami. W obecnym systemie poświadczenia z ~ / .my.cnf są używane do logowania i ustawiania hasła na hasło_mysql_root_passot . Zadanie nr.2 utworzy ~ / .my.cnf lub zastąpi istniejące stare poświadczenia ~ / .my.cnf nowymi.

Dużą zaletą tego podejścia jest posiadanie tylko jednej zmiennej „mysql_root_password”, która jest zawsze poprawna z punktu widzenia podręcznika. W obecnych systemach ~ / .my.cnf jest rodzajem pamięci dla bieżących lokalnych poświadczeń 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

za pomocą client.my.cnf.j2:

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

Dalsza lektura

Ważne uwagi z dokumentacji ansible-mysql_user_module :

  • Notatka 1:

    Aby zabezpieczyć tego użytkownika w ramach idempotentnego podręcznika, musisz utworzyć co najmniej dwa zadania: pierwsze musi zmienić hasło użytkownika root, bez podawania żadnych szczegółów login_user / login_password. Drugi musi upuścić plik ~ / .my.cnf zawierający nowe poświadczenia root. Kolejne uruchomienia playbooka zakończą się powodzeniem, czytając nowe referencje z pliku. ansible-mysql_user_module, notatki

  • Uwaga 2:

    Zarówno hasło, jak i login_user są wymagane podczas przekazywania poświadczeń. Jeśli nie ma żadnych, moduł podejmie próbę odczytania poświadczeń z ~ / .my.cnf i ostatecznie wróci do używania domyślnego loginu MySQL dla „root” bez hasła. ansible-mysql_user_module, notatki

Markus Schulte
źródło
Podobało mi się to podejście i jest ono znacznie lepsze niż wersja w mojej odpowiedzi. Prawdopodobnie powinna to być zaakceptowana odpowiedź.
ydaetskcoR 27.04.16
2
Jest to przydatne, ale w wielu systemach jest utworzonych 4 użytkowników root, z Hostami 127.0.0.1, localhost, :: 1 i bez względu na lokalną nazwę hosta. Powyższe modyfikuje tylko root @ localhost, pozostawiając trzy inne konta root z pustymi hasłami.
robo
Lista wszystkich użytkowników root: mysql --database mysql --execute "select host from user where user = 'root';". Ten post działa tak samo jak ta odpowiedź, ale zawiera kod do ustawiania wszystkich haseł.
hlovdal
2

Dla następnej osoby, która szuka tu odpowiedzi. Chociaż zaakceptowana odpowiedź jest prawdziwa, musisz być bardzo dokładny, jeśli używasz MySQL 5.7, ponieważ anonimowe logowanie w mysqld w trybie demonizowanym (usługa) jest niedozwolone. Zamiast tego MUSISZ zeskrobać plik /var/log/mysqld.log w celu uzyskania TYMCZASOWEGO hasła, które ktoś postanowił utworzyć, i użyj go na login_password = ydaetskcoR. To była funkcja, którą postanowili wdrożyć w wersji 5.7 repozytorium deweloperów, więc jeśli chcesz tego uniknąć, użyj starszej wersji (5.6).

Dokumentacja tutaj: https://dev.mysql.com/doc/refman/5.7/en/server-options.html#option_mysqld_initialize-insecure

http://mysqlserverteam.com/initialize-your-mysql-5-7-instances-with-ease/

einarc
źródło
1

Istnieje podręcznik Ansible służący do hartowania MySQL.

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

To nie tylko zmieniło hasło roota, ale także wykonuje dodatkowe kroki w celu wzmocnienia serwera.

Spójrz na plik readme.

ww12z
źródło
Nie wygląda na to, że obsługuje zmianę hasła roota, gdy jest puste.
flickerfly