레이블이 ssl인 게시물을 표시합니다. 모든 게시물 표시
레이블이 ssl인 게시물을 표시합니다. 모든 게시물 표시

2009년 11월 15일 일요일

MySQL 보안 - stone with SSL 2

stone작성

우선 OpenSSL대응의 stone을 작성한다. 소스를 풀고 안에 있는 Makefile을 편집한다.
다음 부분을 환경에 맞춰서 편집한다.

Makefile
SSL= /usr/local/ssl
SSL_FLAGS= -DUSE_SSL -I$(SSL)/include
SSL_LIBS= -L$(SSL)/lib -lssl -lcrypto

Linux의 경우, glibc-2.3.2에서는 EPOLLONESHOT이 정의되어 있지않기때문에 컴파일 에러가 난다.

Makefile안의 linux: 타켓에 적혀있는 -DUSE_EPOLL을 생략한다.
준비가 끝났으면 make를 실행한다.

make의 실행
shell$ make linux-ssl

생성된 stone을 원하는 디렉토리에 인스톨하면 된다.


stone실행

stone의 사용방법은 소스와 같이 있는 README.txt에 자세하게 적혀있다.

stone의 기본적인 구문은 다음과 같다.

stone 리모트호스트:리모트포트 로컬포트

stone은 Local포트에서 대기 , 수신한 것을 리모트 포트에 릴레이 전송하게 된다.

>클라이언트에서 실행하는 mysql
mysql -h 127.0.0.1 -P 3308

>클라이언트에서 실행하는 stone
stone remote.server.name:3307 3308

>서버에서 실행하는 stone
stone localhost:3306 3307

이것으로 패킷 리피트의 골격이 완성되었다.

그러나 SSL의 통신은 되지 않는다. 여기에서 SSL용 옵션을 지정한다.

전송포트, 대기포트의 뒤에 /ssl을 붙이게 되어 SSL통신을 하게 된다.

>클라이언트에서 실행하는 stone
stone remote.server.name:3307/ssl 3308
>서버에서 실행하는 stone
stone localhost:3306 3307/ssl

또, 개인 키나 CERTIFICATE 파일을 지정하고 픈 경우는 다음처럼 조작한다.

>클라이언트에서 실행하는 stone
stone -q key=key.pem -q cert=cert.pem remote.server.name:3307/ssl 3308
>서버에서 실행하는 stone
stone -z key=key.pem -z cert=cert.pem localhost:3306 3307/ssl

-z옵션은 SSL서버용 옵션이다.
stone이 서버로 동작할 때 사용한다. -q옵션은 SSL클라이언트로 stone이 동작할 때 사용한다.
MySQL의 SSL대응의 때와 마찬가지로 이 옵션을 사용하면 된다.

key=는 개인키, cert=는 CERTIFICATE파일로 자기가 서명한 것이던지 제3자 인증국이 싸인한 파일을 지정한다. 인증국이 서명한 경우 인증국의 CERTIFICATE파일이 필요로 하게된다.

그 경우는 -{z|q} CApath=, -{z|q}CAfile= 둘중에 하나를 사용하면 된다.
CApath=의 경우는 해쉬를 생성해서 파일명을 만들어야 한다.


2009년 11월 13일 금요일

MySQL 보안 - stone with SSL

stone은 심플한 패킷 리피터로 TCP나 UDP를 릴레이 하는 것이 가능하다.

작고 가볍기 때문에 간단한 벽에 구멍을 내거나 패킷 내용 취득등에 많이 사용되고 있다.

OpenSSL를 같이 쓸 수 있기때문에 SSL통신을 할 수 있다.

MySQL클라이언트나 서버를 SSL통신을 시킬려면 stone은 1개(또는 0개)여도 충분하지만 여기에서는 MySQL클라이언트와 서버 둘다 SSL가 설치되지 않았다고 가정하고 이야기한다.

stone사용예

[Local] ------------------------------------[Remoe]
mysql-> 3308(stone) ==(암호화)==> 3307(stone)->3306(mysqld)



2009년 11월 4일 수요일

MySQL 보안 - SSL통신7

SSL통신을 필수로 하기

어떤 유저의 통신에는 반드시 SSL을 사용하는 경우는 GRANT문에 REQUIRE를 지정한다.

mysql>GRANT .... TO 'mycom'@'192.168.0.1' REQUIRE SSL;

또한 어떤 유저는 반드시 올바른 인증을 받지 않으면 안되는 경우에는 GRANT문에 REQUIRE X509를 지정한다.

mysql>GRANT .... TO 'mycom'@'192.168.0.1' REQUIRE X509;


Subject고정

어떤 사용자의 Subject를 고정하고픈 경우는 GRANT문에 SUBJECT를 추가한다.
클라이언트 키의 Subject가 다른 경우, 서버는 접속을 거부한다.

mysql>GRANT .... TO 'mycom'@'192.168.0.1' REQUIRE SUBJECT '/C=KR/L=Basel/O=MYCOM/OU=DB Comms/CN=whatever'

키의 Subject를 표시하고 싶은 경우에는 다음과 같이 한다.

shell$ openssl x509 -text -in client-cert.pem


Issuer의 고정

어떤 유저의 Issuer를 고정하고픈 경우는 GRANT문에 ISSUER를 추가한다.
클라이언트 키의 Issuer가 다른 경우는 서버는 접속을 거부한다.

mysql>GRANT .... TO 'mycom'@'192.168.0.1' REQUIRE ISSUER '/C=KR/O=MYCOM/OU=Certificate Authority/CN=whatever';

Cipher의 고정

어떤 유저의 암호화방식을 고정하고픈 경우는 GRANT문에 CIPHER를 추가한다.

mysql> GRANT .... TO 'mycom'@'192.168.0.1' REQUIRE CIPHER 'DHE-RSA-AES256-SHA:AES128-SHA';

Cipher 리스트는 복수의 암호화를 「:」로 구분짓는다. 특별한 지정으로 「ALL」 하고 「-」이 있다.
예를 들어 , 다음처럼 한 경우 모든 암호화 방식에서 DHE-RSA-AES256-SHA:를 제거한 암호화 방식을 채용한다.
CIPHER 'ALL:DHE-RSA-AES256-SHA'

지원되는 Cipher확인하려면 다음과 같은 조작을 한다.

shell$ openssl ciphers

2009년 10월 30일 금요일

MySQL 보안 - SSL통신6

클라이언트에서 접속

--ssl옵션을 사용해서 접속한다. 키는 ~/.bimil/에 보존지정한다고 가정한다.

shell$ mysql --ssl --ssl-key=~/.bimil/private.pem --ssl-cert=~/.bimil/cert.pem

보통은 만약 SSL의 handshake에 실패하면 평문대로 접속한다.

서버에 접속한 후 STATUS나 SHOW STATUS를 실행하면 SSL로 접속하고 있는지 그렇지 않은지 확인할 수 있다.

○SSL통신을 개시한 경우
mysql> SHOW STATUS LIKE 'Ssl_cipher';
------------------------------------------------
Variable_name | Value
------------------------------------------------
Ssl_cipher | DHE-RSA-AES256-SHA
------------------------------------------------

○SSL통신을 개시하지 못했을 경우
mysql> STATUS
(중략)
SSL: Not in use
(중략)




2009년 10월 18일 일요일

MySQL 보안 - SSL통신5

●Certificate Request 파일에 서명하기

각 Certificate Request 파일을 local CA로 서명한다.

root@shell# openssl ca -policy policy_anything -out signed-cert.pem -in dareka-csr.pem

local CA의 키를 사용해 인증하고픈 누군가의 Certificate Request파일에 서명을 한다.
-out로 지정된 파일이 서명이 끝난 파일이 된다.

policy_anything은 openssl.cnf섹션에 설정되어 있다. 그곳에서는 어느 항목이 필수인가 지정되어 있다. policy_anything은 commonName만이 필수항목으로 되어있다.


policy 섹션에서 키워드에 주어지는 값의 의미


match: 필수항목 그리고 내용은 인증국과 일치
supplied: 필수항목, 내용은 상관없음
optional:있거나 없거나 상관없음.

●MySQL옵션에 파일을 지정하기

서명된 signed-cert.pem파일을 MySQL옵션 --ssl-cert=에 지정하고 --ssl-ca나 --ssl-capath=에 CA의 CERTIFICATE 파일을 지정한다.

예를 들어 다음 예의 경우, 2가지 지정방법이 있다.

  • local CA의 CETIFICATE파일: local-ca-cert.pem
  • local CA에 사인된 파일 : signed-cert.pem
  • private key: private-key.pem
①--ssl-key=private-key.pem --ssl-cert=signed-cert.pem --ssl-ca=local-ca-cert.pem
②--ssl-key=private-key.pem --ssl-cert=signed-cert.pem --ssl-capath= {local-ca-cert.pem을 보존하는 디렉토리 }

local-ca-cert.pem을 보존하는 디렉토리에는 local-ca-cert.pem파일을 보존하는 것만으로는 부족하고 파일의 해쉬를 이름으로 한 파일을 작성할 필요가 있다.

local-ca-cert.pem해쉬
shell$ openssl x509 -hash -noout -in local-ca-cert.pem
a808a98b

local-ca-cert.pem의 해쉬를 붙인 파일을 작성하고 local-ca-cert.pem과 같은 디렉토리에 놓는다.
다음 처럼 조작한다.

local-ca-cert.pem 복사와 해쉬를 파일명으로 한 파일의 작성
shell# cp local-ca-cert.pem capath/
shell# cd capath/
shell# ln -s local-ca-cert.pem a808a98b.0

ln 대신 cp여도 상관없다.
파일명이 "해쉬.숫자"로 되어있다. 숫자는 0이상 정수를 자유로 붙이면 된다.
이것은 만에 하나 해쉬가 다른 파일의 해쉬하고 일치했을 경우에 구별을 두기위한 것이다.

2009년 10월 13일 화요일

MySQL 보안 - SSL통신3

자기 인증국을 세우기

데이터베이스 서버이기때문에 보통은 일반 대다수에게 무작위로 공개하지는 않을 것이다.

제 3자기관의 서명을 받을 것이 아니라 자기 스스로 인증국을 세워 그곳에서 인증하는 방법도 있다.


● 전제지식: OpenSSL 설정파일 또는 사용할 CA섹션을 지정한다.

OpenSSL은 표준 openssl.cnf파일(컴파일할 때 고정됨)을 읽어들여 동작한다.
자기 스스로 인증국으로 하는 경우는 이 파일을 편집하거나 바꿀 필요가 있다.

①별도 파일을 설정파일에 지정한다.
만약 설정파일을 별도의 파일로 했을 경우는 다음과 같이 설정파일을 앞으로 실행하는 모든 명령어 라인의 최초의 옵션에 추가하면 된다.

-config 설정파일

다른 옵션 후에 지정하면 무효가 될 수 있다.

②사용할 CA섹션을 지정한다.
각 CA섹션은 파일내에 [섹션명]으로 정의되어 있지만 [ ca ]섹션 안의 default_ca키워드가 표준으로 사용되는 CA섹션이라는 의미이다.
이것과는 다른 CA섹션을 읽어들이는 경우의 옵션은 다음과 같이 된다.

-name CA섹션명

이것을 각 명령에 추가하면 읽어들이는 섹션은 바뀌게 된다.





2009년 10월 11일 일요일

MySQL 보안 - SSL통신2

서버측 키 생성

■private key 파일 생성

MySQL서버가 사용하는 private key파일(server-key.pem), Certificate Request파일(server-csr.pem)을 작성한다. ( 파일명은 임의로 붙여도 된다. )

※private key파일과 Certificate Request파일 작성
root@shell# openssl req -new -nodes -keyout server-key.pem -out server-csr.pem -days 1000

--nodes를 빼면 pass phrase이 요구되는 키를 작성한다. Common Name ( ....)[] : 에는 서버의 FQDN을 입력해야한다.
또 다음처럼 조작하더라도 같은 결과를 얻을 수 있다.

※make PRIVATE KEY
root@shell# openssl genrsa -des3 -out server-key.pem 1024

※remove pass phrase
root@shell# openssl rsa -in server-key.pem -out server-key.pem

※make CERTIFICATE REQUEST
root@shell# openssl req -new -key server-key.pem -out server-csr.pem -days 1000

■자기 서명 파일 생성
X.509 CERTIFICATE 파일(server-cert.pem)을 작성한다. 스스로 사인(자기서명)을 해 둔다.

※서명
root@shell# openssl x509 -in server-csr.pem -out server-cert.pem -req -signkey server-key.pem -days 1000

■private key 파일과 자기서명 파일의 동시 작성
또, 지금까지의 순서를 정리해서 한번에 private key 파일과 자기서명 파일을 작성할 수 있다.

root@shell# openssl req -new -x509 -nodes -keyout server-key.pem -out server-cert.pem -days 1000

■my.cnf설정
키를 작성했으면 mysqld옵션에 지정해 둔다.

[mysqld]
ssl
ssl-key=/usr/local/mysql/secu/server-key.pem
ssl-cert=/usr/local/mysql/secu/server-cert.pem #주의: 서명한 파일.

#ssl-ca=/usr/local/mysql/secu/ca_cert.pem
#ssl-ca는 CA(Certificate Authority) 증명서이다.

제 3자 인증기관 증명이 필요한 경우에는 server-csr.pem파일( Certificate Request)을 해당 기관에 보낸다. 그리고 인증기관으로부터 받은 서명확인완료 파일을 ssl-cert옵션에 지정한다.
또, ssl-ca나 ssl-capath를 지정할 필요가 있다.


클라이언트 키 생성

클라이언트 키 생성도 서버에서와 마찬가지로 만드는 법은 같다.