• MySQL매뉴얼
    • MySQL 5.6 매뉴얼
    • MySQL 5.1 매뉴얼
    • MySQL 5.0 매뉴얼
    • MySQL HA 매뉴얼
  • 기술문서
    • Xtrabackup 구성
    • 메모리 사용량 모니터링
  • 라이선스
  • 온라인문의
  • 회사소개
  • → 목 록 (MySQL5.6 한글메뉴얼) [close]
  • 1. MySQL 5.6 새로운 기능
  • 2. MySQL 설치 및 업그레이드
  • 3. MySQL Tutorial
  • 4. MySQL 프로그램
  • 5. MySQL 서버관리
  • 6. 보안
  • 1. 일반적인 보안 문제
    2. MySQL 권한 시스템
    3. MySQL 사용자 계정 관리
    1. 사용자 이름과 암호
    2. 사용자 계정 추가
    3. 사용자 계정 삭제
    4. 계정 자원 제한 설정
    5. 계정 암호 지정
    6. 암호 만료 및 샌드 박스 모드
    7. 플러그 인증
    8. MySQL에서 사용 가능한 인증 플러그인
    9. 프록시 사용자
    10. 보안 연결을 위해 SSL 사용
    11. SSH를 사용하여 Windows에서 MySQL에 대한 원격 연결
    12. MySQL Enterprise Audit 로그 플러그인
    13. SQL 기반의 MySQL 계정 활동 감사
  • 7. 백업 및 복구
  • 8. 최적화
  • 9. Language Structure(언어구조)
  • 10. Character Sets(Globalization)
  • 11. 데이터형(Data Types)
  • 12. 함수와 연산자
  • 13. SQL 문법
  • 14. InnoDB 스토리지 엔진
  • 15. 기타 스토리지 엔진
  • 16. 고가용성 및 확장성
  • 17. 리플리케이션
  • 18. MySQL Cluster
  • 19. 파티셔닝
  • 20. Stored Programs and Views
  • 21. INFORMATION_SCHEMA
  • 22. PERFORMANCE SCHEMA
  • 23. 컨넥터 및 API
  • 24. MySQL 확장
  • 25. MySQL Enterprise Edition
  • 26. MySQL Workbench
  • 27. 제약 및 제한
  • 28. MySQL 5.7 새로운 기능

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;


서울시 강남구 영동대로 602 6층
TEL: 02-6061-0006  /  E: csr@mysqlkorea.com
주식회사 이노클러스터  등록번호 : 727-86-02261
Copyright © innocluster Co. ltd. all rights reserved