MySQL 시리즈 : 11 사용자 관리 1 인증

바로 요점

         다른 서비스 소프트웨어와 마찬가지로 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)

노트:

  1. 계정 이름은 두 부분으로 구성됩니다. 사용자 이름과 사용자 호스트는 작은 따옴표로 묶여 있습니다 .
  2. 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의 주요 책임 중 하나입니다. 합리적 사용자 인증 / 승인을 통해 애플리케이션 사용자의 의도하지 않은 방해 행위와 악의적 인 사용자의 불법 방해 행위를 방지 할 수 있습니다.

추천

출처blog.csdn.net/zhaogang1993/article/details/100049964