# 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`

- 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`

- 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

Còn ở trạng thái `MOUNTED` thì `ALTER PLUGGABLE DATABASE PDB1 OPEN;`
### Connect vào bằng máy khác


## 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

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