Oracle Secure Sockets Layer - Amazon Relational Database Service

Oracle Secure Sockets Layer

Você deve ativar a criptografia SSL para uma instância de banco de dados do RDS para Oracle adicionando a opção Oracle SSL ao grupo de opções associado à instância de banco de dados. O Amazon RDS usa uma segunda porta, conforme exigido pela Oracle, para conexões SSL. Essa abordagem permite que comunicações de texto sem formatação e de texto com criptografia SSL ocorram ao mesmo tempo entre uma instância de banco de dados e o SQL*Plus. Por exemplo, você pode usar a porta com comunicação de texto simples para se comunicar com outros recursos dentro de uma VPC enquanto usa a porta com comunicação criptografada em SSL para se comunicar com recursos fora da VPC.

nota

É possível usar SSL ou a Native Network Encryption (NNE) na mesma instância de banco de dados do RDS para Oracle, mas não ambas. Se você usar a criptografia SSL, desative qualquer outra criptografia de conexão. Para ter mais informações, consulte Oracle Native Network Encryption.

SSL/TLS e NNE não fazem mais parte do Oracle Advanced Security. No RDS para Oracle, é possível usar a criptografia SSL com todas as edições licenciadas das seguintes versões do banco de dados:

  • Oracle Database 21c (21.0.0)

  • Oracle Database 19c (19.0.0)

Versões do TLS para a opção Oracle SSL

O Amazon RDS for Oracle oferece suporte ao Transport Layer Security (TLS) versões 1.0 e 1.2. Quando você adiciona uma nova opção Oracle SSL, defina SQLNET.SSL_VERSION explicitamente como um valor válido. Os seguintes valores são permitidos para essa configuração de opção:

  • "1.0": os clientes só podem se conectar à instância de banco de dados usando o TLS versão 1.0. Para opções Oracle SSL existentes, a SQLNET.SSL_VERSION é definida como "1.0" automaticamente. Você pode alterar a configuração se necessário.

  • "1.2" – os clientes podem se conectar à instância de banco de dados usando somente o TLS 1.2.

  • "1.2 or 1.0" – os clientes podem se conectar à instância de banco de dados usando o TLS 1.2 ou 1.0.

Pacotes de criptografia para a opção Oracle SSL

O Amazon RDS for Oracle oferece suporte para vários pacotes de criptografia SSL. Por padrão, a opção Oracle SSL está configurada para usar o pacote de criptografia SSL_RSA_WITH_AES_256_CBC_SHA. Para especificar um pacote de criptografia diferente para usar em conexões SSL, use a configuração da opção SQLNET.CIPHER_SUITE.

A tabela a seguir resume o suporte a SSL no RDS para Oracle em todas as edições do Oracle Database 19c e 21c.

Suíte de cifras (SQLNET.CIPHER_SUITE) Versão do TLS compatível (SQLNET.SSL_VERSION) Suporte ao FIPS Conformidade com FedRAMP
SSL_RSA_WITH_AES_256_CBC_SHA (padrão) 1.0 e 1.2 Sim Não
SSL_RSA_WITH_AES_256_CBC_SHA256 1.2 Sim Não
SSL_RSA_WITH_AES_256_GCM_SHA384 1.2 Sim Não
TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 1.2 Sim Sim
TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 1.2 Sim Sim
TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384 1.2 Sim Sim
TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256 1.2 Sim Sim
TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA 1.2 Sim Sim
TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA 1.2 Sim Sim

Suporte ao FIPS

O RDS para Oracle permite usar o padrão FIPS (Federal Information Processing Standard) para 140-2. O FIPS 140-2 é um padrão do governo dos Estados Unidos que define os requisitos de segurança de módulos criptográficos. Ative o padrão FIPS definindo FIPS.SSLFIPS_140 como TRUE para a opção do Oracle SSL. Quando o FIPS 140-2 é configurado para SSL, as bibliotecas criptográficas criptografam dados entre o cliente e a instância de banco de dados do RDS para Oracle.

Os clientes devem usar o pacote de criptografia compatível com o FIPS. Ao estabelecer uma conexão, o cliente e a instância de banco de dados do RDS para Oracle negociam qual pacote de criptografia deverá ser usado ao transmitir mensagens nas duas direções. A tabela em Pacotes de criptografia para a opção Oracle SSL mostra os pacotes de criptografia SSL compatíveis com o FIPS para cada versão do TLS. Para receber mais informações, consulte Oracle Database FIPS 140-2 Settings na documentação da Oracle.

Adicionar a opção do SSL

Para usar SSL, sua instância de banco de dados do RDS para Oracle deve estar associada a um grupo de opções que inclua a opção SSL.

Para adicionar a opção SSL a um grupo de opções
  1. Crie um novo grupo de opções ou identifique um grupo de opções existente ao qual você pode adicionar a opção SSL.

    Para obter informações sobre como criar um grupo de opções, consulte Criar um grupo de opções.

  2. Adicione a opção SSL ao grupo de opções.

    Se você quiser usar somente pacotes de criptografia verificados para o FIPS para conexões SSL, defina a opção FIPS.SSLFIPS_140 como TRUE. Para obter informações sobre o padrão FIPS, consulte Suporte ao FIPS.

    Para obter informações sobre como adicionar uma opção a um grupo de opções, consulte Adicionar uma opção a um grupo de opções.

  3. Crie uma instância de banco de dados do RDS para Oracle e associe a ela o grupo de opções ou modifique uma instância de banco de dados do RDS para Oracle para associar o grupo de opções a ela.

    Para obter informações sobre como criar uma instância de banco de dados, consulte Criar uma instância de banco de dados do Amazon RDS.

    Para ter mais informações sobre a modificação de uma instância de banco de dados, consulte Modificar uma instância de banco de dados do Amazon RDS.

Para adicionar a opção SSL a um grupo de opções
  1. Crie um novo grupo de opções ou identifique um grupo de opções existente ao qual você pode adicionar a opção SSL.

    Para obter informações sobre como criar um grupo de opções, consulte Criar um grupo de opções.

  2. Adicione a opção SSL ao grupo de opções.

    Especifique as seguintes configurações de opção:

    • Port – O número da porta SSL

    • VpcSecurityGroupMemberships – O grupo de segurança da VPC para o qual a opção está ativada

    • SQLNET.SSL_VERSION – A versão do TLS que o cliente pode usar para se conectar à instância de banco de dados

    Por exemplo, o seguinte comando da AWS CLI adiciona a opção SSL a um grupo de opções denominado ora-option-group.

    exemplo

    Para Linux, macOS ou 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}]'

    Para 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. Crie uma instância de banco de dados do RDS para Oracle e associe a ela o grupo de opções ou modifique uma instância de banco de dados do RDS para Oracle para associar o grupo de opções a ela.

    Para obter informações sobre como criar uma instância de banco de dados, consulte Criar uma instância de banco de dados do Amazon RDS.

    Para obter informações sobre a modificação de uma instância de banco de dados, consulte Modificar uma instância de banco de dados do Amazon RDS.

Configurar o SQL*Plus para usar SSL com uma instância de banco de dados do RDS para Oracle

É necessário configurar o SQL*Plus para se conectar a uma instância de banco de dados do RDS para Oracle que use a opção Oracle SSL.

nota

Para permitir o acesso à instância de banco de dados a partir dos clientes apropriados, verifique se os grupos de segurança estão configurados corretamente. Para ter mais informações, consulte Controlar acesso com grupos de segurança. Além disso, essas instruções são para o SQL*Plus e outros clientes que usam diretamente um Oracle Home. Para conexões JDBC, consulte Configurar uma conexão SSL via JDBC.

Para configurar o SQL*Plus para usar SSL para se conectar a uma instância de banco de dados do RDS para Oracle
  1. Defina a variável de ambiente ORACLE_HOME como o local do diretório inicial do Oracle.

    O caminho para o diretório inicial do Oracle depende da instalação. O exemplo a seguir define a variável de ambiente ORACLE_HOME.

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

    Para obter informações sobre como definir variáveis de ambiente do Oracle, consulte Variáveis de ambiente do SQL*Plus na documentação da Oracle e consulte também o guia de instalação da Oracle para o sistema operacional.

  2. Adicione a variável de ambiente $ORACLE_HOME/lib ao LD_LIBRARY_PATH.

    O exemplo a seguir define a variável de ambiente LD_LIBRARY_PATH.

    prompt>export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$ORACLE_HOME/lib
  3. Crie um diretório para o Oracle Wallet em $ORACLE_HOME/ssl_wallet.

    Este é um exemplo que cria o diretório do Oracle Wallet.

    prompt>mkdir $ORACLE_HOME/ssl_wallet
  4. Baixe o pacote do certificado .pem que funciona para todas as Regiões da AWS e coloque o arquivo no diretório ssl_wallet. Para ter mais informações, consulte Usar SSL/TLS para criptografar uma conexão com uma instância ou um cluster de banco de dados.

  5. No diretório $ORACLE_HOME/network/admin, modifique ou crie o arquivo tnsnames.ora e inclua a entrada a seguir.

    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. No mesmo diretório, modifique ou crie o arquivo sqlnet.ora e inclua os seguintes parâmetros.

    nota

    Para se comunicar com entidades por meio de uma conexão protegida por TLS, a Oracle requer uma carteira com os certificados necessários para autenticação. Você pode usar o utilitário ORAPKI da Oracle para criar e manter carteiras Oracle, conforme mostrado na etapa 7. Para ter mais informações, consulte Configurar o Oracle Wallet usando ORAPKI na documentação da Oracle.

    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
    nota

    Você poderá definir SSL_VERSION como um valor mais alto se sua instância de banco de dados for compatível.

  7. Execute os comandos a seguir para criar o Oracle Wallet.

    prompt>orapki wallet create -wallet $ORACLE_HOME/ssl_wallet -auto_login_only
  8. Extraia cada certificado no arquivo do pacote .pem em um arquivo .pem separado usando um utilitário do sistema operacional.

  9. Adicione cada certificado à carteira usando comandos orapki separados, substituindo certificate-pem-file pelo nome absoluto do arquivo .pem.

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

    Para ter mais informações, consulte Alternar o certificado SSL/TLS.

Conectar-se a uma instância de banco de dados do RDS para Oracle usando SSL

Depois de configurar o SQL*Plus para usar SSL, conforme descrito anteriormente, você pode se conectar à instância de banco de dados do RDS para Oracle com a opção SSL. Opcionalmente, primeiro é possível exportar o valor de TNS_ADMIN que aponta para o diretório que contém os arquivos tnsnames.ora e sqlnet.ora. Isso garante que o SQL*Plus possa encontrar esses arquivos de forma consistente. O exemplo a seguir exporta o valor de TNS_ADMIN.

export TNS_ADMIN = ${ORACLE_HOME}/network/admin

Conecte-se à instância de banco de dados. Por exemplo, você pode se conectar usando o SQL*Plus e um <net_service_name> em um arquivo tnsnames.ora.

sqlplus mydbuser@net_service_name

Você também pode se conectar à instância de banco de dados usando o SQL*Plus sem utilizar um arquivo tnsnames.ora, por meio do seguinte comando.

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

Você também pode se conectar à instância de banco de dados do RDS para Oracle sem usar a SSL. Por exemplo, o seguinte comando se conecta à instância de banco de dados por meio da porta de texto sem formatação sem criptografia SSL.

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

Se você deseja fechar o acesso à porta do protocolo TCP, crie um security group sem entradas de endereço IP e adicione-o à instância. Essa inclusão encerra as conexões através da porta TCP, embora ainda permita conexões sobre a porta SSL especificadas a partir de endereços IP dentro do intervalo permitido pelo security group da opção SSL.

Configurar uma conexão SSL via JDBC

Para usar uma conexão SSL via JDBC, é necessário criar um repositório de chaves, confiar no certificado da CA raiz do Amazon RDS e usar o trecho de código especificado a seguir.

Para criar o repositório de chaves no formato JKS, é possível usar o comando a seguir. Para ter mais informações sobre como criar o repositório de chaves, consulte Creating a keystore na documentação da Oracle. Para ter informações de referência, consulte keytool na Java Platform, Standard Edition Tools Reference.

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

Siga estas etapas para confiar no certificado da CA raiz do Amazon RDS.

Para confiar no certificado da CA raiz do Amazon RDS
  1. Baixe o pacote do certificado .pem que funciona para todas as Regiões da AWS e coloque o arquivo no diretório ssl_wallet.

    Para obter informações sobre como baixar certificados, consulte Usar SSL/TLS para criptografar uma conexão com uma instância ou um cluster de banco de dados.

  2. Extraia cada certificado no arquivo .pem em um arquivo separado usando um utilitário do sistema operacional.

  3. Converta cada certificado no formato .der usando um comando openssl separado, substituindo certificate-pem-file pelo nome do arquivo .pem do certificado (sem a extensão .pem).

    openssl x509 -outform der -in certificate-pem-file.pem -out certificate-pem-file.der
  4. Importe cada certificado para o repositório de chaves usando o comando a seguir.

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

    Para ter mais informações, consulte Alternar o certificado SSL/TLS.

  5. Confirme se o armazenamento de chaves foi criado com êxito.

    keytool -list -v -keystore clientkeystore.jks

    Insira a senha do repositório de chaves quando solicitado.

O exemplo de código a seguir mostra como configurar a conexão SSL usando o JDBC.

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 } }
nota

Especifique uma senha diferente do prompt mostrado aqui como prática recomendada de segurança.

Forçar uma correspondência de DN com uma conexão SSL

Você pode usar o parâmetro Oracle SSL_SERVER_DN_MATCH para forçar que o nome distinto (DN) do servidor de banco de dados corresponda ao nome do serviço. Se você forçar as verificações de correspondência, a SSL assegurará que o certificado seja proveniente do servidor. Se você não forçar a verificação de correspondência, a SSL realizará a verificação, mas permitirá a conexão, independentemente de haver ou não uma correspondência. Se você não forçar a correspondência, permitirá que o servidor falsifique a identidade.

Para forçar a correspondência de DN, adicione a propriedade de correspondência de DN e use a string de conexão especificada abaixo.

Adicione a propriedade à conexão de cliente para reforçar a correspondência de DN.

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

Use a seguinte string de conexão para forçar a correspondência de DN ao usar a SSL.

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

Solução de problemas de conexões SSL

Você pode consultar seu banco de dados e receber o erro 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.

Esse erro ocorre quando o cliente tenta se conectar usando uma versão do TLS não compatível com o servidor. Para evitar esse erro, edite o sqlnet.ora e defina SSL_VERSION como a versão correta do TLS. Para ter mais informações, consulte o Documento de suporte da Oracle 2748438.1 em My Oracle Support.