인증서 및 Oracle Wallet을 사용하여 UTL_HTTP 액세스 구성 - Amazon Relational Database Service

인증서 및 Oracle Wallet을 사용하여 UTL_HTTP 액세스 구성

Amazon RDS는 RDS for Oracle DB 인스턴스에서 아웃바운드 네트워크 액세스를 지원합니다. DB 인스턴스를 네트워크에 연결하기 위해 다음 PL/SQL 패키지를 사용할 수 있습니다.

UTL_HTTP

이 패키지는 SQL 및 PL/SQL에서 HTTP를 호출합니다. HTTP를 통해 인터넷의 데이터에 액세스하는 데 사용할 수 있습니다. 자세한 내용은 Oracle 설명서의 UTL_HTTP를 참조하세요.

UTL_TCP

이 패키지는 PL/SQL에서 TCP/IP 클라이언트 측 액세스 기능을 제공합니다. 이 패키지는 인터넷 프로토콜과 이메일을 사용하는 PL/SQL 애플리케이션에 유용합니다. 자세한 내용은 Oracle 설명서의 UTL_TCP를 참조하세요.

UTL_SMTP

이 패키지는 클라이언트가 SMTP 서버로 이메일을 보낼 수 있도록 SMTP 명령에 대한 인터페이스를 제공합니다. 자세한 내용은 Oracle 설명서의 UTL_SMTP를 참조하세요.

다음 태스크를 완료하면 SSL 핸드셰이크 중에 클라이언트 인증 인증서가 필요한 웹 사이트에서 작동하도록 UTL_HTTP.REQUEST를 구성할 수 있습니다. Oracle Wallet 생성 명령과 DBMS_NETWORK_ACL_ADMIN.APPEND_WALLET_ACE 절차를 수정하여 웹 사이트에 대한 UTL_HTTP 액세스의 암호 인증을 구성할 수도 있습니다. 자세한 내용은 Oracle Database 설명서의 DBMS_NETWORK_ACL_ADMIN을 참조하세요.

참고

SSL/TLS(Amazon Simple Email Service 포함)를 통해 이메일을 보낼 수 있도록 하는 UTL_SMTP에 대해 다음 태스크를 적용할 수 있습니다.

UTL_HTTP 액세스 구성 구성 시 고려 사항

액세스를 구성하기 전에 다음 사항을 고려하세요.

  • SMTP를 UTL_MAIL 옵션으로 사용할 수 있습니다. 자세한 내용은 Oracle UTL_MAIL 섹션을 참조하세요.

  • 원격 호스트의 DNS(Domain Name Server) 이름은 다음 중 어느 것이나 될 수 있습니다.

    • 공개적으로 확인할 수 있어야 함.

    • Amazon RDS DB 인스턴스의 엔드포인트.

    • 사용자 지정 DNS 서버를 통해 확인 가능 자세한 내용은 사용자 지정 DNS 서버 설정 섹션을 참조하세요.

    • 동일한 VPC 또는 피어링된 VPC에 있는 Amazon EC2 인스턴스의 프라이빗 DNS 이름. 이 경우, 사용자 지정 DNS 서버를 통해 이름을 확인할 수 있어야 합니다. 또는 Amazon이 제공하는 DNS를 사용하기 위해 VPC 설정에서 enableDnsSupport 속성을 활성화하고 VPC 피어링 연결에 대한 DNS 확인 지원을 활성화할 수 있습니다. 자세한 내용은 VPC에서 DNS 지원VPC 피어링 연결 수정 단원을 참조하십시오.

    • 원격 SSL/TLS 리소스에 안전하게 연결하기 위해 사용자 지정 Oracle Wallet을 생성하고 업로드하는 것이 좋습니다. Amazon S3와 Amazon RDS for Oracle의 통합을 사용하여 Oracle DB 인스턴스로 Amazon S3의 Wallet을 다운로드할 수 있습니다. Oracle에 대한 Amazon S3 통합에 대한 자세한 내용은 Amazon S3 통합 단원을 참조하십시오.

  • 각 인스턴스에 Oracle SSL 옵션이 구성된 경우 SSL/TLS 엔드포인트를 통해 Oracle DB 인스턴스 사이에 데이터베이스 링크를 설정할 수 있습니다. 추가 구성이 필요하지 않습니다. 자세한 내용은 Oracle 보안 소켓 Layer 섹션을 참조하세요.

1단계: 웹 사이트의 루트 인증서 가져오기

RDS for Oracle DB 인스턴스가 웹 사이트에 대한 보안 연결을 설정하도록 루트 CA 인증서를 추가합니다. Amazon RDS는 루트 인증서를 사용하여 Oracle Wallet에 웹 사이트 인증서를 서명합니다.

다양한 방법으로 루트 인증서를 얻을 수 있습니다. 예를 들어 다음을 수행할 수 있습니다.

  1. 웹 서버를 사용하여 인증서로 보호되는 웹 사이트를 방문합니다.

  2. 서명에 사용된 루트 인증서를 다운로드합니다.

AWS 서비스의 경우 루트 인증서는 일반적으로 Amazon trust services 리포지토리에 있습니다.

2단계: Oracle Wallet 생성

웹 서버 인증서와 클라이언트 인증 인증서를 모두 포함하는 Oracle Wallet을 생성합니다. RDS Oracle 인스턴스는 웹 서버 인증서를 사용하여 웹 사이트에 대한 보안 연결을 설정합니다. 웹 사이트는 Oracle 데이터베이스 사용자를 인증하기 위해 클라이언트 인증서를 필요로 합니다.

인증에 클라이언트 인증서를 사용하지 않고 보안 연결을 구성할 수 있습니다. 이 경우 다음 절차에서 Java KeyStore 단계를 건너뛸 수 있습니다.

Oracle Wallet 생성
  1. 루트 및 클라이언트 인증서를 단일 디렉터리에 넣은 다음 이 디렉터리로 변경합니다.

  2. .p12 클라이언트 인증서를 Java KeyStore로 변환합니다.

    참고

    인증에 클라이언트 인증서를 사용하지 않는 경우 이 단계를 건너뛸 수 있습니다.

    다음 예에서는 client_certificate.p12라는 클라이언트 인증서를 client_keystore.jks라는 Java KeyStore로 변환합니다. 그러면 KeyStore가 Oracle Wallet에 포함됩니다. KeyStore 암호는 P12PASSWORD입니다.

    orapki wallet pkcs12_to_jks -wallet ./client_certificate.p12 -jksKeyStoreLoc ./client_keystore.jks -jksKeyStorepwd P12PASSWORD
  3. 인증서 디렉터리와 다른 Oracle Wallet용 디렉터리를 생성합니다.

    다음 예에서는 /tmp/wallet 디렉터리를 생성합니다.

    mkdir -p /tmp/wallet
  4. wallet 디렉터리에 Oracle Wallet을 생성합니다.

    다음 예에서는 Oracle Wallet 암호를 이전 단계에서 Java KeyStore에서 사용한 것과 동일한 암호인 P12PASSWORD로 설정합니다. 동일한 암호를 사용하면 편리하지만 필수는 아닙니다. -auto_login 파라미터가 자동 로그인 기능을 켜므로 액세스할 때마다 암호를 지정할 필요가 없습니다.

    참고

    보안 모범 사례로 여기에 표시된 프롬프트 이외의 암호를 지정하는 것이 좋습니다.

    orapki wallet create -wallet /tmp/wallet -pwd P12PASSWORD -auto_login
  5. Oracle Wallet에 Java KeyStore를 추가합니다.

    참고

    인증에 클라이언트 인증서를 사용하지 않는 경우 이 단계를 건너뛸 수 있습니다.

    다음 예에서는 /tmp/wallet이라는 Oracle Wallet에 KeyStore client_keystore.jks를 추가합니다. 이 예에서는 Java KeyStore와 Oracle Wallet에 대해 동일한 암호를 지정합니다.

    orapki wallet jks_to_pkcs12 -wallet /tmp/wallet -pwd P12PASSWORD -keystore ./client_keystore.jks -jkspwd P12PASSWORD
  6. 대상 웹 사이트의 루트 인증서를 Oracle Wallet에 추가합니다.

    다음 예에서는 Root_CA.cer이라는 인증서를 추가합니다.

    orapki wallet add -wallet /tmp/wallet -trusted_cert -cert ./Root_CA.cer -pwd P12PASSWORD
  7. 중간 인증서를 추가합니다.

    다음 예에서는 Intermediate.cer이라는 인증서를 추가합니다. 모든 중간 인증서를 로드하는 데 필요한 만큼 이 단계를 반복합니다.

    orapki wallet add -wallet /tmp/wallet -trusted_cert -cert ./Intermediate.cer -pwd P12PASSWORD
  8. 새로 생성된 Oracle Wallet에 필요한 인증서가 있는지 확인합니다.

    orapki wallet display -wallet /tmp/wallet -pwd P12PASSWORD

3단계: RDS for Oracle 인스턴스로 Oracle Wallet 다운로드

이 단계에서는 Oracle Wallet을 Amazon S3에 업로드한 다음 Amazon S3에서 RDS for Oracle 인스턴스로 Wallet을 다운로드합니다.

RDS for Oracle DB 인스턴스로 Oracle Wallet 다운로드
  1. Oracle과 Amazon S3 통합을 위한 사전 조건을 만족시키고 S3_INTEGRATION 옵션을 Oracle DB 인스턴스에 추가하십시오. 옵션의 IAM 역할에 사용 중인 Amazon S3 버킷에 대한 액세스 권한이 있어야 합니다.

    자세한 내용은 Amazon S3 통합 섹션을 참조하세요.

  2. DB 인스턴스에 마스터 사용자로 로그인한 다음 Oracle Wallet을 보관할 Oracle 디렉터리를 생성합니다.

    다음 예에서는 WALLET_DIR이라는 Oracle 디렉터리를 생성합니다.

    EXEC rdsadmin.rdsadmin_util.create_directory('WALLET_DIR');

    자세한 내용은 메인 데이터 스토리지 공간에서 디렉터리 생성 및 삭제 섹션을 참조하세요.

  3. Amazon S3 버킷에 Oracle Wallet을 업로드합니다.

    지원되는 업로드 기술을 사용할 수 있습니다.

  4. Oracle Wallet을 다시 업로드하는 경우 기존 Wallet을 삭제합니다. 그렇지 않은 경우 다음 단계로 건너뜁니다.

    다음 예에서는 cwallet.sso라는 기존 Wallet을 제거합니다.

    EXEC UTL_FILE.FREMOVE ('WALLET_DIR','cwallet.sso');
  5. Amazon S3 버킷에서 Oracle DB 인스턴스로 Oracle Wallet을 다운로드합니다.

    다음 예에서는 my_s3_bucket이라는 Amazon S3 버킷에서 WALLET_DIR이라는 DB 인스턴스 디렉터리로 cwallet.sso라는 Wallet을 다운로드합니다.

    SELECT rdsadmin.rdsadmin_s3_tasks.download_from_s3( p_bucket_name => 'my_s3_bucket', p_s3_prefix => 'cwallet.sso', p_directory_name => 'WALLET_DIR') AS TASK_ID FROM DUAL;
  6. (선택 사항) 암호로 보호된 Oracle Wallet을 다운로드합니다.

    Wallet을 사용할 때마다 암호를 요구하려는 경우에만 이 Wallet을 다운로드합니다. 다음 예에서는 암호로 보호된 Wallet ewallet.p12를 다운로드합니다.

    SELECT rdsadmin.rdsadmin_s3_tasks.download_from_s3( p_bucket_name => 'my_s3_bucket', p_s3_prefix => 'ewallet.p12', p_directory_name => 'WALLET_DIR') AS TASK_ID FROM DUAL;
  7. DB 태스크의 상태를 확인합니다.

    다음 예에서 dbtask-1234567890123-4567.log를 이전 단계에서 반환된 태스크 ID로 대체합니다.

    SELECT TEXT FROM TABLE(rdsadmin.rds_file_util.read_text_file('BDUMP','dbtask-1234567890123-4567.log'));
  8. Oracle Wallet을 저장하는 데 사용하는 디렉터리의 내용을 확인합니다.

    SELECT * FROM TABLE(rdsadmin.rds_file_util.listdir(p_directory => 'WALLET_DIR'));

    자세한 내용은 DB 인스턴스 디렉터리의 파일 목록 표시 섹션을 참조하세요.

4단계: Oracle Wallet에 대한 사용자 권한 부여

새 데이터베이스 사용자를 생성하거나 기존 사용자를 구성할 수 있습니다. 두 경우 모두 인증서를 사용한 클라이언트 인증 및 보안 연결을 위해 Oracle Wallet에 액세스하도록 사용자를 구성해야 합니다.

Oracle Wallet에 대한 사용자 권한 부여
  1. RDS for Oracle DB 인스턴스에 마스터 사용자로 로그인합니다.

  2. 기존 데이터베이스 사용자를 구성하지 않으려는 경우 새 사용자를 생성합니다. 그렇지 않은 경우 다음 단계로 건너뜁니다.

    다음 예에서는 my-user라는 데이터베이스 사용자를 생성합니다.

    CREATE USER my-user IDENTIFIED BY my-user-pwd; GRANT CONNECT TO my-user;
  3. 데이터베이스 사용자에게 Oracle Wallet이 포함된 디렉터리에 대한 권한을 부여합니다.

    다음 예에서는 사용자 my-user 에게 디렉터리 WALLET_DIR에 대한 읽기 액세스 권한을 부여합니다.

    GRANT READ ON DIRECTORY WALLET_DIR TO my-user;
  4. 데이터베이스 사용자에게 UTL_HTTP 패키지를 사용할 수 있는 권한을 부여합니다.

    다음 PL/SQL 프로그램에서는 사용자 my-user에게 UTL_HTTP 액세스 권한을 부여합니다.

    BEGIN rdsadmin.rdsadmin_util.grant_sys_object('UTL_HTTP', UPPER('my-user')); END; /
  5. 데이터베이스 사용자에게 UTL_FILE 패키지를 사용할 수 있는 권한을 부여합니다.

    다음 PL/SQL 프로그램에서는 사용자 my-user에게 UTL_FILE 액세스 권한을 부여합니다.

    BEGIN rdsadmin.rdsadmin_util.grant_sys_object('UTL_FILE', UPPER('my-user')); END; /

5단계: DB 인스턴스에서 웹 사이트에 대한 액세스 구성

이 단계에서는 UTL_HTTP, 업로드한 Oracle Wallet 및 클라이언트 인증서를 사용하여 대상 웹 사이트에 연결할 수 있도록 Oracle 데이터베이스 사용자를 구성합니다. 자세한 내용은 Oracle Database 설명서의 Configuring Access Control to an Oracle Wallet(Oracle Wallet에 대한 액세스 제어 구성)을 참조하세요.

RDS for Oracle DB 인스턴스에서 웹 사이트에 대한 액세스 구성
  1. RDS for Oracle DB 인스턴스에 마스터 사용자로 로그인합니다.

  2. 보안 포트에 사용자 및 대상 웹 사이트에 대한 ACE(Host Access Control Entry)를 생성합니다.

    다음 예에서는 보안 포트 443에서 secret.encrypted-website.com에 액세스하도록 my-user를 구성합니다.

    BEGIN DBMS_NETWORK_ACL_ADMIN.APPEND_HOST_ACE( host => 'secret.encrypted-website.com', lower_port => 443, upper_port => 443, ace => xs$ace_type(privilege_list => xs$name_list('http'), principal_name => 'my-user', principal_type => xs_acl.ptype_db)); -- If the program unit results in PLS-00201, set -- the principal_type parameter to 2 as follows: -- principal_type => 2)); END; /
    중요

    이전 프로그램 단위에서 다음 PLS-00201: identifier 'XS_ACL' must be declared 오류가 발생할 수 있습니다. 이 오류가 반환되면 값을 할당하는 줄을 다음 줄의 principal_type으로 바꾼 다음 프로그램 단위를 다시 실행하세요.

    principal_type => 2));

    PL/SQL 패키지 XS_ACL의 상수에 대한 자세한 내용은 Oracle Database 설명서의 Real Application Security 관리자 및 개발자 안내서를 참조하세요.

    자세한 내용은 Oracle Database 설명서의 Configuring Access Control for External Network Services(외부 네트워크 서비스에 대한 액세스 제어 구성)를 참조하세요.

  3. (선택 사항) 표준 포트에서 사용자 및 대상 웹 사이트에 대한 ACE를 만듭니다.

    일부 웹 페이지가 보안 포트(443) 대신 표준 웹 서버 포트(80)에서 제공되는 경우 표준 포트를 사용해야 할 수 있습니다.

    BEGIN DBMS_NETWORK_ACL_ADMIN.APPEND_HOST_ACE( host => 'secret.encrypted-website.com', lower_port => 80, upper_port => 80, ace => xs$ace_type(privilege_list => xs$name_list('http'), principal_name => 'my-user', principal_type => xs_acl.ptype_db)); -- If the program unit results in PLS-00201, set -- the principal_type parameter to 2 as follows: -- principal_type => 2)); END; /
  4. 액세스 제어 항목이 있는지 확인합니다.

    SET LINESIZE 150 COLUMN HOST FORMAT A40 COLUMN ACL FORMAT A50 SELECT HOST, LOWER_PORT, UPPER_PORT, ACL FROM DBA_NETWORK_ACLS ORDER BY HOST;
  5. 데이터베이스 사용자에게 UTL_HTTP 패키지를 사용할 수 있는 권한을 부여합니다.

    다음 PL/SQL 프로그램에서는 사용자 my-user에게 UTL_HTTP 액세스 권한을 부여합니다.

    BEGIN rdsadmin.rdsadmin_util.grant_sys_object('UTL_HTTP', UPPER('my-user')); END; /
  6. 관련 액세스 제어 목록이 있는지 확인합니다.

    SET LINESIZE 150 COLUMN ACL FORMAT A50 COLUMN PRINCIPAL FORMAT A20 COLUMN PRIVILEGE FORMAT A10 SELECT ACL, PRINCIPAL, PRIVILEGE, IS_GRANT, TO_CHAR(START_DATE, 'DD-MON-YYYY') AS START_DATE, TO_CHAR(END_DATE, 'DD-MON-YYYY') AS END_DATE FROM DBA_NETWORK_ACL_PRIVILEGES ORDER BY ACL, PRINCIPAL, PRIVILEGE;
  7. 데이터베이스 사용자에게 클라이언트 인증에 인증서를 사용하고 연결에 Oracle Wallet을 사용할 수 있는 권한을 부여합니다.

    참고

    인증에 클라이언트 인증서를 사용하지 않는 경우 이 단계를 건너뛸 수 있습니다.

    DECLARE l_wallet_path all_directories.directory_path%type; BEGIN SELECT DIRECTORY_PATH INTO l_wallet_path FROM ALL_DIRECTORIES WHERE UPPER(DIRECTORY_NAME)='WALLET_DIR'; DBMS_NETWORK_ACL_ADMIN.APPEND_WALLET_ACE( wallet_path => 'file:/' || l_wallet_path, ace => xs$ace_type(privilege_list => xs$name_list('use_client_certificates'), principal_name => 'my-user', principal_type => xs_acl.ptype_db)); END; /

6단계: DB 인스턴스에서 웹 사이트로의 연결 테스트

이 단계에서는 UTL_HTTP, 업로드한 Oracle Wallet 및 클라이언트 인증서를 사용하여 웹 사이트에 연결할 수 있도록 데이터베이스 사용자를 구성합니다.

RDS for Oracle DB 인스턴스에서 웹 사이트에 대한 액세스 구성
  1. UTL_HTTP 권한이 있는 데이터베이스 사용자로 RDS for Oracle DB 인스턴스에 로그인합니다.

  2. 대상 웹 사이트에 대한 연결이 호스트 주소를 확인할 수 있는지 확인합니다.

    다음 예에서는 secret.encrypted-website.com에서 호스트 주소를 가져옵니다.

    SELECT UTL_INADDR.GET_HOST_ADDRESS(host => 'secret.encrypted-website.com') FROM DUAL;
  3. 실패한 연결을 테스트합니다.

    UTL_HTTP는 인증서가 있는 Oracle Wallet의 위치를 요구하기 때문에 다음 쿼리는 실패합니다.

    SELECT UTL_HTTP.REQUEST('secret.encrypted-website.com') FROM DUAL;
  4. UTL_HTTP.SET_WALLET을 사용하고 DUAL에서 선택하여 웹 사이트 액세스를 테스트합니다.

    DECLARE l_wallet_path all_directories.directory_path%type; BEGIN SELECT DIRECTORY_PATH INTO l_wallet_path FROM ALL_DIRECTORIES WHERE UPPER(DIRECTORY_NAME)='WALLET_DIR'; UTL_HTTP.SET_WALLET('file:/' || l_wallet_path); END; / SELECT UTL_HTTP.REQUEST('secret.encrypted-website.com') FROM DUAL;
  5. (선택 사항) 쿼리를 변수에 저장하고 EXECUTE IMMEDIATE를 사용하여 웹 사이트 액세스를 테스트합니다.

    DECLARE l_wallet_path all_directories.directory_path%type; v_webpage_sql VARCHAR2(1000); v_results VARCHAR2(32767); BEGIN SELECT DIRECTORY_PATH INTO l_wallet_path FROM ALL_DIRECTORIES WHERE UPPER(DIRECTORY_NAME)='WALLET_DIR'; v_webpage_sql := 'SELECT UTL_HTTP.REQUEST(''secret.encrypted-website.com'', '''', ''file:/' ||l_wallet_path||''') FROM DUAL'; DBMS_OUTPUT.PUT_LINE(v_webpage_sql); EXECUTE IMMEDIATE v_webpage_sql INTO v_results; DBMS_OUTPUT.PUT_LINE(v_results); END; /
  6. (선택 사항) Oracle Wallet 디렉터리의 파일 시스템 위치를 찾습니다.

    SELECT * FROM TABLE(rdsadmin.rds_file_util.listdir(p_directory => 'WALLET_DIR'));

    이전 명령의 출력을 사용하여 HTTP 요청을 만듭니다. 예를 들어 디렉터리가 rdsdbdata/userdirs/01인 경우 다음 쿼리를 실행합니다.

    SELECT UTL_HTTP.REQUEST('https://secret.encrypted-website.com/', '', 'file://rdsdbdata/userdirs/01') FROM DUAL;