第17回から何回かに分けて、
第17回から引き続き、
筆者がCentOS 6.
$ sudo yum install -y http://dev.mysql.com/get/mysql57-community-release-el6-7.noarch.rpm $ sudo yum install -y --disablerepo=mysql57-community --enablerepo=mysql56-community mysql-community-server $ sudo service mysqld start
匿名アカウントとは何か
「匿名アカウント」
具体的には以下のように、
mysql> SELECT user, host FROM mysql.user ORDER BY user, host; +------+-----------+ | user | host | +------+-----------+ | | centos | | | localhost | | root | 127.0.0.1 | | root | ::1 | | root | centos | | root | localhost | +------+-----------+ 6 rows in set (0.00 sec)
匿名アカウントの動作
"root@localhost"アカウントをDROPした状態で、mysql -uroot -hlocalhost
mysql> DROP USER root@localhost; Query OK, 0 rows affected (0.00 sec) $ mysql -uroot -hlocalhost mysql> SELECT USER(); +----------------+ | USER() | +----------------+ | root@localhost | +----------------+ 1 row in set (0.00 sec) mysql> use mysql ERROR 1044 (42000): Access denied for user ''@'localhost' to database 'mysql' mysql> SELECT CURRENT_USER(); +----------------+ | CURRENT_USER() | +----------------+ | @localhost | +----------------+ 1 row in set (0.00 sec) mysql> SHOW GRANTS; +--------------------------------------+ | Grants for @localhost | +--------------------------------------+ | GRANT USAGE ON *.* TO ''@'localhost' | +--------------------------------------+ 1 row in set (0.00 sec)
"root@localhost"にマッチするアカウントが存在しないため、mysql
コマンドラインクライアントからは"root@localhost"で接続したつもり
ここまでは、
ホスト名部分のワイルドカード
匿名アカウントは
たとえば"192.
またたとえば、
mysql> CREATE USER user1@'%' IDENTIFIED BY 'password1'; Query OK, 0 rows affected (0.01 sec)
それでは、
$ mysql -h172.17.1.149 -uuser1 -p Enter password: mysql> SELECT USER(), CURRENT_USER(); +-------------------+----------------+ | USER() | CURRENT_USER() | +-------------------+----------------+ | [email protected] | user1@% | +-------------------+----------------+ 1 row in set (0.00 sec)
期待した通り、
混ぜるな危険、匿名アカウントとホスト名ワイルドカード
ここまでは、
それでは混ぜてみましょう。具体的には、mysql -uuser1 -hlocalhost -p
で接続してみます。
$ mysql -uuser1 -hlocalhost -p Enter password: ERROR 1045 (28000): Access denied for user 'user1'@'localhost' (using password: YES)
おや…… "user1@localhost"アカウントの認証に失敗しました。筆者がパスワードを打ち間違えたのでしょうか?
残念ながらそうではありません。コマンドラインクライアントのオプションから-p
を抜いて、
$ mysql -uuser1 -hlocalhost mysql> SELECT USER(), CURRENT_USER(); +-----------------+----------------+ | USER() | CURRENT_USER() | +-----------------+----------------+ | user1@localhost | @localhost | +-----------------+----------------+ 1 row in set (0.00 sec)
なんと、
第17回のMySQLへのログイン試行判定の説明を思い出してください。
MySQLへのログイン試行は、
以下のように判定されます。
- 接続元ホストの検証
- アカウントの検証
- パスワードの検証
MySQLはまず最初に接続元ホストの検証を行います。"user1@localhost"の要求に対して"''@localhost"と"user1@%"を比較する際、
ホスト名のマッチに失敗して初めて、
仕組み
まとめ
MySQLには
そもそもユーザー名を判定しない