---
# System prepended metadata

title: Cài đặt Oracle Database Vault 12c & Thực hành Lab 3.1 và Lab 3.2

---


# Lab 3.1: Chặn DBA

## PHẦN 1: CẤU HÌNH (CDB$ROOT)

*Chạy bằng `SQLPLUS` hoặc `SQLdeveloper` đều được nhé*

### 1.1. Tạo 4 User Quản lý Vault

```sql
CONNECT / as sysdba

GRANT CREATE SESSION, SET CONTAINER TO c##dvowner IDENTIFIED BY "OwnerPassword123" CONTAINER = ALL;
GRANT CREATE SESSION, SET CONTAINER TO c##dvowner_backup IDENTIFIED BY "BackupPassword123" CONTAINER = ALL;
GRANT CREATE SESSION, SET CONTAINER TO c##dvacctmgr IDENTIFIED BY "MgrPassword123" CONTAINER = ALL;
GRANT CREATE SESSION, SET CONTAINER TO c##dvacctmgr_backup IDENTIFIED BY "MgrbackupPassword123" CONTAINER = ALL;
```

### 1.2. Tạo Profile "Chống Tự khóa"

```sql
CREATE PROFILE C##DV_PROFILE LIMIT
    FAILED_LOGIN_ATTEMPTS 5
    PASSWORD_VERIFY_FUNCTION ora12c_verify_function
    PASSWORD_LOCK_TIME 1/1440
    CONTAINER=ALL;

ALTER USER c##dvowner PROFILE c##dv_profile CONTAINER=ALL;
ALTER USER c##dvowner_backup PROFILE c##dv_profile CONTAINER=ALL;
ALTER USER c##dvacctmgr PROFILE c##dv_profile CONTAINER=ALL;
ALTER USER c##dvacctmgr_backup PROFILE c##dv_profile CONTAINER=ALL;
```

### 1.3. "Đăng ký" Quản trị viên Vault (Cấp CDB)

```sql
BEGIN
    CONFIGURE_DV (
        dvowner_uname         => 'c##dvowner',
        dvacctmgr_uname       => 'c##dvacctmgr');
END;
/
```
### 1.4. Dọn dẹp & Biên dịch lại


```sql
SQL> @%ORACLE_HOME%\rdbms\admin\utlrp.sql
```

### 1.5. Kích hoạt Vault & Khởi động lại

```sql
-- 1. Đăng nhập với owner để kích hoạt
CONNECT c##dvowner/OwnerPassword123
EXEC DBMS_MACADM.ENABLE_DV;

-- 2. Đăng nhập SYSDBA và Khởi động lại
CONNECT / as sysdba
shutdown immediate;
startup;
```
### 1.6. Kiểm tra Trạng thái CDB

```sql
connect / as sysdba
SELECT * FROM DBA_DV_STATUS;
-- Kết quả mong đợi: Cả 2 status (CONFIGURE và ENABLE) đều là TRUE
```

## PHẦN 1: CẤU HÌNH (PDB)

### 2.1. Di chuyển vào PDB1 và Open PDB

```sql
connect / as sysdba

-- Di chuyển vào "căn hộ" PDB1
ALTER SESSION SET CONTAINER = PDB1;

-- Kiểm tra trạng thái (thường nó sẽ là MOUNTED)
SHOW PDBS;

-- Mở PDB1 (Nếu nó chưa ở READ WRITE)
ALTER PLUGGABLE DATABASE PDB1 OPEN;

-- Kiểm tra lại
SHOW PDBS;
-- (Kết quả mong đợi: PDB1 ở mode READ WRITE)
```

### 2.2. "Đăng ký" Quản trị viên Vault (Cấp PDB)

```sql
BEGIN
    CONFIGURE_DV (
        dvowner_uname         => 'c##dvowner',
        dvacctmgr_uname       => 'c##dvacctmgr');
END;
/
```

2.3. Dọn dẹp & Biên dịch lại PDB

```sql
@%ORACLE_HOME%\rdbms\admin\utlrp.sql
```

### 2.4. Kích hoạt Vault & Khởi động lại PDB

```sql
-- 1. Đăng nhập c##dvowner THẲNG VÀO PDB1 và Kích hoạt
CONNECT c##dvowner/"OwnerPassword123"@localhost:1521/PDB1
EXEC DBMS_MACADM.ENABLE_DV;

-- 2. Đăng nhập SYSDBA và Khởi động lại CHỈ PDB1
CONNECT / as sysdba
ALTER PLUGGABLE DATABASE PDB1 CLOSE IMMEDIATE;
ALTER PLUGGABLE DATABASE PDB1 OPEN;
```

### 2.5. Kiểm tra Trạng thái Toàn diện

```sql!
connect / as sysdba

SELECT c.NAME AS CON_NAME, s.NAME AS STATUS_NAME, s.STATUS
FROM
    CDB_DV_STATUS s
JOIN
    V$CONTAINERS c ON s.CON_ID = c.CON_ID
WHERE
    s.NAME = 'DV_ENABLE_STATUS';

-- KẾT QUẢ MONG ĐỢI:
-- CON_NAME      STATUS_NAME         STATUS
-- ------------- ------------------- ----------
-- CDB$ROOT      DV_ENABLE_STATUS    TRUE
-- PDB1          DV_ENABLE_STATUS    TRUE
```

## PHẦN 3: CẤP QUYỀN DỰ PHÒNG

```sql!
-- 1. Owner trao chìa
CONNECT c##dvowner/"OwnerPassword123"
GRANT DV_OWNER TO c##dvowner_backup WITH ADMIN OPTION CONTAINER=ALL;

-- 2. "Quản lý Nhân sự" trao chìa
CONNECT c##dvacctmgr/"MgrPassword123"
GRANT DV_ACCTMGR TO c##dvacctmgr_backup WITH ADMIN OPTION CONTAINER=ALL;

-- 3. Kiểm tra lần cuối
connect / as sysdba
column grantee format a25
column granted_role format a25
select grantee, granted_role, admin_option, common 
    from dba_role_privs
where granted_role in ('DV_ACCTMGR','DV_OWNER')
order by 1,2,3;
```

## PHẦN 4: THỰC HÀNH LAB 3-1

### 4.1. KIỂM TRA (Trước khi cấu hình Realms)

```sql!
CONNECT / as sysdba

-- John PDB1
ALTER SESSION SET CONTAINER = PDB1;

-- Check L
SELECT first_name, last_name, salary
FROM hr.employees
ORDER BY salary DESC;

-- KẾT QUẢ MONG ĐỢI: SYS xem được lương
```

## 4.2. Cấu hình Realms

```sql
-- B1: Tạo Realm
BEGIN 
    DVSYS.DBMS_MACADM.CREATE_REALM(  
        realm_name     => 'Protect HR tables' 
        ,description    => 'Mandatory realm to protect HR tables' 
        ,enabled        => dbms_macutl.g_yes 
        ,audit_options  => null 
        ,realm_type     => dbms_macadm.mandatory_realm);
END;
/

-- B2: Bỏ TẤT CẢ BẢNG (TABLE) của HR vào Realms
BEGIN
    DVSYS.DBMS_MACADM.ADD_OBJECT_TO_REALM(  
        realm_name     => 'Protect HR tables' 
        ,object_owner   => 'HR' 
        ,object_name    => '%' 
        ,object_type    => 'TABLE');
END;
/

-- B3: Cấp quyền xem cho HR
BEGIN
    DVSYS.DBMS_MACADM.ADD_AUTH_TO_REALM(  
        realm_name     => 'Protect HR tables' 
        ,grantee       => 'HR' 
        ,rule_set_name => null 
        ,auth_options  => dbms_macutl.g_realm_auth_owner);
END;
/
```

## PHẦN 5: KIỂM TRA KẾT QUẢ

### 5.1. Kiểm tra dưới quyền SysDBA

```sql!
CONNECT / as sysdba

-- Đi vào PDB1
ALTER SESSION SET CONTAINER = PDB1;

-- Check lương
SELECT first_name, last_name, salary
FROM hr.employees
ORDER BY salary DESC;

-- KẾT QUẢ MONG ĐỢI: THẤT BẠI!
-- ORA-01031: insufficient privileges
```

### 5.2. Kiểm tra dưới quyền HR

```sql
-- 1. Đăng nhập với tư cách HR
CONNECT hr/"hr_password123"@localhost:1521/PDB1

-- 2. Thử xem lương
SELECT first_name, last_name, salary
FROM hr.employees
ORDER BY salary DESC;

-- KẾT QUẢ MONG ĐỢI: Hiện bảng lương
```

# LAB 3.2: Chặn thực thi lệnh dựa trên địa chỉ IP

## Phần 1: Setup ban đầu để có thể connect vào database từ một máy khác

Truy cập `C:\app\Oracle\virtual\product\12.2.0\dbhome_1\network\admin\listener.ora`

Sửa `localhost` thành `0.0.0.0`

![image](https://hackmd.io/_uploads/HyhB8Q7lWx.png)

- Chạy trong cmd:
```
lsnrctl stop
lsnrctl start
```
- Login vào sysdba để đăng kí:
```sql!
sqlplus / as sysdba

ALTER SYSTEM REGISTER;
```

- Check Status bằng cmd:
```
lsnrctl status
```

`Hiện ra đủ như này là OK`
![image](https://hackmd.io/_uploads/ryiCDXQg-l.png)

- Vì mình login vào `HR` nằm trong `PDB1` nên phải `OPEN Container` ra nhé

Ở trạng thái `READ`, `WRITE` này là ok

![image](https://hackmd.io/_uploads/r1VdOmQlWg.png)

Còn ở trạng thái `MOUNTED` thì `ALTER PLUGGABLE DATABASE PDB1 OPEN;`

### Connect vào bằng máy khác

![image](https://hackmd.io/_uploads/SyNrYm7xZx.png)

![image](https://hackmd.io/_uploads/H1TFFmXeWg.png)


## Phần 2: Cấu hình realm chặn lệnh dựa trên địa chỉ IP

- Đăng nhập vào database bằng `dvowner` ở trong container `pdb1`vì chỉ có `dvowner` mới đủ quyền thiết lập chính sách, và HR đang ở trong `pdb1`

```sql!
Login: CONNECT c##dvowner/"OwnerPassword123"@localhost:1521/PDB1

Bước 1:
BEGIN
    DBMS_MACADM.CREATE_RULE( 
        rule_name  => 'Trusted IP Address'
        ,rule_expr => 'sys_context(''userenv'',''ip_address'') = ''127.0.0.1'' ');
END;
/

Bước 2:
BEGIN
    DVSYS.DBMS_MACADM.CREATE_RULE_SET( 
        rule_set_name    => 'Trusted Rule Set' 
        ,description     => 'A rule set for controlling access by IP address' 
        ,enabled         => 'Y' 
        ,eval_options    => dbms_macutl.g_ruleset_eval_any 
        ,audit_options   => null 
        ,fail_options    => dbms_macutl.g_ruleset_fail_show 
        ,fail_message    => 'Access is blocked. Contact the IT helpdesk.' 
        ,fail_code       => '-20000' 
        ,handler_options => dbms_macutl.g_ruleset_handler_off 
        ,handler         => null 
        ,is_static       => true);
END;
/

Bước 3:
BEGIN
    DVSYS.DBMS_MACADM.ADD_RULE_TO_RULE_SET(  
        rule_set_name  => 'Trusted Rule Set' 
        ,rule_name     => 'Trusted IP Address');
END;
/

Bước 4:
BEGIN
    DVSYS.DBMS_MACADM.CREATE_COMMAND_RULE(
        command        => 'DROP TABLE',
        object_owner   => 'HR',
        object_name    => '%',
        rule_set_name  => 'Trusted Rule Set',
        enabled        => DBMS_MACUTL.G_YES
    );
END;
/
```

- Chạy xong sang máy còn lại để test

![image](https://hackmd.io/_uploads/r1mai7meWx.png)

- Ở trên máy chủ thì vẫn `DROP` được bình thường

![image](https://hackmd.io/_uploads/H1R1R7XgWg.png)





