바로 요점
다른 서비스 소프트웨어와 마찬가지로 MySQL의 사용자 관리는 서로 다른 사용자의 서로 다른 권한을 제어하고 서로 다른 사용자의 서로 다른 데이터 액세스 요구 사항을 달성하며 데이터 보안을 보장하는 데 사용됩니다.
MySQL은 이중 계층 인증 모드를 사용하여 사용자 연결 및 쿼리 요청, 즉 인증 인증 및 권한 부여 권한에 응답합니다. 특정 인증 프로세스는 다음과 같습니다.
인증 인증 : 즉, 사용자의 신원을 확인합니다. MySQL 클라이언트는 서버가 무인증 모드를 열지 않는 한 서버에 연결할 때마다 인증을 받아야합니다.
권한 : 즉, 사용자의 권한을 확인합니다. MySQL은 각 사용자의 요청에 대해 권한 확인을 수행하며 사용자의 관련 권한 확인이 성공한 경우에만 관련 작업을 수행 할 수 있습니다.
이 기사에서는 MySQL 인증에 대해 자세히 설명합니다.
MySQL 인증 식료품
- 사용자 정보보기
MySQL과 함께 제공되는 MySQL 데이터베이스의 사용자 테이블은 사용자 정보를 저장하는 데 사용됩니다. 사용자 이름 사용자, 사용자 호스트 호스트 (클라이언트 호스트), 사용자 권한, 리소스 제한 등을 포함합니다. 다음과 같이 사용자 테이블의 테이블 생성 문을 봅니다.
mysql> 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 '',
`Select_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
`Insert_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
`Update_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
`Delete_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
`Create_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
`Drop_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
`Reload_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
`Shutdown_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
`Process_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
`File_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
`Grant_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
`References_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
`Index_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
`Alter_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
`Show_db_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
`Super_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
`Create_tmp_table_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
`Lock_tables_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
`Execute_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
`Repl_slave_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
`Repl_client_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
`Create_view_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
`Show_view_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
`Create_routine_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
`Alter_routine_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
`Create_user_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
`Event_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
`Trigger_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
`Create_tablespace_priv` enum('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N',
`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,
`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',
`plugin` char(64) COLLATE utf8_bin NOT NULL DEFAULT 'mysql_native_password',
`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`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='Users and global privileges'
1 row in set (0.00 sec)
- 모든 사용자 정보보기
mysql> select user,host from mysql.user;
+------------------+-----------+
| user | host |
+------------------+-----------+
| common | % |
| root | % |
| debian-sys-maint | localhost |
| mysql.session | localhost |
| mysql.sys | localhost |
+------------------+-----------+
5 rows in set (0.00 sec)
노트:
1. 사용자 테이블의 호스트 열은 클라이언트 호스트 이름 (서버 호스트 이름이 아님)이거나 localhost (머신)이거나 %와 같은 와일드 카드이거나 IP 주소 일 수 있습니다.
2. 클라이언트와 서버가 같은 호스트이면 서버 호스트 이름을 지정하지 않고 mysql 연결을 사용할 수 있으며, 클라이언트와 서버가 같은 호스트가 아닌 경우 mysql 연결시 서버 호스트 이름 또는 IP 주소를 지정해야합니다. 다음과 같이 :
mysql -u<username> -p<password> -h<server_host>
- 사용자 계정 생성
MySQL은 CREATE USER ... IDENTIFIED BY 문을 사용하여 다음과 같이 관련 계정 정보를 생성합니다.
MySQL [192.168.124.12] SQL> create user 'common'@'%' identified by 'common';
Query OK, 0 rows affected (0.0523 sec)
노트:
- 계정 이름은 두 부분으로 구성됩니다. 사용자 이름과 사용자 호스트는 작은 따옴표로 묶여 있습니다 .
- MySQL 8.0.4부터 사용자 생성시 기본 비밀번호 인증 플러그인이 이전 mysql_native_password에서 caching_sha2_password로 변경되었으므로 위와 같이 원래 비밀번호 인증을 사용해야하는 경우 다음과 같이 생성 문을 수정해야합니다.
create USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '新密码';
- 호스트 이름 패턴
MySQL은 호스트 이름 (예 : localhost), 정규화 된 호스트 이름 (예 : localhost.example.com), IP 주소 / 마스크, 와일드 카드 문자 ( '%', '_') 등 다양한 호스트 이름 형식을 지원합니다. 와일드 카드 문자 '%'는 임의의 길이의 문자열과 일치하고, 와일드 카드 character'_은 '하나의 문자와 일치 ;
또한 익명 MySQL 사용자는 다음과 같이 생성 할 수 있습니다.
mysql> CREATE USER ''@'localhost';
참고 : 버전 5.7.24-0ubuntu0.16.04.1-log 에서 익명 사용자를 만든 후에 는 유명 사용자를 사용할 수 없습니다. 구체적인 이유는 알려져 있지 않습니다.
- 사용자 비밀번호 설정 / 수정
공식적인 권장 사항은 다음과 같이 alter user XXX 문을 사용하여 사용자 암호를 변경하는 것입니다.
alter user 'root'@'localhost' IDENTIFIED BY 'root';
암호를 잊어 버려서 skip-grant-tables 옵션을 사용하여 mysqld 데몬을 시작하는 경우 다음과 같이이 명령을 직접 실행할 때 오류가 발생할 수 있습니다.
먼저 권한을 플러시하고 권한 시스템 관련 테이블을 새로 고쳐야합니다.
- 강제로 암호 만료
DBA는 다음과 같은 상황에서 응용 프로그램 사용자 암호를 강제로 만료시킬 수 있습니다.
ALTER USER 'common'@'%' PASSWORD EXPIRE;
만료 후에도 사용자는 mysql에 계속 로그인 할 수 있지만 다음과 같은 작업을 수행 할 수 없습니다.
- 다른
또한 MySQL 은 Linux 시스템의 PAM (Pluggable Authentication Modules) 인증 과 같은 인증 및 권한 부여를위한 다른 플러그인 모듈을 지원 합니다 .이 인증 모드에서 MySQL 자체는 사용자 비밀번호 정보를 저장하지 않지만 OS 인증 메커니즘을 사용하여 인증합니다. 암호 . 동시에 클라이언트는 mysql_clear_password를 사용하여 다음과 같은 일반 텍스트로 사용자 암호를 보냅니다.
jwlLinux jwllinux # cat /etc/mysql/conf.d/mysql.cnf
[client]
enable-cleartext-plugin
# add by zavier 20190720
user=root
password=root
show-warnings
요약하자면
MySQL의 모든 사용자 인증 / 권한은 mysql.user 테이블에 기록되며, 사용자 인증 방법 및 권한의 합리적인 구성은 DBA의 주요 책임 중 하나입니다. 합리적 사용자 인증 / 승인을 통해 애플리케이션 사용자의 의도하지 않은 방해 행위와 악의적 인 사용자의 불법 방해 행위를 방지 할 수 있습니다.