ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • mysql - 유저 생성과 권한 부여하기
    프로그래밍/DB 2015. 4. 25. 20:19
    반응형



    참고사이트

    https://bharath256.wordpress.com/2008/12/08/access-denied-for-user-root-to-database/

    https://dev.mysql.com/doc/refman/5.0/en/adding-users.html

    https://dev.mysql.com/doc/refman/5.1/en/grant.html

    https://dev.mysql.com/doc/refman/5.0/en/connection-access.html




    우선 사용자를 생성하기 위해 console에서 root로 mysql를 실행한다. 


    mysql -u root -p 

    (암호 입력) 


    유저 생성 명령은 기본적으로 아래와 같다. 


    CREATE USER 'username'@'host'  IDENTIFIED BY 'some_pass' ;



    유저 생성 예시들 



    mysql> CREATE USER 'monty'@'localhost' IDENTIFIED BY 'some_pass';


    localhost에서 접속할 때 사용할 수 있는 monty user 생성


    mysql> GRANT ALL PRIVILEGES ON *.* TO 'monty'@'localhost' WITH GRANT OPTION;


    'monty'@'localhost' 유저에게 관리자 권한을 준다. 


    mysql> CREATE USER 'monty'@'%' IDENTIFIED BY 'some_pass';

     %는 아무 호스트를 의미하며 호스트에서 wildcard 역할을 한다. 

    어디서나 접속할 때 사용할 수 있는 monty user 생성


    mysql> GRANT ALL PRIVILEGES ON *.* TO 'monty'@'%' WITH GRANT OPTION;


    'monty'@'%' 유저에게 관리자 권한을 준다. 


    mysql 에서는 하나의 사용자에게 호스트 별로 다른 권한을 주는 것이 가능하다. 

    이렇게 하나의 사용자에게 여러 권한이 있으면 mysql 내부 기준으로 권한을 정렬하여 

    제일 구체적으로 명시되어 있는 권한부터 사용하게 된다. 

    이럴때 정렬 기준은 호스트 -> 사용자 순서로 구체적인 권한이 있나 확인한다. 

    호스트에서는 %(모든 호스트)가 가장 낮은 우선 순위을 가지고 사용자에서는 ' ' (아무나)가 가장 낮은 우선 순위을 가진다. 


    이 때 주의해야할 것이 로컬 호스트에 ' '(anonymous, 익명의, 아무나)의 권한이 이미 설정되어 있고 

    %에만 특정 사용자가 생성되어 있고 로컬호스트에는 특정 사용자가 생성되어 있지 않으면 

    로컬호스트로 특정 사용자가 접근을 했을때 익명 유저의 로컬호스트 권한이 

    특정 유저의 전체 호스트 권한보다 더 우선순위가 있으므로(호스트 권한이 유저의 권한보다 정렬 기준이 높음!)

    특정 유저에게 로컬호스트의 익명 유저의 권한이 사용된다는 것이다. 


    추가 예시 ) 권한 정렬 전의 사용자 테이블 

    +-----------+----------+-

    | Host      | User     | ...

    +-----------+----------+-

    | %         | root     | ...

    | %         | jeffrey  | ...

    | localhost | root     | ...

    | localhost |          | ...

    +-----------+----------+-


    권한 정렬 후의 사용자 테이블 

    +-----------+----------+-

    | Host      | User     | ...

    +-----------+----------+-

    | localhost | root     | ...

    | localhost |          | ...

    | %         | jeffrey  | ...

    | %         | root     | ...

    +-----------+----------+-


    이 예시에서는 로컬호스트에서 jeffrey로 접근해도 로컬호스트의 익명 사용자 권한이 사용되게 된다. 

    참고로 지금 접속한 사용자가 어떤 권한을 사용하는지 확인하려면 current_user 함수를 사용하면 된다. 


    current_user 함수는 username@host_name 형태로 사용자 테이블에서 지금 선택된 사용자와 호스트 명을 알려준다. 

    아래 예시에서 jeffrey 가 current_user 함수를 사용했을 경우 익명의 로컬호스트 권한이 적용된 것을 확인할 수 있다.  


    mysql> SELECT CURRENT_USER();

    +----------------+

    | CURRENT_USER() |

    +----------------+

    | @localhost     |

    +----------------+



    mysql> CREATE USER 'admin'@'localhost' IDENTIFIED BY 'admin_pass';

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


    로컬호스트의 admin 유저에게 전체 권한을 주는 대신 특정 권한(RELOAD, PROCESS)을 준다. 


    mysql> CREATE USER 'dummy'@'localhost';


    암호를 사용하지 않을 때는 IDENTIFIED BY 'some_pass' 이 부분을 빼고 위와 같이 사용한다. 



    특정 유저의 권한을 보려면 show grants를 사용한다.

    mysql> SHOW GRANTS for 'user'@'host'; 






    마지막으로 Insert문을 사용하여 유저 테이블에 엔트리를 직접 넣을 때는 flush privileges를 사용해서 

    grant table을 다시 로드해야 한다고 알려야 하지만 create user를 사용할 때는 그럴 필요는 없다. 



     



    728x90
    반응형
Designed by Tistory.