13.7.1.4 GRANT 구문
GRANTpriv_type
[(column_list
)] [,priv_type
[(column_list
)]] ... ON [object_type
]priv_level
TOuser_specification
[,user_specification
] ... [REQUIRE {NONE |ssl_option
[[AND]ssl_option
] ...}] [WITH {GRANT OPTION |resource_option
} ...] GRANT PROXY ONuser_specification
TOuser_specification
[,user_specification
] ... [WITH GRANT OPTION]object_type
: { TABLE | FUNCTION | PROCEDURE }priv_level
: { * | *.* |db_name
.* |db_name.tbl_name
|tbl_name
|db_name
.routine_name
}user_specification
:user
[auth_option
]auth_option
: { IDENTIFIED BY 'auth_string
' | IDENTIFIED BY PASSWORD 'hash_string
' | IDENTIFIED WITHauth_plugin
| IDENTIFIED WITHauth_plugin
AS 'hash_string
' }ssl_option
: { SSL | X509 | CIPHER 'cipher
' | ISSUER 'issuer
' | SUBJECT 'subject
' }resource_option
: { | MAX_QUERIES_PER_HOURcount
| MAX_UPDATES_PER_HOURcount
| MAX_CONNECTIONS_PER_HOURcount
| MAX_USER_CONNECTIONScount
}
GRANT
문은 MySQL 사용자 계정에 권한을 부여합니다. GRANT
는 또한 보안 연결을 사용하거나 서버 리소스에 대한 액세스 제한 등의 다른 계정 특성을 지정하는 기능도 있습니다. GRANT
를 사용하려면 GRANT OPTION
권한이 필요하며 부여하려고하는 권한을 가지고 있어야합니다.
일반적으로 데이터베이스 관리자는 먼저 CREATE USER
를 사용하여 계정을 만든 다음 GRANT
를 사용하여 그 권한과 특성을 정의합니다. 예 :
CREATE USER 'jeffrey'@ 'localhost'IDENTIFIED BY 'mypass'; GRANT ALL ON db1. * TO 'jeffrey'@ 'localhost'; GRANT SELECT ON db2.invoice TO 'jeffrey'@ 'localhost'; GRANT USAGE ON *. * TO 'jeffrey'@ 'localhost'WITH MAX_QUERIES_PER_HOUR 90;
그러나 GRANT
문에 지정된 계정이 존재하지 않는 경우 GRANT
는 나중에 NO_AUTO_CREATE_USER
SQL 모드의 설명에 표시된 조건에 따라 계정을 만들 수 있습니다.
REVOKE
문 GRANT
관련하고 관리자가 계정 권한을 삭제할 수 있도록합니다. 섹션 13.7.1.6 "REVOKE 구문" 을 참조하십시오.
mysql 프로그램에서 성공적으로 실행 된 경우 GRANT
는 Query OK, 0 rows affected
에 응답합니다. 그러면 어떤 권한이 부여되었는지를 판정하려면, SHOW GRANTS
를 사용합니다. 섹션 13.7.5.22 "SHOW GRANTS 구문" 을 참조하십시오.
GRANT
문이 섹션의 다음 항목에서 설명되어있는 몇 가지 측면이 있습니다.
MySQL에서 지원하는 권한
글로벌 권한
데이터베이스 권한
테이블 권한
컬럼 권한
스토어드 루틴 권한
프록시 사용자 권한
계정 이름과 암호
다른 계정 특성
MySQL 버전 표준 SQL 버전의
GRANT
MySQL의 일부 버전에서는 새로운 권한 또는 기능을 추가하기 위해 부여 테이블의 구조를 변경하는 것도 있습니다. 모든 새로운 기능을 안정적으로 활용할 수 있도록하려면 새로운 버전의 MySQL에 업데이트 할 때마다 부여 테이블을 업데이트하여 최신 구조를 갖게합니다. 섹션 4.4.7 "mysql_upgrade - MySQL 테이블 체크 및 업그레이드" 를 참조하십시오.
MySQL에서 지원하는 권한
다음 표는 GRANT
및 REVOKE
문에 지정할 수있는 허용되는 priv_type
권한 유형과 각 권한을 부여 할 수있는 수준을 요약 한 것입니다. 이러한 권한의 자세한 내용은 섹션 6.2.1 "MySQL에서 제공되는 권한" 을 참조하십시오.
표 13.1 GRANT 및 REVOKE에 대해 허용되는 권한
권한 | 의미 부여 가능한 수준 |
---|---|
ALL [PRIVILEGES] | GRANT OPTION 을 제외하고 지정된 액세스 수준에있는 모든 권한을 부여합니다 |
ALTER | ALTER TABLE 의 사용을 활성화합니다. 레벨 : 글로벌 데이터베이스 테이블. |
ALTER ROUTINE | 스토어드 루틴을 변경 또는 제거를 사용합니다. 레벨 : 글로벌 데이터베이스 프로 시저. |
CREATE | 데이터베이스 및 테이블 작성을 활성화합니다. 레벨 : 글로벌 데이터베이스 테이블. |
CREATE ROUTINE | 스토어드 루틴의 생성을 활성화합니다. 레벨 : 글로벌 데이터베이스. |
CREATE TABLESPACE | 테이블 스페이스 및 로그 파일 그룹을 생성, 수정 또는 삭제를 활성화합니다. 레벨 : 글로벌. |
CREATE TEMPORARY TABLES | CREATE TEMPORARY TABLE 의 사용을 활성화합니다. 레벨 : 글로벌 데이터베이스. |
CREATE USER | CREATE USER , DROP USER , RENAME USER 및 REVOKE ALL PRIVILEGES 사용을 활성화합니다. 레벨 : 글로벌. |
CREATE VIEW | 보기 만들기 또는 변경 사항을 적용합니다. 레벨 : 글로벌 데이터베이스 테이블. |
DELETE | DELETE 의 사용을 활성화합니다. 레벨 : 글로벌 데이터베이스 테이블. |
DROP | 데이터베이스 테이블 및 뷰의 삭제를 활성화합니다. 레벨 : 글로벌 데이터베이스 테이블. |
EVENT | 이벤트 스케줄러 이벤트의 사용을 활성화합니다. 레벨 : 글로벌 데이터베이스. |
EXECUTE | 사용자가 스토어드 루틴을 실행할 수 있도록합니다. 레벨 : 글로벌 데이터베이스 테이블. |
FILE | 사용자가 서버에 파일을 읽도록하거나 기록하지 할 수 있도록합니다. 레벨 : 글로벌. |
GRANT OPTION | 권한 다른 계정에 부여하거나 다른 계정에서 삭제를 활성화합니다. 레벨 : 글로벌 데이터베이스, 테이블, 프로 시저 프록시. |
INDEX | 인덱스 작성 또는 삭제를 활성화합니다. 레벨 : 글로벌 데이터베이스 테이블. |
INSERT | INSERT 의 사용을 활성화합니다. 레벨 : 글로벌 데이터베이스, 테이블, 컬럼. |
LOCK TABLES | 사용자가 SELECT 권한을 가지고있는 테이블에 대한 LOCK TABLES 의 사용을 활성화합니다. 레벨 : 글로벌 데이터베이스. |
PROCESS | 사용자가 SHOW PROCESSLIST 를 사용하여 모든 프로세스를 볼 수 있도록합니다. 레벨 : 글로벌. |
PROXY | 사용자의 프록시 설정을 사용합니다. 레벨 : 사용자 간. |
REFERENCES | 구현되어 있지 않습니다 |
RELOAD | FLUSH 조작의 사용을 활성화합니다. 레벨 : 글로벌. |
REPLICATION CLIENT | 사용자가 마스터 또는 슬레이브 서버의 위치를 문의 할 수 있습니다. 레벨 : 글로벌. |
REPLICATION SLAVE | 리플리케이션 슬레이브가 마스터 바이너리 로그 이벤트를 읽을 수 있도록합니다. 레벨 : 글로벌. |
SELECT | SELECT 의 사용을 활성화합니다. 레벨 : 글로벌 데이터베이스, 테이블, 컬럼. |
SHOW DATABASES | SHOW DATABASES 는 모든 데이터베이스를 볼 수 있도록합니다. 레벨 : 글로벌. |
SHOW VIEW | SHOW CREATE VIEW 사용을 활성화합니다. 레벨 : 글로벌 데이터베이스 테이블. |
SHUTDOWN | mysqladmin shutdown의 사용을 활성화합니다. 레벨 : 글로벌. |
SUPER | CHANGE MASTER TO , KILL , PURGE BINARY LOGS , SET GLOBAL , mysqladmin debug 명령 등의 기타 관리 작업의 사용을 활성화합니다. 레벨 : 글로벌. |
TRIGGER | 트리거 작업을 활성화합니다. 레벨 : 글로벌 데이터베이스 테이블. |
UPDATE | UPDATE 의 사용을 활성화합니다. 레벨 : 글로벌 데이터베이스, 테이블, 컬럼. |
USAGE | "권한 없음"의 동의어입니다 |
트리거는 테이블에 연결된위한 트리거를 만들거나 삭제하려면 트리거가 아니라이 테이블에 대한 TRIGGER
권한이 있어야합니다.
GRANT
문은 ALL [PRIVILEGES]
또는 PROXY
권한은 단독으로 지정해야 다른 권한과 동시에 지정할 수 없습니다. ALL [PRIVILEGES]
은 GRANT OPTION
및 PROXY
권한을 제외한 권한이 부여되는 수준에서 사용 가능한 모든 권한을 나타냅니다.
USAGE
를 지정하면 권한이없는 사용자를 만들고있는 계정의 REQUIRE
또는 WITH
절을 그 기존의 권한을 변경하지 않고 지정할 수 있습니다.
MySQL 계정 정보는 mysql
데이터베이스 테이블에 저장되어 있습니다. 이 데이터베이스와 액세스 제어 시스템은 섹션 6.2 "MySQL 권한 시스템" 에서 광범위하게 설명되어 있습니다. 자세한 내용은이 섹션을 참조하도록하십시오.
부여 테이블에 대소 문자가 혼합 된 데이터베이스 또는 테이블 이름을 포함 권한 행을 유지해야하며, lower_case_table_names
시스템 변수가 0이 아닌 값으로 설정되어있는 경우, REVOKE
를 사용하여 이러한 권한을 취소 할 수 없습니다. 부여 테이블을 직접 조작 할 수 있어야합니다. ( lower_case_table_names
이 설정되어있을 때, GRANT
는 이러한 행을 생성하지 않지만, 그 변수가 설정되기 전에 이러한 행이 작성되어 있었을 가능성이 있습니다.)
권한은 ON
절에 사용되는 구문에 따라 여러 수준에서 부여 할 수 있습니다. REVOKE
의 경우는 그 같은 ON
구문에서 어떤 권한을 취소 여부를 지정합니다. 다음 예제는 단순화를 위해 IDENTIFIED BY '
어구가 포함되어 있지 않지만 해당 계정이 존재하지 않는 경우 암호가없는 안전하지 않은 계정이 생성되지 않도록이 어구를 포함 같이하십시오. password
'
글로벌 권한
글로벌 권한은 관리 권한입니다. 즉, 특정 서버의 모든 데이터베이스에 적용됩니다. 글로벌 권한을 할당하려면 ON *.*
구문을 사용합니다.
GRANT ALL ON *. * TO 'someuser'@ 'somehost'; GRANT SELECT, INSERT ON *. * TO 'someuser'@ 'somehost';
CREATE TABLESPACE
, CREATE USER
, FILE
, PROCESS
, RELOAD
, REPLICATION CLIENT
, REPLICATION SLAVE
, SHOW DATABASES
, SHUTDOWN
, 그리고 SUPER
권한 관리 권한이며, 글로벌에게만 부여 할 수 있습니다.
기타 권한은 전역 적으로 또는보다 구체적인 수준에서 부여 할 수 있습니다.
MySQL은 글로벌 권한을 mysql.user
테이블에 저장합니다.
데이터베이스 권한
데이터베이스 권한은 특정 데이터베이스의 모든 개체에 적용됩니다. 데이터베이스 수준의 권한을 할당하려면 ON
구문을 사용합니다. db_name
.*
GRANT ALL ON mydb. * TO 'someuser'@ 'somehost'; GRANT SELECT, INSERT ON mydb. * TO 'someuser'@ 'somehost';
ON *.*
대신 ON *
구문을 사용하며 기본 데이터베이스를 선택한 경우 권한은 기본 데이터베이스의 데이터베이스 수준에서 할당됩니다. 기본 데이터베이스가 존재하지 않으면 오류가 발생합니다.
CREATE
, DROP
, EVENT
, GRANT OPTION
및 LOCK TABLES
권한은 데이터베이스 수준에서 지정할 수 있습니다. 또한 테이블 또는 루틴 권한을 데이터베이스 수준에서 지정할 수 있습니다. 이 경우 이러한 권한은 데이터베이스의 모든 테이블 또는 루틴에 적용됩니다.
MySQL 데이터베이스 권한을 mysql.db
테이블에 저장합니다.
테이블 권한
테이블 권한은 특정 테이블의 모든 컬럼에 적용됩니다. 테이블 레벨의 권한을 할당하려면 ON
구문을 사용합니다. db_name.tbl_name
GRANT ALL ON mydb.mytbl TO 'someuser'@ 'somehost'; GRANT SELECT, INSERT ON mydb.mytbl TO 'someuser'@ 'somehost';
db_name.tbl_name
대신 tbl_name
을 지정한 경우,이 문은 기본 데이터베이스의 tbl_name
에 적용됩니다. 기본 데이터베이스가 존재하지 않으면 오류가 발생합니다.
테이블 수준에서 허용되는 priv_type
값은 ALTER
, CREATE VIEW
, CREATE
, DELETE
, DROP
, GRANT OPTION
, INDEX
, INSERT
, SELECT
, SHOW VIEW
, TRIGGER
및 UPDATE
입니다.
MySQL은 테이블 권한 mysql.tables_priv
테이블에 저장합니다.
컬럼 권한
컬럼 권한은 특정 테이블의 단일 컬럼에 적용됩니다. 컬럼 레벨에서 부여 된 각 권한의 뒤에 괄호로 둘러싸인 하나 이상의 컬럼을 지정해야합니다.
GRANT SELECT (col1), INSERT (col1, col2) ON mydb.mytbl TO 'someuser'@ 'somehost';
컬럼에 대해서 (즉, column_list
절을 사용할 때) 허용되는 priv_type
값은 INSERT
, SELECT
및 UPDATE
입니다.
MySQL은 컬럼 권한을 mysql.columns_priv
테이블에 저장합니다.
스토어드 루틴 권한
ALTER ROUTINE
, CREATE ROUTINE
, EXECUTE
및 GRANT OPTION
권한은 스토어드 루틴 (프로 시저 및 함수)에 적용됩니다. 이러한 권한은 글로벌 및 데이터베이스 수준에서 부여 할 수 있습니다. CREATE ROUTINE
을 제외하고 이러한 권한은 개별 루틴에 루틴 레벨에서 부여 할 수 있습니다.
GRANT CREATE ROUTINE ON mydb. * TO 'someuser'@ 'somehost'; GRANT EXECUTE ON PROCEDURE mydb.myproc TO 'someuser'@ 'somehost';
루틴 수준에서 허용되는 priv_type
값은 ALTER ROUTINE
, EXECUTE
및 GRANT OPTION
입니다. CREATE ROUTINE
먼저 루틴을 만드는 데이 권한이 필요하기 때문에 일상 수준의 권한이 없습니다.
MySQL은 루틴 수준의 권한을 mysql.procs_priv
테이블에 저장합니다.
프록시 사용자 권한
PROXY
권한은 사용자가 다른 사용자의 프록시 수 있도록합니다. 프록시 사용자는 프록시 설정 된 사용자를 가장하거나 사용자의 식별 정보를 가져옵니다.
GRANT PROXY ON 'localuser'@ 'localhost'TO 'externaluser'@ 'somehost';
PROXY
이 부여되는 경우, 그 권한은 GRANT
문에 지정되어있는 유일한 권한이어야하며 REQUIRE
절을 지정할 수 없으며 허용되는 유일한 WITH
옵션은 WITH GRANT OPTION
입니다.
프록시 설정에서는 프록시 사용자가 연결할 때 프록시 설정 된 사용자의 이름을 서버에 반환 플러그인을 통해 인증 할 및 프록시 사용자가 프록시 설정 된 사용자에 대한 PROXY
권한을 가지고 있어야합니다. 자세한 내용 및 예제는 섹션 6.3.9 "프록시 사용자" 를 참조하십시오.
MySQL은 프록시 권한을 mysql.proxies_priv
테이블에 저장합니다.
글로벌 데이터베이스, 테이블 및 루틴 레벨의 경우, GRANT ALL
은 부여하려고하는 레벨에 존재하는 권한만을 할당합니다. 예를 들어, GRANT ALL ON
은 데이터베이스 수준의 문이기 때문에 db_name
.*FILE
등의 글로벌 전용 권한을 부여하지 않습니다. ALL
을 부여하더라도 PROXY
권한을 할당하지는 않습니다.
object_type
절 (존재하는 경우)는 연속적인 오브젝트가 테이블, 스토어드 함수 또는 저장 프로 시저 인 경우 TABLE
, FUNCTION
, 또는 PROCEDURE
로 지정하도록하십시오.
데이터베이스, 테이블, 열 또는 루틴에 대한 권한은 각 권한 수준에있는 권한의 논리 OR
로 부가 적으로 형성됩니다. 예를 들어, 사용자가 글로벌 SELECT
권한을 가지고 있다면, 데이터베이스, 테이블 또는 컬럼 레벨의 권한이 없음에 따라 그 권한을 거부 할 수 없습니다. 권한 확인 절차에 대한 자세한 내용은 섹션 6.2.5 "액세스 제어, 2 단계 : 요청 확인" 에 설명되어 있습니다.
MySQL에서는 존재하지 않는 데이터베이스 또는 테이블에 대한 권한을 부여 할 수 있습니다. 테이블의 경우, 부여 된 권한에 CREATE
권한이 포함되어 있어야합니다. 이 동작은 설계에 의한 것이며, 데이터베이스 관리자가 사용자 계정과 나중에 생성 된 데이터베이스 또는 테이블에 대한 권한을 준비 할 수 있도록하는 것을 목적으로하고 있습니다.
MySQL은 데이터베이스 또는 테이블을 삭제해도 어떤 권한도 자동으로 취소되지 않습니다. 그러나 루틴을 삭제 한 경우 해당 루틴에 부여 된 루틴 수준의 권한이 모두 취소됩니다.
계정 이름과 암호
user
값은 GRANT
문이 적용되는 MySQL 계정을 나타냅니다. 모든 호스트의 사용자에 대한 권한 부여에 대응하기 위해 MySQL은
형식에서 user_name
@ host_name
user
값 지정을 지원합니다. user_name
또는 host_name
값이 인용되지 않은 식별자로서 합법적 인 경우, 그것을 따옴표로 묶을 필요가 없습니다. 그러나 특수 문자 ( " -
")를 포함 user_name
문자열 또는 특수 문자 나 와일드 카드 문자 ( " %
")를 포함 host_name
문자열 (예를 들어, 'test-user'@'%.com'
)를 지정하려면 따옴표가 필요합니다. 사용자 이름과 호스트 이름이 개별 따옴표로 묶어야합니다.
호스트 이름에는 와일드 카드를 지정할 수 있습니다. 예를 들어,
은 user_name
@'%.example.com'example.com
도메인의 모든 호스트의 user_name
에 적용되고
는 user_name
@'192.168.1.%'192.168.1
클래스 C 서브넷의 모든 호스트 user_name
에 적용됩니다.
간단한 형식 user_name
은
의 동의어입니다. user_name
@'%'
MySQL 사용자 이름에 와일드 카드를 지원하지 않습니다. 익명 사용자를 참조하려면 GRANT
문에서 빈 사용자 이름을 포함 계정을 지정합니다.
GRANT ALL ON test. * TO '@'localhost '...
이 경우 익명 사용자의 올바른 암호를 사용하여 로컬 호스트에서 접속하는 모든 사용자에게 익명 사용자 계정과 관련된 권한으로 액세스가 허용됩니다.
계정 이름의 사용자 이름과 호스트 이름 값 자세한 내용은 섹션 6.2.3 "계정 이름 지정" 을 참조하십시오.
인용 된 값을 지정하려면, 데이터베이스, 테이블, 열 및 루틴 이름은 식별자 따옴표로 묶어야합니다. 사용자 이름과 호스트 이름은 식별자 또는 문자열로 따옴표로 묶어야합니다. 암호 문자열로 따옴표로 묶어야합니다. 문자열 및 식별자로 인용 부호로 둘러싸 방법에 대한 지침은 섹션 9.1.1 "문자열 리터럴" 및 섹션 9.2 "스키마 객체 이름" 을 참조하십시오.
글로벌 또는 데이터베이스 수준의 권한을 부여하는 GRANT
문에서 데이터베이스 이름을 지정하는 경우, " _
"와" %
"와일드 카드가 허용됩니다. 즉, 예를 들어, 데이터베이스 이름의 일부로 " _
"문자를 사용하는 경우, 사용자가 와일드 카드 패턴과 일치하는 추가 데이터베이스에 액세스 할 수 없도록하기 위해 문자를 GRANT
문에서 ' \_
"로 지정하도록하십시오 (예를 들어, GRANT ... ON `foo\_bar`.* TO ...
).
익명 사용자 MySQL 서버에 접속을 허용하려면
으로 모든 로컬 사용자에게 권한을 부여하도록하십시오. 그렇지 않으면 지정된 사용자가 로컬 컴퓨터에서 MySQL 서버에 로그인하려고하면 (MySQL 설치 중에 만들어진) user_name
@localhostmysql.user
테이블에서 localhost
의 익명 사용자 계정이 사용됩니다. 자세한 내용은 섹션 6.2.4 "액세스 제어 1 단계 : 연결 확인" 을 참조하십시오.
전에 경고가 적용되는지 여부를 판정하려면, 모든 익명 사용자를 나열 다음 쿼리를 실행합니다.
SELECT Host, User FROM mysql.user WHERE User = '';
지금 설명하는 문제를 해결하려면 다음 문을 사용하여 로컬 익명 사용자 계정을 삭제합니다.
DROP USER ''@ 'localhost';
GRANT
는 최대 60 자 길이의 호스트 이름을 지원합니다. 데이터베이스, 테이블, 열 및 루틴 이름은 최대 64 문자를 지정할 수 있습니다. 사용자 이름에는 최대 16 문자를 지정할 수 있습니다.
mysql.user
테이블을 변경해도 사용자 이름에 허용되는 길이는 변경할 수 없습니다. 그것을하려고하면 예기치 않은 동작이 발생하고 사용자가 MySQL 서버에 로그인 할 수 없게 될 가능성도 있습니다. mysql
데이터베이스의 모든 테이블은 섹션 4.4.7 "mysql_upgrade - MySQL 테이블 체크 및 업그레이드" 에 설명 된 절차에 의한 경우를 제외하고 어떤 방법으로도 결코 변경되지 않도록하십시오.
사용자 서버 접속시의 인증 방법을 보여주기 위해 user_specification
절에는 인증 플러그인을 지정하기위한 IDENTIFIED WITH
또는 암호를 지정하기위한 IDENTIFIED BY
를 포함 할 수 있습니다. 사용자 지정 구문은 CREATE USER
문의 경우와 동일합니다. 자세한 내용은 섹션 13.7.1.2 "CREATE USER 구문" 을 참조하십시오.
IDENTIFIED BY
가 존재하며 글로벌 부여 권한 ( GRANT OPTION
)을 지정하는 경우 계정이 이미 암호가 설정되어있는 경우에도 암호가 계정의 새 비밀번호입니다. IDENTIFIED BY
를 지정하지 않으면 계정의 비밀번호는 변경되지 않은 상태입니다.
GRANT
문에 지정된 계정이 존재하지 않는 경우 수행 할 작업은 NO_AUTO_CREATE_USER
SQL 모드에 따라 다릅니다.
NO_AUTO_CREATE_USER
가 활성화되어 있지 않은 경우,GRANT
는이 계정을 만듭니다.IDENTIFIED BY
를 사용하여 비어 있지 않은 암호를 지정하지 않는 한, 이것은 전혀 안전하지 않습니다.NO_AUTO_CREATE_USER
이 활성화되어있는 경우,IDENTIFIED BY
를 사용하여 비어 있지 않은 암호를 지정하거나IDENTIFIED WITH
를 사용하여 인증 플러그인을 지정하지 않는 한,GRANT
실패하고이 계정을 생성하지 않습니다.
MySQL 5.6.12 시점에서는 계정이 이미 존재하는 경우, IDENTIFIED WITH
새 계정을 만들 때 사용되는 것을 목적으로하고 있기 때문에 금지됩니다.
상황에 따라서는 GRANT
가 서버 로그 또는 클라이언트 측의 ~/.mysql_history
등의 기록 파일에 기록 될 수 있습니다. 즉, 일반 텍스트 암호가 해당 정보에 대한 읽기 권한을 가진 모든 사용자가 읽을 수 있습니다. 이것이 서버 로그에서 발생하는 조건 및이를 제어하는 방법은 섹션 6.1.2.3 "암호 및 로깅" 을 참조하십시오. 클라이언트 측 로깅에 대한 유사한 정보는 섹션 4.5.1.3 "mysql 로그" 를 참조하십시오.
다른 계정 특성
WITH
절은 다음의 몇 가지 용도로 사용됩니다.
사용자가 다른 사용자에게 권한을 부여 할 수 있도록
사용자에 대한 자원 제한을 지정하기 위해
사용자가 서버에 보안 연결을 사용할 필요가 있는지 여부 및 그 방법을 지정하기 위해
WITH GRANT OPTION
절은 사용자가 해당 사용자가 가지는 지정된 권한 수준에있는 모든 권한을 다른 사용자에게 부여 할 수 있도록합니다. 다른 권한을 가진 2 명의 사용자가 권한을 결합 할 수있는 가능성이 있기 때문에 GRANT OPTION
권한을 부여 상대에 충분히주의하십시오.
자신이 보유하지 않은 권한을 다른 사용자에게 부여 할 수 없습니다. GRANT OPTION
권한을 사용하여 할당 할 수있는 것은 자신이 보유하고있는 권한뿐입니다.
사용자에게 특정 권한 수준에서 GRANT OPTION
권한을 부여하면 그 사용자는 그 수준에 보유하고있는 (또는 앞으로 주어질 가능성이있는) 모든 권한도 사용자에서 다른 사용자에게 부여 될 수 있다는 점에 유의하십시오. 사용자 데이터베이스에 대한 INSERT
권한을 부여합니다. 그런 다음 데이터베이스에 대한 SELECT
권한을 부여하고 WITH GRANT OPTION
을 지정하면 사용자는 다른 사용자에게 SELECT
권한뿐만 아니라 INSERT
권한도 부여 할 수 있습니다. 그 후, 그 사용자에게 데이터베이스에 대한 UPDATE
권한을 부여하면 그 사용자는 INSERT
, SELECT
및 UPDATE
를 부여 할 수 있습니다.
관리자가 아닌 사용자는 글로벌 또는 mysql
데이터베이스에 대한 ALTER
권한을 부여해서는 안됩니다. 그렇게하면 그 사용자는 테이블의 이름을 변경하여 권한 시스템의 파괴를 시도 할 수 있습니다.
특정 권한과 관련된 보안 위험 자세한 내용은 섹션 6.2.1 "MySQL에서 제공되는 권한" 을 참조하십시오.
일부 WITH
절 옵션은 계정을 사용하여 서버 자원 사용에 대한 제한을 지정합니다.
MAX_QUERIES_PER_HOUR
,count
MAX_UPDATES_PER_HOUR
및count
MAX_CONNECTIONS_PER_HOUR
제한은 어느 특정 시간 동안이 계정에 허용되는 서버에 쿼리, 업데이트 및 연결 수를 제한합니다. (결과가 쿼리 캐시에서 얻은 쿼리는count
MAX_QUERIES_PER_HOUR
제한에 포함되지 않습니다.)count
가0
(기본값) 인 경우, 이것은이 계정에 대한 제한이없는 것을 나타냅니다.MAX_USER_CONNECTIONS
제한이 계정으로 서버에 최대 동시 연결 수를 제한합니다. 0이 아닌count
count
는이 계정에 대한 제한을 명시 적으로 지정합니다.count
가0
(기본값) 인 경우, 서버는max_user_connections
시스템 변수의 전역 값에서이 계정의 동시 연결 수를 결정합니다.max_user_connections
도 제로인 경우는 계정에 제한이 없습니다.
기존의 권한에 영향을주지 않고 기존 사용자에 대한 자원 제한을 지정하려면 GRANT USAGE
를 글로벌 수준에서 사용 ( ON *.*
) 변경되는 제한을 지정합니다. 예 :
GRANT USAGE ON *. * TO ... WITH MAX_QUERIES_PER_HOUR 500 MAX_UPDATES_PER_HOUR 100;
지정되지 않는 제한은 현재 값을 유지합니다.
서버 리소스에 대한 액세스 제한의 자세한 내용은 섹션 6.3.4 "계정 자원 제한 설정" 을 참조하십시오.
MySQL 사용자 이름과 암호 기반 인증의 일반 이외에 X509 인증서의 속성을 확인할 수 있습니다. MySQL 계정의 SSL 관련 옵션을 지정하려면 GRANT
문 REQUIRE
절을 사용합니다. (MySQL에서의 SSL 사용에 대한 배경 정보는 섹션 6.3.10 "안전한 연결을위한 SSL 사용" 을 참조하십시오.)
특정 계정의 연결 유형을 제한하려면 다음의 몇 가지 가능성이 있습니다.
REQUIRE NONE
이 계정에 SSL 또는 X509의 요구 사항이 없는지를 보여줍니다. 이것은 SSL 관련REQUIRE
옵션이 지정되지 않은 경우 기본값입니다. 사용자 이름과 암호가 유효하면 암호화되지 않은 연결이 허용됩니다. 그러나 클라이언트에 적절한 인증서와 키 파일이 존재하는 경우, 클라이언트 옵션에서 암호화 된 연결도 사용할 수 있습니다. 즉, 클라이언트는 어떤 SSL 명령 옵션도 지정 할 필요가없고,이 경우 연결이 암호화되지 않습니다.암호화 된 연결을 사용하려면 클라이언트는--ssl-ca
옵션 또는--ssl-ca
,--ssl-key
,--ssl-cert
세 가지 옵션을 모두 지정해야 있습니다.REQUIRE SSL
옵션이 계정의 SSL 암호화 연결 만 허용하도록 서버에 지시합니다.GRANT ALL PRIVILEGES ON test. * TO 'root'@ 'localhost' IDENTIFIED BY 'goodsecret'REQUIRE SSL;
연결하려면 클라이언트는 서버 인증서를 인증하기위한
--ssl-ca
옵션을 지정해야 더--ssl-key
및--ssl-cert
옵션을 지정할 수 있습니다.--ssl-ca
옵션--ssl-capath
옵션을 모두 지정되지 않은 경우 클라이언트는 서버 인증서를 인증하지 않습니다.REQUIRE X509
은 클라이언트에 유효한 인증서가 존재해야하지만, 정확한 인증서 발급자 및 주체는 문제가되지 않음을 나타냅니다. 유일한 요구 사항은 하나의 CA 인증서로 서명을 검증 할 수 있어야한다는 것입니다.GRANT ALL PRIVILEGES ON test. * TO 'root'@ 'localhost' IDENTIFIED BY 'goodsecret'REQUIRE X509;
연결하려면 클라이언트는
--ssl-ca
,--ssl-key
및--ssl-cert
옵션을 지정해야합니다.REQUIRE
옵션ISSUER
및SUBJECT
는 암묵적으로X509
을 나타 내기 때문에, 이것은 또한 이러한 옵션에 적용됩니다.REQUIRE ISSUER '
연결 시도에서 클라이언트가 CAissuer
''
에 의해 발행 된 유효한 X509 인증서를 제공해야한다는 제한을 설정합니다. 클라이언트가 유효하지만, 다른 발행자가 포함 된 인증서를 제공 한 경우 서버는 연결을 거부합니다. X509 인증서의 사용은 항상 암호화가 포함되므로이 경우issuer
'SSL
옵션이 필요하지 않습니다.GRANT ALL PRIVILEGES ON test. * TO 'root'@ 'localhost' IDENTIFIED BY 'goodsecret' REQUIRE ISSUER '/ C = FI / ST = Some-State / L = Helsinki / O = MySQL Finland AB / CN = Tonu Samuel/emailAddress=tonu@example.com ';
'
값은 하나의 문자열로 입력하도록하십시오.issuer
'참고MySQL이 0.9.6h 이전 버전의 OpenSSL에 연결되어 있다면,
'
값은issuer
'emailAddress
대신Email
을 사용합니다.REQUIRE SUBJECT '
연결 시도에서 클라이언트가 주제subject
'subject
를 포함한 유효한 X509 인증서를 제공해야한다는 제한을 설정합니다. 클라이언트가 유효하지만, 다른 주제를 포함하는 인증서를 제공 한 경우 서버는 연결을 거부합니다.GRANT ALL PRIVILEGES ON test. * TO 'root'@ 'localhost' IDENTIFIED BY 'goodsecret' REQUIRE SUBJECT '/ C = EE / ST = Some-State / L = Tallinn / O = MySQL demo client certificate / CN = Tonu Samuel/emailAddress=tonu@example.com ';
'
값은 하나의 문자열로 입력하도록하십시오. MySQL은이 값과 인증서의 값 간단한 문자열 비교를 수행하기 위해 대문자와 소문자의 구별이나 구성 요소의 순서는 인증서에있는 것과 정확하게 같은 방식으로 지정해야 있습니다.subject
'참고emailAddress
내용은REQUIRE ISSUER
설명에있는 참고를 참조하십시오.충분한 강도의 암호화 및 키 길이가 확실히 사용되도록하려면
REQUIRE CIPHER '
이 필요합니다. 짧은 암호화 키를 사용하는 기존 알고리즘이 사용되면 SSL 자체가 약 해지는 경우가 있습니다. 이 옵션을 사용하면 연결에 특정 암호화 방식을 사용하도록 요청할 수 있습니다.cipher
'GRANT ALL PRIVILEGES ON test. * TO 'root'@ 'localhost' IDENTIFIED BY 'goodsecret' REQUIRE CIPHER 'EDH-RSA-DES-CBC3-SHA';
SUBJECT
, ISSUER
및 CIPHER
옵션을 REQUIRE
절에서 다음과 같이 결합 할 수 있습니다.
GRANT ALL PRIVILEGES ON test. * TO 'root'@ 'localhost' IDENTIFIED BY 'goodsecret' REQUIRE SUBJECT '/ C = EE / ST = Some-State / L = Tallinn / O = MySQL demo client certificate / CN = Tonu Samuel/emailAddress=tonu@example.com ' AND ISSUER '/ C = FI / ST = Some-State / L = Helsinki / O = MySQL Finland AB / CN = Tonu Samuel/emailAddress=tonu@example.com ' AND CIPHER 'EDH-RSA-DES-CBC3-SHA';
이러한 옵션의 순서는 문제가되지 않지만 어떤 옵션도 두 번 지정할 수 없습니다. AND
키워드는 REQUIRE
옵션 간의 옵션입니다.
1 명의 사용자 테이블, 열, 또는 일상 권한을 사용하는 경우 서버는 모든 사용자 테이블, 열 및 루틴 권한을 검사하기 위해이를 통해 MySQL이 조금 느려집니다. 마찬가지로 하나의 사용자 쿼리, 업데이트 또는 연결 수를 제한하면 서버는이 값을 모니터해야합니다.
MySQL 버전 표준 SQL 버전의 GRANT
MySQL 버전 표준 SQL 버전의 GRANT
의 가장 큰 차이점은 다음과 같습니다.
MySQL은 권한을 사용자 이름뿐 아니라 호스트 이름과 사용자 이름 조합에 연결합니다.
표준 SQL은 글로벌 또는 데이터베이스 레벨의 권한을 가지지 않고, 또한 MySQL이 지원하는 모든 권한 유형을 지원하는 것도 아닙니다.
MySQL은 표준 SQL의
UNDER
권한을 지원하지 않습니다.표준 SQL의 권한은 계층적인 방법으로 구조화되어 있습니다. 사용자를 삭제하면 해당 사용자에게 부여 된 모든 권한이 취소됩니다. 이것은 또한
DROP USER
를 사용했을 경우의 MySQL도 마찬가지입니다. 섹션 13.7.1.3 "DROP USER 구문" 을 참조하십시오.표준 SQL에서는 테이블을 삭제하면 테이블에 대한 모든 권한이 취소됩니다. 표준 SQL에서는 권한을 취소하면 그 권한에 따라 부여 된 모든 권한도 삭제됩니다. MySQL에서는 권한은 명시 적
DROP USER
또는REVOKE
문을 사용하거나 MySQL 부여 테이블을 직접 조작함으로써 만 삭제할 수 있습니다.MySQL에서 테이블의 일부의 컬럼에 대해서만
INSERT
권한을 가질 수 있습니다. 이 경우,INSERT
권한을 가지고있는 컬럼의 값만을 삽입하는 경우 해당 테이블에 계속INSERT
문을 실행할 수 있습니다. 엄격한 SQL 모드가 활성화되어 있지 않은 경우, 생략 된 컬럼은 그 암시 기본값으로 설정됩니다. 엄격 모드에서는 생략 된 컬럼 중 하나에 기본값이 없으면이 문은 거부됩니다. (표준 SQL에서는 모든 컬럼에INSERT
권한을 가지고 있어야합니다.) 섹션 5.1.7 "서버 SQL 모드" 에서는 엄격 모드에 대해 설명하고 있습니다. 섹션 11.6 "데이터 유형 기본값" 는 암시의 기본값에 대해 설명하고 있습니다.