인증서 및 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 ServiceUTL_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에 웹 사이트 인증서를 서명합니다.
다양한 방법으로 루트 인증서를 얻을 수 있습니다. 예를 들어 다음을 수행할 수 있습니다.
-
웹 서버를 사용하여 인증서로 보호되는 웹 사이트를 방문합니다.
-
서명에 사용된 루트 인증서를 다운로드합니다.
AWS 서비스의 경우 루트 인증서는 일반적으로 Amazon trust services 리포지토리
2단계: Oracle Wallet 생성
웹 서버 인증서와 클라이언트 인증 인증서를 모두 포함하는 Oracle Wallet을 생성합니다. RDS Oracle 인스턴스는 웹 서버 인증서를 사용하여 웹 사이트에 대한 보안 연결을 설정합니다. 웹 사이트는 Oracle 데이터베이스 사용자를 인증하기 위해 클라이언트 인증서를 필요로 합니다.
인증에 클라이언트 인증서를 사용하지 않고 보안 연결을 구성할 수 있습니다. 이 경우 다음 절차에서 Java KeyStore 단계를 건너뛸 수 있습니다.
Oracle Wallet 생성
-
루트 및 클라이언트 인증서를 단일 디렉터리에 넣은 다음 이 디렉터리로 변경합니다.
-
.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
-jksKeyStorepwdP12PASSWORD
-
인증서 디렉터리와 다른 Oracle Wallet용 디렉터리를 생성합니다.
다음 예에서는
/tmp/wallet
디렉터리를 생성합니다.mkdir -p
/tmp/wallet
-
wallet 디렉터리에 Oracle Wallet을 생성합니다.
다음 예에서는 Oracle Wallet 암호를 이전 단계에서 Java KeyStore에서 사용한 것과 동일한 암호인
P12PASSWORD
로 설정합니다. 동일한 암호를 사용하면 편리하지만 필수는 아닙니다.-auto_login
파라미터가 자동 로그인 기능을 켜므로 액세스할 때마다 암호를 지정할 필요가 없습니다.참고
보안 모범 사례로 여기에 표시된 프롬프트 이외의 암호를 지정하는 것이 좋습니다.
orapki wallet create -wallet
/tmp/wallet
-pwdP12PASSWORD
-auto_login -
Oracle Wallet에 Java KeyStore를 추가합니다.
참고
인증에 클라이언트 인증서를 사용하지 않는 경우 이 단계를 건너뛸 수 있습니다.
다음 예에서는
/tmp/wallet
이라는 Oracle Wallet에 KeyStoreclient_keystore.jks
를 추가합니다. 이 예에서는 Java KeyStore와 Oracle Wallet에 대해 동일한 암호를 지정합니다.orapki wallet jks_to_pkcs12 -wallet
/tmp/wallet
-pwdP12PASSWORD
-keystore ./client_keystore.jks
-jkspwdP12PASSWORD
-
대상 웹 사이트의 루트 인증서를 Oracle Wallet에 추가합니다.
다음 예에서는
Root_CA.cer
이라는 인증서를 추가합니다.orapki wallet add -wallet
/tmp/wallet
-trusted_cert -cert ./Root_CA.cer
-pwdP12PASSWORD
-
중간 인증서를 추가합니다.
다음 예에서는
Intermediate.cer
이라는 인증서를 추가합니다. 모든 중간 인증서를 로드하는 데 필요한 만큼 이 단계를 반복합니다.orapki wallet add -wallet
/tmp/wallet
-trusted_cert -cert ./Intermediate.cer
-pwdP12PASSWORD
-
새로 생성된 Oracle Wallet에 필요한 인증서가 있는지 확인합니다.
orapki wallet display -wallet
/tmp/wallet
-pwdP12PASSWORD
3단계: RDS for Oracle 인스턴스로 Oracle Wallet 다운로드
이 단계에서는 Oracle Wallet을 Amazon S3에 업로드한 다음 Amazon S3에서 RDS for Oracle 인스턴스로 Wallet을 다운로드합니다.
RDS for Oracle DB 인스턴스로 Oracle Wallet 다운로드
-
Oracle과 Amazon S3 통합을 위한 사전 조건을 만족시키고
S3_INTEGRATION
옵션을 Oracle DB 인스턴스에 추가하십시오. 옵션의 IAM 역할에 사용 중인 Amazon S3 버킷에 대한 액세스 권한이 있어야 합니다.자세한 내용은 Amazon S3 통합 섹션을 참조하세요.
-
DB 인스턴스에 마스터 사용자로 로그인한 다음 Oracle Wallet을 보관할 Oracle 디렉터리를 생성합니다.
다음 예에서는
WALLET_DIR
이라는 Oracle 디렉터리를 생성합니다.EXEC rdsadmin.rdsadmin_util.create_directory('
WALLET_DIR
');자세한 내용은 메인 데이터 스토리지 공간에서 디렉터리 생성 및 삭제 섹션을 참조하세요.
-
Amazon S3 버킷에 Oracle Wallet을 업로드합니다.
지원되는 업로드 기술을 사용할 수 있습니다.
-
Oracle Wallet을 다시 업로드하는 경우 기존 Wallet을 삭제합니다. 그렇지 않은 경우 다음 단계로 건너뜁니다.
다음 예에서는
cwallet.sso
라는 기존 Wallet을 제거합니다.EXEC UTL_FILE.FREMOVE ('
WALLET_DIR
','cwallet.sso
'); -
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; -
(선택 사항) 암호로 보호된 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; -
DB 태스크의 상태를 확인합니다.
다음 예에서
dbtask-1234567890123-4567.log
를 이전 단계에서 반환된 태스크 ID로 대체합니다.SELECT TEXT FROM TABLE(rdsadmin.rds_file_util.read_text_file('BDUMP','
dbtask-1234567890123-4567.log
')); -
Oracle Wallet을 저장하는 데 사용하는 디렉터리의 내용을 확인합니다.
SELECT * FROM TABLE(rdsadmin.rds_file_util.listdir(p_directory => '
WALLET_DIR
'));자세한 내용은 DB 인스턴스 디렉터리의 파일 목록 표시 섹션을 참조하세요.
4단계: Oracle Wallet에 대한 사용자 권한 부여
새 데이터베이스 사용자를 생성하거나 기존 사용자를 구성할 수 있습니다. 두 경우 모두 인증서를 사용한 클라이언트 인증 및 보안 연결을 위해 Oracle Wallet에 액세스하도록 사용자를 구성해야 합니다.
Oracle Wallet에 대한 사용자 권한 부여
-
RDS for Oracle DB 인스턴스에 마스터 사용자로 로그인합니다.
-
기존 데이터베이스 사용자를 구성하지 않으려는 경우 새 사용자를 생성합니다. 그렇지 않은 경우 다음 단계로 건너뜁니다.
다음 예에서는
my-user
라는 데이터베이스 사용자를 생성합니다.CREATE USER
my-user
IDENTIFIED BYmy-user-pwd
; GRANT CONNECT TOmy-user
; -
데이터베이스 사용자에게 Oracle Wallet이 포함된 디렉터리에 대한 권한을 부여합니다.
다음 예에서는 사용자
my-user
에게 디렉터리WALLET_DIR
에 대한 읽기 액세스 권한을 부여합니다.GRANT READ ON DIRECTORY
WALLET_DIR
TOmy-user
; -
데이터베이스 사용자에게
UTL_HTTP
패키지를 사용할 수 있는 권한을 부여합니다.다음 PL/SQL 프로그램에서는 사용자
my-user
에게UTL_HTTP
액세스 권한을 부여합니다.BEGIN rdsadmin.rdsadmin_util.grant_sys_object('UTL_HTTP', UPPER('
my-user
')); END; / -
데이터베이스 사용자에게
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
RDS for Oracle DB 인스턴스에서 웹 사이트에 대한 액세스 구성
-
RDS for Oracle DB 인스턴스에 마스터 사용자로 로그인합니다.
-
보안 포트에 사용자 및 대상 웹 사이트에 대한 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
(외부 네트워크 서비스에 대한 액세스 제어 구성)를 참조하세요. -
(선택 사항) 표준 포트에서 사용자 및 대상 웹 사이트에 대한 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; / -
액세스 제어 항목이 있는지 확인합니다.
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;
-
데이터베이스 사용자에게
UTL_HTTP
패키지를 사용할 수 있는 권한을 부여합니다.다음 PL/SQL 프로그램에서는 사용자
my-user
에게UTL_HTTP
액세스 권한을 부여합니다.BEGIN rdsadmin.rdsadmin_util.grant_sys_object('UTL_HTTP', UPPER('
my-user
')); END; / -
관련 액세스 제어 목록이 있는지 확인합니다.
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;
-
데이터베이스 사용자에게 클라이언트 인증에 인증서를 사용하고 연결에 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 인스턴스에서 웹 사이트에 대한 액세스 구성
-
UTL_HTTP
권한이 있는 데이터베이스 사용자로 RDS for Oracle DB 인스턴스에 로그인합니다. -
대상 웹 사이트에 대한 연결이 호스트 주소를 확인할 수 있는지 확인합니다.
다음 예에서는
secret.encrypted-website.com
에서 호스트 주소를 가져옵니다.SELECT UTL_INADDR.GET_HOST_ADDRESS(host => '
secret.encrypted-website.com
') FROM DUAL; -
실패한 연결을 테스트합니다.
UTL_HTTP
는 인증서가 있는 Oracle Wallet의 위치를 요구하기 때문에 다음 쿼리는 실패합니다.SELECT UTL_HTTP.REQUEST('
secret.encrypted-website.com
') FROM DUAL; -
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; -
(선택 사항) 쿼리를 변수에 저장하고
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; / -
(선택 사항) 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;