제 5강 Mysql 접근 권한 시스템

  출처 : http://gwangcom.co.kr

 
 제 5강 Mysql 접근 권한 시스템
mysql 은 진보적이지만 비표준적인 보안/권한 시스템을 가지 고 있다.
이번 장에서는 이것이 어떻게 작동하는지를 설명하고 있 다.

5.1 권한 시스템이란 무엇인가?

Mysql 권한  시스템의  주요 기능은   데이터베이스에서 select,  insert, update, delete 권한을 호스트의 사용자 이름과 관련짓는 것이 다.

추가적인 기능에는 익명 사용 자 기능과 LOAD DATA INFILE 과  관리자 오퍼레이션과 같은 mysql 만의 특수한 권한을 허용하는 부분이 포함되어 있다.

Mysql에서 인증을 목적으로 사용하는  사용자 이름은 유닉스 사용자  이름(로그인 이름) 이나 위도우 사용자 이름고는 전혀 관계가 없다는 것을 기억하자.
대부 분 mysql 클라이언트는 mysql 사용자 이름으로 현재의 유닉스 사용자 이름을 사용하여 접속하려 할 것이다.
그렇지만 이건  오직 편의를 위해서이다.
클라이언트 프로그램은 -u  나 --user 옵션으로 지 정한  다른 이름을 허용한다.
이것은 mysql 사용자 이름에 비밀번호 를  설정하지 않으면 데이터베이스의 보안에 문제가 생길 수 있다는 것을 의미한다.
어떤 이름을 사용하여 서버에 접속하려고 하는 사람은 각 이름에 비밀번호가 설정되어 있지 않다면 접속에 성공할 것이 다.

유닉스 사용자  이름이 일반적으로  8글자로 제한되어  있는 것과  다르게 mysql 사용자 이름은 16글자까지 사용할 수 있다.

mysql 비밀번호는 유닉스의 비밀번호와 아무 관련이 없다.  
유닉스 머신에 로그인할 때 사 용하는 비밀번호와 데이터베이스에 접속할 때  사용하는 비밀번호는 전혀 관련이 없다.
또한 mysql은 유닉스 로그인 프로세스에서 사용하는 것 과 다른 알고리즘으로 비밀번호를 암호화한다.

5.2 mysql 서버 에 접속하기

mysql 클라이언트 프로그램 은 일반적으로 연결 패러미터(매개 변수)가  필요하다.
: 연결할 호 스트, 사용자 이름, 비밀번호.
예를 들어 mysql 클라이언트는 다음과 같이 시작할 수 있다. (선택 인자는 [ ] 로 닫는다)

shell>; mysql [-h host_name] [-u user_name] [-pyour_pass]

-p와 뒤에 붙은 비밀번호 사 이에는 공간이 없다는 것을 기억하자.

-h, -u, -p를 대체할 수 있 는 형식으로는
--host=host_name, --user=user_name and -- password=your_pass 이 있다.

mysql은 커맨드 라인에서 연 결 매개변수가 빠져있을 때는 기본  값을 사용한다.
기본 호스트 이름은 localhost 이고 기본 사용자 이름은  유닉스 로그인 이름이다.
(-p 가 빠져있으면 비밀번호는 사용하지 않는다)
그래서 만약 유 닉스 사용자 이름이 joe 라면 다음의 명령은 동일하다.:

shell> mysql -h localhost -u joe
shell> mysql -h localhost
shell> mysql -u joe
shell> mysql

다른 mysql 클라이언트도 비 슷하게 작동한다.

유닉스 시스템에서 연결을 할 때 사용할 수 있는 기본 값이 있어서 클라이언트 프로그램을 사용할 때 마다 명령행에서 옵션을 사용하지 않아도 된다:

ㅇ 홈 디렉토리의 '.my.cnf' 설정 파일의 [client] 섹션에서  연결 변수를 설정할 수 있다.
파일에서 이와 연관된 섹션은 다음과 같다:

[client]

host=host_name
user=user_name
password=your_pass

ㅇ  환경  변수를  사용하여  연결  변수를  지정할  수  있 다.  
호스트는 MYSQL_HOST 로 지정할 수 있다. Mysql  사용자 이름은 USER, LOGNAME,  또는 LOGIN을 사용할 수 있다.
(이러한 값들은 이 미 유닉스 로그인 이름으로 설정되어  있을  것이다.   그러므로   바꾸지 않는게   좋다)  
비 밀번호는 MYSQL_PWD로 지정할 수 있다.(그렇지만 이것은 안전하지 않 다;)

연결 변수가 여러 가지 방법 을 지정되었다면 명령행에서 지정한 값이 설정 파일과 환경 변수로 설정한 것 보다 우선권을 가진다.
또한 설정 파일의 값이 환경 변수보다 우선권을 가진다.

5. 2. 1 비밀번 호의 보안 유지

다른 사용자가 발견할 수 있 게  비밀번호를 지정하는 방법은 권하지  않는다.
클라이언트 프로 그램을 실행할 때 비밀번호를 지정하는 방법은 아래와 같으며 각 방법마다 위험도를 같이 설명하였다:

ㅇ 명령행에서 -pyour_pass 또는 --password=your_pass 옵션 사용.  
이 방법은 편리하지만 위험한 방법이 다.  
비밀번호를 시스템 상황  프로그램(ps 등)을 통해  볼 수 있 기 때문에 다른 사용자가 명랭행으로 볼 수 있다.
(mysql 클라이언트 는 일반적으로 초기화되는 동안 명령행 인자를 0으로 덮어씌운다.
그렇 지만 값을 볼 수 있는 짧은 틈이 여전히 있다)

ㅇ -p 또는 --password 옵션 사용(비밀번호 값을 지정하지는  않음).
이런 경우 클라이언트 프 로그램은 터미널에서 비밀번호를 물어본다:

shell> mysql -u user_name -p
Enter password: ********

클라이언트는 비밀번호를 칠 때 터미널에서 '*' 문자를  보여준다.
그러므로 다른 사용자가 비 밀번호를 볼 수 없다.
다른 사용자가 볼  수 없으므로 명령행 에서 비밀번호를 입력하는 것 보다 훨씬 더 안전하다.  
그렇지만 이 방법은 비대화식의 스크립트로 클라이언트 프로그램을 사용하면  적절하지 않다.

ㅇ 설정 파일에 비밀번호 저 장.
예를 들어 홈 디렉토리의  '.my.cnf' 파일에서 [client] 섹션 에 비밀번호를 지정할 수 있다.

[client]

password=your_pass

비밀번호를 '.my.cnf' 파일 에 저장한다면 그 파일은 그룹이나 다른 사용자가 읽기/쓰기를 할 수 없도 록 해야  한다.
파일의 퍼미션이 400 이나  600 인지 확인하 자.

ㅇ 비밀번호를 MYSQL_PWD 환 경 변수에 저장할 수 있다.
그렇지만  이 방법은 정말로 위험 하며 사용해서는 안된다.
일부 ps 프로그램은  실행 프로세스의 환경 변수를 보여주는 옵션이 있다;
MYSQL_PWD에 설정을 하면 다른 사 람들이 쉽게 비밀번호를 볼 수 있다.
이런 기능의 ps가 없는 시 스템일지라도 프로세스 환경변수를 검색할 수 있는 방법이 없다고 생각하 는  것은 현명하지 못하다.

이중에서 가장 안전한 방법 은 클라이언트 프로그램이 비밀번호를 요구하거나 적절하게 보안이 된 '.my.cnf' 파일에 비밀번호를 지정하는 것이다.

5.3 mysql에서 제공하는 권한

권한과 관련된 정보는  mysql 데이터베이스의(데이터베이스 이름이  mysql 임) user, db, host, table_priv, columns_priv 테이블에 저장된다.
mysql 서버는 시작할 때, 그리고 환 경을 지정할 때 이 테이블의 내용을 읽어들인다.

mysql에서 제공하는 권한을 설정할 때 사용하는 이름은  아래와 같다.
테이블의 컬럼 이름 은 grant tables의 각 권한 및 권한이  적용되는 context와 연관 되어 있다.

+-------------------+----------------+------------- -----------------+
|  Privilege (권한) |  Column (컬럼) |  Context (환경)            &nb sp; |  
+-------------------+----------------+--------- ---------------------+
|  select           |  Select_priv   |  tables            &nb sp;         |
+-------------------+----------------+--------------- ---------------+
|  insert           |  Insert_priv   |  tables            &nb sp;         |
+-------------------+----------------+--------------- ---------------+
|  update           |  Update_priv   |  tables            &nb sp;         |
+-------------------+----------------+--------------- ---------------+
|  delete           |  Delete_priv   |  tables            &nb sp;         |
+-------------------+----------------+--------------- ---------------+
|  index            |  Index_priv    |  tables            &nb sp;         |
+-------------------+----------------+--------------- ---------------+
|  alter            |  Alter_priv    |  tables            &nb sp;         |
+-------------------+----------------+--------------- ---------------+
|  create           |  Create_priv   |  databases, table or indexs  |
+-------------------+----------------+------- -----------------------+
|  drop            &nb sp;|  Drop_priv     |  databases or tables         |
+-- -----------------+----------------+------------------------------ +
|  grant            |  Grant_priv    |  databases or tables         |
+-------------------+----------------+--------------- ---------------+
|  reload           |  Reload_priv   |  server administration       |
+-------------------+----------------+--------------- ---------------+
|  shutdown         |  Shutdown_priv |  server administration       |
+-------------------+----------------+--------------- ---------------+
|  process          |  Process_priv  |  server administration       |
+-------------------+----------------+--------------- ---------------+
|  file            &nb sp;|  File_priv     |  file access on server       |
+--------------- ----+----------------+------------------------------+

 

select, insert, update, delete 권한은 데이터베이스의 테이블에서  레코드에 대한 오퍼레이션 을 할 수 있도록 허용한다.

SELECT 문은 오직 실제로 테 이블에서 줄(레코드)를 가져올 때만 select 권한이 필요하다.
서버 의 데이터베이스에 접근 권한이 없는 경우라고 하더라도 특정한 SELECT 문은  사용할 수 있다.  
예를 들면 간단한 계산을  위해 mysql 클라이언트를 사용할 수 있다:

mysql> SELECT 1+1;
mysql> SELECT PI()*2;

index(인덱스) 권한은 인덱스 를 생성하거나 제거할 수 있다.
alter 권한은 ALTER TABLE 을 사용할 수 있도록 한다.

create 와 drop 권한은 새로 운 데이터베이스와 테이블을  생성하거나 존재하는 데이터베이스와 테이블 을 제거할 수 있도록 허용한다.

사용자에게 mysql  데이 터베이스의 drop  권한을 허용하면,   그 사용자는 mysql 접근권한 정보가 저장된 데이터베이스를 없앨 수  있다는 것을 명 심하자.

grant 권한은 사용자가 가지 고 있는 권한을 다른 사용자가 가질 수 있도록 허용한다.

file 권한은 LOAD DATA INFILE and SELECT ... INTO OUTFILE  문을 이용하여 서버에 파일을 저장하 고 읽을 수 있는 권한을 허용한다.
이러한 권한을 가진 사용자는 mysql 서버가 읽고 쓸 수 있는 파일을 읽고 쓸 수  있는 권한이 허용 된다.

나머지 권한들은 관리자 오퍼 레이션에 사용되며 mysqladmin 프로그램의 기능을 수행한 다.

아래의 테이블은 각 관리자 권한에 따라 사용할 수 있는  mysqladmin 명령을 보여준 다:

+--------------------+----- -----------------------------------------+
|  Privilege (권한)  |  Command permitted to privilege holders      |
|            &nb sp;       |      (권한에 따라 허용되는 명 령)            &nb sp;|
+--------------------+--------------------------------------- -------+
|  reload            |  reload, refresh, flush-privileges           |
|            &nb sp;       |  , flush-hosts, flush-logs, flush-tables     |
+--------------------+------------------ ----------------------------+
|  shutdown          |  shutdown            &nb sp;                       &nb sp;|
+--------------------+--------------------------------------- -------+
|  process           |  processlist, kill            &nb sp;               |
+--------------------+------------------------ ----------------------+

reload 명령은 서버가 grant 테이블을 다시 읽어 들인다.  
refresh 명령은 모든 열린 테이 블을 닫으며  로그 파일을 열고 닫는다.  
flush- privileges 는 reload 명령과 동의어이다.
다른 flush-* 명령은 refresh 와 비 슷한 기능을 수행한다.
그러나 범위에 제한이 있으며 어떤 경우에는 더 선택할 만하다.
예를 들어  로그 파일만  닫고 다시 열고자  한다면 flush-logs 가 refresh보다 더 나은 선택이다.

(** flush의 옵션으로는 호스 트, 로그  파일, 권한 설정, 테이블,  status variables 설 정 변수가 있다.
SQL 문에서 또는 mysqladmin  유틸리티를 사 용하면 된다. **)

shutdown 명령은 서버를 셧다 운한다.
processlist 명령은 서버에서 실행되고 있는 스레드에 대한 정보를 보여준 다.
kill 명령은 서버 스레드를  죽인다.
언제나 자신의 스레 드는  보거나 죽일 수 있지만 다른 사용자에 의해 시작된 스레드는 프로세 스  권한이 있어야 보거나 죽일 수 있다.

몇가지 권한은 조심스럽게 허 용해야 한다:y:

ㅇ grant(허용) 권한은 사용 자가 다른 사용자의 권한을 설정할  수 있도록 허용한 다.
     다른 권한과 grant 권한을 가진 두 사용자는 권한을  결 합할 수 있다.

ㅇ file 권한은 서버에서 모 든 사람이 읽기 가능한 파일을 읽는데 남용 될 수 있.... SELECT 문을 이용해 접근할 수 있는 내용...

The file privilege can be abused  to read any world-readable file  on the server into a database table,  the contents of which can then  be accessed using SELECT.

(** 굳이 권한을 주지 않아 도 이용할 수 있는 것은 권한을 주지 않는게 낫다는 말이겠지요 **)

ㅇ shutdown 권한은 다른 사 용자에가 완전히 서비스를  사용하지 못하도록 남용될 수 있 다.

ㅇ  process 권한은 비 밀번호를 설정하고 바꾸는 질의를 포함해 현재 수행하고 있는 질의를 보는데 사용될 수 있다.

ㅇ mysql 데이터베이스에 대 한 권한은 비밀번호와 다른 접근  권한 정보를 바꾸는 데 사용될 수 있다. (비밀번호가 암호화되어  저장되었다고 하더라도, 충분 한 권한을 가진 악의있는  사용자는 다른 비밀번호롤 바꿀 수  있다)

mysql 권한 시 스템으로 다룰 수 없는 몇가지가 있다:

ㅇ 접근을 거부할 사용자를 명백하게 지정할 수 없다.
    왜냐하면 사용 자와 연결을 거부하는 것을 완전하게 연관시킬 수 없기 때문이 다.

ㅇ 사용자가 테이터베이스에 서 테이블을 만들고 지울 수 있는 권한을 가질 수 있지만
    데이터베이스 자체를 만들고 삭제할 수는 없도록 지정할  수 없 다.
    ( 그러니까 create 와 drop 권한을 주면 데이터베이스 자체에 대해 제어할 수 있지요.
        그 안의 테이블만  만들고 지울 수 있도록 하지는  못한다 는 말 )