본문 바로가기
IBM - old/IBM APIC

[DataPower]Cloud 에 있는 WAS 와 Legacy 에 있는 DB 연결을 위한 SSL 이 적용된 JDBC 호출 및 Proxy 구성

by freeman98 2017. 5. 25.

안녕하세요 이정운 입니다.


모 고객사의 요구사항에 의해서 가능 여부를 급하게 테스트를 해보고 혹여나 다른 분들에게도 도움이 될까 테스트 내용을 공유드립니다.

요구사항 : Cloud 에 WAS 를 구성하고 기존 Legacy 에 DB 를 둘 예정인데 이를 보안적으로 보안하기 위한 구성(기존 App 변경 없이!)
구성 : WAS on Cloud --> (JDBC Call with SSL) --> TCP proxy service on IBM DataPower Gateway on Legacy -> DB on Legacy


#1) JDBC Call with SSL 을 위해서 MySQL DB 의 SSL 설정을 위한 key 생성 (예시)

MySQL 에 대한 SSL 설정을 위해서 기본적으로 필요한 key, cert 파일을 하단과 같이 openssl 을 이용해서 생성합니다.
(테스트 해보니 해당 파일은 가급적이면 mysql 설치 폴더에 위치해 두는 것이 편합니다. - 보안 제약이 있는듯)

openssl genrsa -out key.pem 2048
openssl req -new -x509 -key key.pem -out cert.pem -days 0


#2) MySQL 에 대한 SSL 설정 추가 및 변경

MySQL 환경 파일에서 SSL 설정을 위한 key, cert 파일 설정을 추가하고 서비스를 재시작하여 SSL 적용이 제대로 되었는지 확인합니다.
/etc/mysql/my.cnf
ssl-ca=/etc/mysql/cert.pem
ssl-cert=/etc/mysql/cert.pem
ssl-key=/etc/mysql/key.pem

sudo service mysql service restart

show variables like '%ssl%';



#3) SSL 을 통한 MySQL 접속 테스트 및 확인

하단의 구문을 이용 미리 만들어진 cert 를 가지고 SSL 접속을 수행하고 SSL 이 제대로 적용되어 있는지 확인합니다.

mysql --host=192.168.225.10 --ssl-ca=/etc/mysql/cert.pem  -u test -p think



#4) IBM DataPower Gateway 에서 해당 요청을 DB 로 전달해줄 TCP Proxy Service 생성

하단과 같이 IBM DataPower Gateway 에서 TCP layer 측면으로 해당 요청을 DB 로 전달해줄 TCP Proxy service 를 생성합니다. 
(참고로 일반적으로 보안에 사용되는 SSL/TLS 는 TCP/IP 위에서 동작합니다.(좀 더 정확히는 TCP/IP 와 Application 레이어 사이) 따라서, TCP Proxy service 는 일반 평문/비문 상관하지 않고 TCP/IP 레이어 요청을 그대로 proxy 할 수 있습니다.)



#5) WAS 를 통한 JDBC 연결

WAS 를 통해서 일반적인 JDBC 연결을 수행하는 샘플을 사용하는데 IP 와 Port 는 IBM DataPower 에서 사전에 만들어둔 TCP Proxy service 의 IP 와 Port 를 사용합니다.

단, 이때 하단과 같이 JDBC call 이 SSL 을 사용할 수 있도록 옵션을 추가할 수 있습니다. (MySQL 기준)

jdbc:mysql://192.168.225.10:3306/think?verifyServerCertificate=false&useSSL=true&requireSSL=true

저는 IBM WAS Liberty 서버를 활용해서 테스트를 진행했고 도움이 될까 IBM WAS Liberty 의 server.xml 설정을 같이 공유드립니다.

IBM WAS Liberty 의 server.xml

<server description="new server">

    <!-- Enable features -->
    <featureManager>
          <feature>webProfile-7.0</feature>
        <feature>localConnector-1.0</feature>
      <feature>jaxws-2.2</feature>
    </featureManager>

    <!-- To access this server from a remote client add a host attribute to the following element, e.g. host="*" -->
    <httpEndpoint host="*" httpPort="8080" id="defaultHttpEndpoint">
             <accessLogging filepath="${server.output.dir}/logs/http_defaultEndpoint_access.log"/>
      </httpEndpoint>

    <!-- Automatically expand WAR files and EAR files -->
    <applicationManager autoExpand="true"/>   
    <applicationMonitor updateTrigger="mbean"/>

    <cdi12 enableImplicitBeanArchives="false"/>

    <library id="MySQLLIB">
        <fileset dir="C:\eclipse\wlp\usr\servers\defaultServer" id="MySqlJDBC" includes="mysql-connector-java-5.1.42-bin.jar"/>
    </library>
    <dataSource id="mysqlds" jndiName="jdbc/mysqlDS" type="javax.sql.DataSource">
        <jdbcDriver libraryRef="MySQLLIB"/>
        <properties databaseName="think" portNumber="3333" serverName="192.168.225.52" user="test" password="Passw0rd!" URL="jdbc:mysql://192.168.225.52:3333/think?verifyServerCertificate=false&amp;useSSL=true&amp;requireSSL=true"/>
    </dataSource>

    <webApplication id="MySQLTest" location="MySQLTest.war" name="MySQLTest"/>
</server>


#6) 샘플 테스트

샘플 테스트를 수행해보면 정상적으로 DB 조회 및 결과를 확인 가능합니다.


추가적으로 packet 을 capture 할 수 있는 도구를 통해서 packet 을 들어다보면 SSL 로 보안화되어 혹여나 악의적으로 중간에 탈취 되어도 읽을 수 없는 것을 확인가능합니다.



#9) 참고자료 

Creating a TCP Proxy service

Mysql ssl 설정 & JDBC 로 SSL 통신

Getting MySQL server to run with SSL

SSL/TLS 기본


댓글