Oracle Secure Sockets Layer - Amazon Relational Database Service

Oracle Secure Sockets Layer

Você habilita a criptografia Secure Sockets Layer (SSL) para uma instância de banco de dados Oracle adicionando a opção Oracle SSL ao grupo de opções associado a instância de banco de dados Oracle. Você especifica a porta sobre a qual deseja se comunicar usando o SSL. É necessário configurar o SQL*Plus conforme mostrado na seção a seguir.

Você habilita a criptografia SSL para uma instância de banco de dados Oracle adicionando a opção Oracle SSL ao grupo de opções associado a 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

Você pode usar a Secure Sockets Layer ou a Native Network Encryption, mas não ambas. Para obter mais informações, consulte Oracle Native Network Encryption.

É possível usar a criptografia SSL com todas as edições das seguintes versões do Oracle Database:

  • Oracle Database 21c (21.0.0)

  • Oracle Database 19c (19.0.0)

  • Oracle Database 12c Versão 2 (12.2)

  • Oracle Database 12c Versão 1 (12.1)

nota

Não é possível usar a Oracle Native Network Encryption (NNE) na mesma instância. Se você usa a criptografia SSL, você deve desabilitar qualquer outra criptografia de conexão.

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. Para usar a opção Oracle SSL, use a configuração de opção SQLNET.SSL_VERSION. Os seguintes valores são permitidos para essa configuração de opção:

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

  • "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.

Para usar a opção Oracle SSL, a configuração de opção SQLNET.SSL_VERSION é necessária também:

  • Para opções Oracle SSL existentes, a SQLNET.SSL_VERSION é definida como "1.0" automaticamente. Você pode alterar a configuração se necessário.

  • Quando você adiciona uma nova opção Oracle SSL, é necessário definir a SQLNET.SSL_VERSION explicitamente como um valor válido.

A tabela a seguir mostra as configurações de opção do TLS que oferecem suporte para versões e edições diferentes de mecanismos da Oracle.

Versão do mecanismo da Oracle SQLNET.SSL_VERSION = "1.0" SQLNET.SSL_VERSION = "1.2" SQLNET.SSL_VERSION = "1.2 ou 1.0"

21.0.0.0 (todas as edições)

Compatível

Compatível

Compatível

19.0.0.0 (Todas as edições)

Compatível

Compatível

Compatível

12.2.0.1 (todas as edições)

Compatível

Compatível

Compatível

12.1.0.2 (todas as edições)

Compatível

Compatível

Compatível

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 seguir estão os valores permitidos para essa configuração de opção:

  • "SSL_RSA_WITH_AES_256_CBC_SHA" – A configuração padrão, compatível com TLS 1.0 e TLS 1.2

  • "SSL_RSA_WITH_AES_256_CBC_SHA256" – Apenas compatível com TLS 1.2

  • "SSL_RSA_WITH_AES_256_GCM_SHA384" – Apenas compatível com TLS 1.2

Para opções Oracle SSL existentes, a SQLNET.CIPHER_SUITE é definida como "SSL_RSA_WITH_AES_256_CBC_SHA" automaticamente. Você pode alterar a configuração se necessário.

A tabela a seguir mostra as configurações de opções de pacotes de criptografia que têm suporte para versões e edições diferentes de mecanismos da Oracle.

Versão do mecanismo da Oracle SQLNET.CIPHER_SUITE = "SSL_RSA_WITH_AES_256_CBC_SHA" SQLNET.CIPHER_SUITE = "SSL_RSA_WITH_AES_256_CBC_SHA256" SQLNET.CIPHER_SUITE = "SSL_RSA_WITH_AES_256_GCM_SHA384"

19.0.0.0 (Todas as edições)

Compatível

Compatível

Compatível

12.2.0.1 (todas as edições)

Compatível

Compatível

Compatível

12.1.0.2 (todas as edições)

Compatível

Compatível

Compatível

Suporte ao FIPS

O Amazon RDS for 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. Habilite o padrão FIPS definindo a configuração FIPS.SSLFIPS_140 como TRUE para a opção do Oracle SSL. Quando o FIPS 140-2 é configurado para SSL, as bibliotecas criptográficas são projetadas para criptografar dados entre o cliente e a instância de banco de dados Oracle.

É possível habilitar a configuração do FIPS com as seguintes versões e edições do banco de dados Oracle:

  • 19.0.0.0: todas as versões, todas as edições, incluindo o Standard Edition Two

  • 12.2.0.1: todas as versões, todas as edições, incluindo o Standard Edition Two

  • 12.1.0.2: versão 2 e posterior, todas as edições, incluindo Standard Edition Two

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 Oracle negociam qual pacote de criptografia deverá ser usado ao transmitir mensagens em ambas as direções. A tabela a seguir mostra os pacotes de criptografia SSL compatíveis com o FIPS para cada versão do TLS.

SQLNET.SSL_VERSION Pacotes de criptografia compatíveis

1,0

SSL_RSA_WITH_AES_256_CBC_SHA

1.2

SSL_RSA_WITH_AES_256_CBC_SHA

SSL_RSA_WITH_AES_256_GCM_SHA384

Para obter mais informações, consulte Oracle Database FIPS 140-2 Settings na documentação da Oracle.

Adicionar a opção do SSL

Para usar o SSL, sua instância de banco de dados do Amazon RDS for 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 nova instância de banco de dados Oracle e associe a ela o grupo de opções ou modifique uma instância de banco de dados 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 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 nova instância de banco de dados Oracle e associe a ela o grupo de opções ou modifique uma instância de banco de dados 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 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.

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

É necessário configurar o SQL*Plus antes de se conectar a uma instância de banco de dados Oracle que usa 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 obter 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 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/12.1.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 certificado raiz que funciona para todas as AWS regiões e coloque o arquivo no diretório ssl_wallet.

    Para obter informações sobre como baixar o certificado raiz, consulte Como Usar SSL/TLS para criptografar uma conexão com uma instância 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 obter 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 seguintes comandos para criar o Oracle Wallet.

    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-2019-root.pem -auto_login_only

    Substitua o nome do arquivo pelo arquivo baixado.

Conectar-se a uma instância de banco de dados 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 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 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, use o seguinte comando. Para obter mais informações sobre como criar o repositório de chaves, consulte a documentação da Oracle.

keytool -keystore clientkeystore -genkey -alias client

Depois, siga as etapas a seguir para confiar no certificado da CA raiz do Amazon RDS.

Para confiar no certificado da CA raiz do Amazon RDS

  1. Faça download do certificado raiz que funciona para todas as AWS regiões e coloque o arquivo no diretório ssl_wallet.

    Para obter informações sobre como fazer download do certificado raiz, consulte Como Usar SSL/TLS para criptografar uma conexão com uma instância de banco de dados.

  2. Converta o certificado para o formato .der usando o seguinte comando.

    openssl x509 -outform der -in rds-ca-2019-root.pem -out rds-ca-2019-root.der

    Substitua o nome do arquivo pelo arquivo obtido por download.

  3. Importe o certificado para o repositório de chaves usando o seguinte comando.

    keytool -import -alias rds-root -keystore clientkeystore.jks -file rds-ca-2019-root.der
  4. 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 } }

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 sua identificação.

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