메뉴
Amazon Relational Database Service
사용 설명서 (API Version 2014-10-31)

Oracle SSL

Oracle DB 인스턴스와 연결된 옵션 그룹에 Oracle SSL 옵션을 추가하여 Oracle DB 인스턴스에 대해 Secure Sockets Layer(SSL) 암호화를 활성화할 수 있습니다. SSL을 사용하여 통신에 사용할 포트를 지정합니다. 다음 단원에 나와 있는 대로 Oracle 클라이언트를 구성해야 합니다.

DB 인스턴스와 연결된 옵션 그룹에 Oracle SSL 옵션을 추가하여 Oracle DB 인스턴스에 대해 SSL 암호화를 활성화할 수 있습니다. Amazon RDS에서는 Oracle의 요구 사항에 따라 두 번째 포트를 SSL 연결에 사용합니다. 이로 인해 DB 인스턴스와 Oracle 클라이언트 간에 클리어 텍스트 통신과 SSL로 암호화된 통신이 동시에 발생할 수 있습니다. 예를 들어 이 포트를 클리어 텍스트 통신에 사용하여 VPC 내의 다른 리소스와 통신하면서 동일한 포트를 SSL로 암호화된 통신에 사용하여 VPC 외부의 리소스와 통신할 수 있습니다.

참고

Secure Sockets Layer 또는 Native Network Encryption를 사용할 수 있지만 둘 다 사용할 수는 없습니다. 자세한 내용은 Oracle 기본 네트워크 암호화을(를) 참조하십시오.

SSL 암호화는 다음과 같은 Oracle 데이터베이스 버전에 사용할 수 있습니다.

  • 12.1.0.2: 모든 버전, 모든 에디션(Standard Edition Two 포함)

  • 12.1.0.1: 모든 버전, 모든 에디션

  • 11.2.0.4: 모든 버전, Enterprise Edition

  • 11.2.0.4: v6 이상, Standard Edition, Standard Edition One, Enterprise Edition

  • 11.2.0.2: 모든 버전, Enterprise Edition

참고

동일한 인스턴스에서 SSL과 Oracle NNE(기본 네트워크 암호화)를 모두 사용할 수 없습니다. SSL 암호화를 사용할 경우 다른 모든 연결 암호화를 비활성화해야 합니다.

Oracle DB 인스턴스에 SSL을 사용하도록 Oracle 클라이언트 구성

Oracle SSL 옵션을 사용하는 Oracle DB 인스턴스에 연결하기 전에 Oracle 클라이언트를 구성해야 합니다.

SSL을 사용하여 Oracle DB 인스턴스에 연결하도록 Oracle 클라이언트를 구성하려면

  1. 다음 명령을 실행하여 ORACLE_HOME 시스템 변수를 dbhome_1 디렉터리의 위치로 설정합니다.

    Copy
    prompt>export ORACLE_HOME=/home/user/app/user/product/12.1.0/dbhome_1
  2. LD_LIBRARY_PATH 시스템 변수에 $ORACLE_HOME/lib를 추가합니다.

    Copy
    prompt>export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$ORACLE_HOME/lib
  3. $ORACLE_HOME/ssl_wallet에 Oracle Wallet을 위한 디렉터리를 만듭니다.

    Copy
    prompt>mkdir $ORACLE_HOME/ssl_wallet
  4. https://s3.amazonaws.com/rds-downloads/rds-ca-2015-root.pem에서 RDS CA 인증서 파일을 다운로드한 후 ssl_wallet 디렉터리에 넣습니다.

  5. $ORACLE_HOME/network/admin 디렉터리에서 tnsnames.ora 파일을 수정하거나 만들고 다음 항목을 포함합니다.

    Copy
    <database name>= (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCPS) (HOST = <endpoint>) (PORT = <ssl port number>)))(CONNECT_DATA = (SID = <database name>)) (SECURITY = (SSL_SERVER_CERT_DN = "C=US,ST=Washington,L=Seattle,O=Amazon.com,OU=RDS,CN=<endpoint>")))
  6. 동일한 디렉터리에서 sqlnet.ora 파일을 수정하거나 만들고 다음 파라미터를 포함합니다.

    Copy
    WALLET_LOCATION = (SOURCE = (METHOD = FILE) (METHOD_DATA = (DIRECTORY = $ORACLE_HOME/ssl_wallet))) SSL_CLIENT_AUTHENTICATION = FALSE SSL_VERSION = 1.0 SSL_CIPHER_SUITES = (SSL_RSA_WITH_AES_256_CBC_SHA) SSL_SERVER_DN_MATCH = ON
  7. 다음 명령을 실행하여 Oracle Wallet을 만듭니다.

    Copy
    prompt>orapki wallet create -wallet $ORACLE_HOME/ssl_wallet -auto_login_only   prompt>orapki wallet add -wallet $ORACLE_HOME/ssl_wallet -trusted_cert -cert $ORACLE_HOME/ssl_wallet/rds-ca-2015-root.pem -auto_login_only

SSL을 사용하여 Oracle DB 인스턴스에 연결

앞서 설명한 대로 SSL을 사용하도록 Oracle 클라이언트를 구성한 후에는 SSL 옵션을 통해 Oracle DB 인스턴스에 연결할 수 있습니다. 예를 들어 sqlplus를 사용하여 DB 인스턴스에 연결하려면 다음 명령을 사용합니다.

Copy
sqlplus> '<mydbuser>@(DESCRIPTION = (ADDRESS = (PROTOCOL = TCPS)(HOST = <endpoint>) (PORT = <ssl port number>))(CONNECT_DATA = (SID = <database name>)))'

SSL을 사용하지 않고 Oracle DB 인스턴스에 연결할 수도 있습니다. 예를 들어 다음 명령을 실행하면 SSL 암호화 없이 클리어 텍스트 포트를 통해 DB 인스턴스에 연결됩니다.

Copy
sqlplus '<mydbuser>@(DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = <endpoint>) (PORT = <port number>))(CONNECT_DATA = (SID = <database name>)))'

TCP(Transmission Control Protocol) 포트 액세스를 닫으려는 경우 IP 주소 수신이 없는 보안 그룹을 만들어 인스턴스에 추가합니다. 이렇게 하면 TCP 포트를 통한 연결이 닫히지만 SSL 옵션 보안 그룹에 의해 허용되는 범위 내에 있는 IP 주소를 사용하여 지정되는 SSL 포트를 통해 계속 연결할 수 있습니다.

JDBC를 통한 SSL 연결 설정

JDBC를 통한 SSL 연결을 사용하려면 키 스토어를 만들고 Amazon RDS 루트 CA 인증서를 신뢰하고 아래에 지정된 코드 조각을 사용해야 합니다.

키 스토어를 JKS 형식으로 만들려면 다음 명령을 사용합니다. 키 스토어 만들기에 대한 자세한 내용은 Oracle 설명서을(를) 참조하십시오.

Copy
keytool -keystore clientkeystore -genkey -alias client

그 다음에는 이 단계에 따라 Amazon RDS 루트 CA 인증서를 신뢰합니다.

  1. 1. https://s3.amazonaws.com/rds-downloads/rds-ca-2015-root.pem에서 Amazon RDS 루트 CA 인증서를 다운로드합니다.

  2. 다음 명령을 사용하여 인증서를 DER 형식으로 변환합니다.

    Copy
    openssl x509 -outform der -in rds-ca-2015-root.pem -out rds-ca-2015-root.der
  3. 다음 명령을 사용하여 인증서를 키 스토어로 가져옵니다.

    Copy
    keytool -import -alias rds-root -keystore clientkeystore -file rds-ca-2015-root.der

다음은 JDBC를 사용하여 SSL 연결을 설정하는 방법을 보여 주는 코드 조각입니다.

Copy
import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; import java.util.Properties; public class OracleSslConnectionTest { private static final String DB_SERVER_NAME = "<dns-name-provided-by-amazon-rds>"; private static final Integer SSL_PORT = "<ssl-option-port-configured-in-option-group>"; private static final String DB_SID = "<oracle-sid>"; private static final String DB_USER = "<user name>"; private static final String DB_PASSWORD = "<password>"; // This key store has only the prod root ca: https://s3.amazonaws.com/rds-downloads/rds-ca-2015-root.pem private static final String KEY_STORE_FILE_PATH = "<file-path-to-keystore>"; private static final String KEY_STORE_PASS = "<keystore-password>"; public static void main(String[] args) throws SQLException { final Properties properties = new Properties(); final String connectionString = String.format( "jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS=(PROTOCOL=TCPS)(HOST=%s)(PORT=%d))(CONNECT_DATA=(SID=%s)))", DB_SERVER_NAME, SSL_PORT, DB_SID); properties.put("user", DB_USER); properties.put("password", DB_PASSWORD); properties.put("oracle.jdbc.J2EE13Compliant", "true"); properties.put("javax.net.ssl.trustStore", KEY_STORE_FILE_PATH); properties.put("javax.net.ssl.trustStoreType", "JKS"); properties.put("javax.net.ssl.trustStorePassword", KEY_STORE_PASS); final Connection connection = DriverManager.getConnection(connectionString, properties); // If no exception, that means handshake has passed, and an SSL connection can be opened } }

SSL 연결과 DN 일치 적용

Oracle SSL_SERVER_DN_MATCH 파라미터를 사용하여 데이터베이스 서버에 대한 DN(고유 이름)을 서비스 이름과 일치하도록 적용할 수 있습니다. 일치 확인을 적용한 경우 SSL에서 인증서가 서버에서 가져온 것인지를 확인합니다. 일치 확인을 적용하지 않은 경우 SSL에서 확인을 수행하지만 일치 여부에 상관없이 연결을 허용합니다. 일치를 적용하지 않은 경우 서버 ID가 위조될 수 있습니다.

DN 일치를 적용하려면 DN 일치 속성을 추가하고 아래 지정된 연결 문자열을 사용합니다.

다음과 같이 속성을 클라이언트 연결에 추가하여 DN 일치를 적용합니다.

Copy
properties.put("oracle.net.ssl_server_dn_match", "TRUE”);

SSL을 사용할 때 DN 일치를 적용하려면 다음 연결 문자열을 사용합니다.

Copy
final String connectionString = String.format( "jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS=(PROTOCOL=TCPS)(HOST=%s)(PORT=%d))" + "(CONNECT_DATA=(SID=%s))" + "(SECURITY = (SSL_SERVER_CERT_DN = \"C=US,ST=Washington,L=Seattle,O=Amazon.com,OU=RDS,CN=%s\")))", DB_SERVER_NAME, SSL_PORT, DB_SID, DB_SERVER_NAME);

관련 주제