2009년 9월 29일 화요일

MySQL 유저관리3

패스워드 세팅

사용자 패스워드를 세팅하는 경우, 다음과 같은 구문이 된다. 실행에 필요한 권한은 mysql권한테이블에 대해서 UPDATE권한이다.

SET PASSWORD FOR '유저명'@'호스트' = PASSWORD('평문패스워드')

패스워드 세팅은 mysqladmin명령어로도 가능하다.

mysqladmin -u 유저명 password "평문패스워드"
이때 mysqladmin명령어를 실행한 호스트가 MySQL서버위에 인식되어 '유저명'@'호스트' 형식으로 해석된다.


유저명 변경

유저명을 변경하는 데에는 다음 구문을 사용한다.
유저명을 변경하는 데에는 CREATE USER권한, 또는 권한테이블에 대한 UPDATE권한이 필요하다.

RENAME USER '지금 유저명'@'호스트' TO '새로운 유저명'@'호스트' [, old_user TO new_user] ...


권한정보를 다시 읽어들이기

권한테이블 내용을 다시 메모리에 읽어들이기 위해서는 다음과 같이 한다.

shell$ mysqladmin -uroot reload

mysql> FLUSH PRIVILEGES;


GRANT, REVOKE, CREATE USER, DROP USER, SET PASSWORD FOR문을 실행한 경우는 수동으로 다시 읽어들 일 필요는 없다.



2009년 9월 27일 일요일

MySQL 유저관리2

유저권한 확인

유저의 권한을 확인하는 경우 다음과 같은 구문이 된다.

SHOW GRANTS FOR '유저명'@'호스트'

MySQL에서는 유저는 호스트하고 한 쌍이라는 것을 잊지말아야한다.
"USAGE" 행만 표시되는 경우, "아무권한도 가지고 있지않다."라는 의미이다.

유저권한 삭제

유저권한을 삭제하는 경우는 REVOKE문을 사용한다. 실행하는 데에는 GRANT OPTION과 권리를 삭제하는 권한을 갖고 있을 필요가 있다.

유저명과 호스트명을 한 쌍이라는 것을 잊지말아야한다.

모든 권한을 삭제해도 유저 자체가 삭제되는 경우는 없다.

REVOKE 권한 [(필드명 [,필드명 ...] )] [,권한 [(필드명 [,필드명 ...] )] ] ...
ON {
[TABLE] {테이블명|*|*.*|데이터베이스명.*}
|PROCEDURE 데이터베이스명.스토어드프로시져명
|FUNCTION 데이터베이스명.FUNCTION명
}
FROM '유저명'@'호스트' [,'유저명'@'호스트' ]...

REVOKE예제
mysql>REVOKE DELETE ON test.* FROM 'user'@'localhost';


유저삭제
유저를 삭제하는 구문은 다음과 같이 된다. 유저를 삭제하려면 CREATE USER 또는 mysql권한 테이블에 대해서 DELETE권한이 필요하게 된다.
MySQL 4.1까지는 유저에 어떠한 권한이 있으면 삭제가 되지 않았다.

DROP USER '유저명'@'호스트'

2009년 9월 24일 목요일

MySQL 유저관리1: 유저추가

유저를 추가하는 경우 CREATE USER문이던지 GRANT문을 사용한다.

존재하지 않는 유저인 경우에는 자동적으로 추가된다.

1. CREATE USER '사용자명'@'호스트' [IDENTIFIED BY [PASSWORD] '평문 패스워드'] [, '사용자명'@'호스트' [IDENTIFIED BY [PASSWORD] '평문 패스워드']] ...

CREATE USER로 새로이 생성된 유저에는 권한은 없다.


2. GRANT 권한 [(필드명[,필드명...])] [,권한 [(필드명[,필드명...])] ] ...
ON {
[TABLE] {테이블명|*|*.*|데이터베이스명.*}
| PROCEDURE 데이터베이스명.스토어드프로시져명
| FUNCTION 데이터베이스명.FUNCTION명
}
TO '사용자명'@'호스트' [IDENTIFIED BY [PASSWORD] '평문 패스워드']
[, '사용자명'@'호스트' [IDENTIFIED BY [PASSWORD] '평문 패스워드']] ...

[REQUIRE
NONE |
[{SSL|X509}]
[CIPHER 'cipher' [AND]]
[ISSUER 'issuer' [AND]]
[SUBJECT 'subject' ]
]

[WITH 리소스* [리소스*] ...]

리소스*={
GRANT OPTION
| MAX_QUERIES_PER_HOUR 수
| MAX_UPDATES_PER_HOUR 수
| MAX_CONNECTIONS_PER_HOUR 수
| MAX_USER_CONNECTIONS 수
}


ON구절은 MySQL 5.0.6에서부터 사용할 수 있게 되었다. 부여하는 권한은 TABLE, PROCEDURE, FUNCTION가운데 지정한다. 또 REQUIRE구절은 SSL통신을 수행하고자 할 경우 사용한다. WITH구절은 리소스 제한을 하고 싶은 경우, GRANT문을 실행하고 있는 유저의 권한을 부여하고 싶을 경우 지정한다.

권한부여예
mysql>GRANT INSERT, SELECT, UPDATE, DELETE ON test.* TO 'user'@'localhost' IDENTIFIED BY 'pass';



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;