DBMS 2
DA, SQL, DB보안 등 실무자를 위한 위한 DB기술 바이블!
이 섹션에서는 다른 사람의 악성적인 공격에 대응하게끔 MySQL을 보다 안정적으로 설치하는 방법에 대해서 설명을 하도록 한다. MySQL사용자 계정을 설정하고 데이터 베이스 접근을 제어하는 접근 제어 시스템에 관련된 사항은 Section 5.8, “MySQL 접근 권한 시스템”에서 다루기로 한다. 인터넷에 연결되어 있는 컴퓨터에서 MySQL을 사용하고 있는 사용자들이라면 이 섹션을 읽기 바란다. MySQL은 사용자가 수행하고자 시도하는 모든 접속, 쿼리, 그리고 다른 실행 동작에 대해 접근 제어 리스트(ACL)에 근거를 한 보안 정책을 사용하고 있다. 또한 MySQL 클라이언트와 서버 사이의 SSl-암호화 접속도 지원을 한다. 여기에서 설명하는 많은 개념들은 MySQL에만 국한되지 않는다; 동일한 개념들이 거의 모든 어플리케이션에도 적용된다. MySQL을 구동할 때에는 가능하면 항상 아래의 가이드 라인을 준수하기 바란다: MySQL 서버에 접속을 할 때에는 패스워드를 사용하도록 한다. 클라이언트 접속 시퀀스 동안 패스워드를 처리하는 방식은 MySQL 4.1.1에서 많은 업그레이드가 되었다. 만약에 여러분이 아직도 4.1.1 이전 버전 형태의 패스워드를 사용한다면, 암호화 알고리즘이 새 버전의 알고리즘만큼 견고하지 못한 것이다. 명석한 공격자라면, 약간의 노력만 가지고도 클라이언트와 서버간의 통신을 가로채서 패스워드를 해석할 수가 있다. 다른 모든 정보는 텍스트 형태로 전송되는데, 이것은 접속을 지켜보는 사용자라면 누구라도 읽을 수가 있는 것이다. 만약에 클라이언트와 서버간의 접속이 신뢰도가 떨어지는 네트워크를 통해 이루어 진다면, 그리고 여러분이 이에 대해 걱정을 한다면, 압축 프로토콜을 사용해서 통신을 해석하는 것을 더욱 어렵게 만들 수도 있다. 또한 MySQL 내부 SSL을 사용해서 보안성을 보다 좋게 만들 수도 있다. Section 5.9.7, “보안 접속 사용하기”를 참조할 것. MySQL 시스템의 보안성을 좋게 하기 위해서는, 여러분은 아래의 내용을 정확하게 숙지해야 한다: 아래의 mysqld 옵션들은 보안성에 영향을 주는 것들이다: LOAD DATA 명령문은 서버 호스트에 있는 파일을 읽어거나, 또는 LOCAL 키워드가 지정이 되면 클라이언트에 있는 파일을 읽어 온다. LOAD DATA 명령문에 대한 LOCAL 버전 지원에는 잠재적으로 두 가지의 보안 이슈가 존재 한다: 이러한 문제를 다루기 위해서, 우리는 LOAD DATA LOCAL 처리 방법을 다음과 같이 변경하였다: 윈도우 시스템의 경우, 여러분은 일반 사용자 계정을 사용해서 MySQL 서버를 윈도우 서비스 형태로 구동 시킬 수가 있다. 유닉스 시스템의 경우에는, MySQL 서버 mysqld는 모든 사용자가 시작 및 구동을 시킬 수가 있다. 하지만, 보안상의 이유로, 여러분은 서버를 유닉스 root 사용자로 구동 시키지는 말도록 한다. mysqld를 권한이 없는 일반 유닉스 사용자 user_name가 구동할 수 있도록 변경하기 위해서는, 아래의 사항을 따르기 바란다:일반적인 보안 이슈
일반적인 보안 이슈
일반적인 보안 가이드라인
공격으로부터 MySQL 보안 설정하기
보안-관련 mysqld 옵션
LOAD DATA LOCAL 이 가지는 보안 이슈
일반 사용자 자격으로 MySQL 구동시키는 방법
일반적인 보안 가이드라인
체크 리스트:
shell> telnet server_host 3306
이것을 사용해서 접속이 되고 이상한 문자가 나오게 되면, 여러분의 포트는 열려 있는 것이며, 방화벽 또는 라우터를 사용해서 닫아야 한다. 만일 telnet이 행 (hang) 상태가 되거나 또는 접속이 거절되면, 포트는 블로킹 된 것이다.
다른 프로그래밍 인터페이스에도 비슷한 기능들이 있다.
shell> tcpdump -l -i eth0 -w - src or dst port 3306 | strings
(위의 것은 리눅스 환경에서만 동작을 하는 명령문이며 다른 시스템에서는 약간 수정을 해야 한다.) 경고: 만약에 여러분이 일반 텍스트 데이터를 보지 못한다고 하더라도, 이것이 데이터가 실제로 암호화 되었다는 것을 항상 의미하는 것은 아니다.
.공격으로부터 MySQL 보안 설정하기
패스워드 설정 방법은 Section 5.9.5, “계정 패스워드 설정하기”를 참조한다.
대신에, 아무런 권한이 없는 일반 사용자만이 mysqld를 구동 시킬 수 있도록 했다. 여러분은 별도의 유닉스 계정 mysql를 생성해서 일을 처리하는 것이 보다 안전하다. 이 계정은 MySQL을 관리하는 용도로만 사용한다. 다른 유닉스 사용자로서 mysqld를 구동 시킬 때에는, 서버 옵션을 지정하는 my.cnf 옵션 파일의 [mysqld] 그룹에 사용자 이름을 지정하는 user 옵션을 추가한다. 예를 들면:
[mysqld]
보다 자세한 사항은 Section 5.7.5, “일반 사용자 자격으로 MySQL 구동시키는 방법”을 참조할 것. mysqld를 root가 아닌 다른 유닉스 사용자로서 구동시킨다는 것은 여러분이 user 테이블에 있는 root 사용자 이름을 변경해야 한다는 것을 의미하는 것이 아니다. MySQL 계정에 대한 사용자 이름은 유닉스 계정에 대한 사용자 이름과는 아무 상관이 없다.
user=mysql
SUPER 권한은 클라이언트 접속을 종료시키고, 시스템 변수 값을 변경해서 서버 동작을 변경시키고, 리플리케이션 서버를 제어하기 위해 사용할 수가 있다.보안-관련 mysqld 옵션
이 옵션은 메인 함수에 대해 xxx 심볼만 가지고 있는 사용자 정의 함수를 읽어올 수 있는지 없는지를 제어한다. 디폴트로는 오프 (off)이며, 최소 한 개의 보조 심볼을 가지고 있는 UDF만을 읽어올 수가 있다; 이것은 규칙에 맞는 UDF를 가지고 있는 파일이 아닌 공유 오브젝트 파일에서는 함수를 읽어오지 못하도록 만든다. 이 옵션은 5.0.3에 추가 되었다. Section 24.2.4.6, “사용자 정의 함수 보안 유의 사항”을 참고할 것.
만일 --local-infile=0를 사용해서 서버를 구동 시킨다면, 클라이언트는 LOAD DATA 에서 LOCAL을 사용할 수가 없게 된다. Section 5.7.4, “LOAD DATA LOCAL 보안 이슈”를 참조.
서버로 하여금 새로운 패스워드에 대해서 짧은 (4.1 이전 버전 스타일) 패스워드 해시를 만들도록 한다. 이것은 서버가 이전 버전의 클라이언트 프로그램을 지원해야 하는 경우에 유용하다. Section 5.8.9, “MySQL 4.1이후의 패스워드 해싱 (Hashing)”을 참조할 것.
이전 버전의 MySQL의 경우, 이 옵션은 SHOW DATABASES 명령문이 사용자가 권한을 가지고 있는 데이터 베이스의 이름을 출력하게끔 한다. 5.0 이후에는 이 옵션은 더 이상 사용되지 않는다. Section 13.5.1.3, “GRANT 신텍스”를 참조할 것.
만약에 이 옵션이 활성화되면, 사용자가 mysql.user 테이블 또는 테이블 내 컬럼에 대해서 INSERT 권한을 가지고 있지 않는 한 GRANT 명령문을 사용해서는 새로운 MySQL 사용자를 만들 수가 없게 된다. 만약에 사용자로 하여금 이러한 권한을 가지는 새로운 사용자를 생성할 수 있도록 하고자 한다면, 여러분은 그 사용자에게 아래의 권한을 승인해야 한다:
GRANT INSERT(user) ON mysql.user TO 'user_name'@'host_name';
이것은 사용자가 권한 컬럼을 직접 변경하지 못하도록 만들며, 대신에 GRANT 명령문을 사용해서 다른 사용자에게 권한을 주도록 만든다.
구형 (pre-4.1) 패스워드를 가지고 있는 계정에 대해서는 사용을 허가하지 않음. mysql 클라이언트도 --secure-auth 옵션을 가지는데, 이것은 만약에 서버가 클라이언트 계정에 대해 구형 포맷의 패스워드를 요구할 경우에는 접속을 하지 못하도록 하기 위함이다.
이 옵션은 서버가 권한 테이블을 전혀 사용할 수 없도록 만든다. 이렇게 하면 누구라도 제한 없이 서버와 모든 데이터 베이스에 접근할 수 있게 된다. mysqladmin flush-privileges를 실행하거나, 시스템 쉘에서 mysqladmin reload 명령어를 실행하거나, 또는 MySQL FLUSH PRIVILEGES 명령문을 입력하면 구동 중인 서버가 그랜트 테이블을 사용해서 재 구동할 수 있게 된다. 이 옵션은 또한 사용자 정의 함수를 가져오지 못하도록 한다.
호스트 이름을 해석하지 않는다. 그랜트 테이블에 있는 모든 Host 컬럼값은 반드시 IP 번호 또는 localhost 이어야 한다.
네트워크를 통한 TCP/IP 접속을 허용하지 않음. Mysqld에 대한 모든 접속은 유닉스 소켓 파일을 통해서 이루어져야 한다.
이 옵션을 사용지고 있는 사용자에게만 허용이 되며, 이 명령문은 모든 데이터 베이스 이름을 출력한다. 이 옵션이 없으면, SHOW DATABASES는 모든 사용자가 사용할 수 있으나, 사용자가 SHOW DATABASES 권한을 가지고 있는 데이터 베이스 이름만 화면에 출력 한다. 모든 글로벌 권한은 데이터 베이스에 대한 권한이라는 것을 알기 바란다.LOAD DATA LOCAL 이 가지는 보안 이슈
[client]
loose-local-infile=1
ERROR 1148: The used command is not allowed with this MySQL version
일반 사용자 자격으로 MySQL 구동시키는 방법
출처 : MySQL 코리아
shell> chown -R user_name /path/to/mysql/datadir
만약에 여러분이 이렇게 하지 않으면, user_name 자격으로 서버를 구동 시킬 때 서버는 데이터 베이스 또는 테이블에 접근을 하지 못하게 된다.
만약에 MySQL 데이터 디렉토리 안에 있는 디렉토리 또는 파일이 심볼릭 링크라면, 그 링크를 따라야 하고 링크가 가리키는 디렉토리와 파일도 변경 해야 한다. chown -R은 여러분을 위한 심볼릭 링크를 따르지 않을 것이다.
[mysqld]
user=user_name