그냥 테스트 해 봅시다.
수퍼 유저로 연결 한 다음 :
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 도메인 소켓에 연결하려면 (즉, 파일 시스템 항목에 의해 이름이 지정된 I / O 파이프 /var/run/mysqld/mysqld.sock
) 명령 줄에서이를 실행합니다 ( --protocol
옵션을 사용하여 이중 확인).
mysql -pbar -ufoo
mysql -pbar -ufoo
위의 내용은 "user comes from localhost"와 일치하지만 확실히 "user comes from 127.0.0.1"과는 일치하지 않을 것으로 예상합니다.
대신 "127.0.0.1"에서 서버에 연결하려면 명령 줄에서 실행하십시오.
mysql -pbar -ufoo
를 생략 --protocol=TCP
하면 mysql
명령은 여전히 Unix 도메인 소켓을 사용하려고 시도합니다. 다음과 같이 말할 수도 있습니다.
mysql -pbar -ufoo
한 줄에 두 번의 연결 시도 :
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;
- 소켓을 사용하여 연결 : FAILURE
- 127.0.0.1에서 연결 : 실패
사례 1 : 호스트 = '%'
update user set host='%' where user='foo'; flush privileges;
- 소켓을 사용하여 연결 : 확인
- 127.0.0.1에서 연결 : 확인
사례 2 : 호스트 = 'localhost'
update user set host='localhost' where user='foo';flush privileges;
동작은 다양 하며 이는 분명히에 따라 다릅니다 skip-name-resolve
. 설정된 경우 localhost
로그에 따라가있는 행 이 무시됩니다. 다음은 오류 로그에서 볼 수 있습니다. "--skip-name-resolve 모드에서 무시 된 ''user '항목'root @ localhost '." . 이것은 Unix 도메인 소켓을 통한 연결이 없음을 의미합니다. 그러나 이것은 경험적으로 사실이 아닙니다. localhost
이제는 Unix 도메인 소켓 만 의미하며 더 이상 127.0.0.1과 일치하지 않습니다.
skip-name-resolve
꺼짐 :
- 소켓을 사용하여 연결 : 확인
- 127.0.0.1에서 연결 : 확인
skip-name-resolve
켜짐 :
- 소켓을 사용하여 연결 : 확인
- 127.0.0.1에서 연결 : 실패
사례 3 : 호스트 = '127.0.0.1'
update user set host='127.0.0.1' where user='foo';flush privileges;
- 소켓을 사용하여 연결 : FAILURE
- 127.0.0.1에서 연결 : 확인
사례 4 : 호스트 = ''
update user set host='' where user='foo';flush privileges;
- 소켓을 사용하여 연결 : 확인
- 127.0.0.1에서 연결 : 확인
( MySQL 5.7 : 6.2.4 액세스 제어, 1 단계 : 연결 확인 에 따르면 빈 문자열 ''은 "모든 호스트"를 의미하지만 '%'뒤에 정렬됩니다. )
사례 5 : 호스트 = '192.168.0.1'(추가 테스트)
( '192.168.0.1'은 내 컴퓨터의 IP 주소 중 하나입니다. 귀하의 경우 적절하게 변경하십시오)
update user set host='192.168.0.1' where user='foo';flush privileges;
- 소켓을 사용하여 연결 : FAILURE
- 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)
Edge Case A : 호스트 = '0.0.0.0'
update user set host='0.0.0.0' where user='foo';flush privileges;
- 소켓을 사용하여 연결 : FAILURE
- 127.0.0.1에서 연결 : 실패
Edge Case B : 호스트 = '255.255.255.255'
update user set host='255.255.255.255' where user='foo';flush privileges;
- 소켓을 사용하여 연결 : FAILURE
- 127.0.0.1에서 연결 : 실패
Edge Case 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;
- 소켓을 사용하여 연결 : FAILURE
- 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
권한 테이블 중 하나 인 테이블에 실제로 무엇이 있는지 보려면 다음을 사용하십시오.
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;