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