제 6강 Mysql 크랙커에 대비하여 mysql을 안전하게 하는 방법

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

 
 제 6강 Mysql 크랙커에 대비하여 mysql을 안전하게 하는 방법

mysql 서버에 연결할 때 일반 적으로 비밀번호를 사용해야  한다.
비밀번호는 연결할 때 단순한 텍스트로 전송되지 않는다.

서버/클라이언트 연결은 암호 화되지 않는다;
모든 정보는 연결을 볼 수 있는 누구라도 읽을 수 있는 텍스트로 전송된다.
이 문제에 대해  걱정이 되면 문제를 어 렵게 하기 위해 압축 프로토콜(mysql 3.22 이상 버전)을 사용할 수  있다.
보안을 더 확실하게 하기 위해 ssh를 설치할  수  있다.

(http://www.cs.hut.fi/ssh 참고) 이것을 이용해 mysql 서버와 클라이언트 사이에 암호화된 TCP/IP 연 결을 사용할 수 있다.

mysql 시스템의 보안을 유지 하게 위해 다음의 제안을 신중하게 고려하자:

- 모든 mysql 사 용자가 비밀번호를 사용.
   어떤 사용자가  비밀번호가 없으 면 'mysql - u 사용자이름' 을 이용해 간단하게
    그 사용자로  로그인할 수 있다는 것을 기억하자.
   이것은 클라이언트/서버 애플리케이션의  일반적인 작동방법이 다.
   mysql_install_db 스크립트를 실행하기 전에 이 스크립트를 수정하여 모든 사용 자의 비밀번호를
   바꿀 수 있다.
   또는 mysql  root 사용자의 비밀번호를 바꿀 때는 다음과 같이 하면 된다:

shell> mysql -u root mysql

mysql> UPDATE user SET Password=PASSWORD('new_password')

        WHERE user='root';

mysql> FLUSH PRIVILEGES;

- mysql 데몬을 유닉스의 root  사용자로 시작하지 말자.
   mysqld 는  다 른 사용자가 실행할 수 있다.
   또한 보안을 더 엄격 하게 하기 위해 mysql이라는 유닉스 사용자를 만들 수 있다.
   다른 유닉스 사용자로  mysqld를 실행하면 user 테이블에서 root 사용자 이름을 바꿀 필요가
   없다.
   mysqld를 다른 유닉스 사용자가 시작하기 위해 mysql.server 스크립트를 수정하면 된다.
   일반적으로 su 명령을  사용한다.

- mysqld를 실행할 수 있는 사용자만이 데이터베이스  디렉토리에 읽기/쓰기 권한을 가지고
   있는지 확인.

- 모든 사용자에게 process 권한을 주지 말자. mysqladmin processlist 을 출력하면
   현재 실행하는 쿼리의 내용을 볼 수 있다.
    그러므로 이러한 명령을  실행할  권한이  있는   사용자는  다른  사용자의
    UPDATE  user  SET password=PASSWORD(_'no_secure') 질의를 볼 수 있 다.
   mysql은 process  권한을 가진 사용자를 위해 추가적인(extra) 연결을 저장한다.
   그래서  mysql root 사용자는 모든 일반적인 연결이 사용되었어 도 로그인하고  점검을
   할 수 있다.

- 모든 사용자에게 file 권한 을 주지 말자.
   이러한 권한이  있는 사용 자는 mysqld 대몬의 권한이 있는 파일  시스템의 어느 곳에라도
   파일을  저장할 수 있다.
   좀 더 안전하 게 하기 위해 SELECT ... INTO OUTFILE  로 생성되는 모든 파일은 모 든 사용자가
   읽기만 할 수 있으며 이미 존재하는 파일을 덮어씌울 수 없다.

(** file 권 한은 LOAD DATA INFILE , SELECT .. INTO OUTFILE 문을 이용하여 서버에 파일을
   저장하고 읽을 수 있는 권한을 허용한다.
   이러 한 권한을 가진 사용자는 mysql 서버가 읽고 쓸 수 있는 파일을 읽고 쓸 수  있는
   권한이 허용된다.
   일반 사용자에게 이런 권한을 줄 필요는 없다.  
   필요한 부분 만 권한을 주는 것이 좋다.
   권한을 남용말자. **)

- DNS 를 신뢰하지 못한다면 승인 테입르에서 호스트이름 대신  IP를 사용하자.
   기본적으로 mysqld 의  --secure 옵션은 호스트이름을 안전하게  한다.
   어떤 경우 와일드카드 문자가 포함된 호스트이름 값을  사용할때는 매우 조심해야 한다.

- mysql.server 스크립트에 서 유닉스 root 사용자의 비밀번호를 넣는다면,
    이 스크립트는 오직 root만이 읽을 수 있도록 해야 한다.

다음의 mysqld 옵션은 보안 과 관련되어 있다:

--secure : gethostbyname() 시스템 콜에  의해 리턴된 IP 숫자가  원래의 호스트이름 을
   resolve 한 것과 같은지를 점검한다.
    이것은 어떤 사람이 다른 호스트 이름을 에뮬레이터해서 접근하는 것 을 어렵게 만든다.  
   이 옵션은 또한 호스트 이름이 온전한지에 대한 점검을 추가한다.
   해 석하는데 때로는 시간이 많이 걸려서 mysql 3.21에서는 기본적으로 설 정이 되어 있지 않다.
   mysql 3.22에서는 호스트 이름을 캐쉬하고 이 옵션이  기본적으로 설정되어 있다.

(** 함수 gethostbyname()은 호스트 이름을 인자로 받아 그에 해당하는 IP 주소 및 기타 정보를
   해당하는 구조체에 담아 그 구조체의  포인터를 리턴하는 함수입 니다.
   쉽게 말해서 호스트 이름을 넣으면 해당 IP 주소를 찾아주지요.**)

--skip-grant-tables : 이 옵 션을 사용하면 서버가 권한 시스템을 전혀 사용하지 않는다.
   그러면 모든 사용자가 모든 데이터베이스에 접속할  수 있다!

(mysqladmin reload 를 실행 하여 실행중인 서버가 승인 테이블을 사용하도록 할 수 있다.)

--skip-name-resolve : 호스 트이름이 해석되지 않는다.
   승인 테이블의  모든 Host 컬럼값은 반드시 IP 숫자이거나 로컬호스트이어야 한 다.

--skip-networking : 네트웍 을 통한 TCP/IP 연결을 허용안함.
   mysqld와 모 든   연결은  유닉스   도메인  소켓을    통해  만들어진다.   
   이  옵션은 MIT- pthreads를 사용하는 시스템에서는 제대로 작동을 하지 않는다.  
   왜냐면 MIT-pthreads 패키지는 유닉스 소켓을 지원하지 않기 때문이 다.

(** 리눅스 를 사용하는 사람들에게는  상관이 없습니다.
   기본적으로 유닉스 도메인  소켓을 지원하니깐.
   이와 비슷 하게 postgres도 6.3버전 이후부터인가요?
   기본적으로 유닉스 도메인 소켓으로 바뀌었지요. **)