From 8e1e521a705ca22812939ba979a79c9106feac52 Mon Sep 17 00:00:00 2001 From: devmrko Date: Tue, 7 Jul 2026 13:14:31 +0900 Subject: [PATCH] [Developer] #546 make VPD setup rerunnable on ADB --- docs/design/546-hermes-vm-deploy/README.md | 21 +++- ...17_agent_ords_security_local_vpd_setup.sql | 9 +- ...agent_ords_security_backoffice_support.sql | 109 ++++++++++++------ 3 files changed, 100 insertions(+), 39 deletions(-) diff --git a/docs/design/546-hermes-vm-deploy/README.md b/docs/design/546-hermes-vm-deploy/README.md index 2bfe88f..9f32101 100644 --- a/docs/design/546-hermes-vm-deploy/README.md +++ b/docs/design/546-hermes-vm-deploy/README.md @@ -29,8 +29,10 @@ VPD Backoffice는 Oracle Database VPD/ORDS 기능을 백오피스 권한 테이 - `BACKOFFICE_DB_URL` - `BACKOFFICE_ORDS_DB_URL` - `BACKOFFICE_PORT` -- 원격 프로세스는 `nohup java -jar app.jar` 방식으로 기동한다. - - systemd 등록은 VM의 sudo 정책과 포트 공개 정책이 확정된 뒤 별도 이슈에서 다룬다. +- 원격 프로세스는 systemd `vpd-backoffice.service`로 기동한다. + - `User=opc`, `Restart=on-failure`, `NoNewPrivileges=true`, `PrivateTmp=true`를 적용한다. + - 환경 파일은 `/etc/vpd-backoffice/vpd-backoffice.env`에 두고 `root:opc`, `640` 권한으로 제한한다. + - Wallet과 초기 관리자 자격증명 파일은 앱 디렉터리에 두고 각각 `700` 디렉터리와 `600` 파일 권한으로 제한한다. ## 완료 기준 @@ -51,6 +53,18 @@ VPD Backoffice는 Oracle Database VPD/ORDS 기능을 백오피스 권한 테이 - OCI NSG: `218.39.170.82/32 -> tcp/8082` ingress 추가 - 외부 헬스체크: `http://130.162.134.59:8082/login` HTTP 200 +## 2026-07-07 KBAIPOC VM 배포 결과 + +- 배포 대상: `opc@161.33.6.45` (`vnic-aidp-poc`), 서비스: `vpd-backoffice.service`. +- Java: Oracle Linux 9의 `java-21-openjdk-headless`를 설치했다. +- 앱은 `0.0.0.0:8080`에서 수신하고 VM firewalld에서 `8080/tcp`을 허용한다. +- ADB Wallet은 앱 디렉터리의 `wallet/`에 배치하고, 앱은 `kbaipoc_high` 서비스 별칭으로 접속한다. +- 새로운 ADB에 표준 VPD POC 스키마, `CB_ORDS`, 백오피스 지원 객체, 동적 VPD 필터를 VM SQLcl로 초기화했다. 핵심 지원 테이블 5개와 `CB_AGENT_CTX_PKG`, `CB_AGENT_DOC_VPD_FILTER`의 `VALID` 상태를 확인했다. +- 초기화 SQL은 현재 스키마의 `CB_PERMISSION_RULE` 5열 모델에 맞춰 seed 열을 명시하고, 지원 객체 생성은 재실행 가능하도록 `ORA-00955`를 처리한다. Autonomous Database의 parallel DML 충돌을 피하기 위해 보조 SQL은 parallel DML을 비활성화하고 seed 전 트랜잭션을 끝낸다. +- VM 내부 로그인과 인증된 대시보드에서 ADB 조회·도움말 SVG를 확인했고, 외부 `http://161.33.6.45:8080/login`도 HTTP `200`을 반환했다. + +> 현재 접속 주소는 IP 기반 HTTP이므로 테스트 전용이다. 운영 전환 시에는 도메인과 신뢰할 수 있는 TLS 인증서를 구성하고 `BACKOFFICE_REQUIRE_HTTPS=true`, secure session cookie를 활성화해야 한다. + ## 검증 - `mvn test` @@ -59,3 +73,6 @@ VPD Backoffice는 Oracle Database VPD/ORDS 기능을 백오피스 권한 테이 - `scripts/deploy-backoffice-vm.sh --host hermes --skip-build` - 원격 내부 `/login` HTTP 200 - 외부 `/login` HTTP 200 +- `systemctl status vpd-backoffice`가 `active (running)`이고 앱 로그에서 `vpd-backoffice-pool` 연결이 성공한다. +- VM SQLcl에서 VPD context package body와 dynamic filter가 `VALID`이다. +- `http://161.33.6.45:8080/login`이 외부에서 HTTP `200`을 반환한다. diff --git a/sql/adb/17_agent_ords_security_local_vpd_setup.sql b/sql/adb/17_agent_ords_security_local_vpd_setup.sql index 1d0be46..7e72ed8 100644 --- a/sql/adb/17_agent_ords_security_local_vpd_setup.sql +++ b/sql/adb/17_agent_ords_security_local_vpd_setup.sql @@ -112,9 +112,12 @@ INSERT INTO cb_permission VALUES (100, 10, 'CB_V_SEARCH_DOCUMENTS', 'SELECT', 'A INSERT INTO cb_permission VALUES (200, 20, 'CB_V_SEARCH_DOCUMENTS', 'SELECT', 'ALLOW'); INSERT INTO cb_permission VALUES (300, 30, 'CB_V_SEARCH_DOCUMENTS', 'SELECT', 'ALLOW'); -INSERT INTO cb_permission_rule VALUES (1000, 100, 'MY_DEPT', NULL); -INSERT INTO cb_permission_rule VALUES (2000, 200, 'SELF', NULL); -INSERT INTO cb_permission_rule VALUES (3000, 300, 'ALL', NULL); +INSERT INTO cb_permission_rule (rule_id, perm_id, rule_column, rule_type, rule_value) +VALUES (1000, 100, NULL, 'MY_DEPT', NULL); +INSERT INTO cb_permission_rule (rule_id, perm_id, rule_column, rule_type, rule_value) +VALUES (2000, 200, NULL, 'SELF', NULL); +INSERT INTO cb_permission_rule (rule_id, perm_id, rule_column, rule_type, rule_value) +VALUES (3000, 300, NULL, 'ALL', NULL); INSERT INTO cb_permission_column VALUES (300, 'CONTENTS'); diff --git a/sql/adb/25_agent_ords_security_backoffice_support.sql b/sql/adb/25_agent_ords_security_backoffice_support.sql index 404862d..085b060 100644 --- a/sql/adb/25_agent_ords_security_backoffice_support.sql +++ b/sql/adb/25_agent_ords_security_backoffice_support.sql @@ -9,6 +9,7 @@ WHENEVER SQLERROR EXIT SQL.SQLCODE SET ECHO ON SET FEEDBACK ON +ALTER SESSION DISABLE PARALLEL DML; PROMPT === Adding optional description column to bearer keys === BEGIN @@ -120,14 +121,23 @@ EXCEPTION END; / -CREATE TABLE cb_protected_object ( - object_id NUMBER PRIMARY KEY, - owner VARCHAR2(128) NOT NULL, - object_name VARCHAR2(128) NOT NULL UNIQUE, - ords_path VARCHAR2(300) NOT NULL, - enabled_yn CHAR(1) DEFAULT 'Y' CHECK (enabled_yn IN ('Y','N')) NOT NULL, - description VARCHAR2(200) -); +BEGIN + EXECUTE IMMEDIATE ' + CREATE TABLE cb_protected_object ( + object_id NUMBER PRIMARY KEY, + owner VARCHAR2(128) NOT NULL, + object_name VARCHAR2(128) NOT NULL UNIQUE, + ords_path VARCHAR2(300) NOT NULL, + enabled_yn CHAR(1) DEFAULT ''Y'' CHECK (enabled_yn IN (''Y'',''N'')) NOT NULL, + description VARCHAR2(200) + )'; +EXCEPTION + WHEN OTHERS THEN + IF SQLCODE != -955 THEN + RAISE; + END IF; +END; +/ BEGIN EXECUTE IMMEDIATE 'ALTER TABLE cb_protected_object ADD (description VARCHAR2(200))'; @@ -139,16 +149,25 @@ EXCEPTION END; / -CREATE TABLE cb_protected_column ( - column_id NUMBER PRIMARY KEY, - object_id NUMBER NOT NULL REFERENCES cb_protected_object(object_id), - column_name VARCHAR2(128) NOT NULL, - sensitive_yn CHAR(1) DEFAULT 'N' CHECK (sensitive_yn IN ('Y','N')) NOT NULL, - visible_role_id NUMBER, - sensitivity_level VARCHAR2(20) DEFAULT 'PUBLIC' NOT NULL, - redaction_method VARCHAR2(20) DEFAULT 'NONE' NOT NULL, - CONSTRAINT cb_protected_column_uk UNIQUE (object_id, column_name) -); +BEGIN + EXECUTE IMMEDIATE ' + CREATE TABLE cb_protected_column ( + column_id NUMBER PRIMARY KEY, + object_id NUMBER NOT NULL REFERENCES cb_protected_object(object_id), + column_name VARCHAR2(128) NOT NULL, + sensitive_yn CHAR(1) DEFAULT ''N'' CHECK (sensitive_yn IN (''Y'',''N'')) NOT NULL, + visible_role_id NUMBER, + sensitivity_level VARCHAR2(20) DEFAULT ''PUBLIC'' NOT NULL, + redaction_method VARCHAR2(20) DEFAULT ''NONE'' NOT NULL, + CONSTRAINT cb_protected_column_uk UNIQUE (object_id, column_name) + )'; +EXCEPTION + WHEN OTHERS THEN + IF SQLCODE != -955 THEN + RAISE; + END IF; +END; +/ BEGIN EXECUTE IMMEDIATE 'ALTER TABLE cb_protected_column ADD (sensitivity_level VARCHAR2(20) DEFAULT ''PUBLIC'' NOT NULL)'; @@ -177,23 +196,45 @@ WHERE sensitivity_level = 'PUBLIC' AND redaction_method = 'NONE' AND sensitive_yn = 'Y'; -CREATE TABLE cb_permission_column ( - permission_id NUMBER NOT NULL, - column_name VARCHAR2(128) NOT NULL, - CONSTRAINT cb_permission_column_pk PRIMARY KEY (permission_id, column_name) -); +-- Autonomous Database can use parallel DML. Finish the compatibility update +-- before merging the seed rows into the same table. +COMMIT; -CREATE TABLE cb_ords_probe_audit ( - audit_id NUMBER PRIMARY KEY, - event_type VARCHAR2(50) NOT NULL, - key_id NUMBER, - object_id NUMBER, - status VARCHAR2(50), - row_count NUMBER, - error_code VARCHAR2(100), - message VARCHAR2(500), - created_at TIMESTAMP DEFAULT SYSTIMESTAMP NOT NULL -); +BEGIN + EXECUTE IMMEDIATE ' + CREATE TABLE cb_permission_column ( + permission_id NUMBER NOT NULL, + column_name VARCHAR2(128) NOT NULL, + CONSTRAINT cb_permission_column_pk PRIMARY KEY (permission_id, column_name) + )'; +EXCEPTION + WHEN OTHERS THEN + IF SQLCODE != -955 THEN + RAISE; + END IF; +END; +/ + +BEGIN + EXECUTE IMMEDIATE ' + CREATE TABLE cb_ords_probe_audit ( + audit_id NUMBER PRIMARY KEY, + event_type VARCHAR2(50) NOT NULL, + key_id NUMBER, + object_id NUMBER, + status VARCHAR2(50), + row_count NUMBER, + error_code VARCHAR2(100), + message VARCHAR2(500), + created_at TIMESTAMP DEFAULT SYSTIMESTAMP NOT NULL + )'; +EXCEPTION + WHEN OTHERS THEN + IF SQLCODE != -955 THEN + RAISE; + END IF; +END; +/ BEGIN EXECUTE IMMEDIATE '