DBMS 2

DA, SQL, DB보안 등 실무자를 위한 위한 DB기술 바이블!

MySQL 사용자 계정 관리

DBMS 2
MySQL 가이드
데이터 베이스 관리
MySQL 사용자 계정 관리
작성자
admin
작성일
2021-02-19 10:51
조회
7648

MySQL 사용자 계정 관리

MySQL 사용자 이름과 패스워드
MySQL에 새로운 사용자 계정 추가하기
MySQL에서 사용자 계정 제거하기
계정 자원 제한하기
계정 패스워드 할당하기
패스워드 보안 유지하기
보안 접속 사용하기

이 섹션에서는 MySQL 서버가 클라이언트 계정을 어떻게 설정하는지 설명한다. 다음의 주제에 대해서 설명을 하고 있다:


  • MySQL에서 사용되는 계정 이름과 패스워드의 의미와 OS가 사용하는 이름과 패스워드의 의미를 비교한다.
  • 새로운 계정 설정 방법과 존재하는 계정 제거 하는 방법.
  • 패스워드 변경 방법.
  • 패스워드를 안전하게 사용하는 가이드 라인.
  • SSL을 사용한 보안 접속 사용법.
MySQL 사용자 이름과 패스워드

MySQL 계정은 사용자 이름 (username)과 사용자가 서버에 접속을 할 수 있는 클라이언트 호스트 또는 호스트라는 용어로 정의된다. 계정에는 패스워드도 있다. MySQL과 OS가 사용자 이름 및 패스워드를 처리하는 방식에는 뚜렷한 차이점이 몇 가지 있다:


  • MySQL이 인증 목적으로 사용하는 사용자 이름은 윈도우 또는 유닉스가 사용하는 사용자 이름 (로그인 이름)과는 아무런 상관이 없다. 유닉스 시스템의 경우, 대부분의 MySQL 클라이언트는 디폴트로 MySQL이 사용하는 사용자 이름을 현재의 유닉스 사용자 이름으로 사용해서 로그인을 시도하지만, 이것은 단지 편의상의 이유 때문이다. 디폴트는 쉽게 변경 시킬 수가 있는데, 그 이유는 클라이언트 프로그램은 사용자 이름을 -u 또는 --user 옵션을 사용해서 지정할 수 있도록 하기 때문이다. 이것은 누구라도 어떤 사용자 이름을 가지고도 서버에 접속을 할 수 있다는 것을 의미하는 것이기 때문에, 모든 MySQL 계정이 패스워드를 가지지 않는 한 여러분은 데이터 베이스를 안전하게 만들지 못하게 된다.
  • MySQL 사용자 이름은 최대 16 문자 길이로 만들 수가 있다. 이 길이는 MySQL 서버와 클라이언트에는 엄격하게 적용되며, mysql 데이터 베이스에 있는 테이블 정의를 수정해서 이 제한을 없앨 수는 없다.
    OS가 사용하는 사용자 이름은 MySQL의 사용자 이름과는 전혀 관련이 없으며 최대 가능 길이도 서로 틀리다. 예를 들면, 유닉스에서는 전형적으로 문자 길이가 8로 제한된다.
  • MySQL 패스워드는 여러분이 OS에 로그인할 때 사용하는 패스워드와는 아무런 상관이 없는 것이다.
  • MySQL는 고유 알고리즘을 사용해서 패스워드를 암호화 한다. MySQL이 사용하는 암호화 기법은 PASSWORD() SQL 함수이며, 유닉스에서는 ENCRYPT() SQL 함수를 사용해서 암호화 한다.

여러분이 MySQL을 설치하면, 그랜트 테이블은 초기에 계정 세개를 가지게 된다. 이 계정들은 Section 2.9.3, “초기 MySQL 계정 보안 설정하기”에서 설명하는 이름과 접근 권한을 가지게 된다. 그 후에, 여러분은 GRANT 와 REVOKE와 같은 명령문을 사용해서 MySQL 계정을 설정, 수정, 그리고 제거할 수가 있게 된다. Section 13.5.1, “계정 관리 명령문”을 참조.

명령어 라인의 클라이언트를 가지고 서버에 접속을 할 때에는, 여러분은 사용자 이름과 패스워드를 사용자 계정에 지정해야 한다:



shell> mysql --user=monty --password=guess db_name

짧은 옵션을 사용할 경우에는, 아래와 같이 한다:



shell> mysql -u monty -pguess db_name

-p 옵션과 패스워드 값 사이에는 스페이스가 없다. Section 5.8.4, “MySQL 서버에 접속하기”를 참조.

위와 같은 경우에는 패스워드 값이 명령어 라인에서 보이게 되기 때문에 보안의 문제가 생긴다. Section 5.9.6, “패스워드 보안 유지하기”를 참조. 이것을 피하기 위해서는, --password 또는 -p 옵션을 아래와 같이 사용한다:



shell> mysql --user=monty --password db_name
shell> mysql -u monty -p db_name


패스워드 옵션이 패스워드 값을 가지지 않으면, 클라이언트 프로그램은 프롬프트를 발생시켜서 여러분이 패스워드를 입력하기를 기다리게 된다. (이 경우에, db_name는 패스워드 값으로 인식되지 않는데, 그 이유는 패스워드 옵션과 뒤의 값 사이에 스페이스가 있기 때문이다.)

어떤 시스템에서는, MySQL이 패스워드를 위한 프롬프트로 사용하는 라이브러리 루틴이 자동적으로 패스워드의 길이를 8 문자로 한정한다. 이것은 시스템 라이브러리에 관련된 문제이며, MySQL과는 관련이 없다. 내부적으로는, MySQL은 패스워드의 길이를 제한하지 않는다. 이 문제를 피하기 위해서는, 여러분의 MySQL 패스워드를 8 또는 그보다 작은 값으로 변경을 하거나, 또는 옵션 파일에 패스워드를 넣어두면 된다.


MySQL에 새로운 사용자 계정 추가하기

여러분은 두 가지 방법으로 MySQL 계정을 생성할 수가 있다:


  • CREATE USER 또는 GRANT와 같이 계정 생성용 명령문을 사용한다.
  • NSERT, UPDATE, 또는 DELETE와 같은 명령문을 사용해서 MySQL 그랜트 테이블을 직접 편집한다.

첫 번째 방법이 보다 간편하고 에러가 나올 확률이 적다. CREATE USER 와 GRANT는 Section 13.5.1.1, “CREATE USER 신텍스”, 및 Section 13.5.1.3, “GRANT 신텍스”에서 설명을 하고 있다.

계정 생성을 위한 또 하나의 옵션은 MySQL 계정 관리 기능을 제공하는 타 회사의 제품을 사용하는 것이다. phpMyAdmin이 이런 제품 중에 하나이다.

아래의 예제는 mysql 클라이언트 프로그램을 사용해서 새로운 사용자를 설정하는 방법을 보여준다. 이 예제에서는 권한이 Section 2.9.3, “초기 MySQL 계정에 보안 작업하기”에서 설명하는 디폴트에 따라서 설정되어 있다는 가정을 한다. 이것은 변경 작업을 하기 위해서는, 여러분이 반드시 MySQL 서버에 MySQL root 사용자로 접속을 해야 하고, 그리고 root 계정은 반드시 mysql 데이터 베이스에 대해서는 INSERT 권한을 가지고 RELOAD 관리 권한을 가지고 있어야 한다는 것을 의미한다.

우선, mysql 프로그램을 사용해서 MySQL root 사용자로 서버에 접속을 한다:



shell> mysql --user=root mysql

만약에 root 계정에 패스워드를 할당하였다면, --password 또는 -p 옵션을 사용해서 mysql 명령어를 입력한다.

서버에 접속을 한 후에는, 여러분은 새로운 계정을 추가할 수가 있게 된다. 아래의 명령문은 GRANT 를 사용해서 새로운 계정을 설정한다:



mysql> GRANT ALL PRIVILEGES ON *.* TO 'monty'@'localhost'
-> IDENTIFIED BY 'some_pass' WITH GRANT OPTION;
mysql> GRANT ALL PRIVILEGES ON *.* TO 'monty'@'%'
-> IDENTIFIED BY 'some_pass' WITH GRANT OPTION;
mysql> GRANT RELOAD,PROCESS ON *.* TO 'admin'@'localhost';
mysql> GRANT USAGE ON *.* TO 'dummy'@'localhost';


GRANT 명령문을 사용해서 생성된 계정은 아래와 같은 특성을 가지게 된다:


  • 생성된 계정 중에 두 개는 사용자 이름 monty와 패스워드 some_pass를 가진다. 두 계정 모두 전체 권한을 가지고 있는 슈퍼유저 (superuser) 계정이다. 하나의 계정 ('monty'@'localhost')은 로컬 호스트에서 접속을 할 경우에만 사용된다. 또 다른 계정 ('monty'@'%')은 다른 호스트에서 접속을 하기 위해 사용된다. monty라는 이름으로 어디에서든지 접속을 할 수 있기 위해서는 monty에 대해 두 개의 계정을 모두 가지고 있는 것이 필요하다는 것을 알아 두기 바란다. localhost 계정이 없다면, monty가 로컬 호스트에서 접속을 할 때 mysql_install_db가 생성한 localhost에 대한 익명 사용자 계정이 우선적으로 사용된다. 그 결과로, monty는 하나의 익명 사용자처럼 취급을 받게 된다. 이렇게 되는 이유는 익명 사용자 계정이 'monty'@'%' 계정보다 더 구체적인 (more-specific) Host 컬럼 값을 가지기 때문이며 따라서 user 테이블 정렬 순서에서 보다 앞서 나오기 때문이다. (user 테이블 정렬은 Section 5.8.5, “접근 제어, Stage 1: 접속 검증”를 참조할 것.)
  • admin이라는 이름의 패스워드가 없는 계정이 하나 있다. 이 계정은 로컬 호스트에서 접속하기 위해서만 사용된다. 이 계정은 RELOAD 와 PROCESS 관리 권한을 가지고 있다. 이러한 권한은 admin 사용자가 mysqladmin reload, mysqladmin refresh, 그리고 mysqladmin flush-xxx 명령문 뿐만 아니라, mysqladmin processlist도 실행할 수 있도록 해 준다. 어떤 데이터 베이스에 대해서도 접근할 수 있는 권한은 승인되지 않았다. 여러분은 나중에 GRANT 명령문을 입력해서 이러한 권한을 추가할 수가 있다.
  • dummy라는 이름의 패스워드가 없는 계정이 하나 있다. 이 계정은 로컬 호스트에서 접속을 할 때에만 사용된다. 아무런 권한도 승인되지 않았다. GRANT 명령문에 있는 USAGE 권한은 여러분이 아무런 권한이 없는 계정을 만들 수 있게 해 준다. 이것은 모든 글로벌 권한을 'N'으로 설정하면 된다. 이 계정에 여러분이 특정 권한을 나중에 승인할 것이라는 가정을 한다.

GRANT명령문에 대한 대안으로, 여러분은 동일한 계정을 INSERT 명령문을 실행해서 직접 생성한 후에 FLUSH PRIVILEGES를 통해 서버가 그랜트 테이블을 다시 읽어 오도록 만들 수가 있다.



shell> mysql --user=root mysql
mysql> INSERT INTO user
-> VALUES('localhost','monty',PASSWORD('some_pass'),
-> 'Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y');
mysql> INSERT INTO user
-> VALUES('%','monty',PASSWORD('some_pass'),
-> 'Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y');
mysql> INSERT INTO user SET Host='localhost',User='admin',
-> Reload_priv='Y', Process_priv='Y';
mysql> INSERT INTO user (Host,User,Password)
-> VALUES('localhost','dummy','');
mysql> FLUSH PRIVILEGES;


여러분이 INSERT를 사용해서 계정을 생성할 때 FLUSH PRIVILEGES를 사용하는 이유는 서버가 그랜트 테이블을 다시 읽어 오도록 만들기 위해서이다. 그렇지 않으면, 여러분이 서버를 재 구동 시키기 전에는 변경 사항이 적용되지 않는다. GRANT를 사용하는 경우는, FLUSH PRIVILEGES가 필요 없다.

PASSWORD() 함수를 INSERT와 함께 사용하는 이유는 패스워드를 암호화 하기 위해서다. GRANT 명령문은 패스워드를 암호화 하며, 따라서 PASSWORD()가 필요 없게 된다.

'Y' 값은 계정의 권한을 활성화 시킨다. 사용하는 MySQL 버전에 따라서, 맨 처음 두 개의 INSERT 명령문에서 서로 다른 수의 'Y' 값을 사용할 것이다. admin 계정의 경우, 여러분은 SET을 사용하는 확장된 INSERT 신텍스를 추가할 수가 있을 것이다.

dummy 계정에 대한 INSERT 명령문의 경우, user 테이블 열의 Host, User, 및 Password 컬럼에만 값이 할당된다. 아무런 권한 컬럼도 명확하게 설정이 되지 않았기 때문에, MySQL은 디폴트 값인 'N'을 모두 할당한다. 이것은 GRANT USAGE를 실행하는 것과 같은 결과 값이다.

슈퍼유저 계정을 설정하기 위해서는, 권한 컬럼을 'Y'로 설정한 user 테이블 엔트리를 생성하기만 하면 된다는 점을 알아두자. user 테이블 권한은 글로벌이기 때문에, 다른 그랜트 테이블의 어떤 엔트리도 필요가 없게 된다.

다음의 예제에서는 세 개의 계정을 생성하며, 각 계정들이 특정 데이터 베이스에 접근할 수 있도록 하고 있다. 각각의 계정은 이름이 custom이며 패스워드는 obscure가 된다.

GRANT를 가지고 계정을 생성하기 위해서는, 아래의 명령문을 사용한다:



shell> mysql --user=root mysql
mysql> GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP
-> ON bankaccount.*
-> TO 'custom'@'localhost'
-> IDENTIFIED BY 'obscure';
mysql> GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP
-> ON expenses.*
-> TO 'custom'@'whitehouse.gov'
-> IDENTIFIED BY 'obscure';
mysql> GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP
-> ON customer.*
-> TO 'custom'@'server.domain'
-> IDENTIFIED BY 'obscure';


세 개의 계정은 아래와 같이 사용될 수 있다:


  • 첫 번째 계정은 bankaccount 데이터 베이스에 접근할 수는 있으나, 로컬 호스트에서만 가능하다.
  • 두 번째 계정은 expenses 데이터 베이스에 접근할 수 있으나, 호스트 whitehouse.gov에서만 가능하다.
  • 세 번째 계정은 customer 데이터 베이스에 접근할 수 있으나, server.domain에서만 가능하다.

custom 계정을 GRANT 없이 설정하기 위해서는, 그랜트 테이블을 직접 수정하기 위해 아래와 같이 INSERT 명령문을 사용한다:



shell> mysql --user=root mysql
mysql> INSERT INTO user (Host,User,Password)
-> VALUES('localhost','custom',PASSWORD('obscure'));
mysql> INSERT INTO user (Host,User,Password)
-> VALUES('whitehouse.gov','custom',PASSWORD('obscure'));
mysql> INSERT INTO user (Host,User,Password)
-> VALUES('server.domain','custom',PASSWORD('obscure'));
mysql> INSERT INTO db
-> (Host,Db,User,Select_priv,Insert_priv,
-> Update_priv,Delete_priv,Create_priv,Drop_priv)
-> VALUES('localhost','bankaccount','custom',
-> 'Y','Y','Y','Y','Y','Y');
mysql> INSERT INTO db
-> (Host,Db,User,Select_priv,Insert_priv,
-> Update_priv,Delete_priv,Create_priv,Drop_priv)
-> VALUES('whitehouse.gov','expenses','custom',
-> 'Y','Y','Y','Y','Y','Y');
mysql> INSERT INTO db
-> (Host,Db,User,Select_priv,Insert_priv,
-> Update_priv,Delete_priv,Create_priv,Drop_priv)
-> VALUES('server.domain','customer','custom',
-> 'Y','Y','Y','Y','Y','Y');
mysql> FLUSH PRIVILEGES;


처음 세 개의 INSERT 명령문은 사용자 custom이 지정한 패스워드를 가지고 다양한 호스트에서 접속 할 수 있도록 허용하지만, 어떠한 글로벌 권한도 없는 user테이블 엔트리를 추가하고 있다 (모든 권한은 디폴트 값이 'N'으로 설정됨). 그 다음 세 개의 INSERT 명령문은 custom이 올바른 호스트에서 접속을 할 경우에만 bankaccount, expenses, 그리고 customer 데이터 베이스에 대한 권한을 승인하는 db 테이블 엔트리를 추가한다. 여러분이 그랜트 테이블을 직접 수정하는 일반적인 경우에는, 반드시 서버가 FLUSH PRIVILEGES를 실행해서 그랜트 테이블을 다시 읽어 옴으로써 변경된 권한이 적용되도록 해야 한다.

만약에 특정 사용자가 여러분이 지정한 도메인의 모든 머신에서 접근을 할 수 있도록 만들기 위해서는 (예를 들면, mydomain.com), 그 사용자 계정의 호스트 부분에 ‘%’ 와일드 카드 문자를 사용하는 GRANT 명령문을 입력한다:



mysql> GRANT ...
-> ON *.*
-> TO 'myname'@'%.mydomain.com'
-> IDENTIFIED BY 'myboss';


그랜트 테이블을 직접 수정해서 동일한 일을 처리하도록 하기 위해서는, 아래와 같이 한다



mysql> INSERT INTO user (Host,User,Password,...)
-> VALUES('%.mydomain.com','myname',PASSWORD('myboss'),...);
mysql> FLUSH PRIVILEGES;


MySQL에서 사용자 계정 제거하기

계정을 제거하기 위해서는 DROP USER 명령문을 사용한다. Section 13.5.1.2, “DROP USER 신텍스”를 참조할 것.


계정 자원 제한하기

MySQL 서버의 자원 사용을 제한하는데 사용하는 방법 중의 하나는 max_user_connections 시스템 변수의 값을 0이 아닌 값으로 설정하는 것이다. 하지만, 이 방법은 글로벌하게 적용되기 때문에, 개별 사용자 계정을 관리하지는 못한다. 또한, 단일 계정을 사용해서 이루어지는 동시 접속 숫자는 제한할 수 있지만, 접속을 한 클라이언트의 동작을 제한 하지는 못한다.

MySQL 5.0에서는, 각 개별 계정에서 대해 아래와 같이 서버 자원을 한정할 수가 있다:


  • 한 계정이 시간 당 입력할 수 있는 쿼리의 숫자
  • 한 계정이 시간 당 입력할 수 있는 업데이트의 숫자
  • 한 계정이 시간 당 접속할 수 있는 숫자

클라이언트가 입력하는 모든 명령문은 쿼리 제한치에 대해서 계산된다. 데이터 베이스 또는 테이블을 수정하는 명령문만이 업데이트 제한치에 대해서 계산된다.

MySQL 5.0.3 이후에는, 하나의 계정 당 서버에 동시에 접속할 수 있는 숫자를 제한할 수도 있게 되었다.

이 문장에서 표현되는 계정은 user 테이블에 있는 단일 열을 의미하는 것이다. 각 계정은 자신의 User 와 Host 컬럼 값을 가지고 서로 구분 된다.

이러한 기능을 사용하기 위한 필요 요건으로는, mysql 데이터 베이스에 있는 user 테이블은 반드시 자원-관련 컬럼을 가지고 있어야 한다. 자원 제한은 max_questions, max_updates, max_connections, 그리고 max_user_connections 컬럼에 저장된다. 만일 여러분의 user 테이블에 이러한 컬럼이 없다면, 이 테이블을 업그레이드 하도록 한다; Section 5.6.2, “mysql_upgrade -MySQL 업그레이드를 위한 테이블 검사”를 참조할 것.

GRANT 명령문을 사용해서 자원 한계를 설정하기 위해서는, 제한되는 자원의 이름을 지정하고 제한 값을 가리키는 시간당 카운트 WITH 구문을 사용한다. 예를 들면, customer 데이터 베이스에는 접근할 수는 있으나, 제한적??는, 아래와 같이 명령문을 입력한다:



mysql> GRANT ALL ON customer.* TO 'francis'@'localhost'
-> IDENTIFIED BY 'frank'
-> WITH MAX_QUERIES_PER_HOUR 20
-> MAX_UPDATES_PER_HOUR 10
-> MAX_CONNECTIONS_PER_HOUR 5
-> MAX_USER_CONNECTIONS 2;


제한 타입을 WITH 구문에 모두 거론할 필요는 없으나, 제한 타입의 이름들은 일정 순서로 표시될 수는 있다. 각각의 시간당 제한치 값은 시간당 카운트 되는 정수 값이 되어야 한다. 만약에 GRANT 명령문이 WITH 구문을 가지고 있지 않다면, 제한치는 각각 디폴트 0으로 설정된다 (즉, 제한 없음). MAX_USER_CONNECTIONS의 경우, 제한치는 그 계정이 어느 한 시점에 동시에 접속을 할 수 있는 최대 값을 나타내는 정수 값이 된다. 만일 이 값이 디폴트 0으로 설정되면, max_user_connections 시스템 변수 값이 그 계정의 동시 접속 숫자가 된다.

현재 존재하는 계정의 제한치를 설정 또는 변경하기 위해서는, 글로벌 레벨 (ON *.*)에서 GRANT USAGE 명령문을 사용한다. 아래의 명령문은 francis의 쿼리 한계를 100으로 변경한다:



mysql> GRANT USAGE ON *.* TO 'francis'@'localhost'
-> WITH MAX_QUERIES_PER_HOUR 100;


이 명령문은 계정의 현재 권한을 변경하지 않는 상태에서 지정된 제한 값만을 수정한다.

현재의 제한 값을 제거하기 위해서는, 그 값을 0으로 설정한다. 예를 들면, francis가 한 시간에 접속할 수 있는 제한 값을 제거하기 위해서는, 아래의 명령문을 사용한다:



mysql> GRANT USAGE ON *.* TO 'francis'@'localhost'
-> WITH MAX_CONNECTIONS_PER_HOUR 0;


서버는 구동을 할 때, 각 계정이 자원을 사용하는 횟수를 계산한다. 만일 한 계정이 시간당 접속 한계치에 도달하게 되면, 서버는 새로운 시간 단위가 발생하기 전까지 그 계정에 대한 접속을 거부한다. 그 계정이 쿼리나 업데이트 한계치에 도달하는 경우에도 마찬가지로 동작을 한다. 이러한 모든 경우에는 에러 메시지가 나오게 된다.

자원 계산은 클라이언트 단위가 아닌 계정 단위로 이루어진다. 예를 들면, 만약에 여러분의 계정이 쿼리 한계를 50으로 하고 있다면, 여러분은 서버에 두 개의 클라이언트를 동시에 접속을 시키는 방법으로 이 한계를 100으로 늘릴 수는 없다. 양쪽에서 일어나는 쿼리는 같이 계산이 된다.

현재의 시간당 자원 사용 카운트는 모든 계정에 대해 전체적으로, 또는 지정한 계정에 대해서만 개별적으로 리셋 시킬 수가 있다:


  • 모든 계정의 현재 카운트 값을 0으로 리셋 시키기 위해서는, FLUSH USER_RESOURCES 명령문을 사용한다. 이 카운트 값은 그랜트 테이블을 다시 읽어 와서 리셋 시킬 수도 있다 (예를 들면, FLUSH PRIVILEGES 명령문 또는 mysqladmin reload 명령어를 사용해서).
  • 개별 계정 카운트 값은 그것을 제한 값 중의 하나로 재 승인하면 0으로 설정된다. 이렇게 하기 위해서는, 앞에서 설명한 방식으로 GRANT USAGE를 사용하고 제한 값을 그 계정이 현재 가지고 있는 값과 동일하게 지정 한다.

카운터를 리셋하더라도 MAX_USER_CONNECTIONS 제한 값에는 영향을 주지 않는다.

서버가 시작될 때 모든 카운트는 0으로 리셋 된다.


계정 패스워드 할당하기

페스워드는 명령어 라인에서 mysqladmin 명령어를 사용해서 할당할 수가 있다:



shell> mysqladmin -u user_name -h host_name password "newpwd"

이 명령어가 패스워드를 리셋 시키는 계정은 User 컬럼에 있는 user_name 과 매치되는 user 테이블 열과 Host 컬럼에 있는 클라이언트 호스트를 가지고 있는 계정이 된다.
한 계정에 패스워드를 할당하는 또 다른 방법은 SET PASSWORD 명령문을 실행하는 것이다:



mysql> SET PASSWORD FOR 'jeffrey'@'%' = PASSWORD('biscuit');

mysql 데이터 베이스에 업데이트 접근을 할 수 있는 root 사용자만이 다른 사용자의 패스워드를 변경 시킬 수가 있다. 만일 여러분이 익명 사용자로 접속을 할 수 없다면, FOR 구문을 생략해서 여러분 자신의 패스워드를 변경 시킬 수가 있게 된다:



mysql> SET PASSWORD = PASSWORD('biscuit');

여러분은 또한 글로벌 레벨(ON *.*)에서 GRANT USAGE 명령문을 사용해서 한 계정의 현재 권한에는 영향을 미치지 않고 패스워드를 할당할 수가 있다:



mysql> GRANT USAGE ON *.* TO 'jeffrey'@'%' IDENTIFIED BY 'biscuit';

비록 위의 방법들을 사용해서 패스워드를 할당하는 것이 일반적인 방법이기는 하지만, 여러분은 user 테이블을 직접 수정을 해서 동일한 일을 처리할 수도 있다:


  • 새로운 계정을 생성할 때 패스워드를 지정하기 위해서는, Password 컬럼에 값을 부여한다:
    shell> mysql -u root mysql
    mysql> INSERT INTO user (Host,User,Password)
    -> VALUES('%','jeffrey',PASSWORD('biscuit'));
    mysql> FLUSH PRIVILEGES;

  • 이미 존재하는 계정의 패스워드를 변경하고자 한다면, UPDATE를 사용해서 Password 컬럼 값을 설정한다:
    shell> mysql -u root mysql
    mysql> UPDATE user SET Password = PASSWORD('bagel')
    -> WHERE Host = '%' AND User = 'francis';
    mysql> FLUSH PRIVILEGES;

여러분이 SET PASSWORD, INSERT, 또는 UPDATE를 사용해서 한 계정에 비어 있지 않는 패스워드 (non-empty password)를 할당할 때에는, 반드시 PASSWORD() 함수를 사용해서 암호화를 해야 한다. 이 함수는 패스워드를 일반 문장이 아닌 암호화를 해서 저장을 하게 된다. 만약에 여러분이 이 사실을 잊게 되면, 아마도 아래와 같이 패스워드를 설정할 것이다:



shell> mysql -u root mysql
mysql> INSERT INTO user (Host,User,Password)
-> VALUES('%','jeffrey','biscuit');
mysql> FLUSH PRIVILEGES;


이렇게 하면 암호화된 값이 아닌 'biscuit'이 user 테이블에 패스워드로 저장이 된다. Jeffrey가 이 패스워드를 사용해서 서버에 접속을 시도할 때, 입력하는 패스워드는 암호화가 되고 user 테이블에 저장되어 있는 패스워드 값과 비교를 하게 된다. 하지만, 저장되어 있는 값은 일반 문장인 'biscuit'이기 때문에 비교는 실패하게 되고 서버는 접속을 거절하게 된다:



shell> mysql -u jeffrey -pbiscuit test
Access denied

만약에 여러분이 GRANT ... IDENTIFIED BY 명령문 또는 mysqladmin password 명령어를 사용해서 패스워드를 할당했다면, 이것들은 모두 패스워드를 암호화 한다. 이와 같은 경우, PASSWORD() 함수 사용은 불필요하게 된다.


패스워드 보안 유지하기

관리적인 차원에서, 관리자 계정이 아닌 사용자에게는 절대로 user 테이블 접근 권한을 승인하지 말아야 한다.

여러분이 클라이언트 프로그램을 구동해서 서버에 접속을 할 경우에는, 다른 사람이 볼 수 있도록 패스워드를 입력하는 방법은 그리 좋은 것이 아니다. 여러분이 클라이언트 프로그램을 구동 시킬 때 패스워드를 지정할 수 있는 방법이 여기에 있는데, 각각의 방법마다 위험 요소가 있게 된다:


  • -pyour_pass 또는 --password=your_pass 옵션을 명령어 라인에서 사용한다. 예를 들면:
    shell> mysql -u francis -pfrank db_name
    이것은 편리하기는 하지만, 안전하지가 못하다. 그 이유는, 다른 사용자가 명령어 라인에서 ps와 같은 시스템 상태 프로그램을 사용하면 여러분의 패스워드를 볼 수가 있기 때문이다.
  • -p 또는 --password 옵션을 패스워드 값을 사용하지 않고 입력한다. 이와 같은 경우, 클라이언트 프로그램은 패스워드를 입력하라는 프롬프트를 보내게 된다:
    shell> mysql -u francis -p db_name
    Enter password: ********

    ‘*’ 문자는 여러분이 입력하는 패스워드를 가리킨다. 이 패스워드는 여러분이 입력하는 문자로는 나타나지 않는다. 이 방법은 패스워드를 명령어 라인에 직접 입력하는 방법보다는 안전하다. 하지만, 이 방법은 여러분이 쌍방향 (interactive) 통신을 하는 프로그램을 사용할 경우에만 사용할 수 있다. 만약에 스크립트를 통해 클라이언트를 호출하는 경우에는, 터미널에서 패스워드를 입력할 수가 없다.
  • 패스워드를 옵션 파일에 저장한다. 예를 들면, 유닉스에서 여러분은 홈 디렉토리에 있는 .my.cnf 파일의 [client] 섹션에 패스워드를 저장할 수가 있다:
    [client]
    password=your_pass

    만약에 패스워드를 .my.cnf에 저장한다면, 그 파일은 여러분 이외의 사람이 접근할 수가 없게 된다. 이것을 확실하게 하기 위해서, 파일 접근 모드를 400 또는 600으로 설정한다. 예를 들면:
    shell> chmod 600 .my.cnf
    Section 4.3.2, “옵션 파일 사용하기”를 참조할 것.
  • 패스워드를 환경 변수 MYSQL_PWD에 저장한다. 이 방법은 보안에 가장 취약하기 때문에 절대로 사용하지 말기 바란다.

위의 방법 중에, 가장 안전한 방법은 프롬프트에서 패스워드를 입력하거나, 옵션 파일에 패스워드를 저장해서 사용하는 것이다.


보안 접속 사용하기
기본적인 SSL 개념
OpenSSL을 사용해서 SSL 접속하기
yaSSL을 사용해서 SSL 접속하기
MySQL을 위한 SSL 인증 설정 하기
SSL 명령어 옵션
SSH를 사용해서 윈도우에서 원격으로 MySQL 접속하기

MySQL은 보안 소켓 레이어 (Secure Sockets Layer) (SSL) 프로토콜을 사용하는 MySQL클라이언트 서버간 보안 (암호화) 접속을 지원한다. 이 섹션에서는 SSL 접속을 사용하는 방법을 설명하기로 한다. 또한, 윈도우에서 SSH를 설정하는 방법도 설명하기로 한다. Section 13.5.1.3, “GRANT 신텍스”를 참조할 것.

MySQL의 표준 구성은 가능하면 빠른 성능을 내도록 설계되어 있기 때문에 암호화 접속은 디폴트로 사용되지 않는다. 이렇게 구성을 하면 클라이언트/서버 프로토콜이 더욱 느려지게 된다.

MySQL은 접속 당 암호화를 활성화 시킨다. 여러분은 각각의 어플리케이션에 따라서 암호화를 하거나 비 암호화 접속을 선택할 수가 있다.


기본적인 SSL 개념

MySQL이 SSL을 사용하는 방법을 이해하기 위해서는, SSL과 X509의 기본적인 개념을 알고 있어야 한다.

디폴트로, MySQL은 클라이언트와 서버간에는 암호화되지 않은 접속을 사용한다. 이것은 네트워크를 접근할 수 있는 사람이라면 누구든지 서로 통신을 하고 있는 데이터를 지켜 볼 수 있다는 것을 의미한다. 보안성을 좀더 개선하기 위해서는, 클라이언트/서버 트래픽을 --compress 옵션을 사용해서 압축할 수가 있는데, 이 방법만으로는 모든 공격자를 방어할 수는 없다.

임호화는 모든 종류의 데이터를 읽을 수 없는 형태로 만드는 것이다. SSL은 공중망을 통해 받은 데이터가 신뢰할 수 있는 것이라는 확신을 주기 위해 서로 다른 암호화 알고리즘을 사용하는 프로토콜이다. 여기에는 데이터의 변경, 손실, 또는 재 생성을 추적할 수 있는 매커니즘이 포함되어 있다. SSL은 또한 X509 표준을 사용하는 ID 검증 알고리즘과 함께 동작을 한다.

X509는 인터넷상에서 누군가를 구분하는 것이 가능하게 만들어 준다. 이것은 전자 상거래에서 광범위하게 사용되고 있다. 기본적인 용어로는, “인증 기관 (Certificate Authority)” (또는 CA)라는 회사가 있게 되며 필요한 사람들에게 전자 인증을 부여한다. 인증은 비대칭 암호화 알고리즘을 기반으로 하고 있으며 두 개의 암호화 키를 가지고 있다 (공중 키와 보안 키). 인증 소유자는 자신임을 증명하기 위해 다른 기관에게 인증서를 제출할 수 있다. 인증서는 소유자의 공중 키로 구성이 된다. 이 공중 키를 가지고 암호화된 데이터는 대응하는 보안 키를 사용해야만 암호가 풀리게 된다.

보다 자세한 정보에 대해서는 인터넷을 통해 알아보기 바란다.


OpenSSL을 사용해서 SSL 접속하기

MySQL 서버와 클라이언트 프로그램간의 SSL 접속을 사용하기 위해서는, 시스템이 OpenSSL 또는 (MySQL 5.0.10 이후에는) yaSSL를 지원하고 MySQL이 SSL을 지원하도록 설치되어야 한다. 이 섹션에서는 OpenSSL을 다루기로 한다. yaSSL의 사용에 대해서는, Section 5.9.7.3, “YaSSL을 사용해서 SSL 접속하기”, 를 참조하기 바란다.

MySQL과 OpenSSL간의 보안 접속을 하기 위해서는, 아래의 사항을 따라야 한다:


    1. OpenSSL 라이브러리를 설치한다. 우리는 OpenSSL 0.9.6을 가지고 테스트를 하였다. OpenSSL은 http://www.openssl.org에서 얻을 수가 있다.
    2. MySQL을 구성할 때, configure 스크립트를 --with-vio 및 --with-openssl 옵션과 함께 실행한다:
shell> ./configure --with-vio --with-openssl
  1. mysql.user 테이블에 SSL-관련 컬럼이 포함되도록 그랜트 테이블을 업그레이드 해 두어야 한다. 그랜트 테이블이 4.0.0 이전 버전일 경우에는 업그레이드가 필요하다. 업그레이드 과정은 Section 5.6.2, “mysql_upgrade -MySQL 업그레이드를 위해 테이블 검사하기”를 참조할 것.
  2. 구동 중인 mysqld 서버가 OpenSSL을 지원하는지를 검사하기 위해서는, have_openssl 시스템 변수의 값을 조사한다:

mysql> SHOW VARIABLES LIKE 'have_openssl';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| have_openssl | YES |
+---------------+-------+


만약에 그 값이 YES이면, 서버는 OpenSSL 접속을 지원하는 것이다.


yaSSL을 사용해서 SSL 접속하기

MySQL이 내부적으로 가지고 있는 yaSSL 를 사용하면 보다 간단하게 보안 접속을 할 수가 있다. 여러분은 Section 5.9.7.2, “OpenSSL을 사용해서 SSL 접속하기”에서 설명한 OpenSSL 설치를 위한 과정을 진행하지 않아도 된다. 또한, MySQL와 yaSSL는 동일한 라이센스 모델을 사용하고 있다.

현재, yaSSL은 아래의 플랫폼에 대해서만 지원이 되고 있다:


  • Linux/x86-64 Red Hat Enterprise 3.0
  • Linux RHAS21 Itanium-2 with gcc, statically linked
  • Linux Itanium-2 with gcc
  • Windows (all builds)

MySQL을 소스를 가지고 설치를 할 때 yaSSL를 활성화 시키기 위해서는, 아래와 같이 MySQL를 구성한다:



shell> ./configure --with-yassl

유닉스 플랫폼에서의 yaSSL 지원은 트루 랜덤 (true random) 번호를 추출하기 위해 /dev/urandom 또는 /dev/random가 설치되어야 한다는 것을 알아두자. 보다 자세한 정보 (특히 솔라리스 2.8 이전 버전 또는 HP-UX에서의 yaSSL에 관한 것)는, Bug #13164를 참조하기 바란다.

MySQL 서버가 yaSSL 지원하도록 시작하기 위해서는, OpenSSL를 지원하기 위한 옵션과 동일한 것을 사용하고 보안 접속을 만들기 위해 필요한 인증서를 식별한다:



shell> mysqld --ssl-ca=cacert.pem \
--ssl-cert=server-cert.pem \
--ssl-key=server-key.pem


  • --ssl-ca CA(Certificate Authority) 인증서를 식별한다.
  • --ssl-cert 서버 인증서를 식별한다.
  • --ssl-key 클라이언트 인증서를 식별한다.

MySQL 서버가 yaSSL를 지원하는 보안 접속을 형성하기 위해서는, 클라이언트를 아래와 같이 시작한다:



shell> mysql --ssl-ca=cacert.pem \
--ssl-cert=server-cert.pem \
--ssl-key=server-key.pem


달리 표현하면, 옵션들은 서버를 위한 것과 똑 같은 것이며, 그리고 CA 인증서도 동일해야 한다.어플리케이션 프로그램에서 보안 접속을 형성하기 위해서는, mysql_real_connect()를 호출하기 전에 mysql_ssl_set() API 함수를 사용해서 적당한 인증 옵션을 설정한다. Section 22.2.3.64, “mysql_ssl_set()”를 참조할 것.
MySQL을 위한 SSL 인증 설정 하기

OpenSSL을 사용하는 MySQL용 SSL 인증 설정 방법의 예를 보도록 하자:



DIR=`pwd`/openssl
PRIV=$DIR/private

mkdir $DIR $PRIV $DIR/newcerts
cp /usr/share/ssl/openssl.cnf $DIR
replace ./demoCA $DIR -- $DIR/openssl.cnf

# Create necessary files: $database, $serial and $new_certs_dir
# directory (optional)

touch $DIR/index.txt
echo "01" > $DIR/serial

#
# Generation of Certificate Authority(CA)
#

openssl req -new -x509 -keyout $PRIV/cakey.pem -out $DIR/cacert.pem \
-config $DIR/openssl.cnf

# Sample output:
# Using configuration from /home/monty/openssl/openssl.cnf
# Generating a 1024 bit RSA private key
# ................++++++
# .........++++++
# writing new private key to '/home/monty/openssl/private/cakey.pem'
# Enter PEM pass phrase:
# Verifying password - Enter PEM pass phrase:
# -----
# You are about to be asked to enter information that will be
# incorporated into your certificate request.
# What you are about to enter is what is called a Distinguished Name
# or a DN.
# There are quite a few fields but you can leave some blank
# For some fields there will be a default value,
# If you enter '.', the field will be left blank.
# -----
# Country Name (2 letter code) [AU]:FI
# State or Province Name (full name) [Some-State]:.
# Locality Name (eg, city) []:
# Organization Name (eg, company) [Internet Widgits Pty Ltd]:MySQL AB
# Organizational Unit Name (eg, section) []:
# Common Name (eg, YOUR name) []:MySQL admin
# Email Address []:

#
# Create server request and key
#
openssl req -new -keyout $DIR/server-key.pem -out \
$DIR/server-req.pem -days 3600 -config $DIR/openssl.cnf

# Sample output:
# Using configuration from /home/monty/openssl/openssl.cnf
# Generating a 1024 bit RSA private key
# ..++++++
# ..........++++++
# writing new private key to '/home/monty/openssl/server-key.pem'
# Enter PEM pass phrase:
# Verifying password - Enter PEM pass phrase:
# -----
# You are about to be asked to enter information that will be
# incorporated into your certificate request.
# What you are about to enter is what is called a Distinguished Name
# or a DN.
# There are quite a few fields but you can leave some blank
# For some fields there will be a default value,
# If you enter '.', the field will be left blank.
# -----
# Country Name (2 letter code) [AU]:FI
# State or Province Name (full name) [Some-State]:.
# Locality Name (eg, city) []:
# Organization Name (eg, company) [Internet Widgits Pty Ltd]:MySQL AB
# Organizational Unit Name (eg, section) []:
# Common Name (eg, YOUR name) []:MySQL server
# Email Address []:
#
# Please enter the following 'extra' attributes
# to be sent with your certificate request
# A challenge password []:
# An optional company name []:

#
# Remove the passphrase from the key (optional)
#

openssl rsa -in $DIR/server-key.pem -out $DIR/server-key.pem

#
# Sign server cert
#
openssl ca -policy policy_anything -out $DIR/server-cert.pem \
-config $DIR/openssl.cnf -infiles $DIR/server-req.pem

# Sample output:
# Using configuration from /home/monty/openssl/openssl.cnf
# Enter PEM pass phrase:
# Check that the request matches the signature
# Signature ok
# The Subjects Distinguished Name is as follows
# countryName :PRINTABLE:'FI'
# organizationName :PRINTABLE:'MySQL AB'
# commonName :PRINTABLE:'MySQL admin'
# Certificate is to be certified until Sep 13 14:22:46 2003 GMT
# (365 days)
# Sign the certificate? [y/n]:y
#
#
# 1 out of 1 certificate requests certified, commit? [y/n]y
# Write out database with 1 new entries
# Data Base Updated

#
# Create client request and key
#
openssl req -new -keyout $DIR/client-key.pem -out \
$DIR/client-req.pem -days 3600 -config $DIR/openssl.cnf

# Sample output:
# Using configuration from /home/monty/openssl/openssl.cnf
# Generating a 1024 bit RSA private key
# .....................................++++++
# .............................................++++++
# writing new private key to '/home/monty/openssl/client-key.pem'
# Enter PEM pass phrase:
# Verifying password - Enter PEM pass phrase:
# -----
# You are about to be asked to enter information that will be
# incorporated into your certificate request.
# What you are about to enter is what is called a Distinguished Name
# or a DN.
# There are quite a few fields but you can leave some blank
# For some fields there will be a default value,
# If you enter '.', the field will be left blank.
# -----
# Country Name (2 letter code) [AU]:FI
# State or Province Name (full name) [Some-State]:.
# Locality Name (eg, city) []:
# Organization Name (eg, company) [Internet Widgits Pty Ltd]:MySQL AB
# Organizational Unit Name (eg, section) []:
# Common Name (eg, YOUR name) []:MySQL user
# Email Address []:
#
# Please enter the following 'extra' attributes
# to be sent with your certificate request
# A challenge password []:
# An optional company name []:

#
# Remove a passphrase from the key (optional)
#
openssl rsa -in $DIR/client-key.pem -out $DIR/client-key.pem

#
# Sign client cert
#

openssl ca -policy policy_anything -out $DIR/client-cert.pem \
-config $DIR/openssl.cnf -infiles $DIR/client-req.pem

# Sample output:
# Using configuration from /home/monty/openssl/openssl.cnf
# Enter PEM pass phrase:
# Check that the request matches the signature
# Signature ok
# The Subjects Distinguished Name is as follows
# countryName :PRINTABLE:'FI'
# organizationName :PRINTABLE:'MySQL AB'
# commonName :PRINTABLE:'MySQL user'
# Certificate is to be certified until Sep 13 16:45:17 2003 GMT
# (365 days)
# Sign the certificate? [y/n]:y
#
#
# 1 out of 1 certificate requests certified, commit? [y/n]y
# Write out database with 1 new entries
# Data Base Updated

#
# Create a my.cnf file that you can use to test the certificates
#

cnf=""
cnf="$cnf [client]"
cnf="$cnf ssl-ca=$DIR/cacert.pem"
cnf="$cnf ssl-cert=$DIR/client-cert.pem"
cnf="$cnf ssl-key=$DIR/client-key.pem"
cnf="$cnf [mysqld]"
cnf="$cnf ssl-ca=$DIR/cacert.pem"
cnf="$cnf ssl-cert=$DIR/server-cert.pem"
cnf="$cnf ssl-key=$DIR/server-key.pem"
echo $cnf | replace " " '
' > $DIR/my.cnf


SSL 접속을 테스트 하기 위해서는, 서버를 아래와 같이 시작하도록 하는데, 여기에서 $DIR은 샘플 my.cnf 옵션 파일이 저장되어 있는 디렉토리의 경로 이름이다:



shell> mysqld --defaults-file=$DIR/my.cnf &

그 다음에 동일한 옵션 파일을 사용해서 클라이언트 프로그램을 호출한다:



shell> mysql --defaults-file=$DIR/my.cnf

MySQL 소스 배포판을 가지고 있다면, 위에 있는 my.cnf 파일이 배포판의 SSL 디렉토리에 있는 데모 인증서와 키 파일을 참조하도록 설정을 변경해서 테스트 할 수도 있다.


SSL 명령어 옵션

아래에 있는 리스트는 SSL, 인증서 파일, 그리고 키 파일의 사용을 지정하기 위해 사용되는 옵션을 설명하는 것이다. 이 옵션들은 명령어 라인 또는 옵션 파일에서 지정될 수 있다.


  • --ssl
    서버의 경우, 이 옵션은 서버가 SSL 접속을 허용한다는 것을 가리킨다. 클라이언트 프로그램에 대해서는, 이 옵션은 클라이언트가 SSL을 사용해서 서버에 접속할 수 있다는 것을 나타낸다. 이 옵션 자체만을 가지고는 SSL 접속을 만들 수가 없다. 여러분은 반드시 --ssl-ca, --ssl-cert, 그리고 --ssl-key 옵션을 함께 지정해야 한다. 이 옵션은 SSL을 사용하지 말도록 가리키기 위한 형태로 보다 많이 사용된다. 이렇게 지정하기 위해서는, 옵션을 --skip-ssl 또는 --ssl=0와 같이 지정한다. --ssl 의 사용은 SSL 접속을 요구하지 않는다는 것을 알아두자. 예를 들면, 만일 서버 또는 클라이언트가 SSL을 지원하지 않고 컴파일 되었다면, 일반적인 암호화 되지 않은 접속이 사용된다. SSL 접속이 사용되고 있다는 것을 확인하는 방법은 GRANT 명령문 안에 REQUIRE SSL 구문을 포함하고 있는 계정을 서버에서 생성하는 것이다. 그런 다음에 이 계정을 사용해서 서버에 접속을 하는데, 이때 서버와 클라이언트가 모두 SSL 지원을 활성화 되어 있어야 한다.
  • --ssl-ca=file_name
    신뢰성이 있는 SSL CA 리스트를 가지고 있는 파일에 대한 경로
  • --ssl-capath=directory_name
    신뢰성이 있는 SSL CA 인증서를 PEM 포맷 형태로 가지고 있는 디렉토리의 경로.
  • --ssl-cert=file_name
    보안 접속 구축을 위해 사용되는 SSL 인증 파일의 이름.
  • --ssl-cipher=cipher_list
    SSL 암호화를 위해 사용되는 암호 리스트. cipher_list는 openssl ciphers 명령어와 동일한 포맷이다. 예: --ssl-cipher=ALL:-AES:-EXP
  • --ssl-key=file_name
    보안 접속 구축을 위해 사용되는 SSL 키 파일의 이름.
SSH를 사용해서 윈도우에서 원격으로 MySQL 접속하기

이 섹션에서는 SSH를 사용해서 원격 MySQL 서버에 보안 접속을 하는 방법을 설명한다:


  1. SSH 클라이언트를 여러분의 윈도우 머신에 설치한다. 무료 버전이 아닌 것 중에 가장 좋은 것은 http://www.vandyke.com/에 있는 SecureCRT이다. http://www.f-secure.com/에 있는 f-secure를 사용하는 것도 좋다. 무료 버전은, http://directory.google.com/Top/Computers/Security/Products_and_Tools/Cryptography/SSH/Clients/Windows/에서 찾을 수가 있다.
  2. 윈도우를 SSH 클라이언트와 함께 시작한다. Host_Name = yourmysqlserver_URL_or_IP로 설정한다. 서버에 로그인 하기 위해 userid=your_userid를 설정한다. userid 값은 MySQL 계정의 사용자 이름과 동일하지 않을 수도 있다.
  3. 포트를 전방향 (forwarding)으로 설정한다. 원격 전방향 (remote forward) (local_port: 3306, remote_host: yourmysqlservername_or_ip, remote_port: 3306) 또는 로컬 전방향 (local forward) (port: 3306, host: localhost, remote port: 3306)으로 설정한다.
  4. 모든 것을 저장한다, 그렇지 않으면, 다음에 위의 모든 것을 다시 실행해야 한다.
  5. 지금 막 생성한 SSH 세션을 가지고 서버에 로그인 한다.
  6. 윈도우 머신에서, ODBC 어플리케이션을 시작한다 (Access와 같이).
  7. 윈도우에서 새로운 파일을 생성하고, 여러분이 일반적으로 하는 방식대로 ODBC 드라이버를 사용해서 MySQL에 링크를 하되, MySQL 호스트 서버에 대한 localhost 에는 yourmysqlservername를 타이핑하지 않는다.

이렇게 하면, 여러분은 SSH를 사용한 암호화를 통해 MySQL에 ODBC 접속을 가지게 된다.

출처 : MySQL 코리아