Oracle 보안 소켓 Layer - Amazon Relational Database Service

Oracle 보안 소켓 Layer

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

참고

동일한 RDS for Oracle DB 인스턴스에서 SSL 또는 NNE(기본 네트워크 암호화)를 사용할 수 있지만 동시에 사용할 수는 없습니다. SSL 암호화를 사용할 경우 다른 연결 암호화는 모두 해제해야 합니다. 자세한 내용은 Oracle 기본 네트워크 암호화 섹션을 참조하세요.

SSL/TLS 및 NNE는 더 이상 Oracle Advanced Security의 일부가 아닙니다. RDS for Oracle에서는 다음 데이터베이스 버전의 모든 정식 에디션에서 SSL 암호화를 사용할 수 있습니다.

  • Oracle Database 21c(21.0.0)

  • Oracle Database 19c(19.0.0)

  • Oracle Database 12c Release 2 (12.2) - 이 릴리스 지원 중단됨

  • Oracle Database 12c Release 1 (12.1) - 이 릴리스 지원 중단됨

Oracle SSL 옵션에 대한 TLS 버전

Amazon RDS for Oracle은 TLS(전송 계층 보안) 버전 1.0 및 1.2를 지원합니다. 새 Oracle SSL 옵션을 추가할 경우, 유효한 값에 SQLNET.SSL_VERSION을 명시적으로 설정합니다. 다음은 이 옵션 설정으로 허용되는 값입니다.

  • "1.0" – 클라이언트는 TLS 버전 1.0만 사용하여 DB 인스턴스에 연결할 수 있습니다. 기존 Oracle SSL 옵션에서 SQLNET.SSL_VERSION"1.0"으로 자동 설정됩니다. 필요할 경우 설정을 변경할 수 있습니다.

  • "1.2" – 클라이언트는 TLS 1.2만 사용하여 DB 인스턴스에 연결할 수 있습니다.

  • "1.2 or 1.0" – 클라이언트는 TLS 1.2 또는 1.0을 사용하여 DB 인스턴스에 연결할 수 있습니다.

Oracle SSL 옵션에 대한 암호 그룹

Amazon RDS for Oracle은 여러 개의 SSL 암호 그룹을 지원합니다. 기본적으로 Oracle SSL은 SSL_RSA_WITH_AES_256_CBC_SHA 암호 그룹을 사용하도록 구성되어 있습니다. SSL 연결을 통해 사용할 다른 암호 그룹을 지정하려면 SQLNET.CIPHER_SUITE 옵션 설정을 사용하십시오.

다음 테이블에는 RDS for Oracle에 대한 SSL 지원이 요약되어 있습니다. 지정된 Oracle 데이터베이스 릴리스는 모든 버전을 지원합니다.

암호 그룹(SQLNET.CIPHER_SUITE) TLS 버전 지원(SQLNET.SSL_VERSION) 지원되는 Oracle Database 릴리스 FIPS 지원 FedRAMP 규정 준수
SSL_RSA_WITH_AES_256_CBC_SHA(기본) 1.0 및 1.2 12c, 19c, 21c 아니요
SSL_RSA_WITH_AES_256_CBC_SHA256 1.2 12c, 19c, 21c 아니요
SSL_RSA_WITH_AES_256_GCM_SHA384 1.2 12c, 19c, 21c 아니요
TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 1.2 19c, 21c
TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 1.2 19c, 21c
TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384 1.2 19c, 21c
TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256 1.2 19c, 21c
TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA 1.2 19c, 21c
TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA 1.2 19c, 21c

FIPS 지원

RDS for Oracle을 사용하면 140-2에 대해 FIPS(Federal Information Processing Standard) 표준을 사용할 수 있습니다. FIPS 140-2는 암호 모듈 보안 요구 사항을 정의하는 미국 정부 표준입니다. Oracle SSL 옵션에 대해 FIPS.SSLFIPS_140TRUE로 설정하여 FIPS 표준을 활성화합니다. FIPS 140-2가 SSL용으로 구성된 경우 암호화 라이브러리는 클라이언트와 RDS for Oracle DB 인스턴스 간의 데이터를 암호화합니다.

클라이언트는 FIPS를 준수하는 암호 제품군을 사용해야 합니다. 연결을 설정할 때 클라이언트와 RDS for Oracle DB 인스턴스는 메시지를 주고받을 때 사용할 암호 제품군을 협상합니다. Oracle SSL 옵션에 대한 암호 그룹의 테이블에서는 각 TLS 버전에 대한 FIPS 호환 SSL 암호 그룹을 보여줍니다. 자세한 내용은 Oracle Database 설명서의 Oracle Database FIPS 140-2 설정을 참조하세요.

SSL 옵션 추가

SSL을 사용하려면 RDS for Oracle DB 인스턴스가 SSL 옵션을 포함하는 옵션 그룹과 연결되어 있어야 합니다.

SSL 옵션을 옵션 그룹에 추가하려면
  1. 새 옵션 그룹을 만들거나 SSL 옵션을 추가할 수 있는 기존 옵션 그룹을 식별하십시오.

    옵션 그룹의 생성에 대한 자세한 내용은 옵션 그룹 생성 단원을 참조하십시오.

  2. [SSL] 옵션을 옵션 그룹에 추가합니다.

    SSL 연결에 FIPS 확인 암호 제품군만 사용하려면 FIPS.SSLFIPS_140 옵션을 TRUE로 설정합니다. FIPS 표준에 대한 자세한 내용은 FIPS 지원 단원을 참조하십시오.

    옵션 그룹에 옵션을 추가하는 방법에 대한 자세한 내용은 옵션 그룹에 옵션 추가 단원을 참조하십시오.

  3. 새 RDS for Oracle DB 인스턴스를 생성하고 옵션 그룹을 연결하거나, RDS for Oracle DB 인스턴스를 수정하여 옵션 그룹을 연결합니다.

    DB 인스턴스 생성에 대한 자세한 내용은 Amazon RDS DB 인스턴스 생성 단원을 참조하세요.

    DB 인스턴스 수정에 대한 자세한 내용은 Amazon RDS DB 인스턴스 수정 단원을 참조하세요.

SSL 옵션을 옵션 그룹에 추가하려면
  1. 새 옵션 그룹을 만들거나 SSL 옵션을 추가할 수 있는 기존 옵션 그룹을 식별하십시오.

    옵션 그룹의 생성에 대한 자세한 내용은 옵션 그룹 생성 단원을 참조하십시오.

  2. [SSL] 옵션을 옵션 그룹에 추가합니다.

    다음 옵션 설정을 지정합니다.

    • Port – SSL 포트 번호입니다.

    • VpcSecurityGroupMemberships – 옵션이 활성화되는 VPC 보안 그룹입니다.

    • SQLNET.SSL_VERSION – 클라이언트가 DB 인스턴스에 연결할 때 사용할 수 있는 TLS 버전입니다.

    예를 들어 다음 AWS CLI 명령은 SSL 옵션을 ora-option-group이라는 옵션 그룹에 추가합니다.

    Linux, macOS, Unix:

    aws rds add-option-to-option-group --option-group-name ora-option-group \ --options 'OptionName=SSL,Port=2484,VpcSecurityGroupMemberships="sg-68184619",OptionSettings=[{Name=SQLNET.SSL_VERSION,Value=1.0}]'

    Windows의 경우:

    aws rds add-option-to-option-group --option-group-name ora-option-group ^ --options 'OptionName=SSL,Port=2484,VpcSecurityGroupMemberships="sg-68184619",OptionSettings=[{Name=SQLNET.SSL_VERSION,Value=1.0}]'
  3. 새 RDS for Oracle DB 인스턴스를 생성하고 옵션 그룹을 연결하거나, RDS for Oracle DB 인스턴스를 수정하여 옵션 그룹을 연결합니다.

    DB 인스턴스 생성에 대한 자세한 내용은 Amazon RDS DB 인스턴스 생성 단원을 참조하세요.

    DB 인스턴스 수정에 대한 자세한 내용은 Amazon RDS DB 인스턴스 수정 단원을 참조하세요.

RDS for Oracle DB 인스턴스에 SSL을 사용하도록 SQL*Plus 구성

Oracle SSL 옵션을 사용하는 RDS for Oracle DB 인스턴스에 연결하려면 우선 연결 전에 SQL*Plus를 구성해야 합니다.

참고

해당 클라이언트에서 DB 인스턴스에 액세스하는 것을 허용하려면 보안 그룹을 올바르게 구성해야 합니다. 자세한 내용은 보안 그룹을 통한 액세스 제어 섹션을 참조하세요. 또한 이러한 지침은 Oracle 홈을 직접 사용하는 SQL*Plus 및 기타 클라이언트에 대한 것입니다. JDBC 연결에 대한 자세한 정보는 JDBC를 통한 SSL 연결 설정 단원을 참조하십시오.

SSL을 사용하여 RDS for Oracle DB 인스턴스에 연결하도록 SQL*Plus를 구성하려면
  1. ORACLE_HOME 환경 변수를 Oracle 홈 디렉터리의 위치로 설정합니다.

    Oracle 홈 디렉터리 경로는 설치에 따라 달라집니다. 다음은 ORACLE_HOME 환경 변수를 설정하는 예제입니다.

    prompt>export ORACLE_HOME=/home/user/app/user/product/12.1.0/dbhome_1

    Oracle 환경 변수 설정에 대한 자세한 정보는 Oracle 설명서의 SQL*Plus Environment Variables 및 운영 체제에 해당하는 Oracle 설치 안내서를 참조하십시오.

  2. $ORACLE_HOME/libLD_LIBRARY_PATH 환경 변수에 추가합니다.

    다음은 LD_LIBRARY_PATH 환경 변수를 설정하는 예제입니다.

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

    다음은 Oracle Wallet 디렉터리를 생성하는 예제입니다.

    prompt>mkdir $ORACLE_HOME/ssl_wallet
  4. 모든 AWS 리전에서 작동하는 인증서 번들 .pem 파일을 다운로드하고 파일을 ssl_wallet 디렉터리에 저장합니다. 자세한 내용은 SSL/TLS를 사용하여 DB 인스턴스 또는 클러스터에 대한 연결 암호화을(를) 참조하세요.

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

    net_service_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 파일을 수정하거나 만들고 다음 파라미터를 포함합니다.

    참고

    TLS 보안 연결을 통해 개체와 통신하기 위해 Oracle이 인증에 필요한 인증서가 있는 wallet을 요구합니다. 7단계에서와 같이 Oracle의 ORAPKI 유틸리티를 사용하여 Oracle Wallet을 만들고 유지 관리할 수 있습니다. 자세한 내용은 Oracle 설명서의 Setting up Oracle wallet using ORAPKI를 참조하십시오.

    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
    참고

    DB 인스턴스가 지원하는 경우 SSL_VERSION을 더 높은 값으로 설정할 수 있습니다.

  7. 다음 명령을 실행하여 Oracle Wallet을 만듭니다.

    prompt>orapki wallet create -wallet $ORACLE_HOME/ssl_wallet -auto_login_only
  8. OS 유틸리티를 사용하여 .pem 번들 파일의 각 인증서를 별도의 .pem 파일로 추출합니다.

  9. .pem 파일의 절대 파일 이름으로 certificate-pem-file을 대체하여 개별 orapki 명령을 통해 Wallet에 각 인증서를 추가합니다.

    prompt>orapki wallet add -wallet $ORACLE_HOME/ssl_wallet -trusted_cert -cert certificate-pem-file -auto_login_only

    자세한 내용은 SSL/TLS 인증서 교체 섹션을 참조하세요.

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

앞에서 설명한 대로 SSL을 사용하도록 SQL*Plus를 구성한 후에는 SSL 옵션을 통해 RDS for Oracle DB 인스턴스에 연결할 수 있습니다. 선택적으로, tnsnames.ora 및 sqlnet.ora 파일이 들어있는 디렉터리를 가리키는 TNS_ADMIN 값을 먼저 내보낼 수 있습니다. 그러면 SQL *Plus가 이러한 파일을 일관되게 찾을 수 있습니다. 다음 예에서는 TNS_ADMIN 값을 내보냅니다.

export TNS_ADMIN = ${ORACLE_HOME}/network/admin

DB 인스턴스에 연결합니다. 예를 들어 SQL*Plus와 tnsnames.ora 파일의 <net_service_name>을 사용하여 연결할 수 있습니다.

sqlplus mydbuser@net_service_name

다음 명령을 사용하면 tnsnames.ora 파일 사용 없이 SQL*Plus를 사용하여 DB 인스턴스에 연결할 수도 있습니다.

sqlplus 'mydbuser@(DESCRIPTION = (ADDRESS = (PROTOCOL = TCPS)(HOST = endpoint) (PORT = ssl_port_number))(CONNECT_DATA = (SID = database_name)))'

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

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 설명서의 키 스토어 생성을 참조하세요. 참조 정보는 Java 플랫폼, 표준 에디션 도구 참조keytool을 참조하세요.

keytool -genkey -alias client -validity 365 -keyalg RSA -keystore clientkeystore

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

Amazon RDS 루트 CA 인증서를 신뢰하려면
  1. 모든 AWS 리전에서 작동하는 인증서 번들 .pem 파일을 다운로드하고 파일을 ssl_wallet 디렉터리에 저장합니다.

    인증서 다운로드에 대한 자세한 내용은 SSL/TLS를 사용하여 DB 인스턴스 또는 클러스터에 대한 연결 암호화 단원을 참조하세요.

  2. OS 유틸리티를 사용하여 .pem 파일의 각 인증서를 별도의 파일로 추출합니다.

  3. 별도의 openssl 명령을 사용하여 각 인증서를 .der 형식으로 변환하고 certificate-pem-file을 인증서 .pem 파일 이름(.pem 확장자 제외)으로 대체합니다.

    openssl x509 -outform der -in certificate-pem-file.pem -out certificate-pem-file.der
  4. 다음 명령을 사용하여 각 인증서를 키 스토어로 가져옵니다.

    keytool -import -alias rds-root -keystore clientkeystore.jks -file certificate-pem-file.der

    자세한 내용은 SSL/TLS 인증서 교체 섹션을 참조하세요.

  5. 키 스토어가 성공적으로 만들어졌는지 확인하십시오.

    keytool -list -v -keystore clientkeystore.jks

    메시지가 표시되면 키 스토어 암호를 입력하십시오.

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

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. 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 일치를 적용합니다.

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

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

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);

SSL 연결 문제 해결

데이터베이스를 쿼리한 후 ORA-28860 오류가 표시될 수 있습니다.

ORA-28860: Fatal SSL error 28860. 00000 - "Fatal SSL error" *Cause: An error occurred during the SSL connection to the peer. It is likely that this side sent data which the peer rejected. *Action: Enable tracing to determine the exact cause of this error.

이 오류는 클라이언트가 서버에서 지원하지 않는 TLS 버전을 사용하여 연결을 시도할 때 발생합니다. 이 오류를 방지하려면 sqlnet.ora를 편집하고 SSL_VERSION을 올바른 TLS 버전으로 설정하세요. 자세한 내용은 My Oracle Support 문서의 Oracle Support Document 2748438.1을 참조하세요.