MySQL 5.7でrootユーザがパスワード認証になっていない時にパスワード認証に変更するやり方
環境はAWS
# cat /etc/lsb-release DISTRIB_ID=Ubuntu DISTRIB_RELEASE=16.04 DISTRIB_CODENAME=xenial DISTRIB_DESCRIPTION="Ubuntu 16.04.1 LTS"
Ansibleを使っていてrolesの下が
db ├── tasks │ └── main.yml └── templates └── mysql.preseed.j2
で
$ cat roles/db/tasks/main.yml - template: src=mysql.preseed.j2 dest=/tmp/mysql.preseed - shell: debconf-set-selections /tmp/mysql.preseed - apt: name={{ item }} update_cache=yes with_items: - mysql-server - mysql-client
$ cat roles/db/templates/mysql.preseed.j2 mysql-community-server mysql-community-server/root-pass password {{ password }} mysql-community-server mysql-community-server/re-root-pass password {{ password }}
みたいな状態で{{ password }}
部分を変数として与えてMySQL 5.7をインストールしたら、rootユーザのパスワードが設定されておらず、OSのrootユーザのみがパスワード無しで(かつ、どんなテキトーパスワードでも)接続できるようになっていた。
中身を見てみると
mysql> select plugin, authentication_string from mysql.user where user = 'root'; +-------------+-----------------------+ | plugin | authentication_string | +-------------+-----------------------+ | auth_socket | | +-------------+-----------------------+
だと。
パスワードの設定とplugin
の値をmysql_native_password
を変更するには
mysql> ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'hogehoge';
としてやる。
SET PASSWORD
文やALTER USER 'root'@'localhost' IDENTIFIED BY 'hogehoge'
ではダメ。
そもそもmysql.preseed.j2
の内容がおかしい気もするがここ直せばパスワード設定されるのかは未検証。