6.2.1 MySQL에서 제공되는 권한
MySQL에서는 다양한 컨텍스트 및 다양한 동작 레벨에 적용되는 권한이 제공됩니다.
관리 권한에 따라 사용자는 MySQL 서버의 동작을 관리 할 수 있습니다. 이러한 권한은 특정 데이터베이스에 고유 않기 때문에 글로벌입니다.
데이터베이스 권한은 데이터베이스 및 데이터베이스의 모든 개체에 적용됩니다. 이러한 권한은 특정 데이터베이스에 부여하고 모든 데이터베이스에 적용되도록 글로벌에 부여 할 수 있습니다.
테이블, 인덱스, 뷰, 스토어드 루틴 등의 데이터베이스 개체를위한 권한은 데이터베이스의 특정 객체 데이터베이스에서 특정 유형의 모든 객체 (예를 들어 데이터베이스의 모든 테이블) 또는 모든 데이터베이스의 특정 유형의 모든 개체에 글로벌 부여 할 수 있습니다.
계정 권한에 대한 정보는 mysql
데이터베이스의 user
, db
, tables_priv
, columns_priv
및 procs_priv
테이블에 저장됩니다 ( 섹션 6.2.2 "권한 시스템 부여 테이블" 을 참조하십시오). MySQL 서버는 이러한 테이블의 내용을 시작할 때 메모리에 읽고 섹션 6.2.6 "권한 변경이 활성화되는시기" 에 나타내는 조건에서 이들을 다시로드합니다. 액세스 제어 결정은 부여 테이블의 인 메모리 복사에 근거합니다.
MySQL의 일부 버전에서는 새로운 권한 또는 기능을 추가하기 위해 부여 테이블의 구조를 변경하는 것도 있습니다. 모든 새로운 기능을 안정적으로 활용할 수 있도록하려면 새로운 버전의 MySQL에 업데이트 할 때마다 부여 테이블을 업데이트하여 최신 구조를 갖게합니다. 섹션 4.4.7 "mysql_upgrade - MySQL 테이블 체크 및 업그레이드" 를 참조하십시오.
다음 표는 GRANT
및 REVOKE
문에서 SQL 레벨에서 사용되는 권한 이름 외에도 부여 테이블의 각 권한에 관련된 컬럼 및 권한이 적용되는 상황이 나타나고 있습니다.
표 6.2 GRANT 및 REVOKE에 대해 허용되는 권한
권한 | 컬럼 | 컨텍스트 |
---|---|---|
CREATE | Create_priv | 데이터베이스 테이블 또는 인덱스 |
DROP | Drop_priv | 데이터베이스 테이블 또는 뷰 |
GRANT OPTION | Grant_priv | 데이터베이스 테이블 또는 스토어드 루틴 |
LOCK TABLES | Lock_tables_priv | 데이터베이스 |
REFERENCES | References_priv | 데이터베이스 또는 테이블 |
EVENT | Event_priv | 데이터베이스 |
ALTER | Alter_priv | 테이블 |
DELETE | Delete_priv | 테이블 |
INDEX | Index_priv | 테이블 |
INSERT | Insert_priv | 테이블 또는 컬럼 |
SELECT | Select_priv | 테이블 또는 컬럼 |
UPDATE | Update_priv | 테이블 또는 컬럼 |
CREATE TEMPORARY TABLES | Create_tmp_table_priv | 테이블 |
TRIGGER | Trigger_priv | 테이블 |
CREATE VIEW | Create_view_priv | 뷰 |
SHOW VIEW | Show_view_priv | 뷰 |
ALTER ROUTINE | Alter_routine_priv | 스토어드 루틴 |
CREATE ROUTINE | Create_routine_priv | 스토어드 루틴 |
EXECUTE | Execute_priv | 스토어드 루틴 |
FILE | File_priv | 서버 호스트에서 파일 액세스 |
CREATE TABLESPACE | Create_tablespace_priv | 서버 관리 |
CREATE USER | Create_user_priv | 서버 관리 |
PROCESS | Process_priv | 서버 관리 |
PROXY | proxies_priv 테이블을 참조 | 서버 관리 |
RELOAD | Reload_priv | 서버 관리 |
REPLICATION CLIENT | Repl_client_priv | 서버 관리 |
REPLICATION SLAVE | Repl_slave_priv | 서버 관리 |
SHOW DATABASES | Show_db_priv | 서버 관리 |
SHUTDOWN | Shutdown_priv | 서버 관리 |
SUPER | Super_priv | 서버 관리 |
ALL [PRIVILEGES] | 서버 관리 | |
USAGE | 서버 관리 |
다음 목록에는 MySQL에서 사용 가능한 각 권한의 일반적인 설명이 제공되고 있습니다. 특정 SQL 문에는 여기에 표시된 것보다 구체적인 권한 요구 사항이있는 경우도 있습니다. 그런 경우 해당 문 설명이 자세히 나와 있습니다.
ALL
또는ALL PRIVILEGES
권한 지정자는 단축형입니다. 이것은 "특정 권한 수준에서 사용 가능한 모든 권한"(GRANT OPTION
제외)을 나타냅니다. 예를 들어, 글로벌 또는 테이블 레벨에서ALL
을 부여하면 모든 글로벌 권한 또는 테이블 레벨의 모든 권한이 부여됩니다.ALTER
권한은 테이블의 구조를 변경하는ALTER TABLE
의 사용을 가능하게합니다.ALTER TABLE
에는CREATE
및INSERT
권한도 필요합니다. 테이블 이름을 변경하려면 기존 테이블 측에서ALTER
및DROP
과 새로운 테이블 측에서ALTER
,CREATE
및INSERT
권한이 필요합니다.스토어드 루틴 (프로 시저 및 함수)을 변경 또는 삭제하려면
ALTER ROUTINE
권한이 있어야합니다.CREATE
권한은 새 데이터베이스 및 테이블 작성을 가능하게합니다.스토어드 루틴 (프로 시저 및 함수)을 생성하려면
CREATE ROUTINE
권한이 있어야합니다.테이블 스페이스 및 로그 파일 그룹을 생성, 변경 또는 삭제하려면
CREATE TABLESPACE
권한이 있어야합니다.CREATE TEMPORARY TABLES
권한은CREATE TEMPORARY TABLE
문을 사용하여 임시 테이블 생성을 가능하게합니다.MySQL 5.6.3의 시점에서는 세션에서 임시 테이블이 작성되면 서버는 테이블에서 권한 검사를 추가 실행하지 않습니다. 세션을 만들어서,
DROP TABLE
,INSERT
,UPDATE
,SELECT
등의 모든 작업을 테이블에서 실행할 수 있습니다.이 동작의 하나의 영향으로 현재 사용자가 임시 테이블을 만들 수있는 권한을 가지지 않아도 세션이 임시 테이블을 조작 할 수있는 것이 있습니다. 현재 사용자가
CREATE TEMPORARY TABLES
권한을 가지고 있지 않지만,CREATE TEMPORARY TABLES
을 가진 사용자의 권한으로 실행하여 임시 테이블을 만들고,DEFINER
컨텍스트 저장 프로 시저를 실행할 수 있다고합니다. 프로 시저 실행 중에 세션 정의 측 사용자 권한을 사용합니다. 프로 시저가 복귀 한 뒤 유효한 권한은 현재 사용자의 권한으로 돌아 이로 인해 계속 임시 테이블을 표시하고 임시 테이블에 대한 모든 작업을 수행 할 수있게합니다.MySQL 5.6.3 이전에서는
INSERT
,UPDATE
,SELECT
등의 임시 테이블에서 다른 작업에는 임시 테이블을 저장하는 데이터베이스에 대한 작업을하거나 같은 이름의 비 임시 테이블에 대한 추가 권한이 필요 입니다.임시 테이블과 비 임시 테이블의 권한을 분리하는이 상황에 대한 일반적인 해결 방법은 임시 테이블을 사용하기위한 전용 데이터베이스를 만드는 것입니다. 이렇게하면 그 데이터베이스에 대해
CREATE TEMPORARY TABLES
권한과 사용자에 의해 수행되는 임시 테이블 작업에 필요한 다른 모든 권한을 사용자에게 부여 할 수 있습니다.CREATE USER
권한은CREATE USER
,DROP USER
,RENAME USER
및REVOKE ALL PRIVILEGES
사용을 가능하게합니다.CREATE VIEW
권한은CREATE VIEW
의 사용을 가능하게합니다.DELETE
권한은 데이터베이스의 테이블에서 행 삭제를 가능하게합니다.DROP
권한은 기존 데이터베이스 테이블 및 뷰의 드롭을 가능하게합니다. 파티션 된 테이블에서ALTER TABLE ... DROP PARTITION
문을 사용하려면DROP
권한이 필요합니다.DROP
권한이TRUNCATE TABLE
을 위해서도 필요합니다.mysql
데이터베이스에 대한DROP
권한을 부여하면 MySQL 접근 권한이 저장되어있는 데이터베이스를 사용자가 삭제할 수 있습니다.이벤트 스케줄러에 대한 이벤트를 생성, 변경, 삭제 또는 표시하려면
EVENT
권한이 필요합니다.스토어드 루틴 (프로 시저 및 함수)를 실행하려면
EXECUTE
권한이 필요합니다.FILE
권한은LOAD DATA INFILE
및SELECT ... INTO OUTFILE
문 및LOAD_FILE()
함수를 사용하여 서버 호스트에서 파일 읽기 및 쓰기를 수행하기위한 권한을 사용자에게 부여합니다.FILE
권한을 가진 사용자는 모든 사용자가 읽을 수인지, MySQL 서버가 읽을 수있는 서버 호스트에있는 모든 파일을 읽을 수 있습니다. (이 것은 암시 적으로 데이터베이스 디렉토리의 모든 파일 서버에서 액세스 할 수 있으므로 사용자는 그 모든 파일을 읽을 수있는 것을 의미합니다.) 또한FILE
권한에 따라 사용자는 MySQL 서버가 쓰기 액세스 권한이있는 모든 디렉토리에 새로운 파일을 만들 수 있습니다. 이것은 권한 테이블을 구현하는 파일을 저장하는 서버의 데이터 디렉토리를 포함합니다. 보안을 위해 서버는 기존 파일을 덮어 쓰지 않습니다.파일을 읽고 쓸 수있는 장소를 제한하려면
secure_file_priv
시스템을 특정 디렉토리로 설정합니다. 섹션 5.1 "서버 시스템 변수" 를 참조하십시오.GRANT OPTION
권한을 통해 사용자는 자신이 소유하는 권한을 다른 사용자에게 부여하거나 다른 사용자로부터 제거 할 수 있습니다.INDEX
권한은 사용자가 인덱스를 만들거나 놓을 수 있습니다.INDEX
는 기존의 테이블에 적용됩니다. 테이블에 대한CREATE
권한을 가지는 경우,CREATE TABLE
문에 인덱스 정의를 포함 할 수 있습니다.INSERT
권한은 데이터베이스의 테이블에 행 삽입을 가능하게합니다.ANALYZE TABLE
,OPTIMIZE TABLE
,REPAIR TABLE
과 같은 테이블 유지 보수 문에도INSERT
권한이 필요합니다.LOCK TABLES
권한은 사용자가SELECT
권한이있는 테이블을 잠그기 위해 명시 적LOCK TABLES
명령문의 사용을 가능하게합니다. 여기에는 잠긴 테이블을 다른 세션에서 읽은하지 않도록하는 기입 락의 사용이 포함됩니다.PROCESS
권한은 서버에서 실행되는 스레드에 대한 정보의 표시에 관계합니다 (즉, 세션에 의해 실행되는 명령문에 대한 정보). 이 권한은SHOW PROCESSLIST
또는 mysqladmin processlist를 사용하여 다른 계정에 속한 스레드를 표시하는 것을 허용하고 자신의 스레드를 볼 수 있습니다.PROCESS
권한은SHOW ENGINE
의 사용도 가능합니다.PROXY
권한은 사용자가 다른 사용자로 위장하거나 다른 사용자로 인식되게 할 수 있습니다. 섹션 6.3.9 "프록시 사용자" 를 참조하십시오.REFERENCES
권한은 현재 사용되지 않습니다.RELOAD
권한은FLUSH
명령문의 사용을 가능하게합니다. 또한 이것은FLUSH
조작 (flush-hosts
,flush-logs
,flush-privileges
,flush-status
,flush-tables
,flush-threads
,refresh
, 그리고reload
)과 동등한 mysqladmin 명령을 사용 가능하게합니다.reload
명령은 부여 테이블을 메모리에 다시로드하도록 서버에 지시합니다.flush-privileges
는reload
의 동의어입니다.refresh
명령은 로그 파일을 닫고 다시 열고 모든 테이블을 플러시합니다. 다른flush-
명령은xxx
refresh
와 유사한 기능을 수행하고 있지만보다 구체적이기 때문에 일부 상황에서는 바람직한 경우가 있습니다. 예를 들어, 로그 파일만을 플래시 때는refresh
보다flush-logs
를 선택하는 것이 좋습니다.REPLICATION CLIENT
권한은SHOW MASTER STATUS
및SHOW SLAVE STATUS
의 사용을 가능하게합니다. MySQL 5.6.6 이후에서는, 이것은SHOW BINARY LOGS
문 사용도 가능합니다.REPLICATION SLAVE
권한은 마스터로 현재 서버에 연결할 때 슬레이브 서버가 사용하는 계정에 주도록하십시오. 이 권한이없는 경우, 슬레이브는 마스터 서버의 데이터베이스에 대해 실행 된 업데이트를 요청 할 수 없습니다.SELECT
권한에 따라 사용자는 데이터베이스의 테이블에서 행을 선택할 수 있습니다.SELECT
문에서SELECT
권한이 필요한 것은 문이 테이블에서 실제로 레코드를 검색하는 경우입니다. 일부SELECT
문은 테이블에 액세스하지 않기 때문에 모든 데이터베이스에 대한 액세스 권한이 없어도 실행할 수 있습니다. 예를 들어, 테이블을 참조하지 않는 식을 평가하기위한 간단한 계산기로SELECT
를 사용할 수 있습니다.SELECT 1 + 1; SELECT PI () * 2;
SELECT
권한은 컬럼 값을 읽을 다른 문에 대해서도 필요합니다. 예를 들어,UPDATE
문 대입col_name
=expr
의 오른쪽에서 참조되는 컬럼 또는DELETE
또는UPDATE
문WHERE
절에 지정된 컬럼에 대한SELECT
가 필요합니다.SHOW DATABASES
권한에 따라 계정은SHOW DATABASE
문을 발행하여 데이터베이스 이름을 표시 할 수 있습니다. 이 권한이없는 계정은 계정이 일부 권한을 가진 데이터베이스 만 표시되지 않고 서버가--skip-show-database
옵션에서 시작되는 경우는 문을 일체 사용할 수 없습니다. 모든 글로벌 권한은 데이터베이스에 대한 권한이라는 점에 유의하십시오.SHOW VIEW
권한은SHOW CREATE VIEW
의 사용을 가능하게합니다.SHUTDOWN
권한은 mysqladmin shutdown 명령의 사용을 가능하게합니다. 해당 SQL 문은 없습니다.SUPER
권한에 의해 계정이 다른 계정에 속한 스레드를 종료하기위한CHANGE MASTER TO
,KILL
또는 mysqladmin kill (자신의 스레드는 항상 강제 종료 할 수 있습니다)PURGE BINARY LOGS
글로벌 시스템 변수를 변경하기 위해 의SET GLOBAL
를 사용하여 구성 변경, mysqladmin debug 명령 로깅의 활성화 또는 비활성화read_only
시스템 변수가 유효한 경우 업데이트 실행 슬레이브 서버에서 복제의 시작 및 중지, 저장 프로그램 및 뷰의DEFINER
속성의 모든 계정 지정을 사용할 수 있으며, 사용자는max_connections
시스템 변수에 의해 제어되는 연결 제한에 도달하는 경우에도 (번) 연결 할 수 있습니다.바이너리 로깅을 활성화 한 경우 저장 기능을 만들거나 수정할 때, 섹션 20.7 "저장 프로그램의 바이너리 로깅" 에서 언급 된 바와 같이
SUPER
권한이 역시 필요할 수 있습니다.TRIGGER
권한은 트리거 작업을 활성화합니다. 테이블의 트리거를 작성, 삭제 또는 실행하려면 그 테이블에 대해이 권한을 가질 필요가 있습니다.UPDATE
권한은 데이터베이스의 테이블 행의 갱신을 가능하게합니다.USAGE
권한 지정자는 "권한 없음"을 나타냅니다. 이것은GRANT
와 함께 글로벌 수준에서 사용되는 기존의 계정 권한에 영향을주지 않고 자원 제한 및 SSL 특성 등의 계정 속성을 변경합니다.
계정에 필요한 권한만을 부여하는 것이 좋습니다. FILE
권한 및 관리 권한 부여에 충분히주의하도록하십시오.
FILE
권한을 악용하여 MySQL 서버가 서버 호스트에서 읽을 수있는 모든 파일을 데이터베이스 테이블에서 읽을 수 있습니다. 여기에는 모든 사용자가 읽을 수있는 모든 파일 및 서버의 데이터 디렉토리에있는 파일이 포함되어 있습니다. 그 후,SELECT
를 사용하여 테이블에 액세스하고 테이블의 내용을 클라이언트 호스트로 전송할 수 있습니다.GRANT OPTION
권한을 통해 사용자는 다른 사용자에게 권한을 부여 할 수 있습니다. 다른 권한을 가진 2 명의 사용자가GRANT OPTION
권한을 가지고 있으면, 권한을 결합 할 수 있습니다.ALTER
권한을 사용하여 테이블의 이름을 변경하여 권한 시스템을 끊을 수 있습니다.SHUTDOWN
권한을 악용하여 서버를 종료하여 다른 사용자에게 서비스를 완전히 방해 할 수 있습니다.PROCESS
권한은 패스워드 설정 및 변경하는 명령문 등을 포함하여 현재 실행중인 명령문의 일반 텍스트를 표시 할 수 있습니다.SUPER
권한은 다른 세션을 종료하거나 서버의 동작 방식을 변경하는 데에 사용할 수 있습니다.mysql
데이터베이스 자체에 부여 된 권한을 사용하여 암호 및 기타 액세스 권한 정보를 변경할 수 있습니다. 비밀번호는 암호화되어 저장되어 있기 때문에 공격자는 단순히 암호를보고 일반 텍스트 암호를 알 수 없습니다. 그러나user
테이블의Password
컬럼에 대한 쓰기 액세스 권한이있는 사용자 계정의 암호를 변경하고 해당 계정을 사용하여 MySQL 서버에 연결할 수 있습니다.