2009년 9월 23일 수요일

MySQL 유저인증과 권한

MySQL에서는 유저명, 패스워드, 권한등은 전부 "mysql" 데이터베이스의 여러개의 테이블(권한 테이블이라고 불리움)에 기록된다.
유저명과 호스트명(IP address)이 셋트로 인증에 사용되고 유저명이 같아도 호스트가 다르면 다른 것으로 취급된다.

유저는 OS계정이나 데이터베이스, MySQL서버 프로세스하고는 전혀 관계가 없다.
또. "데이터베이스 소유자" 라는 개념도 없다.
부여된 권한에 따라서 데이터베이스나 테이블에 관한 조작이 제한되는 것뿐이다.
권한 정보는 기동시에 테이블에서 메모리로 로드된다.

초기 인스톨 상태에서는 모든 조작이 허용되는 'root'@'localhost'(패스워드 없음)가 존재한다.
운용전에 패스워드를 설정하는 것을 잊어버려서는 안된다.
또 'root'라는 유저명을 변경해도 상관없다.

유저명과 호스트

유저명과 호스트는 세트로 인증에 사용된다. 호스트에는 호스트명또는 IP주소, 네트워크지정이 가능하다. 네트워크 지정의 경우는 비트마스크 형식으로는 지정되지 않는 것을 주의해야한다.

유저명과 호스트 예
'user1'@'server1'
'user1'@'server1.domain.jp'
'user1'@'192.168.0.1'
'user1'@'192.168.0.0/255.255.255.192'
'user1'@'192.168.0.%'
'user1'@'%'
''@'127.0.0.1'

  • 127.0.0.1과 localhost
Unix계열 MySQL서버의 경우 MySQL은 "127.0.0.1"과 "localhost"를 다른 걸로 다룬다. 127.0.0.1는 서버에 TCP/IP를 사용해서 접속해온 클라이언트, localhost는 소켓파일을 사용해서 접속해온 클라이언트로 다루게 된다.

  • 와일드카드
호스트 부분의 "%"는 와일드카드로 어떠한 문자열에도 매치한다. 호스트에 지정한 경우는 "모든것"을 의미한다. "_"는 한 문자에 매치한다. 그리고 유저명에는 "%", "_"의 와일드카드는 지정할 수 없다.

  • Anonymous유저
유저부분을 공백으로 한 경우, 어떠한 유저라도 매치하게 된다. MySQL 초기 인스톨 상태의 경우, test데이터베이스에 대해서 이 Anonymous유저가 접근할 수 있도록 되어있다.
실제 운용으로 들어갈 때에는 시큐리티 홀이 되기쉽기때문에 Anonymous유저를 삭제할 것을 추천한다.
Anonymous유저의 경우 mysql.user.User컬럼,mysql.db.User 컬럼, mysql.tables_priv.User컬럼, mysql.columns_priv.User컬럼, mysql.procs_priv.User컬럼이 공문자로 되어있다.
이것에 해당되는 레코드를 삭제하고 FLUSH PRIVILEGES를 실행하면 Anonymous유저를 삭제할 수 있게된다.


Anonymous유저 확인예
mysql>SELECT * FROM mysql.user WHERE mysql.user.User = '';
mysql>SELECT * FROM mysql.db WHERE mysql.db.User = '';
mysql>SELECT * FROM mysql.tables_priv WHERE mysql.tables_priv.User = '';
mysql>SELECT * FROM mysql.columns_priv WHERE mysql.columns_priv.User = '';
mysql>SELECT * FROM mysql.procs_priv WHERE mysql.procs_priv.User = '';


Anonymous유저 삭제예
mysql>DELETE FROM mysql.user WHERE mysql.user.User = '';
mysql>DELETE FROM mysql.db WHERE mysql.db.User = '';
mysql>FLUSH PRIVILEGES;