6.3.2 사용자 계정 추가
MySQL 계정은 다음 2 가지 방법으로 만들 수 있습니다.
계정을 만들 수있는 문 (
CREATE USER
나GRANT
등)를 사용한다. 이 문을 실행하면 서버에 의해 부여 테이블에 적절한 변경됩니다.INSERT
,UPDATE
,DELETE
등의 문을 사용하여 MySQL 부여 테이블을 직접 조작한다.
계정 생성 문을 사용하는 것이 부여 테이블을 직접 조작하는 것보다 간결하고 오류 발생률도 낮기 때문에 권장되는 방법입니다. CREATE USER
및 GRANT
내용은 섹션 13.7.1 "계정 관리 문" 에 설명되어 있습니다.
계정을 만들 수있는 또 다른 옵션은 GUI 도구 MySQL Workbench를 사용하는 방법입니다. 또는 MySQL 계정 관리 기능을 제공하는 사용 가능한 여러 서드 파티 프로그램 중 하나를 사용합니다. phpMyAdmin
은 이러한 프로그램의 하나입니다.
다음 예제는 mysql 클라이언트 프로그램을 사용하여 새 계정을 설정하는 방법을 보여줍니다. 이러한 예는 섹션 2.10.2 "처음 MySQL 계정 보안 설정" 에서 설명하는 디폴트에 따라 권한이 설정되어있는 것이 전제가되고 있습니다. 즉, 변경을하려면 MySQL root
사용자로 MySQL 서버에 접속할 필요가 있고, root
계정은 mysql
데이터베이스에 대한 INSERT
권한과 RELOAD
관리 권한을 가지고 있어야합니다.
해당 예에 언급 한 바와 같이 특정 제약이 활성화되도록 서버 SQL 모드가 설정되어있는 경우 일부 문에 실패합니다. 특히 엄격 모드 ( STRICT_TRANS_TABLES
, STRICT_ALL_TABLES
및 NO_AUTO_CREATE_USER
)는 서버가 일부 문을 받아 들일 해결됩니다. 이러한 경우에 대한 해결 방법을 설명합니다. SQL 모드 및 그에 따른 부여 테이블의 조작에 미치는 영향에 대한 자세한 내용은 섹션 5.1.7 "서버 SQL 모드" 및 섹션 13.7.1.4 "GRANT 구문" 을 참조하십시오.
우선, mysql 프로그램을 사용하여 MySQL root
사용자로 서버에 연결합니다.
shell> mysql --user=root mysql
root
계정에 암호를 할당하면이 mysql 명령과이 섹션 뒷부분의 명령에 모두 --password
또는 -p
옵션을 지정해야합니다.
root
로 서버에 접속 한 뒤 새 계정을 추가 할 수 있습니다. 다음 명령문은 GRANT
를 사용하여 4 개의 새로운 계정을 설정합니다.
mysql>CREATE USER 'monty'@'localhost' IDENTIFIED BY 'some_pass';
mysql>GRANT ALL PRIVILEGES ON *.* TO 'monty'@'localhost'
->WITH GRANT OPTION;
mysql>CREATE USER 'monty'@'%' IDENTIFIED BY 'some_pass';
mysql>GRANT ALL PRIVILEGES ON *.* TO 'monty'@'%'
->WITH GRANT OPTION;
mysql>CREATE USER 'admin'@'localhost';
mysql>GRANT RELOAD,PROCESS ON *.* TO 'admin'@'localhost';
mysql>CREATE USER 'dummy'@'localhost';
이 문에서 생성 된 계정에는 다음 속성이 있습니다.
계정 중 두 개는 사용자 이름
monty
암호가some_pass
입니다. 두 계정도 모두 실행하기위한 모든 권한을 가지고 슈퍼 사용자 계정입니다.'monty'@'localhost'
계정은 로컬 호스트에서 접속할 때에 만 사용할 수 있습니다.'monty'@'%'
계정에서는 호스트 부분에'%'
와일드 카드를 사용하고 있기 때문에, 이것을 사용하면 모든 호스트에서 연결할 수 있습니다.monty
되는 모든 곳에서 연결할 수 있도록하려면monty
에 두 계정이 필요합니다.localhost
계정이없는 경우는monty
가 로컬 호스트에서 접속할 때, mysql_install_db에서 생성 된localhost
의 익명 사용자 계정이 우선됩니다. 그 결과,monty
는 익명 사용자로 처리됩니다. 그 이유는 익명 사용자 계정이'monty'@'%'
계정보다 고유의Host
컬럼 값을 가지고 있기 때문에user
테이블 정렬 순서에서보다 빨리 나타날 것입니다. (user
테이블의 정렬 내용은 섹션 6.2.4 "액세스 제어 1 단계 : 연결 확인" 에 설명되어 있습니다.)'admin'@'localhost'
계정에는 암호가 없습니다. 이 계정은admin
이 로컬 호스트에서 접속할 때에 만 사용할 수 있습니다. 여기에는RELOAD
및PROCESS
의 관리 권한이 부여됩니다. 이러한 권한을 가진admin
사용자는 mysqladmin reload, mysqladmin refresh, mysqladmin flush-xxx
명령 및 mysqladmin processlist를 실행할 수 있습니다. 모든 데이터베이스에 액세스 할 수있는 권한이 부여되지 않습니다. 기타GRANT
문을 발행하면 나중에 이러한 권한을 추가 할 수 있습니다.'dummy'@'localhost'
계정에는 암호가 없습니다. 이 계정은 로컬 호스트에서 접속할 때에 만 사용할 수 있습니다. 권한이 부여되지 않습니다. 나중에 계정에 특정 권한을 부여하는 것을 전제로하고 있습니다.
NO_AUTO_CREATE_USER
SQL 모드가 활성화되어있는 경우 암호없이 계정 만들기 문에 실패합니다. 이를 해결하려면 비어 있지 않은 암호를 지정 IDENTIFIED BY
절을 사용합니다.
계정에 대한 권한을 확인하려면 SHOW GRANTS
를 사용합니다.
mysql> SHOW GRANTS FOR 'admin'@'localhost';
+ ------------------------------------------------- ---- +
| Grants for admin @ localhost |
+ ------------------------------------------------- ---- +
| GRANT RELOAD, PROCESS ON *. * TO 'admin'@ 'localhost'|
+ ------------------------------------------------- ---- +
CREATE USER
및 GRANT
대신으로 직접 INSERT
문을 실행 한 후 FLUSH PRIVILEGES
를 사용하여 부여 테이블을 다시로드하도록 서버에 지시하여 동일한 계정을 만들 수 있습니다.
shell>mysql --user=root mysql
mysql>INSERT INTO user
->VALUES('localhost','monty',PASSWORD('some_pass'),
->'Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y');
mysql>INSERT INTO user
->VALUES('%','monty',PASSWORD('some_pass'),
->'Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y',
->'Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y',
->'','','','',0,0,0,0);
mysql>INSERT INTO user SET Host='localhost',User='admin',
->Reload_priv='Y', Process_priv='Y';
mysql>INSERT INTO user (Host,User,Password)
->VALUES('localhost','dummy','');
mysql>FLUSH PRIVILEGES;
INSERT
를 사용하여 계정을 만들 경우, FLUSH PRIVILEGES
를 사용하여 부여 테이블을 다시로드하도록 서버에 지시해야합니다. 그렇지 않으면 서버를 다시 시작할 때까지 변경이 인식되지 않습니다. CREATE USER
는 FLUSH PRIVILEGES
가 필요하지 않습니다.
INSERT
에서 PASSWORD()
함수를 사용하는 이유는 패스워드를 암호화하는 것입니다. CREATE USER
문은 자동으로 암호가 암호화되기 때문에 PASSWORD()
가 필요하지 않습니다.
'Y'
값을 지정하면 계정에 대한 권한을 사용할 수 있습니다. MySQL 버전은 처음 두 개의 INSERT
문에 다른 수의 'Y'
값을 사용할 필요가있을 수도 있습니다. admin
계정에 대한 INSERT
문은 SET
를 사용하여 더 읽기 가능하도록 확장 된 INSERT
구문이 사용되고 있습니다.
dummy
계정에 대한 INSERT
문에서는 user
테이블 행의 Host
, User
, 및 Password
컬럼에만 값이 할당됩니다. 권한 컬럼은 명시 적으로 설정되지 않기 때문에, MySQL에 의해 모든 컬럼에 기본값 'N'
이 할당됩니다. 이것은 CREATE USER
의 동작과 동일합니다.
엄격한 SQL 모드가 활성화되어있는 경우에는 기본값이없는 모든 컬럼에 값을 지정해야합니다. 이 경우 INSERT
문은 명시 적으로 ssl_cipher
, x509_issuer
및 x509_subject
컬럼에 값을 지정해야합니다.
슈퍼 사용자 계정을 설정하는 데 필요한 작업은 모든 권한 컬럼이 'Y'
로 설정 한 user
테이블 행을 삽입 할뿐입니다. user
테이블 권한은 글로벌이기 때문에 다른 부여 테이블 중 하나에 항목이 필요하지 않습니다.
다음 예에서는 3 개의 계정을 생성하고 그들에게 특정 데이터베이스에 대한 액세스 권한을 부여합니다. 각각의 사용자 이름은 custom
이고 암호는 obscure
입니다.
CREATE USER
및 GRANT
를 사용하여 계정을 만들려면 다음 문을 사용합니다.
shell>mysql --user=root mysql
mysql>CREATE USER 'custom'@'localhost' IDENTIFIED BY 'obscure';
mysql>GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP
->ON bankaccount.*
->TO 'custom'@'localhost';
mysql>CREATE USER 'custom'@'host47.example.com' IDENTIFIED BY 'obscure';
mysql>GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP
->ON expenses.*
->TO 'custom'@'host47.example.com';
mysql>CREATE USER 'custom'@'server.domain' IDENTIFIED BY 'obscure';
mysql>GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP
->ON customer.*
->TO 'custom'@'server.domain';
3 개의 계정은 다음과 같이 사용할 수 있습니다.
첫 번째 계정은
bankaccount
데이터베이스에 액세스 할 수 있지만 로컬 호스트에 한정됩니다.두 번째 계정은
expenses
데이터베이스에 액세스 할 수 있지만host47.example.com
호스트에 한정됩니다.세 번째 계정은
customer
데이터베이스에 액세스 할 수 있지만server.domain
호스트에 한정됩니다.
GRANT
를 사용하지 않고 custom
계정을 설정하려면 다음과 같이 INSERT
문을 사용하여 부여 테이블을 직접 수정합니다.
shell>mysql --user=root mysql
mysql>INSERT INTO user (Host,User,Password)
->VALUES('localhost','custom',PASSWORD('obscure'));
mysql>INSERT INTO user (Host,User,Password)
->VALUES('host47.example.com','custom',PASSWORD('obscure'));
mysql>INSERT INTO user (Host,User,Password)
->VALUES('server.domain','custom',PASSWORD('obscure'));
mysql>INSERT INTO db
->(Host,Db,User,Select_priv,Insert_priv,
->Update_priv,Delete_priv,Create_priv,Drop_priv)
->VALUES('localhost','bankaccount','custom',
->'Y','Y','Y','Y','Y','Y');
mysql>INSERT INTO db
->(Host,Db,User,Select_priv,Insert_priv,
->Update_priv,Delete_priv,Create_priv,Drop_priv)
->VALUES('host47.example.com','expenses','custom',
->'Y','Y','Y','Y','Y','Y');
mysql>INSERT INTO db
->(Host,Db,User,Select_priv,Insert_priv,
->Update_priv,Delete_priv,Create_priv,Drop_priv)
->VALUES('server.domain','customer','custom',
->'Y','Y','Y','Y','Y','Y');
mysql>FLUSH PRIVILEGES;
처음 세 개의 INSERT
문은 부여 된 암호를 사용하여 다양한 호스트에서 접속하는 사용자 custom
허용하는 user
테이블 엔트리를 추가하지만 글로벌 권한은 부여하지 않습니다 (모든 권한은 기본값 'N'
으로 설정됩니다). 다음의 3 개의 INSERT
문은 bankaccount
, expenses
, 그리고 customer
데이터베이스에 대한 권한을 custom
부여하지만, 적절한 호스트에서 액세스 할 때 제한되는 db
테이블 항목을 추가합니다. 정상적으로 부여 테이블을 직접 변경하는 경우에는 권한의 변경 사항이 적용되도록 FLUSH PRIVILEGES
를 사용하여 다시로드하도록 서버에 지시해야합니다.
특정 도메인 ( mydomain.com
등)의 모든 컴퓨터에서 액세스 할 수있는 사용자를 만들 때 계정 이름의 호스트 부분에 ' %
'와일드 카드 문자를 사용할 수 있습니다.
mysql> CREATE USER 'myname'@'%.mydomain.com' IDENTIFIED BY 'mypass';
부여 테이블을 직접 수정하여 동일한 작업을 수행하려면 다음과 같이 실행합니다.
mysql>INSERT INTO user (Host,User,Password,...)
->VALUES('%.mydomain.com','myname',PASSWORD('mypass'),...);
mysql>FLUSH PRIVILEGES;