글
MySQL DB 보안(1) | |
MySQL은 세계적으로 널리 쓰이는 가벼운 프리소프트웨어 데이터베이스(Free Software Database)이다. 정확하게 말하면 MySQL은 세계적으로 가장 대중적인 SQL이다. MySQL 말고라도 MSQL 같은 소규모 DB, 또는 ASP와 연동하여 쓰이는 MSSQL 등 많은 다른 SQL이 있긴 하지만 MySQL에는 프리라는 이점 때문에 다른 SQL들 보다 널리 사용되고 있다. 우선 MySQL은 Linux, Apache, PHP 등과 같이 오픈 소스를 지향하는 애플리케이션과 궁합이 잘 맞는다. 전 세계적으로 인터넷 상에서 가장 많은 비중을 차지하는 서버는 리눅스이고, 그 중 PHP와 MySQL의 연동은 리눅스 서버의 근간을 이루고 있다. 하지만 이런 이유로 해커에게 가장 많은 타깃이 되는 목표이기도 하다. 이제 MySQL의 기본 보안설정에 대해서 알아보는 시간을 갖도록 하자. 1. Root 계정 패스워드 점검 MySQL설치 시 root 이름을 갖는 계정이 생성되는데 슈퍼유저(superuser) 계정이다. 초기root 계정 패스워드는 비어 있어 누구라도 MySQL 서버에 root - 패스워드 없이 - 로 접속할 수 있다. 이를 이용하여 데이터베이스의 관리자 권한으로 접근이 가능하여 DB의 추가, 삭제, 변경 등의 모든 권한을 갖게 된다. MySQL Clinet에서 root계정으로 패스워드 입력없이 접근이 되는지 확인한다. [그림 1] 패스워드 입력없이 root 계정으로 접근 Mysql 이라는 데이터베이스에는 계정 정보를 저장하고 있는 user라는 테이블이 존재하며, 해당 테이블에서 사용자명과 패스워드 설정 유무를 확인할 수 있다. [그림 2] user 테이블에서 패스워드 설정되어 있지 않는 root 계정 확인 UPDATE를 사용해서 user 테이블을 직접 수정할 수 있다. 아래의 UPDATE 명령문은 유저가 root인 계정의 패스워드를 password()암호화 함수를 이용하여 새로운 패스워드를 할당 하고 있으며, 하나의 패스워드를 두 개의 root 계정 모두에 동시에 할당하고 있다. UPDATE 명령문은 윈도우와 유닉스에 모두 적용된다. FLUSH PRIVILEGES 명령은 mysql을 다시 시작 하지 않고 바로 권한을 적용 할 수가 있다. 2. 익명 사용자(Anonymous) 계정 패스워드 점검 MySQL 설치 시 root 계정 외에 두 개의 익명 사용자 계정이 생성되고, 사용자 이름이 비어 있는 상태로 만들어 진다. 익명 사용자 계정은 패스워드가 없으며, 따라서 누구라도 이 계정을 사용해서 MySQL서버에 접속할 수 있다. MySQL 5.x부터는 익명사용자가 생성되지 않는다. 유닉스에서는, 두 개 모두가 로컬 호스트에서 접속을 하기 위한 것으로 사용된다. 하나의 계정에 대해서는 localhost 의 호스트 이름을, 또는 다른 계정에 대해서는 실제 호스트 이름 또는 IP 번호를 지정함으로써 로컬 호스트로부터 접속이 이루어져야 한다. 이 계정들은 test 데이터 베이스 및 test_로 시작되는 다른 데이터 베이스를 위한 모든 권한을 가지고 있다. MySQL Clinet에서 사용자 없이(anonymous사용자) 접근이 되는지 확인한다. [그림 3] 계정 없이(anonymous사용자) MySQL에 접근 Mysql 라는 데이터베이스에는 계정정보를 저장하고 있는 user라는 테이블이 존재하며, 해당 테이블에서 사용자명과 패스워드 설정 유무를 확인할 수 있다. [그림 4] mysql.user테이블에서 anonymous사용자 확인 익명 사용자 계정에 패스워드를 할당하기 위해서는, root로 서버에 접속을 한 다음에 SET PASSWORD 또는 UPDATE를 실행한다. 어느 경우에서든지, PASSWORD() 함수를 사용해서 패스워드를 암호화 하도록 한다. UPDATE를 사용할 경우 Root로 서버에 접속을 한 다음에 UPDATE 명령문을 입력하여 적당한 user 테이블 레코드의 Password 컬럼에 값을 할당한다. 이 과정은 윈도우와 유닉스에서 모두 동일하다. UPDATE를 사용해서 user 테이블에 직접 패스워드를 갱신한 다음에는, 서버가 FLUSH PRIVILEGES를 통해 Grant 테이블을 다시 읽어 오도록 해야 한다. 그렇게 하지 않으면, 서버를 재 구동 시키기 전까지 서버는 갱신된 내용을 알지 못하게 된다. 패스워드를 설정하는 방법 이외에 아래와 같이 유저를 삭제하는 방법도 있다. 3. USER 테이블 접근 권한 점검 MySQL에서 접근제어(Access Control)는 Grant tabales에 해당하는 User, db, host, tables_priv, columns_priv 테이블에 권한 정보를 저장하고 MySQL서버를 시작할 때 이 테이블에 있는 내용들을 메모리고 읽어들이고, 권한 변경설정 후에도 다시 한번 읽어들인다. 즉, 접근제어 결정은 GrantTable에 메모리 복사본을 기반으로 수행된다. GrantTalbe중 user 테이블은 HOST, USER, PASSWORD라는 중요 정보를 저장하고 있고 이 테이블에는 사용자 권한 목록 및 사용자 패스워드의 해쉬값등을 포함하고 있다. 이런 중요한 테이블에 대해서는 일반사용자에 대한 접근제어가 이루어져야하며 Select 권한은 DBA(DataBase Administrators)만 사용할 수 있어야 한다. 만약, 웹과 연동되는 DB의 사용자가 USER테이블 접근권한이 있다면 웹과 연동되는 DB의 SQL인젝션 취약성이 있을 경우 DB의 계정 및 인증 정보가 유출될 수 있다. 다음과 같이 Mysql.user테이블에서 전체 DB사용자와 패스워드 해쉬값을 출력할 수 있다. [그림 5] Mysql.user 테이블에서 DB사용자와 패스워드 출력 3.1 점검 방안 Mysql.user테이블에 대한 접근 권한 또는 Select권한(Select_priv)을 갖고 있는 사용자에 대해 점검한다. Show grants 명령문을 이용하여 각 사용자에게 부여된 권한을 살펴본 후 모든 DB에 접근권한이 있거나 MysqlDB에 접근권한이 있는 사용자들을 살펴본다. [그림 6] Mysql.user 테이블에서 SELECT권한 확인 [그림 7] munnt계정에 대한 권한 점검 위의 결과는 munnt 사용자에게 모든 DB와 Table에 접근할 수 있는 모든 권한이 부여되어 있다. ① DBA가 아닌 일반사용자에 대해서 mysql.user(mysql 데이터베이스의 user 테이블)에 대한 모든 접근 권한을 제거한다. 또는 ② DBA가 아닌 일반사용자에 대해서 Select권한을 제거한다. 앞에서 설명한 것 이외에도 다음과 같이 mysql을 사용할 때 보안을 위해 알아 두어야 할 사항들이 있으며, 이 부분은 나중에 다시 자세하게 알아보는 기회를 갖도록 한다. - 샘플 및 테스트 DB 점검 - MySQL 실행 유저 점검 - MySQL 히스토리(history) 파일 점검 - 원격 접근 점검 - MySQL 접속시 보안 방법 - FILE 권한이 승인된 사용자 점검 - 로깅 설정 점검 - GRANT tables에 접근 가능한 사용자 점검 - PROCESS 권한이 부여된 사용자 점검 - SSL(Secure Socket Layer) 설정 점검 [저자] 안랩코코넛 문성태 [출처] 안랩코코넛 SECU-LETTER 2007년 1월호 |
'Security' 카테고리의 다른 글
Tomcat 보안 개요 (0) | 2009.03.12 |
---|---|
centos5 geoip patch하기 (0) | 2008.07.30 |
FreeBSD 보안 하드닝 Tip (0) | 2007.06.11 |
SSH 보안설정 (0) | 2007.06.11 |
[솔라리스 강좌] 설정 변경과 시스템 보안 설정 (0) | 2006.06.11 |
RECENT COMMENT