テストしてみましょう。
スーパーユーザーとして接続してから、次の手順を実行します。
SHOW VARIABLES LIKE "%version%";
+
| Variable_name | Value |
+
| version | 10.0.23-MariaDB-0+deb8u1-log |
その後
USE mysql;
セットアップ
テスト用のfooパスワードbarを持つユーザーを作成します。
CREATE USER foo@'%' IDENTIFIED BY 'bar'; FLUSH PRIVILEGES;
接続する
Unixドメインソケット(つまり、ファイルシステムエントリ/var/run/mysqld/mysqld.sockなどによって名前が付けられたI / Oパイプ)に接続するには、コマンドラインでこれを実行し--protocolます(オプションを使用して二重に確認します)
mysql -pbar -ufoo
mysql -pbar -ufoo
上記は「ユーザーはローカルホストから来ています」と一致しますが、「ユーザーは127.0.0.1から来ています」とは一致しないと予想されます。
代わりに「127.0.0.1」からサーバーに接続するには、コマンドラインでこれを実行します
mysql -pbar -ufoo
を省略した場合でも--protocol=TCP、mysqlコマンドはUnixドメインソケットを使用しようとします。あなたはまた言うことができます:
mysql -pbar -ufoo
1行での2つの接続試行:
export MYSQL_PWD=bar; \
mysql -ufoo
mysql -ufoo
(パスワードは、mysqlプロセスに渡されるように環境で設定されます)
疑わしい場合の検証
接続がTCP / IPソケットまたはUnixドメインソケットのどちらを経由するかを実際に確認するには
- の出力を調べて、mysqlクライアントプロセスのPIDを取得します。
ps faux
- 実行し
lsof -n -p<yourpid>ます。
次のようなものが表示されます。
mysql [PID] quux 3u IPv4 [code] 0t0 TCP 127.0.0.1:[port]->127.0.0.1:mysql (ESTABLISHED)
または
mysql [PID] quux 3u unix [code] 0t0 [code] socket
そう:
ケース0:ホスト= '10 .10.10.10 '(nullテスト)
update user set host='10.10.10.10' where user='foo'; flush privileges;
- ソケットを使用して接続します:失敗
- 127.0.0.1から接続:失敗
ケース1:ホスト= '%'
update user set host='%' where user='foo'; flush privileges;
- ソケットを使用して接続:OK
- 127.0.0.1から接続:OK
ケース2:ホスト= 'localhost'
update user set host='localhost' where user='foo';flush privileges;
動作はさまざまで、これは明らかにに依存しskip-name-resolveます。設定されている場合localhost、ログに従って行が無視されます。エラーログには次の内容が表示されます。「「user」エントリ「root @ localhost」は--skip-name-resolveモードでは無視されます。」。これは、Unixドメインソケットを介して接続しないことを意味します。しかし、これは経験的には当てはまりません。localhost現在はUnixドメインソケットのみを意味し、127.0.0.1とは一致しなくなりました。
skip-name-resolve オフです:
- ソケットを使用して接続:OK
- 127.0.0.1から接続:OK
skip-name-resolve オンになっています:
- ソケットを使用して接続:OK
- 127.0.0.1から接続:失敗
ケース3:ホスト= '127.0.0.1'
update user set host='127.0.0.1' where user='foo';flush privileges;
- ソケットを使用して接続します:失敗
- 127.0.0.1から接続:OK
ケース4:ホスト= ''
update user set host='' where user='foo';flush privileges;
- ソケットを使用して接続:OK
- 127.0.0.1から接続:OK
(MySQL 5.7:6.2.4アクセス制御、ステージ1:接続検証によると、空の文字列 ''も「任意のホスト」を意味しますが、「%」の後にソートされます。)
ケース5:ホスト= '192.168.0.1'(追加テスト)
(「192.168.0.1」は私のマシンのIPアドレスの1つです。あなたの場合は適切に変更してください)
update user set host='192.168.0.1' where user='foo';flush privileges;
- ソケットを使用して接続します:失敗
- 127.0.0.1から接続:失敗
だが
- 使用して接続
mysql -pbar -ufoo -h192.168.0.1:OK(!)
これは実際にから来るTCP接続であるため、後者192.168.0.1によって明らかにされるように、lsof:
TCP 192.168.0.1:37059->192.168.0.1:mysql (ESTABLISHED)
エッジケースA:ホスト= '0.0.0.0'
update user set host='0.0.0.0' where user='foo';flush privileges;
- ソケットを使用して接続します:失敗
- 127.0.0.1から接続:失敗
エッジケースB:ホスト= '255.255.255.255'
update user set host='255.255.255.255' where user='foo';flush privileges;
- ソケットを使用して接続します:失敗
- 127.0.0.1から接続:失敗
エッジケースC:ホスト= '127.0.0.2'
(127.0.0.2は、RFC6890で定義されている127.0.0.1と同等の完全に有効なループバックアドレスです)
update user set host='127.0.0.2' where user='foo';flush privileges;
- ソケットを使用して接続します:失敗
- 127.0.0.1から接続:失敗
興味深いことに:
mysql -pbar -ufoo -h127.0.0.2から接続し127.0.0.1、失敗します
mysql -pbar -ufoo -h127.0.0.2 --bind-address=127.0.0.2 大丈夫です
掃除
delete from user where user='foo';flush privileges;
補遺
mysql.user権限テーブルの1つであるテーブルに実際に何があるかを確認するには、次を使用します。
SELECT SUBSTR(password,1,6) as password, user, host,
Super_priv AS su,
Grant_priv as gr,
CONCAT(Select_priv, Lock_tables_priv) AS selock,
CONCAT(Insert_priv, Update_priv, Delete_priv, Create_priv, Drop_priv) AS modif,
CONCAT(References_priv, Index_priv, Alter_priv) AS ria,
CONCAT(Create_tmp_table_priv, Create_view_priv, Show_view_priv) AS views,
CONCAT(Create_routine_priv, Alter_routine_priv, Execute_priv, Event_priv, Trigger_priv) AS funcs,
CONCAT(Repl_slave_priv, Repl_client_priv) AS replic,
CONCAT(Shutdown_priv, Process_priv, File_priv, Show_db_priv, Reload_priv, Create_user_priv) AS admin
FROM user ORDER BY user, host;
これは与える:
+
| password | user | host | su | gr | selock | modif | ria | views | funcs | replic | admin |
+
| *E8D46 | foo | | N | N | NN | NNNNN | NNN | NNN | NNNNN | NN | NNNNNN |
同様にテーブルの場合mysql.db:
SELECT host,db,user,
Grant_priv as gr,
CONCAT(Select_priv, Lock_tables_priv) AS selock,
CONCAT(Insert_priv, Update_priv, Delete_priv, Create_priv, Drop_priv) AS modif,
CONCAT(References_priv, Index_priv, Alter_priv) AS ria,
CONCAT(Create_tmp_table_priv, Create_view_priv, Show_view_priv) AS views,
CONCAT(Create_routine_priv, Alter_routine_priv, Execute_priv) AS funcs
FROM db ORDER BY user, db, host;