Recommanded Free YOUTUBE Lecture: <% selectedImage[1] %>

Contents

MySQL 접근 권한 설정

MySQL은 호스트, 계정 단위로 데이터베이스에 대한 접근권한을 설정 할 수 있다. 권한 설정은 GRANT를 이용한다.
GRANT ALL ON db1.* To 'yundream'@'172.17.0.1' IDENTIFIED BY 'password'
  • GRANT : 권한 설정을 위한 MySQL 명령
  • ALL : 테이블에 대한 권한(Table Privileges)을 설정한다. SELECT, DELETE, CREATE, UPDATE, DROP ... 등의 권한을 설정할 수 있다.
  • db1.* : 권한을 적용할 테이블을 설정한다. 각 테이블 단위로 설정 할 수 있다. "*"을 이용해서 데이터베이스에 있는 모든 테이블에 권한을 적용 할 수 있다.
  • 유저@호스트 : 권한을 적용할 유저와 호스트다. 모든 호스트에 대해서 권한을 허용하고 싶다면 "%"를 사용하면 된다.
  • IDENTIFIED BY 'password' : password를 가지는 계정을 만든다. IDENTIFIED BY는 생략 할 수 있는데, 이 경우 CREATE USER로 유저를 미리 만들어야 한다.
GRANT SELECT, INSERT, UPDATE, DELETE ON shopping.* To 'wordpress'@'172.17.0.1' IDENTIFIED BY 'mypassword'
172.17.0.1에서 접근하는 wordpress 계정에 대해서 shopping 데이터베이스에 있는 모든 테이블에 "SELECT, INSERT, UPDATE, DELETE" 권한을 준다. "mypassword"를 패스워드로 설정했다. 명령을 실행하면, mysql 데이터베이스의 user 테이블과 db 테이블에 유저권한이 설정된다.
mysql> use mysql;
mysql> select * from user where user='wordpress' \G
*************************** 1. row ***************************
                  Host: 172.17.0.1
                  User: wordpress
           Select_priv: N
           Insert_priv: N
// ......
// 중간 생략
// ......
Create_tablespace_priv: N
              ssl_type: 
            ssl_cipher: 
           x509_issuer: 
          x509_subject: 
         max_questions: 0
           max_updates: 0
       max_connections: 0
  max_user_connections: 0
                plugin: mysql_native_password
 authentication_string: *FABE5482D5AADF36D028AC443D117BE1180B9725
      password_expired: N
 password_last_changed: 2018-11-14 14:24:42
     password_lifetime: NULL
        account_locked: N
1 row in set (0.00 sec)
mysql> select * from db where user='wordpress' \G
*************************** 1. row ***************************
                 Host: 172.17.0.1
                   Db: shopping
                 User: wordpress
          Select_priv: Y
          Insert_priv: Y
          Update_priv: Y
          Delete_priv: Y
          Create_priv: N
            Drop_priv: N
           Grant_priv: N
      References_priv: N
           Index_priv: N
           Alter_priv: N
Create_tmp_table_priv: N
     Lock_tables_priv: N
     Create_view_priv: N
       Show_view_priv: N
  Create_routine_priv: N
   Alter_routine_priv: N
         Execute_priv: N
           Event_priv: N
         Trigger_priv: N
1 row in set (0.00 sec)

CREATE USER로 유저를 만들고 권한을 적용해 보자.
GRANT ALL ON shopping.* TO 'yundream'@'172.17.0.1';

SHOW GRANT명령으로 유저 권한을 읽을 수 있다.
mysql> show grants for 'yundream'@'172.17.0.1';
+-----------------------------------------------------------------+
| Grants for yundream@172.17.0.1                                  |
+-----------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'yundream'@'172.17.0.1'                   |
| GRANT ALL PRIVILEGES ON `shopping`.* TO 'yundream'@'172.17.0.1' |
+-----------------------------------------------------------------+
2 rows in set (0.00 sec)

유저가 실행할 수 있는 쿼리 갯수를 설정 할 수도 있다. 1시간에 10번의 쿼리만 허용했다.
ALTER USER 'yundream'@'172.17.0.1' WITH MAX_QUERIES_PER_HOUR 10;
해당 유저가 10번 이상의 쿼리를 실행하면 아래와 같은 에러메시지를 출력한다.
insert into items SET id=5, name='4';
ERROR 1226 (42000): User 'yundream' has exceeded the 'max_questions' resource (current value: 10)

글로벌 권한

데이터베이스를 사용하는 애플리케이션의 경우, 테이블단위로 권한을 설정한다. 반면 데이터베이스 관리자의 경우에는 글로벌 권한을 줘야 할 것이다.
GRANT ALL ON *.* TO 'dbadmin'@'172.17.0.1' IDENTIFIED BY 'mypassword'

데이터베이스 전체 권한

database.*으로 데이터베이스 전체에 권한을 줄 수 있다.
GRANT ALL ON mydb.* TO 'someuser'@'somehost';

테이블단위 권한

database.table로 테이블단위로 권한을 줄 수 있다.
GRANT ALL ON mydb.mytable TO 'someuser'@'somehost';