MySQLと名前解決
MySQLにおいて名前解決は、
- IPアドレスがMySQL内の名前解決キャッシュに載っているかどうかを確認する
- (載っていない場合) IPアドレスからホスト名に逆引きをかける
(getnameinfo) - 得られたホスト名を正引きし、
IPアドレスを得る (getaddrinfo) - IPアドレスとホスト名の両方を使って、
接続元ホストの検証をする (第17回 MySQLのユーザー管理について [その1] を参照)の2ページ目 - 検証に成功した場合、
これ以降の 「接続元ホスト」 はIPアドレスまたはホスト名の 「検証に成功したどちらか一方」 を利用する - ユーザー名、
パスワードなどの認証に進む
名前解決が無効
--skip-name-resolve
オプションはよくgetnameinfo
とgetaddrinfo
であるため、/etc/
などDNS以外の名前解決も試みます
DNSの逆引き、--skip-name-resolve
を設定したら速くなった」--skip-name-resolve
が設定されていようといまいと、mysql -hmysql-hostname
とコマンドラインから名前を指定することは可能です
名前解決を利用するメリット
MySQLの名前解決を有効にしておくメリットが享受できるのは、/etc/
などその他の名前解決手段)--skip-name-resolve
の設定をした方が良いでしょう。
名前解決が適切に設定されている場合、
- ホスト名ワイルドカード
(第21回 MySQLのユーザー管理について [その3] を参照)の運用がしやすくなる - 名前解決の手段が適切にされていないアクセス元からの接続試行をエラーログに出力することができる
ホスト名ワイルドカードの運用がしやすくなる
第21回 MySQLのユーザー管理について
たとえばIPアドレス172.mysql.
テーブルに記録されている情報は以下の通りであるべきです。
mysql> SELECT user, host FROM mysql.user WHERE user = 'myuser'; +--------+------------+ | user | host | +--------+------------+ | myuser | 172.17.0.2 | | myuser | 172.17.0.3 | | myuser | 172.17.1.2 | +--------+------------+ 3 rows in set (0.00 sec)
172.
かといって、/etc/
を利用して名前解決をさせることで、
mysql> SELECT user, host FROM mysql.user WHERE user = 'myuser'; +--------+--------------------+ | user | host | +--------+--------------------+ | myuser | myapp%.localdomain | +--------+--------------------+ 1 row in set (0.01 sec) $ vim /etc/hosts .. 172.17.0.2 myapp2.localdomain 172.17.0.3 myapp3.localdomain 172.17.1.2 myapp4.localdomain $ sudo service mysqld restart
この設定をしたMySQLサーバに対して172.
mysql> SELECT current_user(); +---------------------------+ | current_user() | +---------------------------+ | myuser@myapp%.localdomain | +---------------------------+ 1 row in set (0.00 sec) mysql> SHOW PROCESSLIST; +----+--------+--------------------------+------+---------+------+----------+------------------+ | Id | User | Host | db | Command | Time | State | Info | +----+--------+--------------------------+------+---------+------+----------+------------------+ | 5 | myuser | myapp2.localdomain:53164 | NULL | Query | 0 | starting | SHOW PROCESSLIST | +----+--------+--------------------------+------+---------+------+----------+------------------+ 1 row in set (0.00 sec)
名前解決を設定していない172.
$ mysql -h172.17.0.1 -umyuser -p Enter password: ERROR 1130 (HY000): Host '172.17.0.11' is not allowed to connect to this MySQL server
/etc/
などで172.
ただし、/etc/
の読み込みはMySQLの起動時にしか行われないため、/etc/
の運用では毎回再起動が必要になってしまいます。名前解決を利用したアカウント運用は、
名前解決の手段が適切にされていないアクセス元からの接続試行をエラーログに出力することができる
--skip-name-resolve
が有効になっていない環境では、
2016-09-05T06:36:30.324215Z 3 [Warning] IP address '172.17.0.11' could not be resolved: Name or service not known
これは冒頭で説明したステップの2. 「(載っていない場合)mysql.
テーブルにIPアドレス形式でアカウントが登録してあれば、
まとめ
skip-name-resolveオプションはMySQLサーバ内の名前解決を無効化します。たまに聞く誤解ですが、
名前解決を有効にしておくことで得られるメリットも多少ありますが、--skip-name-resolve
で名前解決を無効化しておく方が定石です。