OS 환경 : Oracle Linux 8.4 (64bit)
DB 환경 : Oracle Database 23.7.0.25.01 ai for Oracle Cloud and Engineered Systems, Free
방법 : 오라클 23ai dbms_cloud 설치(non-adb)
오라클 23.7 버전부터 adb가 아닌 일반 온프레미스db에도 dbms_cloud 패키지를 설치할 수 있음
(2025년 04월 기준 아직까지 23.7 일반 버전은 나오지 않았지만 Oracle Cloud and Engineered Systems 버전과 Free 버전으로 테스트함)
아래 글 작성시에는 free 버전 설치시 23.4버전이 설치되었지만 지금은 23.7 버전으로 설치됨
참고 : Oracle Linux 8.4에 Oracle 23ai Free RPM 설치 및 삭제 가이드 ( https://positivemh.tistory.com/1095 )
하지만 dbms_cloud가 23.7에 기본적으로 탑재되어있지 않고 수동으로 설치해주어야함
23.7 new feature 참고 :
https://docs.oracle.com/en/database/oracle/oracle-database/23/nfcoa/ru_23_7.html#GUID-104803-1
DBMS_CLOUD 패키지는 아래와 같이 구성됨
DBMS_CLOUD
DBMS_CLOUD_AI
DBMS_CLOUD_NOTIFICATION
DBMS_CLOUD_PIPELINE
DBMS_CLOUD_REPO
DBMS_CLOUD를 사용하기 위해서는 크게 6개 단계를 수행해야함
단계명 뒤에 적혀있는 20.n 숫자는 메뉴얼에 나와있는 번호임
1. DBMS_CLOUD 설치(20.2)
2. 인증서가 포함된 SSL 지갑(Wallet) 생성(20.3)
3. 새로 생성한 SSL 지갑을 사용할 수 있도록 환경 설정(20.4)
4. DBMS_CLOUD 사용을 위한 데이터베이스 ACE(Access Control Entries) 구성(20.5)
5. DBMS_CLOUD 설정 검증(20.6)
6. DBMS_CLOUD를 사용할 사용자 또는 롤 구성(20.7)
6_1. DBMS_CLOUD를 위한 최소 권한 부여(20.7.1)
6_2. 사용자 또는 롤에 대한 ACE(Access Control Entries) 구성(20.7.2)
6_3. 사용자 및 롤 설정 검증(20.7.3)
1. DBMS_CLOUD 설치(20.2)
참고 : https://docs.oracle.com/en/database/oracle/oracle-database/23/sutil/installing-dbms_cloud.html
먼저 dbms_cloud를 설치해야함, 설치하기 위해 크게 두가지 스크립트를 사용함
기존 및 향후 생성할 모든 pluggable database(PDB)에 DBMS_CLOUD를 올바르게 설치하려면 $ORACLE_HOME/rdbms/admin 디렉토리에 있는 catcon.pl 유틸리티를 사용해 패키지를 설치해야함
DBMS_CLOUD의 코드와 설치 스크립트는 오라클 배포본에 포함되어 있음
주요 스크립트
- catclouduser.sql : 이 스크립트는 필수 권한과 함께 C##CLOUD$SERVICE 스키마를 생성함, 스크립트를 수동으로 변경하면 안 됨
- dbms_cloud_install.sql : 이 스크립트는 C##CLOUD$SERVICE 스키마에 DBMS_CLOUD 패키지를 설치함, 스크립트를 수동으로 변경하면 안 됨
db 기동 상태 확인
1
2
3
4
5
6
7
8
9
10
|
SQL>
set lines 200 pages 1000
col name for a20
select con_id, name, open_mode, dbid, con_uid, guid from v$containers;
CON_ID NAME OPEN_MODE DBID CON_UID GUID
---------- -------------------- ---------- ---------- ---------- --------------------------------
1 CDB$ROOT READ WRITE 2139673887 1 1F2E1FEA745ED86FE0631789A8C03E68
2 PDB$SEED READ ONLY 1404751039 1404751039 1F2E1FEA745FD86FE0631789A8C03E68
3 ORACLE23PDB1 READ WRITE 1388982306 1388982306 1F2FD9D07446FDA2E0631789A8C0EBF2
|
cdb, pdb 모두 기동상태임
DBMS_CLOUD 패키지 설치
예시 $ $ORACLE_HOME/perl/bin/perl $ORACLE_HOME/rdbms/admin/catcon.pl -u sys/{password} -force_pdb_mode 'READ WRITE' -b dbms_cloud_install -d $ORACLE_HOME/rdbms/admin/ -l /tmp catclouduser.sql
1
2
3
4
5
6
7
8
|
$ $ORACLE_HOME/perl/bin/perl $ORACLE_HOME/rdbms/admin/catcon.pl -u sys/oracle -force_pdb_mode 'READ WRITE' -b dbms_cloud_install -d $ORACLE_HOME/rdbms/admin/ -l /tmp catclouduser.sql
catcon::set_log_file_base_path: ALL catcon-related output will be written to [/tmp/dbms_cloud_install_catcon_3620.lst]
catcon::set_log_file_base_path: catcon: See [/tmp/dbms_cloud_install*.log] files for output generated by scripts
catcon::set_log_file_base_path: catcon: See [/tmp/dbms_cloud_install_*.lst] files for spool files, if any
catcon.pl: completed successfully
|
명령어 설명 :
DBMS_CLOUD 패키지를 설치할 CDB에 로그인한 뒤 catcon.pl와 catclouduser.sql을 이용하여 설치함
설치하면서, 로그 파일은 /tmp 디렉토리에 dbms_cloud_install 라는 이름으로 생성되도록 설정함
DBMS_CLOUD 패키지를 C##CLOUD$SERVICE 스키마에 설치
예시 $ $ORACLE_HOME/perl/bin/perl $ORACLE_HOME/rdbms/admin/catcon.pl -u sys/your-password -force_pdb_mode 'READ WRITE' -b dbms_cloud_install -d $ORACLE_HOME/rdbms/admin/ -l /tmp dbms_cloud_install.sql
1
2
3
4
5
6
7
8
|
$ $ORACLE_HOME/perl/bin/perl $ORACLE_HOME/rdbms/admin/catcon.pl -u sys/oracle -force_pdb_mode 'READ WRITE' -b dbms_cloud_install -d $ORACLE_HOME/rdbms/admin/ -l /tmp dbms_cloud_install.sql
catcon::set_log_file_base_path: ALL catcon-related output will be written to [/tmp/dbms_cloud_install_catcon_3751.lst]
catcon::set_log_file_base_path: catcon: See [/tmp/dbms_cloud_install*.log] files for output generated by scripts
catcon::set_log_file_base_path: catcon: See [/tmp/dbms_cloud_install_*.lst] files for spool files, if any
catcon.pl: completed successfully
|
명령어 설명 :
DBMS_CLOUD 패키지를 설치할 CDB에 로그인한 뒤 catcon.pl와 dbms_cloud_install.sql을 이용하여 설치함
설치하면서, 로그 파일은 /tmp 디렉토리에 dbms_cloud_install 라는 이름으로 생성되도록 설정함
참고로 설치시 alert log를 보면 PDB$SEED가 자동으로 close 상태가 되었다가 다시 read write 모드로 오픈됨을 확인할 수 있음
1
2
3
4
5
6
|
$ tail -300f /app/oracle/diag/rdbms/oracle23/oracle23/trace/alert_oracle23.log
2025-03-09T19:37:30.108021+09:00
alter pluggable database "PDB$SEED" close immediate force instances=('oracle23')
..
Completed: Pluggable database PDB$SEED opened read only
Completed: alter pluggable database "PDB$SEED" open READ ONLY instances=('oracle23')
|
그리고 설치를 진행하면 모든 pdb들이 DBMS_CLOUD 설치를 위해 강제로 open됨
설치가 이후에는 PDB는 설치 전 상태로 다시 돌아감(mount 등)
위의 쿼리 확인 작업은 open된 상태의 PDB에서만 유효함
CDBROOT에서 패키지 확인
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
|
$ sqlplus sys/oracle@localhost:1521/oracle23 as sysdba
SQL>
set lines 200 pages 1000
col owner for a30
col object_name for a40
select con_id, owner, object_name, status, sharing, oracle_maintained
from cdb_objects
where object_name like 'DBMS_CLOUD%'
order by 1, 2, 3;
CON_ID OWNER OBJECT_NAME STATUS SHARING O
---------- ------------------------------ ---------------------------------------- ------- ------------------ -
1 C##CLOUD$SERVICE DBMS_CLOUD VALID METADATA LINK Y
1 C##CLOUD$SERVICE DBMS_CLOUD VALID METADATA LINK Y
1 C##CLOUD$SERVICE DBMS_CLOUD_AI VALID METADATA LINK Y
1 C##CLOUD$SERVICE DBMS_CLOUD_AI VALID METADATA LINK Y
1 C##CLOUD$SERVICE DBMS_CLOUD_AI_PROFILE$ VALID METADATA LINK Y
1 C##CLOUD$SERVICE DBMS_CLOUD_AI_PROFILE_ATTR$ VALID METADATA LINK Y
1 C##CLOUD$SERVICE DBMS_CLOUD_AI_PROFILE_SCHEMA$ VALID METADATA LINK Y
1 C##CLOUD$SERVICE DBMS_CLOUD_CAPABILITIES$ VALID METADATA LINK Y
1 C##CLOUD$SERVICE DBMS_CLOUD_CAPABILITIES_UNIQUE VALID NONE Y
1 C##CLOUD$SERVICE DBMS_CLOUD_CAPABILITY VALID METADATA LINK Y
1 C##CLOUD$SERVICE DBMS_CLOUD_CAPABILITY VALID METADATA LINK Y
1 C##CLOUD$SERVICE DBMS_CLOUD_CLOUD_STORE_UNIQUE VALID NONE Y
1 C##CLOUD$SERVICE DBMS_CLOUD_CONFIG_PARAM VALID DATA LINK Y
1 C##CLOUD$SERVICE DBMS_CLOUD_CONFIG_PARAM$ VALID METADATA LINK Y
1 C##CLOUD$SERVICE DBMS_CLOUD_CORE VALID METADATA LINK Y
1 C##CLOUD$SERVICE DBMS_CLOUD_CORE VALID METADATA LINK Y
1 C##CLOUD$SERVICE DBMS_CLOUD_FILE_SYSTEM$ VALID METADATA LINK Y
1 C##CLOUD$SERVICE DBMS_CLOUD_FILE_SYSTEM_UNIQUE VALID NONE Y
1 C##CLOUD$SERVICE DBMS_CLOUD_INTERNAL VALID METADATA LINK Y
1 C##CLOUD$SERVICE DBMS_CLOUD_INTERNAL VALID METADATA LINK Y
1 C##CLOUD$SERVICE DBMS_CLOUD_NOTIFICATION VALID METADATA LINK Y
1 C##CLOUD$SERVICE DBMS_CLOUD_NOTIFICATION VALID METADATA LINK Y
1 C##CLOUD$SERVICE DBMS_CLOUD_OCI_REGIONS VALID DATA LINK Y
1 C##CLOUD$SERVICE DBMS_CLOUD_OCI_REGIONS$ VALID METADATA LINK Y
1 C##CLOUD$SERVICE DBMS_CLOUD_OCI_REGIONS_UNIQUE VALID NONE Y
1 C##CLOUD$SERVICE DBMS_CLOUD_PARAM_UNIQUE VALID NONE Y
1 C##CLOUD$SERVICE DBMS_CLOUD_PIPELINE VALID METADATA LINK Y
1 C##CLOUD$SERVICE DBMS_CLOUD_PIPELINE VALID METADATA LINK Y
1 C##CLOUD$SERVICE DBMS_CLOUD_PIPELINE$ VALID METADATA LINK Y
1 C##CLOUD$SERVICE DBMS_CLOUD_PIPELINE_ATTR$ VALID METADATA LINK Y
1 C##CLOUD$SERVICE DBMS_CLOUD_PIPELINE_ATTR_I1$ VALID NONE Y
1 C##CLOUD$SERVICE DBMS_CLOUD_PIPELINE_FILE$ VALID METADATA LINK Y
1 C##CLOUD$SERVICE DBMS_CLOUD_PIPELINE_FILE_I1$ VALID NONE Y
1 C##CLOUD$SERVICE DBMS_CLOUD_PIPELINE_I1$ VALID NONE Y
1 C##CLOUD$SERVICE DBMS_CLOUD_PIPELINE_INTERNAL VALID METADATA LINK Y
1 C##CLOUD$SERVICE DBMS_CLOUD_PIPELINE_INTERNAL VALID METADATA LINK Y
1 C##CLOUD$SERVICE DBMS_CLOUD_REPO VALID METADATA LINK Y
1 C##CLOUD$SERVICE DBMS_CLOUD_REPO VALID METADATA LINK Y
1 C##CLOUD$SERVICE DBMS_CLOUD_REQUEST VALID METADATA LINK Y
1 C##CLOUD$SERVICE DBMS_CLOUD_REQUEST VALID METADATA LINK Y
1 C##CLOUD$SERVICE DBMS_CLOUD_REST_API_RESULTS$ VALID METADATA LINK Y
1 C##CLOUD$SERVICE DBMS_CLOUD_STORE VALID DATA LINK Y
1 C##CLOUD$SERVICE DBMS_CLOUD_STORE$ VALID METADATA LINK Y
1 C##CLOUD$SERVICE DBMS_CLOUD_TASK VALID METADATA LINK Y
1 C##CLOUD$SERVICE DBMS_CLOUD_TASK VALID METADATA LINK Y
1 C##CLOUD$SERVICE DBMS_CLOUD_TASK$ VALID METADATA LINK Y
1 C##CLOUD$SERVICE DBMS_CLOUD_TASKS VALID METADATA LINK Y
1 C##CLOUD$SERVICE DBMS_CLOUD_TASK_CLASS VALID METADATA LINK Y
1 C##CLOUD$SERVICE DBMS_CLOUD_TASK_CLASS$ VALID METADATA LINK Y
1 C##CLOUD$SERVICE DBMS_CLOUD_TASK_CLASS_UNIQUE VALID NONE Y
1 C##CLOUD$SERVICE DBMS_CLOUD_TASK_CLEANUP VALID NONE Y
1 C##CLOUD$SERVICE DBMS_CLOUD_TASK_ID VALID NONE Y
1 C##CLOUD$SERVICE DBMS_CLOUD_TYPES VALID METADATA LINK Y
1 PUBLIC DBMS_CLOUD VALID METADATA LINK Y
1 PUBLIC DBMS_CLOUD_AI VALID METADATA LINK Y
1 PUBLIC DBMS_CLOUD_CAPABILITY VALID METADATA LINK Y
1 PUBLIC DBMS_CLOUD_CORE VALID METADATA LINK Y
1 PUBLIC DBMS_CLOUD_INTERNAL VALID METADATA LINK Y
1 PUBLIC DBMS_CLOUD_NOTIFICATION VALID METADATA LINK Y
1 PUBLIC DBMS_CLOUD_OCI_REGIONS VALID METADATA LINK Y
1 PUBLIC DBMS_CLOUD_PIPELINE VALID METADATA LINK Y
1 PUBLIC DBMS_CLOUD_PIPELINE_INTERNAL VALID METADATA LINK Y
1 PUBLIC DBMS_CLOUD_REPO VALID METADATA LINK Y
1 PUBLIC DBMS_CLOUD_TYPES VALID METADATA LINK Y
3 C##CLOUD$SERVICE DBMS_CLOUD VALID METADATA LINK Y
3 C##CLOUD$SERVICE DBMS_CLOUD VALID METADATA LINK Y
3 C##CLOUD$SERVICE DBMS_CLOUD_AI VALID METADATA LINK Y
3 C##CLOUD$SERVICE DBMS_CLOUD_AI VALID METADATA LINK Y
3 C##CLOUD$SERVICE DBMS_CLOUD_AI_PROFILE$ VALID METADATA LINK Y
3 C##CLOUD$SERVICE DBMS_CLOUD_AI_PROFILE_ATTR$ VALID METADATA LINK Y
3 C##CLOUD$SERVICE DBMS_CLOUD_AI_PROFILE_SCHEMA$ VALID METADATA LINK Y
3 C##CLOUD$SERVICE DBMS_CLOUD_CAPABILITIES$ VALID METADATA LINK Y
3 C##CLOUD$SERVICE DBMS_CLOUD_CAPABILITIES_UNIQUE VALID NONE Y
3 C##CLOUD$SERVICE DBMS_CLOUD_CAPABILITY VALID METADATA LINK Y
3 C##CLOUD$SERVICE DBMS_CLOUD_CAPABILITY VALID METADATA LINK Y
3 C##CLOUD$SERVICE DBMS_CLOUD_CLOUD_STORE_UNIQUE VALID NONE Y
3 C##CLOUD$SERVICE DBMS_CLOUD_CONFIG_PARAM VALID DATA LINK Y
3 C##CLOUD$SERVICE DBMS_CLOUD_CONFIG_PARAM$ VALID METADATA LINK Y
3 C##CLOUD$SERVICE DBMS_CLOUD_CORE VALID METADATA LINK Y
3 C##CLOUD$SERVICE DBMS_CLOUD_CORE VALID METADATA LINK Y
3 C##CLOUD$SERVICE DBMS_CLOUD_FILE_SYSTEM$ VALID METADATA LINK Y
3 C##CLOUD$SERVICE DBMS_CLOUD_FILE_SYSTEM_UNIQUE VALID NONE Y
3 C##CLOUD$SERVICE DBMS_CLOUD_INTERNAL VALID METADATA LINK Y
3 C##CLOUD$SERVICE DBMS_CLOUD_INTERNAL VALID METADATA LINK Y
3 C##CLOUD$SERVICE DBMS_CLOUD_NOTIFICATION VALID METADATA LINK Y
3 C##CLOUD$SERVICE DBMS_CLOUD_NOTIFICATION VALID METADATA LINK Y
3 C##CLOUD$SERVICE DBMS_CLOUD_OCI_REGIONS VALID DATA LINK Y
3 C##CLOUD$SERVICE DBMS_CLOUD_OCI_REGIONS$ VALID METADATA LINK Y
3 C##CLOUD$SERVICE DBMS_CLOUD_OCI_REGIONS_UNIQUE VALID NONE Y
3 C##CLOUD$SERVICE DBMS_CLOUD_PARAM_UNIQUE VALID NONE Y
3 C##CLOUD$SERVICE DBMS_CLOUD_PIPELINE VALID METADATA LINK Y
3 C##CLOUD$SERVICE DBMS_CLOUD_PIPELINE VALID METADATA LINK Y
3 C##CLOUD$SERVICE DBMS_CLOUD_PIPELINE$ VALID METADATA LINK Y
3 C##CLOUD$SERVICE DBMS_CLOUD_PIPELINE_ATTR$ VALID METADATA LINK Y
3 C##CLOUD$SERVICE DBMS_CLOUD_PIPELINE_ATTR_I1$ VALID NONE Y
3 C##CLOUD$SERVICE DBMS_CLOUD_PIPELINE_FILE$ VALID METADATA LINK Y
3 C##CLOUD$SERVICE DBMS_CLOUD_PIPELINE_FILE_I1$ VALID NONE Y
3 C##CLOUD$SERVICE DBMS_CLOUD_PIPELINE_I1$ VALID NONE Y
3 C##CLOUD$SERVICE DBMS_CLOUD_PIPELINE_INTERNAL VALID METADATA LINK Y
3 C##CLOUD$SERVICE DBMS_CLOUD_PIPELINE_INTERNAL VALID METADATA LINK Y
3 C##CLOUD$SERVICE DBMS_CLOUD_REPO VALID METADATA LINK Y
3 C##CLOUD$SERVICE DBMS_CLOUD_REPO VALID METADATA LINK Y
3 C##CLOUD$SERVICE DBMS_CLOUD_REQUEST VALID METADATA LINK Y
3 C##CLOUD$SERVICE DBMS_CLOUD_REQUEST VALID METADATA LINK Y
3 C##CLOUD$SERVICE DBMS_CLOUD_REST_API_RESULTS$ VALID METADATA LINK Y
3 C##CLOUD$SERVICE DBMS_CLOUD_STORE VALID DATA LINK Y
3 C##CLOUD$SERVICE DBMS_CLOUD_STORE$ VALID METADATA LINK Y
3 C##CLOUD$SERVICE DBMS_CLOUD_TASK VALID METADATA LINK Y
3 C##CLOUD$SERVICE DBMS_CLOUD_TASK VALID METADATA LINK Y
3 C##CLOUD$SERVICE DBMS_CLOUD_TASK$ VALID METADATA LINK Y
3 C##CLOUD$SERVICE DBMS_CLOUD_TASKS VALID METADATA LINK Y
3 C##CLOUD$SERVICE DBMS_CLOUD_TASK_CLASS VALID METADATA LINK Y
3 C##CLOUD$SERVICE DBMS_CLOUD_TASK_CLASS$ VALID METADATA LINK Y
3 C##CLOUD$SERVICE DBMS_CLOUD_TASK_CLASS_UNIQUE VALID NONE Y
3 C##CLOUD$SERVICE DBMS_CLOUD_TASK_CLEANUP VALID NONE Y
3 C##CLOUD$SERVICE DBMS_CLOUD_TASK_ID VALID NONE Y
3 C##CLOUD$SERVICE DBMS_CLOUD_TYPES VALID METADATA LINK Y
3 PUBLIC DBMS_CLOUD VALID METADATA LINK Y
3 PUBLIC DBMS_CLOUD_AI VALID METADATA LINK Y
3 PUBLIC DBMS_CLOUD_CAPABILITY VALID METADATA LINK Y
3 PUBLIC DBMS_CLOUD_CORE VALID METADATA LINK Y
3 PUBLIC DBMS_CLOUD_INTERNAL VALID METADATA LINK Y
3 PUBLIC DBMS_CLOUD_NOTIFICATION VALID METADATA LINK Y
3 PUBLIC DBMS_CLOUD_OCI_REGIONS VALID METADATA LINK Y
3 PUBLIC DBMS_CLOUD_PIPELINE VALID METADATA LINK Y
3 PUBLIC DBMS_CLOUD_PIPELINE_INTERNAL VALID METADATA LINK Y
3 PUBLIC DBMS_CLOUD_REPO VALID METADATA LINK Y
3 PUBLIC DBMS_CLOUD_TYPES VALID METADATA LINK Y
128 rows selected.
|
con_id 1번 cdb와 con_id 3 pdb 모두 DBMS_CLOUD 오브젝트가 VALID 상태임
나의 경우 close 상태인 pdb가 없었지만 만약 open되어있지 않은 pdb가 존재했던 경우 pdb를 오픈시켜 오브젝트 vaild 유무를 확인해야함
설치 로그에 오류가 발견되거나 C##CLOUD$SERVICE 소유의 invalid 오브젝트가 있으면 원인을 분석 및 수정해야 함
PDB에서 패키지 확인
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
$ sqlplus sys/oracle@localhost:1521/oracle23pdb1 as sysdba
SQL>
set lines 200 pages 1000
col owner for a30
col object_name for a40
select owner, object_name, status, sharing, oracle_maintained
from cdb_objects
where object_name like 'DBMS_CLOUD%'
order by 1, 2, 3;
OWNER OBJECT_NAME STATUS SHARING O
------------------------------ ---------------------------------------- ------- ------------------ -
C##CLOUD$SERVICE DBMS_CLOUD VALID METADATA LINK Y
C##CLOUD$SERVICE DBMS_CLOUD VALID METADATA LINK Y
C##CLOUD$SERVICE DBMS_CLOUD_AI VALID METADATA LINK Y
..
PUBLIC DBMS_CLOUD_REPO VALID METADATA LINK Y
PUBLIC DBMS_CLOUD_TYPES VALID METADATA LINK Y
64 rows selected.
|
2. 인증서가 포함된 SSL 지갑(Wallet) 생성(20.3)
참고 : https://docs.oracle.com/en/database/oracle/oracle-database/23/sutil/create-ssl-wallet-with-certificates.html
HTTP URI와 Object Storage 등 HTTPS 기반의 자원에 접근하기 위해, 데이터베이스에서 사용할 SSL 월렛을 만들어야 함
SSL 월렛에는 필요한 인증서를 넣어야 함
인증서 다운로드
https://objectstorage.us-phoenix-1.oraclecloud.com/p/KB63IAuDCGhz_azOVQ07Qa_mxL3bGrFh1dtsltreRJPbmb-VwsH2aQ4Pur2ADBMA/n/adwcdemo/b/CERTS/o/dbc_certs.tar
이 링크는 변경될수 있으니 만약 디운로드 되지 않는다면 공식 메뉴얼에 있는 링크로 다운로드하면됨
인증서 서버에 업로드 및 권한 부여
1
2
3
|
# mkdir -p /home/oracle/dbc
# mv dbc_certs.tar /home/oracle/dbc
# chown -R oracle:dba /home/oracle/dbc
|
인증서 파일 압축 해제
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
# su - oracle
$ cd /home/oracle/dbc
$ tar -xvf dbc_certs.tar
$ ls
Actalis.cer BaltimoreCyberTrust.cer Comodo2.cer DigiCert9.cer GeoTrust5.cer ISRG.cer SecomTrust2.cer TeleSec1.cer UserTrust3.cer
AddTrust1.cer Buypass1.cer Comodo3.cer DSTRoot.cer GlobalSign1.cer Keynectis.cer Sectigo.cer TeleSec2.cer UserTrust4.cer
AddTrust2.cer Buypass2.cer Comodo4.cer DTrust1.cer GlobalSign2.cer LuxTrust.cer SecureTrust.cer TeleSec3.cer UserTrust5.cer
AddTrust3.cer Camerfirma1.cer dbc_certs.tar DTrust2.cer GlobalSign3.cer MicroSec.cer SSLCom1.cer TeliaSonera1.cer VeriSign1.cer
AffirmTrust1.cer Camerfirma2.cer DigiCert1.cer Entrust1.cer GlobalSign4.cer NetLock.cer SSLCom2.cer TeliaSonera2.cer VeriSign2.cer
AffirmTrust2.cer Camerfirma3.cer DigiCert2.cer Entrust2.cer GlobalSign5.cer QuoVadis1.cer Starfield1.cer Thawte1.cer VeriSign3.cer
AffirmTrust3.cer Certplus1.cer DigiCert3.cer Entrust3.cer GlobalSign6.cer QuoVadis2.cer Starfield2.cer Thawte2.cer VeriSign4.cer
AffirmTrust4.cer Certplus2.cer DigiCert4.cer Entrust4.cer GoDaddy1.cer QuoVadis3.cer Starfield3.cer Thawte3.cer VeriSign5.cer
Amazon1.cer Certum1.cer DigiCert5.cer GeoTrust1.cer GoDaddy2.cer QuoVadis4.cer Swisscom.cer Thawte4.cer VeriSign6.cer
Amazon2.cer Certum2.cer DigiCert6.cer GeoTrust2.cer GTECyberTrust.cer QuoVadis5.cer SwissSign1.cer Thawte5.cer VeriSign7.cer
Amazon3.cer Chunghwa.cer DigiCert7.cer GeoTrust3.cer IdenTrust1.cer QuoVadis6.cer SwissSign2.cer UserTrust1.cer XRamp.cer
Amazon4.cer Comodo1.cer DigiCert8.cer GeoTrust4.cer IdenTrust2.cer SecomTrust1.cer SwissSign3.cer UserTrust2.cer
|
정상적으로 인증서가 받아짐
SSL 월렛을 /app/oracle/wallets/ssl 위치에 생성
(만약 월렛이 이미 있다면 이 과정은 생략가능하고 인증서만 추가하면됨)
1
2
3
4
5
6
7
8
9
|
$ mkdir -p /app/oracle/wallets/ssl
$ cd /app/oracle/wallets/ssl
예시 $ orapki wallet create -wallet . -pwd "SSL 월렛 패스워드" -auto_login
$ orapki wallet create -wallet . -pwd "sslpwd1!" -auto_login
Oracle PKI Tool Release 23.0.0.0.0 - Production
Version 23.0.0.0.0
Copyright (c) 2004, 2024, Oracle and/or its affiliates. All rights reserved.
Operation is successfully completed.
|
월렛에 인증서 추가
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
#! /bin/bash
for i in $(ls /home/oracle/dbc/*cer)
do
orapki wallet add -wallet /app/oracle/wallets/ssl -trusted_cert -cert $i -pwd "sslpwd1!"
done
Oracle PKI Tool Release 23.0.0.0.0 - Production
Version 23.0.0.0.0
Copyright (c) 2004, 2024, Oracle and/or its affiliates. All rights reserved.
Operation is successfully completed.
Oracle PKI Tool Release 23.0.0.0.0 - Production
Version 23.0.0.0.0
Copyright (c) 2004, 2024, Oracle and/or its affiliates. All rights reserved.
Operation is successfully completed.
..
(반복됨)
|
등록된 인증서 확인
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
$ orapki wallet display -wallet /app/oracle/wallets/ssl
Oracle PKI Tool Release 23.0.0.0.0 - Production
Version 23.0.0.0.0
Copyright (c) 2004, 2024, Oracle and/or its affiliates. All rights reserved.
Requested Certificates:
User Certificates:
Trusted Certificates:
Subject: OU=ePKI Root Certification Authority,O=Chunghwa Telecom Co.\, Ltd.,C=TW
Subject: CN=Certum CA,O=Unizeto Sp. z o.o.,C=PL
Subject: CN=NetLock Arany (Class Gold) Főtanúsítvány,OU=Tanúsítványkiadók (Certification Services),O=NetLock Kft.,L=Budapest,C=HU
Subject: CN=UTN-USERFirst-Client Authentication and Email,OU=http://www.usertrust.com,O=The USERTRUST Network,L=Salt Lake City,ST=UT,C=US
Subject: CN=GlobalSign,O=GlobalSign,OU=GlobalSign Root CA - R6
..
Subject: CN=QuoVadis Root Certification Authority,OU=Root Certification Authority,O=QuoVadis Limited,C=BM
Subject: CN=SwissSign Platinum CA - G2,O=SwissSign AG,C=CH
Subject: CN=QuoVadis Root CA 2 G3,O=QuoVadis Limited,C=BM
|
모두 등록됨
3. 새로 생성한 SSL 지갑을 사용할 수 있도록 환경 설정(20.4)
참고 : https://docs.oracle.com/en/database/oracle/oracle-database/23/sutil/configure-oracle-environment-to-use-new-ssl-wallet.html
Oracle Database 환경에서 새로 만든 SSL 월렛을 사용하려면 DB 환경이 새로 생성된 SSL 월렛을 가리키도록 설정해야 함
설정을 위해서는 OCI 서버의 SQLnet.ora 파일에 월렛 위치를 추가해야 함
만약 Oracle RAC(Real Application Clusters) 환경이라면, 모든 노드에서 동일하게 SQLnet.ora 파일을 설정해줘야 함
이미 기존의 SSL 월렛이 있고 인증서를 기존 월렛에 추가했다면, 이 과정은 생략 가능함
sqlnet.ora 파일에 월렛 위치 추가
1
2
3
4
|
$ vi $ORACLE_HOME/network/admin/sqlnet.ora
WALLET_LOCATION=
(SOURCE=(METHOD=FILE)
(METHOD_DATA=(DIRECTORY=/app/oracle/wallets/ssl)))
|
4. DBMS_CLOUD 사용을 위한 데이터베이스 ACE(Access Control Entries, 접근 제어 항목) 구성(20.5)
참고 : https://docs.oracle.com/en/database/oracle/oracle-database/23/sutil/configure-database-aces-for-dbms_cloud.html
Object Storage 및 신뢰할 수 있는 외부 HTTPS 엔드포인트(URI)에 접속하려면 접근 제어 항목(ACE)을 설정해야 함
기본적으로 오라클 데이터베이스는 외부와의 통신이 허용되지 않음
Object Storage에 접근하기 위해서는 데이터베이스가 외부 통신을 할 수 있도록 적절한 ACE를 구성해야 함
만약 데이터베이스가 방화벽 뒤에 있다면 인터넷 게이트웨이(프록시)의 정보를 제공하고 ACE를 구성해야 함
데이터베이스가 HTTP 프록시를 사용해 인터넷에 연결하는 환경이라면, 게이트웨이를 통해 외부 네트워크 서비스에 접근할 수 있도록 반드시 구성해야 함
이 과정에서 DBMS_CLOUD가 외부 네트워크 서비스에 접근할 때 사용할 HTTP 프록시 게이트웨이에 접근할 수 있도록 데이터베이스의 접근 제어 목록(ACL)에 ACE를 추가해야 함
나의 경우 HTTP 프록시를 사용하지 않고 iptime 공유기를 이용해 외부 연결용 DDNS만 설정해놓은 환경임
이 경우 모든 호스트(host='*')를 HTTPS 포트인 443번으로 열어주면됨
Oracle DB는 DDNS 여부와 상관없이 DBMS_CLOUD가 접근할 모든 HTTPS 목적지에 대한 ACE만 필요함
DDNS 자체가 목적지가 아니라 출발지이기 때문에, DDNS를 별도로 ACE에 넣을 필요는 없음
HTTP 프록시를 사용하는 경우 공식 문서를 참고해서 설정해야함
참고 :
환경 설정 시 주의사항
DB 환경 관련 변수를 정확히 입력해야 DBMS_CLOUD가 올바르게 동작함
설정을 정확히 하지 않으면 DBMS_CLOUD 기능이 제대로 작동하지 않음
프록시 설정과 SSL 월렛 경로를 정확하게 입력해야 함
dbc_aces.sql 파일 생성
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
|
$ vi /home/oracle/dbc/dbc_aces.sql
@$ORACLE_HOME/rdbms/admin/sqlsessstart.sql
-- DBMS_CLOUD의 기능 소유자 변경 금지
define clouduser=C##CLOUD$SERVICE
-- SSL 월렛 경로 지정
define sslwalletdir=/app/oracle/wallets/ssl
begin
-- 모든 HTTPS(443) 접속을 허용
dbms_network_acl_admin.append_host_ace(
host => '*',
lower_port => 443,
upper_port => 443,
ace => xs$ace_type(
privilege_list => xs$name_list('http', 'http_proxy'),
principal_name => upper('&clouduser'),
principal_type => xs_acl.ptype_db));
-- SSL 월렛 접근 권한 설정
dbms_network_acl_admin.append_wallet_ace(
wallet_path => 'file:&sslwalletdir',
ace => xs$ace_type(
privilege_list => xs$name_list('use_client_certificates', 'use_passwords'),
principal_name => upper('&clouduser'),
principal_type => xs_acl.ptype_db));
end;
/
-- 데이터베이스 속성 SSL_WALLET 설정
begin
if sys_context('userenv', 'con_name') = 'CDB$ROOT' then
execute immediate 'alter database property set ssl_wallet=''&sslwalletdir''';
end if;
end;
/
|
cdb 접속 후 스크립트 실행
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
$ sqlplus sys/oracle@localhost:1521/oracle23 as sysdba
SQL> @/home/oracle/dbc/dbc_aces.sql
Session altered.
old 9: principal_name => upper('&clouduser'),
new 9: principal_name => upper('C##CLOUD$SERVICE'),
old 14: wallet_path => 'file:&sslwalletdir',
new 14: wallet_path => 'file:/app/oracle/wallets/ssl',
old 17: principal_name => upper('&clouduser'),
new 17: principal_name => upper('C##CLOUD$SERVICE'),
PL/SQL procedure successfully completed.
old 3: execute immediate 'alter database property set ssl_wallet=''&sslwalletdir''';
new 3: execute immediate 'alter database property set ssl_wallet=''/app/oracle/wallets/ssl''';
PL/SQL procedure successfully completed.
|
스크립트를 실행한 후 환경에 맞게 설정값이 들어갔는지 확인이 필요함
HTTP 프록시 환경이 아닌 경우 어떤 항목도 표시되지 않음
SSL_WALLET 속성에는 속성에는 ssl 월렛이 위치한 디렉토리가 표시되어야함
5. DBMS_CLOUD 설정 검증(20.6)
참고 : https://docs.oracle.com/en/database/oracle/oracle-database/23/sutil/verify-configuration-dbms_cloud.html
DBMS_CLOUD 코드가 올바르게 설치되었는지 확인한 후 SSL 월렛과 접근 제어 항목(ACE)이 올바르게 설정되었는지 검증해야 함
그전에 dns에 오라클 링크 주소가 등록되어 있지 않으면 아래 스크립트 수행시 에러가 발생함
1
2
3
|
possibly raised PLSQL/SQL error: -29273 - ORA-29273: HTTP request failed
possibly raised HTML error: ORA-12545: Connect failed because target host or
object does not exist
|
구글 dns(8.8.8.8) 등록
/etc/resolv.conf에 8.8.8.8, 8.8.8.4 추가
1
2
3
4
|
# vi /etc/resolv.conf
nameserver 168.126.63.1
nameserver 8.8.8.8
nameserver 8.8.4.4
|
nslookup 통신 테스트
1
2
3
4
5
6
7
8
9
10
11
12
|
# nslookup objectstorage.eu-frankfurt-1.oraclecloud.com
Server: 8.8.8.8
Address: 8.8.8.8#53
Non-authoritative answer:
objectstorage.eu-frankfurt-1.oraclecloud.com canonical name = objectstorage.eu-frankfurt-1.oci.oraclecloud.com.
Name: objectstorage.eu-frankfurt-1.oci.oraclecloud.com
Address: 134.70.48.1
Name: objectstorage.eu-frankfurt-1.oci.oraclecloud.com
Address: 134.70.44.1
Name: objectstorage.eu-frankfurt-1.oci.oraclecloud.com
Address: 134.70.40.1
|
정상
ping 테스트
1
2
3
4
5
6
7
8
9
10
|
$ ping objectstorage.eu-frankfurt-1.oraclecloud.com
PING objectstorage.eu-frankfurt-1.oci.oraclecloud.com (134.70.48.1) 56(84) bytes of data.
64 bytes from 134.70.48.1 (134.70.48.1): icmp_seq=1 ttl=128 time=264 ms
64 bytes from 134.70.48.1 (134.70.48.1): icmp_seq=2 ttl=128 time=265 ms
64 bytes from 134.70.48.1 (134.70.48.1): icmp_seq=3 ttl=128 time=264 ms
64 bytes from 134.70.48.1 (134.70.48.1): icmp_seq=4 ttl=128 time=264 ms
^C
--- objectstorage.eu-frankfurt-1.oci.oraclecloud.com ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3005ms
rtt min/avg/max/mdev = 263.753/264.157/264.560/0.301 ms
|
정상
db에서 접속되는지 확인
1
2
3
4
5
|
SQL> select utl_http.request('https://objectstorage.eu-frankfurt-1.oraclecloud.com') from dual;
UTL_HTTP.REQUEST('HTTPS://OBJECTSTORAGE.EU-FRANKFURT-1.ORACLECLOUD.COM')
--------------------------------------------------------------------------------
{"code":"NotFound","message":"Not Found"}
|
정상적으로 표시됨
스크립트 파일 생성
*아래 스크립트는 SYS 사용자로 CDB 또는 PDB에서 실행해야 함
*환경 변수 값이 정확히 설정되지 않으면, DBMS_CLOUD가 정상적으로 설정되었더라도 검증 과정이 실패할 수 있음
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
|
$ vi /home/oracle/dbc/check_dbms_cloud.sql
define clouduser=C##CLOUD$SERVICE
-- 환경에 맞게 SSL Wallet 디렉토리와 비밀번호 설정
define sslwalletdir=/app/oracle/wallets/ssl
define sslwalletpwd="sslpwd1!"
-- 프록시가 필요한 환경에서는 아래 설정 추가
-- define proxy_uri=<프록시 URI 주소>
-- create and run this procedure as owner of the ACLs, which is the future owner
-- of DBMS_CLOUD
CREATE OR REPLACE PROCEDURE &clouduser..GET_PAGE(url IN VARCHAR2) AS
request_context UTL_HTTP.REQUEST_CONTEXT_KEY;
req UTL_HTTP.REQ;
resp UTL_HTTP.RESP;
data VARCHAR2(32767) default null;
err_num NUMBER default 0;
err_msg VARCHAR2(4000) default null;
BEGIN
-- SSL 월렛을 사용해 request context 생성
request_context := UTL_HTTP.CREATE_REQUEST_CONTEXT(
wallet_path => 'file:&sslwalletdir',
wallet_password => '&sslwalletpwd');
-- HTTP 프록시가 필요한 경우 주석 해제 후 설정
-- UTL_HTTP.SET_PROXY('&proxy_uri', NULL);
-- HTTP request 수행
req := UTL_HTTP.BEGIN_REQUEST(url => url,request_context => request_context);
resp := UTL_HTTP.GET_RESPONSE(req);
DBMS_OUTPUT.PUT_LINE('valid response');
EXCEPTION
WHEN OTHERS THEN
err_num := SQLCODE;
err_msg := SUBSTR(SQLERRM, 1, 3800);
DBMS_OUTPUT.PUT_LINE('possibly raised PLSQL/SQL error: ' ||err_num||' - '||err_msg);
UTL_HTTP.END_RESPONSE(resp);
data := UTL_HTTP.GET_DETAILED_SQLERRM ;
IF data IS NOT NULL THEN
DBMS_OUTPUT.PUT_LINE('possibly raised HTML error: ' ||data);
END IF;
END;
/
set serveroutput on
BEGIN
&clouduser..GET_PAGE('https://objectstorage.eu-frankfurt-1.oraclecloud.com');
END;
/
set serveroutput off
drop procedure &clouduser..GET_PAGE;
|
스크립트 수행
*위 스크립트 수행시 "valid response" 라고 표시되면 정상 동작하는것임
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
SQL> @/home/oracle/dbc/check_dbms_cloud.sql
old 1: CREATE OR REPLACE PROCEDURE &clouduser..GET_PAGE(url IN VARCHAR2) AS
new 1: CREATE OR REPLACE PROCEDURE C##CLOUD$SERVICE.GET_PAGE(url IN VARCHAR2) AS
old 13: wallet_path => 'file:&sslwalletdir',
new 13: wallet_path => 'file:/app/oracle/wallets/ssl',
old 14: wallet_password => '&sslwalletpwd');
new 14: wallet_password => 'sslpwd1!');
Enter value for proxy_uri: [엔터] <<-- proxy_uri를 사용하지 않기때문에 그냥 엔터 입력
old 17: -- UTL_HTTP.SET_PROXY('&proxy_uri', NULL);
new 17: -- UTL_HTTP.SET_PROXY('', NULL);
Procedure created.
old 2: &clouduser..GET_PAGE('https://objectstorage.eu-frankfurt-1.oraclecloud.com');
new 2: C##CLOUD$SERVICE.GET_PAGE('https://objectstorage.eu-frankfurt-1.oraclecloud.com');
valid response <<--- vaild response 표시됨(정상)
PL/SQL procedure successfully completed.
old 1: drop procedure &clouduser..GET_PAGE
new 1: drop procedure C##CLOUD$SERVICE.GET_PAGE
Procedure dropped.
|
6. DBMS_CLOUD를 사용할 사용자 또는 롤 구성(20.7)
6_1. DBMS_CLOUD를 위한 최소 권한 부여(20.7.1)
참고 : https://docs.oracle.com/en/database/oracle/oracle-database/23/sutil/grant-minimal-privileges-user-role-use-dbms_cloud.html
DBMS_CLOUD 기능을 사용하려면 사용자 또는 롤에 최소한의 접근 권한을 부여해야 함
*다수의 사용자에게 일괄적으로 권한을 부여할 경우, Role을 통해 권한을 관리하는 것이 권장됨
pdb의 imsi 유저에게 권한을 부여함
imsi 유저가 없다면 생성
참고 : 오라클 19c 테스트 시 사용하는 imsi 유저 생성 쿼리 ( https://positivemh.tistory.com/1017 )
Role을 사용하여 권한 부여 (권장 방식)
CLOUD_USER 롤을 생성한 후, IMSI 사용자에게 롤을 부여
*pdb환경에서 sys 또는 system 계정으로 실행해야 함
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
|
SQL>
set verify off
-- 대상 롤 정의
define userrole='CLOUD_USER'
-- 대상 사용자 정의
define username='IMSI'
-- 롤 생성
CREATE ROLE &userrole;
-- 사용자에게 롤 부여
GRANT CLOUD_USER TO &username;
-- DBMS_CLOUD 기능을 사용하기 위한 최소 권한 부여
-- External 테이블 생성 권한 부여(DBMS_CLOUD.CREATE_EXTERNAL_TABLE() 사용 시 필요)
GRANT CREATE TABLE TO &userrole;
-- 아래 권한 부여(COPY_DATA() 사용 시 필요)
GRANT READ, WRITE ON DIRECTORY DATA_PUMP_DIR TO &userrole;
-- DBMS_CLOUD 패키지 실행 권한 부여
GRANT EXECUTE ON DBMS_CLOUD TO &userrole;
GRANT EXECUTE ON DBMS_CLOUD_PIPELINE TO &userrole;
GRANT EXECUTE ON DBMS_CLOUD_REPO TO &userrole;
GRANT EXECUTE ON DBMS_CLOUD_NOTIFICATION TO &userrole;
|
모든 권한이 부여됨
6_2. 사용자 또는 롤에 대한 ACE(Access Control Entries) 구성(20.7.2)
참고 : https://docs.oracle.com/en/database/oracle/oracle-database/23/sutil/configure-aces-user-role-use-dbms_cloud.html
DBMS_CLOUD 패키지는 INVOKER 권한을 사용하므로 사용자 또는 롤이 DBMS_CLOUD의 모든 기능을 사용하려면 적절한 ACE(Access Control Entries) 구성이 필요함
*다수의 사용자에게 권한을 부여할 경우, 롤을 통해 설정하는 것이 관리에 유리함
Role을 사용하여 ACE 구성(권장 방식)
CLOUD_USER 롤을 생성한 후, 해당 롤에 대한 ACE를 설정함
*pdb환경에서 sys 또는 system 계정으로 실행해야 함
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
|
SQL>
@$ORACLE_HOME/rdbms/admin/sqlsessstart.sql
-- 대상 롤 정의
define cloudrole='CLOUD_USER'
-- SSL Wallet 디렉토리 설정
define sslwalletdir=/app/oracle/wallets/ssl
-- 프록시 환경이라면 아래 설정을 수정하여 사용
-- define proxy_uri=<프록시 URI 주소>
-- define proxy_host=<프록시 DNS 이름>
-- define proxy_low_port=<프록시 하위 포트>
-- define proxy_high_port=<프록시 상위 포트>
-- 새로운 ACL / ACE 구성
BEGIN
-- 모든 HTTPS(443) 요청 허용
DBMS_NETWORK_ACL_ADMIN.APPEND_HOST_ACE(
host => '*',
lower_port => 443,
upper_port => 443,
ace => xs$ace_type(
privilege_list => xs$name_list('http', 'http_proxy'),
principal_name => upper('&cloudrole'),
principal_type => xs_acl.ptype_db));
-- 프록시 환경에서만 사용
-- DBMS_NETWORK_ACL_ADMIN.APPEND_HOST_ACE(
-- host => '&proxy_host',
-- lower_port => &proxy_low_port,
-- upper_port => &proxy_high_port,
-- ace => xs$ace_type(
-- privilege_list => xs$name_list('http', 'http_proxy'),
-- principal_name => upper('&cloudrole'),
-- principal_type => xs_acl.ptype_db));
-- SSL Wallet 접근 권한 부여
DBMS_NETWORK_ACL_ADMIN.APPEND_WALLET_ACE(
wallet_path => 'file:&sslwalletdir',
ace => xs$ace_type(
privilege_list => xs$name_list('use_client_certificates', 'use_passwords'),
principal_name => upper('&cloudrole'),
principal_type => xs_acl.ptype_db));
END;
/
@$ORACLE_HOME/rdbms/admin/sqlsessend.sql
|
ACE가 설정됨
6_3. 사용자 및 롤 설정 검증(20.7.3)
참고 : https://docs.oracle.com/en/database/oracle/oracle-database/23/sutil/verify-setup-user-roles-use-dbms_cloud.html
일반유저 테스트용 스크립트 파일 생성
*아래 스크립트는 SYS 사용자로 CDB 또는 PDB에서 실행해야 함
*환경 변수 값이 정확히 설정되지 않으면, DBMS_CLOUD가 정상적으로 설정되었더라도 검증 과정이 실패할 수 있음
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
|
$ vi /home/oracle/dbc/check_dbms_cloud_imsi.sql
-- 대상 사용자 정의 (IMSI 사용자 테스트)
define clouduser='IMSI'
-- SSL Wallet 디렉토리 및 비밀번호 설정
define sslwalletdir=/app/oracle/wallets/ssl
define sslwalletpwd="sslpwd1!"
-- 테스트 프로시저 생성
CREATE OR REPLACE PROCEDURE &clouduser..GET_PAGE(url IN VARCHAR2)
AS
request_context UTL_HTTP.REQUEST_CONTEXT_KEY;
req UTL_HTTP.REQ;
resp UTL_HTTP.RESP;
data VARCHAR2(32767) default null;
err_num NUMBER default 0;
err_msg VARCHAR2(4000) default null;
BEGIN
-- SSL Wallet을 활용한 요청 컨텍스트 생성
request_context := UTL_HTTP.CREATE_REQUEST_CONTEXT(
wallet_path => 'file:&sslwalletdir',
wallet_password => '&sslwalletpwd');
-- HTTP 요청 수행
req := UTL_HTTP.BEGIN_REQUEST(url => url, request_context => request_context);
resp := UTL_HTTP.GET_RESPONSE(req);
DBMS_OUTPUT.PUT_LINE('valid response');
EXCEPTION
WHEN OTHERS THEN
err_num := SQLCODE;
err_msg := SUBSTR(SQLERRM, 1, 3800);
DBMS_OUTPUT.PUT_LINE('possibly raised PLSQL/SQL error: ' || err_num || ' - ' || err_msg);
UTL_HTTP.END_RESPONSE(resp);
data := UTL_HTTP.GET_DETAILED_SQLERRM;
IF data IS NOT NULL THEN
DBMS_OUTPUT.PUT_LINE('possibly raised HTML error: ' || data);
END IF;
END;
/
set serveroutput on
BEGIN
&clouduser..GET_PAGE('https://objectstorage.eu-frankfurt-1.oraclecloud.com');
END;
/
set serveroutput off
|
pdb에 imsi유저로 접속 후 스크립트 수행
*위 스크립트 수행시 "valid response" 라고 표시되면 정상 동작하는것임
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
$ sqlplus imsi/imsi@localhost:1521/oracle23pdb1
SQL> @/home/oracle/dbc/check_dbms_cloud_imsi.sql
old 1: CREATE OR REPLACE PROCEDURE &clouduser..GET_PAGE(url IN VARCHAR2)
new 1: CREATE OR REPLACE PROCEDURE IMSI.GET_PAGE(url IN VARCHAR2)
old 12: wallet_path => 'file:&sslwalletdir',
new 12: wallet_path => 'file:/app/oracle/wallets/ssl',
old 13: wallet_password => '&sslwalletpwd');
new 13: wallet_password => 'sslpwd1!');
Procedure created.
possibly raised PLSQL/SQL error: -29273 - ORA-29273: HTTP request failed
possibly raised HTML error: ORA-24247: network access denied by access control
list (ACL)
PL/SQL procedure successfully completed.
|
에러 발생
pdb의 sys나 system 유저로 imsi 유저에 utl_http 실행 권한 및 acl 권한 직접 부여
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
SQL> grant execute on utl_http to imsi;
Grant succeeded.
SQL>
BEGIN
DBMS_NETWORK_ACL_ADMIN.APPEND_HOST_ACE(
host => '*',
lower_port => 443,
upper_port => 443,
ace => xs$ace_type(
privilege_list => xs$name_list('http', 'http_proxy'),
principal_name => 'IMSI',
principal_type => xs_acl.ptype_db)
);
END;
/
PL/SQL procedure successfully completed.
|
pdb의 imsi 유저로 스크립트 재수행
*위 스크립트 수행시 "valid response" 라고 표시되면 정상 동작하는것임
1
2
3
4
5
6
7
|
SQL> @/home/oracle/dbc/check_dbms_cloud_imsi.sql
Procedure created.
valid response <<--- vaild response 표시됨(정상)
PL/SQL procedure successfully completed.
|
정상적으로 vaild response가 나옴
*해결하고 보니 메뉴얼에도 나와있는 내용이었음
(원문 : If you have granted the ACLs through a role, then you must grant those privileges explicitly to user SCOTT for this example to work)
(번역 : 롤을 통해 ACL을 부여한 경우 SCOTT이 예제가 작동하려면 해당 권한을 사용자에게 명시적으로 부여해야 합니다.)
dba_network_acl_privileges 확인
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
SQL>
set lines 200 pages 1000
col acl for a50
col principal for a10
col privilege for a10
col is_grant for a10
select acl, principal, privilege, is_grant
from dba_network_acl_privileges
where principal = 'IMSI';
ACL PRINCIPAL PRIVILEGE IS_GRANT
-------------------------------------------------- ---------- ---------- ----------
NETWORK_ACL_305057**********************B47C IMSI http true
NETWORK_ACL_305057**********************B47C IMSI http-proxy true
|
결론 :
이렇게 오라클 23.7버전부터 dbms_cloud를 사용할수 있게됨
다음 게시글에선 dbms_cloud_ai를 이용해 23.7(non autonomous database)에서 select ai를 테스트해볼 예정임
참조 :
2748362.1
https://docs.oracle.com/en/database/oracle/oracle-database/23/nfcoa/ru_23_7.html#GUID-104803-1
https://docs.oracle.com/en/database/oracle/oracle-database/23/sutil/dbms_cloud-family-packages.html
https://bryangrenn.blogspot.com/2025/03/23.7-Selectai.html?m=1
https://oracle-cloud.tistory.com/entry/Select-AI-%EC%BF%BC%EB%A6%AC-%EC%83%9D%EC%84%B1-%EA%B8%B0%EB%8A%A5-%EC%86%8C%EA%B0%9C
https://blog.cloudnueva.com/select-ai-is-not-a-toy
'ORACLE > Admin' 카테고리의 다른 글
오라클 23ai 신기능 Select AI 사용 테스트(non-adb) (0) | 2025.04.17 |
---|---|
오라클 19c dbca silent 시 템플릿별 컴포넌트 비활성화 설정 (0) | 2025.04.14 |
오라클 19c 유저별 테이블스페이스 quota 확인 및 변경 (0) | 2025.04.07 |
오라클 19c 파티션 인덱스의 테이블스페이스 변경 (0) | 2025.03.31 |
오라클 19c alert log DDE flood control 기능(에러 홍수 제어) (0) | 2025.03.24 |