6.2.2 권한 시스템 부여 테이블
일반적으로 계정을 설정하고 각 계정에서 사용 가능한 권한을 제어하기 위해서는 GRANT
와 REVOKE
같은 명령문을 사용하여 mysql
데이터베이스의 부여 테이블의 내용을 간접적으로 조작합니다. 섹션 13.7.1 "계정 관리 명령문" 을 참조하십시오. 여기에서 부여 테이블의 기본 구조와 서버가 클라이언트와 상호 작용할 때 부여 테이블의 내용을 어떻게 사용하는지 설명합니다.
다음 mysql
데이터베이스 테이블에 부여 정보가 포함되어 있습니다.
user
: 사용자 계정, 글로벌 권한 및 권한 이외의 다른 컬럼이 포함되어 있습니다.db
: 데이터베이스 수준의 권한이 포함되어 있습니다.host
: 사용되지 않습니다. MySQL 5.6.7 이후의 새로운 MySQL 설치에서는이 테이블이 작성되지 않습니다했습니다.tables_priv
: 테이블 레벨의 권한이 포함되어 있습니다.columns_priv
: 컬럼 레벨의 권한이 포함되어 있습니다.procs_priv
: 저장 프로 시저 및 저장 기능의 권한이 포함되어 있습니다.proxies_priv
: 프록시 사용자 권한이 포함되어 있습니다.
mysql
데이터베이스의 다른 테이블에 부여 정보가 유지되지 않고, 다른 곳에서 설명되어 있습니다.
event
: 이벤트 스케줄러에 대한 정보가 포함되어 있습니다. 섹션 20.4 "이벤트 스케줄러 사용" 을 참조하십시오.func
: 사용자 정의 함수에 대한 정보가 포함되어 있습니다. 섹션 24.3 "MySQL에 새로운 기능 추가" 를 참조하십시오.help_
:이 테이블은 서버 측의 도움말에 사용됩니다. 섹션 5.1.10 "서버 측의 도움말" 을 참조하십시오.xxx
plugin
: 서버 플러그인에 대한 정보가 포함되어 있습니다. 섹션 5.1.8.1 "플러그인 설치 및 제거" 및 섹션 24.2 "MySQL 플러그인 API" 를 참조하십시오.proc
: 저장 프로 시저 및 저장 기능에 대한 정보가 포함되어 있습니다. 섹션 20.2 "스토어드 루틴 (프로 시저 및 함수) 사용" 을 참조하십시오.servers
:FEDERATED
스토리지 엔진에 의해 사용됩니다. 섹션 15.8.2.2 "CREATE SERVER를 사용한 FEDERATED 테이블 만들기" 를 참조하십시오.time_zone_
:이 테이블에는 표준 시간대 정보가 포함되어 있습니다. 섹션 10.6 "MySQL Server에서 시간대 지원" 을 참조하십시오.xxx
이름
_log
를 가진 테이블은 로깅에 사용됩니다. 섹션 5.2 "MySQL Server 로그" 를 참조하십시오.
mysql
데이터베이스 테이블의 변경은 CREATE USER
, GRANT
, CREATE PROCEDURE
등의 문의 응답으로 서버에 의해 완료됩니다. INSERT
, UPDATE
, DELETE
등의 문을 사용하여 이러한 테이블을 직접 수정하는 것은 권장되지 않습니다. 이러한 변화의 결과로 잘못된 형식이 행을 서버가 임의로 무시합니다.
각 부여 테이블 범위 컬럼과 권한 컬럼이 있습니다.
범위 컬럼은 테이블의 각 행 (항목)의 범위, 즉 행이 적용되는 컨텍스트를 결정합니다. 예를 들어,
Host
와User
값이'thomas.loc.gov'
와'bob'
인user
테이블 행은bob
이라는 사용자 이름을 지정하는 클라이언트가 호스트thomas.loc.gov
에서 서버로 실행하는 인증 연결 을 위해 사용됩니다. 마찬가지로,Host
,User
, 그리고Db
컬럼 값이'thomas.loc.gov'
,'bob'
및'reports'
인db
테이블 행은bob
가thomas.loc.gov
호스트로부터reports
데이터베이스에 연결할 때 에 사용됩니다.tables_priv
테이블 및columns_priv
테이블은 각 행에 적용되는 테이블 또는 테이블과 컬럼의 조합을 나타내는 범위 열 수 있습니다.procs_priv
범위 컬럼은 각 행에 적용되는 스토어드 루틴을 보여줍니다.권한 컬럼은 테이블 행에 의해 부여 된 권한, 즉 수행 할 수있는 작업을 지정합니다. 서버는 다양한 부여 테이블의 정보를 조합하여 사용자 권한의 완전한 설명을 구성합니다. 이 실행에 사용되는 규칙의 설명은 섹션 6.2.5 "액세스 제어, 2 단계 : 요청 확인" 에 있습니다.
서버는 다음의 방법으로 부여 테이블을 사용합니다.
user
테이블의 범위 컬럼은 입 접속을 거부 또는 허용 여부를 결정합니다. 허용되는 연결에 대해user
테이블에서 부여 된 모든 권한은 사용자의 전역 권한을 나타냅니다. 이 테이블에서 부여 된 모든 권한은 서버의 모든 데이터베이스에 적용됩니다.참고모든 글로벌 권한은 모든 데이터베이스에 대한 권한으로 간주되기 때문에 모든 글로벌 권한을 가진 사용자는
SHOW DATABASES
를 사용하거나 또는INFORMATION_SCHEMA
의SCHEMATA
테이블을 검사하는 것으로, 모든 데이터베이스 이름을 표시 할 수 있도록 합니다.db
테이블 범위 컬럼은 어떤 사용자가 어떤 호스트에서 어떤 데이터베이스에 액세스 할 수 있는지를 결정합니다. 권한 컬럼은 허용 된 작업을 결정합니다. 데이터베이스 수준에서 부여 된 권한은 데이터베이스의 다른 테이블과 저장 프로그램 등의 데이터베이스의 모든 개체에 적용됩니다.tables_priv
와columns_priv
테이블은db
테이블과 비슷하지만, 이들은 또한 입도가 미세하고 데이터베이스 레벨이 아닌 테이블 레벨 및 컬럼 레벨로 적용됩니다. 테이블 수준에서 부여되는 권한은 테이블 및 모든 컬럼에 적용됩니다. 컬럼 수준에서 부여 된 권한은 특정 컬럼에만 적용됩니다.procs_priv
테이블은 스토어드 루틴에 적용됩니다. 루틴 레벨에서 부여 된 권한은 단일 루틴에만 적용됩니다.proxies_priv
테이블은 다른 사용자의 프록시 역할을 할 수있는 사용자가 누구인지, 그리고 프록시 사용자가PROXY
권한을 다른 사용자에게 부여 할 수 있는지 여부를 지정합니다.
서버는 mysql
데이터베이스의 user
와 db
테이블을 액세스 제어의 1 단계와 2 단계 모두에서 사용합니다 ( 섹션 6.2 "MySQL 권한 시스템" 을 참조하십시오). user
와 db
테이블의 컬럼을 여기에 나타냅니다.
표 6.3 user 테이블과 db 테이블의 컬럼
테이블 이름 | user | db |
---|---|---|
범위 컬럼 | Host | Host |
User | Db | |
Password | User | |
권한 컬럼 | Select_priv | Select_priv |
Insert_priv | Insert_priv | |
Update_priv | Update_priv | |
Delete_priv | Delete_priv | |
Index_priv | Index_priv | |
Alter_priv | Alter_priv | |
Create_priv | Create_priv | |
Drop_priv | Drop_priv | |
Grant_priv | Grant_priv | |
Create_view_priv | Create_view_priv | |
Show_view_priv | Show_view_priv | |
Create_routine_priv | Create_routine_priv | |
Alter_routine_priv | Alter_routine_priv | |
Execute_priv | Execute_priv | |
Trigger_priv | Trigger_priv | |
Event_priv | Event_priv | |
Create_tmp_table_priv | Create_tmp_table_priv | |
Lock_tables_priv | Lock_tables_priv | |
References_priv | References_priv | |
Reload_priv | ||
Shutdown_priv | ||
Process_priv | ||
File_priv | ||
Show_db_priv | ||
Super_priv | ||
Repl_slave_priv | ||
Repl_client_priv | ||
Create_user_priv | ||
Create_tablespace_priv | ||
보안 칼럼 | ssl_type | |
ssl_cipher | ||
x509_issuer | ||
x509_subject | ||
plugin | ||
authentication_string | ||
password_expired | ||
자원 제어 컬럼 | max_questions | |
max_updates | ||
max_connections | ||
max_user_connections |
mysql.user
테이블의 plugin
및 authentication_string
컬럼은 인증 플러그인 정보를 저장합니다.
계정 행의 plugin
컬럼이 비어있는 경우, 서버는 Password
컬럼 암호 해시 형식에 따라 mysql_native_password
또는 mysql_old_password
플러그인을 암시 적으로 사용하여 계정을 인증합니다. Password
값이 비어 있거나 4.1 암호 해시 (41 자) 인 경우, 서버는 mysql_native_password
을 사용합니다. 암호 값이 4.1 이전 암호 해시 (16 문자)의 경우, 서버는 mysql_old_password
을 사용합니다. (이 해시 형식에 대한 추가 정보는 섹션 6.1.2.4 "MySQL에서 암호 해시" 를 참조하십시오.) 클라이언트는 계정 행의 Password
컬럼의 암호와 일치해야합니다.
계정 행에서 plugin
컬럼에 플러그인이 지정된 경우 서버는 이것을 사용하여 계정에 대한 연결 시도를 인증합니다. 플러그인 Password
컬럼의 값을 사용할지 여부는 플러그인에 따라 다릅니다.
password_expired
컬럼은 DBA가 계정 암호를 만료하고 사용자에게 암호를 재설정하도록 요청할 수 있도록하기 위해 MySQL 5.6.6에서 추가되었습니다. 기본 password_expired
값은 'N'
입니다 만, ALTER USER
문을 사용하여 'Y'
로 설정 할 수 있습니다. 계정의 암호가 만료 된 후 서버로부터 연결에서 해당 계정에 의해 실행되는 모든 작업은 사용자가 SET PASSWORD
문을 발행하여 새 계정 암호를 설정할 때까지 오류가 발생 합니다. 섹션 13.7.1.1 "ALTER USER 구문" 을 참조하십시오.
암호 만료 후 SET PASSWORD
를 사용하여 암호를 현재 값으로 설정하여 암호를 '리셋'할 수 있습니다. 적절한 정책으로 다른 암호를 선택하는 것이 좋습니다.
MySQL 5.6.6에서 ALTER USER
는 Password
컬럼을 빈 문자열로 설정하기 때문에이 문은 5.6.7까지 사용하지 마십시오.
액세스 제어의 2 단계에서 서버는 요청 유효성 검사를 수행하여 클라이언트가 발행 한 각 요청에 대한 각각의 클라이언트가 충분한 권한이 있는지 확인합니다. user
와 db
부여 테이블 이외에 테이블에 대한 요청의 경우, 서버는 tables_priv
와 columns_priv
테이블을 참조 할 수 있습니다. 후자의 테이블은 테이블 레벨 및 컬럼 레벨에서의 세세한 권한 제어를 제공합니다. 여기에는 다음 표의 열 수 있습니다.
표 6.4 tables_priv 테이블 및 columns_priv 테이블의 컬럼
테이블 이름 | tables_priv | columns_priv |
---|---|---|
범위 컬럼 | Host | Host |
Db | Db | |
User | User | |
Table_name | Table_name | |
Column_name | ||
권한 컬럼 | Table_priv | Column_priv |
Column_priv | ||
다른 컬럼 | Timestamp | Timestamp |
Grantor |
Timestamp
컬럼 및 Grantor
컬럼은 각각 현재의 타임 스탬프 및 CURRENT_USER
값으로 설정됩니다. 그러나 이들은 미사용 때문에 여기에서는 더 이상 설명하지 않습니다.
스토어드 루틴에 대한 요청을 확인하기 위해 서버가 procs_priv
테이블을 참조 할 수 있으며,이 테이블은 다음 표에 나열된 열 수 있습니다.
표 6.5 procs_priv 테이블의 컬럼
테이블 이름 | procs_priv |
---|---|
범위 컬럼 | Host |
Db | |
User | |
Routine_name | |
Routine_type | |
권한 컬럼 | Proc_priv |
다른 컬럼 | Timestamp |
Grantor |
Routine_type
컬럼은 'FUNCTION'
또는 'PROCEDURE'
값을 가지는 ENUM
컬럼이며, 그 행이 나타내는 루틴의 유형을 말합니다. 이 컬럼을 통해 동일한 이름을 가진 함수와 프로 시저에 별도로 권한을 부여 할 수 있습니다.
Timestamp
컬럼과 Grantor
컬럼은 현재 사용하지 않는 때문에 여기에서는 더 이상 설명하지 않습니다.
proxies_priv
테이블은 프록시 사용자에 대한 정보를 기록합니다. 여기에는 다음과 같은 열이 있습니다.
Host
,User
:이 컬럼은 프록시 설정되는 계정에PROXY
권한이있는 사용자 계정을 나타냅니다.Proxied_host
,Proxied_user
:이 컬럼은 프록시 설정되는 사용자 계정을 나타냅니다.Grantor
: 현재 사용되지 않습니다.Timestamp
: 현재 사용되지 않습니다.With_grant
:이 컬럼은 프록시 계정이PROXY
권한을 다른 계정에 부여 할 수 있는지 여부를 나타냅니다.
부여 테이블의 범위 컬럼에 문자열이 포함되어 있습니다. 이들은 다음과 같이 선언 된 각각의 기본값은 빈 문자열입니다.
표 6.6 부여 테이블의 범위 컬럼의 형태
컬럼 이름 | 유형 |
---|---|
Host , Proxied_host | CHAR(60) |
User , Proxied_user | CHAR(16) |
Password | CHAR(41) |
Db | CHAR(64) |
Table_name | CHAR(64) |
Column_name | CHAR(64) |
Routine_name | CHAR(64) |
액세스 확인을 위해, User
, Proxied_user
, Password
, Db
, 및 Table_name
값의 비교는 대소 문자를 구분합니다. Host
, Proxied_host
, Column_name
및 Routine_name
값의 비교는 대소 문자를 구분하지 않습니다.
user
와 db
테이블에서는 각 권한은 ENUM('N','Y') DEFAULT 'N'
으로 선언되는 별도의 컬럼에 나열됩니다. 즉, 각 권한은 비활성화 또는 활성화 할 수 있으며, 기본값은 무효입니다.
tables_priv
, columns_priv
및 procs_priv
테이블에서는 권한 컬럼은 SET
컬럼으로 선언됩니다. 이러한 컬럼 값은 테이블에 의해 제어되는 모든 조합의 권한을 포함 할 수 있습니다. 컬럼 값에 나열되어있는 권한 만 입력됩니다.
표 6.7 Set 타입 권한 컬럼 값
테이블 이름 | 컬럼 이름 | 가능한 Set 요소 |
---|---|---|
tables_priv | Table_priv | 'Select',
'Insert', 'Update', 'Delete', 'Create', 'Drop', 'Grant', 'References',
'Index', 'Alter', 'Create View', 'Show view', 'Trigger' |
tables_priv | Column_priv | 'Select', 'Insert', 'Update', 'References' |
columns_priv | Column_priv | 'Select', 'Insert', 'Update', 'References' |
procs_priv | Proc_priv | 'Execute', 'Alter Routine', 'Grant' |
관리자 권한 ( RELOAD
, SHUTDOWN
등)은 user
테이블에서만 지정됩니다. 관리 작업은 서버 자체에서 작업이며, 데이터베이스 고유 않기 때문에 이러한 권한을 다른 부여 테이블에 나열하는 이유는 없습니다. 따라서 사용자가 관리 작업을 수행 할 수 있는지 여부를 판별하려면, 서버는 user
테이블 만 참조해야합니다.
FILE
권한도 user
테이블에서만 지정됩니다. 이것은 원래 관리 권한은 없지만 서버 호스트에서 파일을 읽거나 쓸 수있는 능력은 액세스 데이터베이스와 무관합니다.
mysqld 서버는 시작할 때 부여 테이블의 내용을 메모리에 읽습니다. FLUSH PRIVILEGES
명령문을 실행하거나 mysqladmin flush-privileges 또는 mysqladmin reload 명령을 실행하여 테이블을 다시로드하도록 서버에 지시 할 수 있습니다. 부여 테이블의 변경은 섹션 6.2.6 "권한 변경이 활성화되는시기" 와 같이 반영됩니다.
계정의 권한을 변경하면 변경으로 인해 권한이 원하는대로 설치되는지 여부를 확인하는 것이 좋습니다. 특정 계정의 권한을 확인하려면 SHOW GRANTS
문을 사용합니다 ( 섹션 13.7.5.22 "SHOW GRANTS 구문" 을 참조하십시오). 예를 들어, 사용자 이름 및 호스트 이름 값이 각각 bob
및 pc84.example.com
계정에 부여 된 권한을 확인하려면 다음 문을 사용합니다.
SHOW GRANTS FOR 'bob'@'pc84.example.com';