MySQL 권한 제어 세부 분석

13059 단어 MySQL권한컨트롤
오늘 일요일,아침 에 잠시 게 으 름 을 피 웠 습 니 다.늦게 일 어 났 습 니 다.점심 에 할 일이 없어 서 MySQL 에 있 는 권한 제어 모듈 을 다시 보 았 습 니 다.다시 돌 이 켜 보면 수확 의 세부 사항 이 많 습 니 다.여기에 기록 하여 나중에 보기 편 합 니 다.
    권한 부분 에 관 한 내용 은 지난 3 월 11 일 에 쓴 글 중 일부 가 있 습 니 다.오늘 의 내용 은 저 희 는 하나의 세부 지식 포 인 트 를 사용 하여 작성 합 니 다(본 고 에서 사용 한 MySQL 버 전 은 5.7.16).이런 지식 포 인 트 를 쓰기 전에 MySQL 의 권한 으로 입 도 를 제어 한 다음 에 MySQL 에서 클 라 이언 트 가 요청 할 때 알 아 보 겠 습 니 다.서버 에서 하 는 확인 작업 은 먼저 권한 제어 입 도 를 보십시오.
1.전역 등급
    전역 권한 은 주어진 서버 에 있 는 모든 데이터 베 이 스 를 사용 합 니 다.이 권한 은 my sql.user 표 에 저 장 됩 니 다.grant all on**방법 과 revoke all on**방법 으로 권한 을 부여 하거나 회수 합 니 다.
2.데이터베이스 등급
    데이터베이스 권한 은 주어진 데이터베이스 에 있 는 모든 목표 에 적용 되 며,표 대상 과 저장 과정 을 포함 합 니 다.이 권한 은 my sql.db 표 에 저장 되 어 있 으 며,grant all on db 를 사용 합 니 다.name.*또는 대응 하 는 revoke 방법 은 데이터베이스 권한 을 부여 하고 회수 할 수 있 습 니 다.
3.표층 급
   표 권한 은 주어진 표 의 모든 열 에 적 용 됩 니 다.이 권한 은 my sql 의 tables 에 저 장 됩 니 다.priv 표 에 서 는 일반적으로 grant all on db 를 사용 합 니 다.name.tbl_name 과 대응 하 는 revoke 문 구 는 권한 을 부여 하거나 취소 합 니 다.
4.열 등급 의 권한
    열 등급 의 권한 은 주어진 표 의 지정 열 에 적 용 됩 니 다.이 권한 은 my sql.columns 에 저 장 됩 니 다.priv 표 에서 이 권한 이 자주 사용 되 지 않 기 때문에 권한 수여 방법 에 대한 예 시 를 보 여 줍 니 다.다음 과 같 습 니 다.
우선 사용 자 를 만 듭 니 다.yeyztest.test 1 이 표 의 select 권한 을 가지 고 있 습 니 다.

mysql:mysql 19:35:38>>show grants for dba_yeyz@'192.168.18.%' ;
+------------------------------------------------------------------------------+
| Grants for [email protected].%                       |
+------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'dba_yeyz'@'192.168.18.%'               |
| GRANT SELECT ON `yeyztest`.`test1` TO 'dba_yeyz'@'192.168.18.%'        |
+------------------------------------------------------------------------------+
2 rows in set (0.00 sec)
그 다음 에 우리 가 test 1 의 한 필드 id 를 더 해서 update 작업 을 했 는데 결 과 는 다음 과 같 습 니 다.

mysql> select * from test1;
+---------------+
| id      |
+---------------+
|      22 |
| 3333333333333 |
+---------------+
2 rows in set (0.00 sec)

mysql> update test1 set id=2 where id=22;
ERROR 1142 (42000): UPDATE command denied to user 'dba_yeyz'@'192.168.18.**' for table 'test1'
물론,우 리 는 update 를 진행 할 수 없습니다.이때,우 리 는 루트 계 정 을 사용 하여 이 dba 에 게yeyz 의 계 정 은 id 열 권한 을 가 진 다음 결 과 를 봅 니 다.

mysql:mysql 19:38:38>>show grants for dba_yeyz@'192.168.18.%' ;
+------------------------------------------------------------------------------+
| Grants for [email protected].%                       |
+------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'dba_yeyz'@'192.168.18.%'               |
| GRANT SELECT ON `yeyztest`.`test1` TO 'dba_yeyz'@'192.168.18.%'       |
| GRANT SELECT, UPDATE (id) ON `yeyztest`.`test1` TO 'dba_yeyz'@'192.168.18.%' |
+------------------------------------------------------------------------------+
3 rows in set (0.00 sec)
필드 에 권한 을 추가 하 는 문 구 를 주의해 야 합 니 다.즉,:
grant  update (id) on yeyztest.test1 to XXXXXX
권한 뒤에 필드 의 이름 을 따 르 는 것 이다.
이 럴 때 columnspriv 의 시 계 를 볼 수 있 습 니 다.기록 은:

mysql:mysql 19:39:46>>select * from columns_priv;
+--------------+----------+----------+------------+-------------+---------------------+-------------+
| Host     | Db    | User   | Table_name | Column_name | Timestamp      | Column_priv |
+--------------+----------+----------+------------+-------------+---------------------+-------------+
| 192.168.18.% | yeyztest | dba_yeyz | test1   | id     | 0000-00-00 00:00:00 | Update   |
+--------------+----------+----------+------------+-------------+---------------------+-------------+
1 row in set (0.00 sec)
다시 dbayeyz 에서 update 작업 을 하면 결 과 를 볼 수 있 습 니 다.

mysql> update test1 set id=2 where id=22;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0

mysql> select *from test1;
+---------------+
| id      |
+---------------+
|       2 |
| 3333333333333 |
+---------------+
2 rows in set (0.00 sec)
   id=22 의 열 을 id=2 로 성공 적 으로 바 꾸 었 습 니 다.
5.서브루틴 등급
    create routine,alter routine,execute,grant 권한 은 저 장 된 서브루틴 에 적 용 됩 니 다.이 권한 은 전역 등급 과 데이터 베이스 등급 으로 부여 되 며 my sql.procs 에 저장 할 수 있 습 니 다.priv 중.
클 라 이언 트 가 요청 을 할 때 MySQL 서버 가 요청 을 확인 할 때의 프로 세 스 그림 은 다음 과 같 습 니 다.

  나 는 오늘 본 세부 적 인 지식 을 하나하나 나열 하여 여러분 에 게 도움 이 되 기 를 바 랍 니 다.
1.MySQL 5.7.16 버 전에 서 my sql 시스템 라 이브 러 리 에 host 표 가 없습니다.권한 제어 와 관련 된 표 는 5 개 에 불과 합 니 다.각각 user,db,table 입 니 다.priv、proc_priv、column_priv。
2.my sql.user 표 의 메 인 키 는 user 와 host 를 결합 하여 구성 되 었 으 며 표 구 조 를 참조 하 십시오.

[email protected]:mysql 19:44:56>>show create table mysql.user\G
*************************** 1. row ***************************
    Table: user
Create Table: CREATE TABLE `user` (
 `Host` char(60) COLLATE utf8_bin NOT NULL DEFAULT '',
 `User` char(32) COLLATE utf8_bin NOT NULL DEFAULT '',
---------------    (29 )--------------
 `Select_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
 ......    

---------------    (4 )---------------
 `ssl_type` enum('','ANY','X509','SPECIFIED') CHARACTER SET utf8 NOT NULL DEFAULT '',
 `ssl_cipher` blob NOT NULL,
 `x509_issuer` blob NOT NULL,
 `x509_subject` blob NOT NULL,
---------------      (4 )--------------
 `max_questions` int(11) unsigned NOT NULL DEFAULT '0',
 `max_updates` int(11) unsigned NOT NULL DEFAULT '0',
 `max_connections` int(11) unsigned NOT NULL DEFAULT '0',
 `max_user_connections` int(11) unsigned NOT NULL DEFAULT '0',
--------------    (1 )---------------
 `plugin` char(64) COLLATE utf8_bin NOT NULL DEFAULT 'mysql_native_password',
--------------    (5 )--------------
 `authentication_string` text COLLATE utf8_bin,
 `password_expired` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
 `password_last_changed` timestamp NULL DEFAULT NULL,
 `password_lifetime` smallint(5) unsigned DEFAULT NULL,
 `account_locked` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
 PRIMARY KEY (`Host`,`User`) -------------    ,host  -----------
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='Users and global privileges'
1 row in set (0.00 sec)
3、tables_priv 표 에는 다음 과 같은 권한 만 있 습 니 다.즉,표 에 대한 권한 입 니 다.
select、insert、update、delete、drop、create、alter、grant、references、index、create view、show view、trigger;
columns_priv 표 의 권한 은 다음 네 가지 밖 에 없습니다:select,insert,update,references
4.한 사용자 의 비밀 번 호 를 수정 할 때 보통 다음 과 같은 몇 가지 방법 이 있 습 니 다.

set password for user@host = password('newpassword');
update mysql.user set authentication_string=password('pwd') where user='username' and host='hostname';
alter user user@host identified by 'newpassword';
mysqladmin -u username -h hostname -p password "new password";
   가장 좋 은 방법 은 alter user 의 방법 입 니 다.사실은 새로운 버 전 8.0 에서 set password 의 방법 은 이미 사용 할 수 없 기 때문에 alter user 의 방법 으로 새로운 비밀 번 호 를 설정 하 는 것 을 권장 합 니 다.
   그 밖 에 자주 사용 되 지 않 는 방법 도 있 습 니 다.grant 방법 으로 이전의 비밀 번 호 를 덮어 쓰 는 것 입 니 다.여기 서 우 리 는 간단 한 실험 을 통 해 효 과 를 보 겠 습 니 다.

mysql:mysql 20:01:05>>GRANT SELECT ON `yeyztest`.`test` TO 'dba_yeyz'@'192.168.18.%' identified by '111111';
Query OK, 0 rows affected, 1 warning (0.00 sec)
mysql:mysql 20:01:29>>select user,host,concat(user,'@','\'',host,'\''),authentication_string from mysql.user;
+------------------+----------------+-----------------------------------+-------------------------------------------+
| user       | host      | concat(user,'@','\'',host,'\'')  | authentication_string           |
+------------------+----------------+-----------------------------------+-------------------------------------------+
| dba_yeyz     | 192.168.18.%  | dba_yeyz@'192.168.18.%'      | *FD571203974BA9AFE270FE62151AE967ECA5E0AA |
+------------------+----------------+-----------------------------------+-------------------------------------------+
11 rows in set (0.00 sec)

mysql:mysql 20:01:31>>GRANT SELECT ON `yeyztest`.`test` TO 'dba_yeyz'@'192.168.18.%' identified by '123456';
Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql:mysql 20:01:57>>select user,host,concat(user,'@','\'',host,'\''),authentication_string from mysql.user;
+------------------+----------------+-----------------------------------+-------------------------------------------+
| user       | host      | concat(user,'@','\'',host,'\'')  | authentication_string           |
+------------------+----------------+-----------------------------------+-------------------------------------------+
| dba_yeyz     | 192.168.18.%  | dba_yeyz@'192.168.18.%'      | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 |
+------------------+----------------+-----------------------------------+-------------------------------------------+
1 rows in set (0.00 sec)
   위의 테스트 를 통 해 알 수 있 듯 이 우리 가 grant 방법 을 사용 하여 지정 한 사용자 에 게 비밀 번 호 를 다시 설정 할 때 이전의 오래된 비밀 번 호 는 덮어 쓰기 때문에 이 조작 은 온라인 에서 신중하게 사용 해 야 합 니 다.grant 할 때마다 이미 존재 하 는 계 정 이 있 는 지 확인 하고 없 는 지 확인 한 후에 grant 작업 을 해 야 합 니 다.
5.만약 에 우리 가 실수 로 my sql 의 루트 비밀 번 호 를 잊 어 버 리 면 my sql 서 비 스 를 다시 시작 할 수 있 습 니 다.게다가-skip-grant-tables 라 는 매개 변 수 를 사용 하여 my sql 서 비 스 를 시작 하면 권한 표 에서 일치 하 는 작업 을 면제 하고 my sql 서비스 에 직접 로그 인하 여 루트 계 정의 비밀 번 호 를 수정 할 수 있 습 니 다.
6.update 나 insert 를 사용 하여 my sql.user 표 에 기록 하 는 방법 으로 계 정 을 만 들 거나 비밀 번 호 를 수정 할 경우 문 구 를 실행 한 후에 flush privileges 의 작업 으로 권한 표를 새로 고침 해 야 합 니 다.그렇지 않 으 면 이 작업 은 효 과 를 낼 수 없습니다.
7.my sqladmin 도구 의 실행 에 영향 을 줄 수 있 는 몇 가지 권한 이 있 습 니 다.
reload 권한:flush 작업 에 영향 을 줍 니 다.
shutdown 권한:shutdown 작업 에 영향 을 줍 니 다.
process 권한:processlist 작업 에 영향 을 줍 니 다.
슈퍼 권한:kill 작업 에 영향
8.이전에 mysql.user 표 의 자원 제어 필드 를 언급 했 는데 각각
max_questions 시간 당 최대 요청 수,maxupdates 시간 당 최대 업데이트 수,maxconnections 시간 당 최대 연결 수,maxuser_connections 단일 사용자 가 동시에 만 들 수 있 는 최대 연결 수 입 니 다.
사용자 에 게 이 인 자 를 설정 하려 면 다음 SQL 을 사용 하여 설정 할 수 있 습 니 다.

mysql:mysql 20:01:58>>GRANT SELECT ON `yeyztest`.`test` TO 'dba_yeyz'@'192.168.18.%' with max_queries_per_hour 1000;
Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql:mysql 20:13:13>>select user,host,max_questions from mysql.user where user='dba_yeyz';  
+----------+--------------+---------------+
| user   | host     | max_questions |
+----------+--------------+---------------+
| dba_yeyz | 192.168.18.% |     1000 |
+----------+--------------+---------------+
1 row in set (0.00 sec)
여기 있 는 grant 구문 에 with 라 는 옵션 을 사 용 했 습 니 다.with 뒤에 따라 갈 수 있 는 옵션 은 5 개 입 니 다.각각:
grant option:권한 을 수 여 받 은 사용 자 는 이 권한 을 다른 사용자 에 게 부여 할 수 있 습 니 다.
max_queries_per_hour count:시간 당 count 회 조 회 를 실행 할 수 있 습 니 다.
max_updates_per_hour count:시간 당 count 회 업 데 이 트 를 실행 할 수 있 습 니 다.
max_connections_per_hour count:시간 당 count 연결 을 만 들 수 있 습 니 다.
max_user_connections count:한 사용 자 를 설정 하면 count 연결 을 동시에 만 들 수 있 습 니 다.
9.전역 변수 설정:
SET GLOBAL default_password_lifetime = 180;
SET GLOBAL default_password_lifetime = 0;
비밀 번 호 를 설정 할 수 있 는 수명 주 기 는 6 개 월 이 고 6 개 월 후에 효력 을 잃 으 며 0 으로 설정 하면 계속 유효 합 니 다.
물론 사용 자 를 만 들 때 암호 의 수정 주 기 를 지정 하거나 암호 의 수정 주 기 를 사용 하지 않 을 수도 있 습 니 다.

CREATE USER 'jeffrey'@'localhost' PASSWORD EXPIRE INTERVAL 90 DAY;
ALTER USER 'jeffrey'@'localhost' PASSWORD EXPIRE INTERVAL 90 DAY;

CREATE USER 'jeffrey'@'localhost' PASSWORD EXPIRE NEVER;
ALTER USER 'jeffrey'@'localhost' PASSWORD EXPIRE NEVER;
10.가끔 우 리 는 계 정 비밀 번 호 를 삭제 한 것 같 지만 계 정 비밀 번 호 를 통 해 방문 할 수 있 습 니 다.이때 설정 을 확인 해 야 합 니 다.바로 user 표 에 빈 기록 이 있 는 지 확인 하 는 것 입 니 다.
select user,host from mysql.user where user='';
모든 사용자 가 직접 로그 인 할 수 있 도록 user 를 빈 기록 으로 설정 한 것 일 가능성 이 높다.있다 면 안전 의 취지 에 어 긋 나 기 때문에 직접 처리 하 는 것 이 좋다.
이상 은 MySQL 권한 제어 세부 분석의 상세 한 내용 입 니 다.MySQL 권한 제어 에 관 한 자 료 는 다른 관련 글 을 주목 하 십시오!

좋은 웹페이지 즐겨찾기