2015년 4월 15일 수요일

MySQL에 새로운 사용자 권한 추가하기(MySQL user add Command/Mysql Grant)

MySQL에 새로운 사용자 권한 추가하기


두가지 방법으로 사용자를 추가할 수 있다 : GRANT 문 사용 또는 mysql 승인 테이블 직접 조작. GRANT 문을 사용하는 것이 더 선호되는 방법이다.

아래의 예제는 새로운 사용자를 설정하기 위해 어떻게 mysql 클라이언트를 사용하는지 보여준다.
이 예제는 이전에 설명했던것과 같이 기본값에 따라 권한을 설정하는 것으로 가정한다.
이것은 설정을 바꾸기 위해  mysqld가 실행되고 있는 같은  시스템에 있어야 한다는  것을 말한다.

(**초기값은 localhost에서만 접속 가능하므로**)
또한 mysql root 사용자로  접속해야 하고 root 사용자는 mysql 데이터베이스에 대한 insert 권한과  reload 관리자 권한이 있어야 한다.
root 사용자의 비밀번호를  바꾸었으면, 아래와 같이 mysql 명령행 상태에서 비밀번호를 명시해야 한다.

GRANT 문을 이용해 새로운 사용자를 추가할 수 있다:

shell> mysql --user=root mysql

mysql> GRANT ALL PRIVILEGES ON *.* TO monty@localhost

        IDENTIFIED BY 'something' WITH GRANT OPTION;

mysql> GRANT ALL PRIVILEGES ON *.* TO monty@"%"

        IDENTIFIED BY 'something' WITH GRANT OPTION;

mysql> GRANT RELOAD,PROCESS ON *.* TO admin@localhost;

mysql> GRANT USAGE ON *.* TO dummy@localhost;



위 GRANT 문에서는 세 명의 사용자를 설정한다:

monty : 어느 곳에서든 서버에 연결할 수 있는 완전한  슈퍼유저이지만 비밀번호를 사용해야 한다.
우리는 monty@localhost 와 monty@"%"를  사용한 GRANT 문에 대해서 반드시 논의를 해야 한다.
localhost  목록을 추가하지 않으면, mysql_install_db 에 의해 생성된 localhost 의 익명 사용자 목록(등록?)이 로컬 호스트에서 접속할때  우선권을 갖는다.
왜냐하면  지정된 Host 필드 값이 있으며 정열 순서에서 먼저 오기 때문이다.
(** 승인 테이블의 정열 순서가 특정한 Host를 지정한 것부터 시작하는 것을 기억하자.

admin : 비밀번호 없이 localhost에서 접속할 수 있으며 reload와 process 관리자 권한을 승인받은 사용자. 이경우 사용자가 mysqladmin processlist 뿐만 아니라 mysqladmin reload, mysqladmin refresh, mysqladmin flush-* 명령을 실행할 수 있다.
데이터베이스와  관련된 권한은 승인되지  않았다.

이것은 추가적인 GRANT 문을 사용해 나중에 승인할 수 있다.

dummy : 비밀번호없이 연결할 수 있지만 오직 localhost에서만  연결 가능한 사용자.
권한 유형(privilege type)이 USAGE 이기 때문에  전체적인 권한이 'N'로 설정되어 있다.
USAGE 는 아무런 권한도 설정하지  않는다. 나중에 데이터베이스와 관련된 권한을 승인할 수 있다.

또한 동일한 사용자 접근 정보를 INSERT 문을 통해 직접 추가할 수 있으며 이경우에는 서버가 승인 테이블을 다시 읽도록 알려주어야  한다.(**FLUSH PRIVILEGES 사용**)

shell> mysql --user=root mysql

mysql>                INSERT                 INTO                user

VALUES('localhost','monty',PASSWORD('something'),'Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y')

mysql> INSERT INTO user VALUES('%','monty',PASSWORD('something'),

        'Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y')

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;

mysql 버전에  따라 위에서  'Y'  값이 다를  수 있다는   것을 기억하자.

3.22.11 버전 이후에서 사용할 수 있는 확장된 INSERT 문은  여기서 admin 사용자에게 사용되었다.

슈퍼유저를 설정하기 위해 권한필드를 'Y'로 한 user 테이블  목록만 만들면 된다는 것을 기억하자. db 나 host 테이블 목록은 필요없다.  (** 관리자 권한은 db나 host 테이블과는 전혀 관련이 없다. db는 접속할  수 있는 데이터베이스에 대해 상세하게 설정하고 host 테이블은 db테이블을  좀 더 정교하게 설정하기 위해 필요한 것이다. 관리자 권한은 오직  user 테이블만 관련되어있다 **)

마지막 INSERT 문(dummy 사용자)에서는 user 테이블의 권한 컬럼이 명확하게 설정되지 않았다. 왜냐면 이 컬럼의 기본값은 'N'로 되어  있기 때문이다.

다음의   예제에서는  custom   이라는   사용자를  추가한다.   custom은 localhost,   server.domain,   whitehouse.gov에서  접속할   수   있다. localhost에서는   bankaccount  데이터베이스에만   접속할   수  있으며 whitehouse.gov에서는 expenses 데이터베이스에, 모든 세  호스트상에서는 customer 데이터베이스에 접속하길 원한다. 모든 세 호스트상에서  stupid라는 비밀번호를 사용하길 원한다.
GRANT 문을 이용 이러한 사용자 권한을 설정하기 위해 다음의 명령을 실행하자:



shell> mysql --user=root mysql

mysql> GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP

        ON bankaccount.*

        TO custom@localhost

        IDENTIFIED BY 'stupid';

mysql> GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP

        ON expenses.*

        TO custom@whitehouse.gov

        IDENTIFIED BY 'stupid';

mysql> GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP

        ON customer.*

        TO custom@'%'

        IDENTIFIED BY 'stupid';

승인 테이블을 직접 수정해 사용자 권한을 설정하려면 다음의 명령을 사용하자. (마지막에 FLUSH PRIVILEGES 를 사용해야 한다는 것을 기억하자):



shell> mysql --user=root mysql

mysql> INSERT INTO user (Host,User,Password)

        VALUES('localhost','custom',PASSWORD('stupid'));

mysql> INSERT INTO user (Host,User,Password)

        VALUES('server.domain','custom',PASSWORD('stupid'));

mysql> INSERT INTO user (Host,User,Password)

        VALUES('whitehouse.gov','custom',PASSWORD('stupid'));

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

       ('whitehouse.gov','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('%','customer','custom','Y','Y','Y','Y','Y','Y');

mysql> FLUSH PRIVILEGES;

처음의 세가지 INSERT 문은 custom 사용자가 비밀번호를  사용하여 다양한 호스트에서 접속할 수 있도록 user 테이블 목록을 추가한다.  그렇지만 그에게 어떠한 퍼미션도 승인하지 않는다. (모든 권한은 기본값으로  'N' 이다) 다음의 세가지 INSERT 문은 적절한 호스트에서 접속을 할  때, custom 에게 bankaccount, expenses, customer 데이터베이스에 대한 권한을  승인하는 db 테이블 목록을 추가한다. 일반적으로 승인 테이블을  직접 수정하였으면, 변경된 권한을 적용하기 위해 서버가 승인 테이블을  다시 읽도록 해 주어야 한다.

특정한 사용자가 특정한 도메인의 시스템에서 접속할 수  있도록 설정하고자 한다면, 다음과 같이 GRANT 문을 설정할 수 있다:



mysql> GRANT ...

        ON *.*

        TO myusername@"%.mydomainname.com"

        IDENTIFIED BY 'mypassword';

승인 테이블을 직접 수정하려면 다음과 같이 한다:



mysql> INSERT INTO  user VALUES ('%.mydomainname.com',  'myusername',PASSWORD('mypassword'),...);

mysql> FLUSH PRIVILEGES;




승인 테이블을 다루기 위해 xmysqladmin, mysql_webadmin, xmysql  프로그램을 사용할 수 있다. http://www.mysql.com/Contrib 에서 이러한  유틸리티를 찾을 수 있다.



* Sample Code )


1. create database test_db

// for Local user
2. grant all privileges on test_db.* to user_phil@localhost identified by 'password'
with grant option

// for Remote User
3. grant all privileges on test_db.* to user_phil@"%" identified by 'password'
with grant option


댓글 없음:

댓글 쓰기