보안의 필요성
현대인들은 일상생활에 깊숙이 파고든 PC와 스마트폰으로 웹 서핑을 즐깁니다. 그러다 보니 인터넷상에 전송 중인 데이터를 악의적인 의도로 데이터를 엿볼 수도 있습니다. 즉, 누군가가 전송 중인 데이터를 엿볼 수 있는 것을 스니핑(sniffing)이라고 합니다.
대표적으로 계정의 id, pw를 가로채 타인의 개인 정보를 이용하여 물리적인 손해 입히는 사례가 있습니다.
이에 대해 CUBRID는 사용자 데이터를 보호하기 위해서 패킷 암호화를 제공합니다.
패킷 암호화를 적용하면 전송할 데이터에 대해 패킷이 암호화되어 전송됨으로써 누군가 스니핑(sniffing) 하더라도 데이터를 해석할 수 없게 구현할 수 있습니다.
CUBRID 패킷암호화
CUBRID는 클라이언트와 서버 간에 전송되는 데이터를 암호화하기 위해 SSL/TLS 프로토콜을 사용합니다.
SSL은 대칭형(symmetric)키를 이용하여 송수신 데이터를 암호화합니다. (클라이언트와 서버가 같은 세션키를 공유하여 암복호함).
클라이언트가 서버에 연결할 때마다 새롭게 생성되는 세션키 생성에 필요한 정보를 암호화한 형태로 교환하기 위해서 비 대칭 (asymmetric) 암호화 알고리즘을 사용하며, 이를 위해서 서버의 공개키와 개인키가 필요합니다.
공개키는 인증서에 포함되어 있으며, 인증서와 개인키는 $CUBRID/conf 디렉터리에 있으며 각각의 파일명은 ‘cas_ssl_cert.crt’ 와 ‘cas_ssl_cert.key’ 입니다. 이 인증서는 OpenSSL의 명령어 도구를 이용하여 생성된 것이며 ‘self-signed’ 형태의 인증서입니다.
사용자가 원하는 경우 IdenTrust나 DigiCert와 같은 공인 인증기관에서 발급받은 인증서로 대체 가능하며, OpenSSL 명령어 도구로 새롭게 생성하여 대체하는 것도 가능합니다.
아래는 OpenSSL 명령어 도구를 이용하여 개인키, 인증서 생성 예시입니다.
# 2048 bit 크기의 RSA 개인키 생성
$ openssl genrsa -out my_cert.key 2048
# 인증요청서 CSR (Certificate Signing Request)
$ openssl req -new -key my_cert.key -out my_cert.csr
# 1년 유효한 인증서 생성 (365 : self-signed certificate 유효기간(일))
$ openssl x509 -req -days 365 -in my_cert.csr -signkey my_cert.key -out my_cert.crt
|
cs |
위에서 생성된 my_cert.key와 my_cert.crt를 $CUBRID/conf 아래 cas_ssl_cert.key와 cas_ssl_cert.crt로 대체하면 됩니다.
(위에 작성된 self-signed certificate 예시는 1년 유효한 인증서임으로 매년 갱신 해야 합니다. self-signed certificate도 유효기간을 늘이면 매년 갱신이 필요 없기 때문에 매년 갱신을 원하지 않는 경우, self-signed 인증서의 유효 기간을 늘리거나, 공인 인증기관에서 발급받은 인증서를 대체해서 사용하면 됩니다.)
CUBRID 패킷암호화 방법
- 지원하는 드라이버
큐브리드는 다양한 드라이버를 제공하고 있으나, 현재 패킷 암호화 연결을 지원하는 드라이버는 JDBC와 CCI 드라이버입니다.
- 서버설정
CUBRID는 브로커 단위로 암호화모드와 비암호화 모드를 설정할 수 있습니다.
기본은 비암호화 모드이며 설정 파일 중 cubrid_broker.conf의 SSL 파라미터 값을 아래 그림과 같이 ON으로 변경하여 암호화 모드로 설정할 수 있습니다.
DB 운영 중에 브로커 파라미터 값을 변경했다면, 브로커를 재시작 해야합니다. (브로커는 응용 클라이언트가 DB 서버에 연결할 수 있도록 중계하는 미들웨어입니다.)
- 클라이언트(AP응용) 암호화 연결 설정
클라이언트(AP응용)에서는 db-url의 useSSL property를 사용해 암호화 연결을 할 수 있습니다. 클라이언트는 아래 예시처럼 useSSL property 추가만 해주면 SSL 접속을 할 수 있습니다.
JDBC 드라이버 : "jdbc:cubrid:localhost:33000:demodb:::?charset=utf-8&useSSL=true","UserId",""
CCI 드라이버 : cci:cubrid:localhost:33000:demodb:::?useSSL=true
|
cs |
- 매니저 설정 화면
브로커가 암호화 모드로 동작중인 상태에서 useSSL property 설정을 하지않고 사용하게 되면 다음과 같은 에러가 출력 됩니다. 이 의미는 현재 접속하려는 클라이언트와 브로커 암호화 모드가 일치해야 한다는 것을 의미합니다.(둘다 암호화 모드이거나 둘다 비 암호화 모드)
The requested SSL mode is not permitted, the CAS server is running in a different mode (check useSSL property)
패킷암호화 적용 전/후
- 사용 전
아래 그림은 패킷 암호화 연결을 사용하지 않았을 때 입니다. TCP stream을 보게 되면 사용했던 쿼리와 결과를 알 수 있습니다.
- 사용 후
아래 그림은 패킷 암호화 연결을 적용한 후의 캡처 화면입니다. 암호화 되기전에는 보여지던 쿼리와 결과 값이 암호화되어 해석할 수 없는 것을 확인 할 수 있습니다.