IBM Guardium Khả năng đánh giá lỗ hổng và đánh giá cấu hình an toàn của cơ sở dữ liệu đối với các hệ thống Oracle Database và Microsoft SQL Server

ĐÁNH GIÁ LỖ HỔNG VÀ CẤU HÌNH AN TOÀN CỦA CƠ SỞ DỮ LIỆU TRÊN ORACLE DATABASE VÀ MICROSOFT SQL SERVER​

1. Mục tiêu​

  • Đánh giá cấu hình an toàn của Oracle Database (oracledb01) và SQL Server (SQLDB01) đang vận hành bằng Guardium Vulnerability Assessment (VA): phân quyền, xác thực và mật khẩu, tham số cấu hình, kiểm toán.
  • Phát hiện lỗ hổng đã công bố (CVE) và bản vá còn thiếu theo phiên bản CSDL đang chạy.
  • Bổ sung test tùy biến cho yêu cầu riêng của hệ thống bán lẻ mà bộ test có sẵn không kiểm tra.
  • Phát hiện cấu hình bị thay đổi giữa hai lần quét và xác minh kết quả khắc phục.

2. Nguyên lý hoạt động​

VA không dùng S-TAP. Collector kết nối JDBC tới CSDL qua datasource bằng một tài khoản chỉ đọc, truy vấn data dictionary và tham số cấu hình, so với ngưỡng của từng test rồi trả về Pass, Fail hoặc Error kèm giá trị quan sát được và khuyến nghị khắc phục.​
Loại test​
Cách lấy dữ liệu​
Ví dụ​
Trong lab​
PredefinedTruy vấn qua JDBC; nội dung dựa trên CIS Benchmark, DISA STIGQuyền cấp cho PUBLIC, profile mật khẩu, tham số kiểm toán, xp_cmdshellDùng
CVESo phiên bản, bản vá của CSDL với danh sách lỗ hổng IBM cập nhật hằng quý (gói DPS)Bản vá RU của Oracle, CU của SQL Server còn thiếuDùng
Query-basedCâu SQL do người dùng viết, so kết quả với giá trị mong muốnBảng khách hàng cấp cho PUBLICDùng (mục 3.6)
CAS-basedAgent CAS trên máy chủ CSDL đọc file, quyền file, registrysqlnet.ora, listener.ora, Hide InstanceKhông có CAS; kiểm tra thủ công ở KB1

Mỗi test thuộc một nhóm (Privilege, Authentication, Configuration, Version, Other) và một mức (Critical, Major, Minor, Caution, Info). Tests passing là tỷ lệ test Pass trên tổng số test Pass và Fail; Result Summary đếm số test Pass (p), Fail (f), Error (e) theo nhóm và mức.​
  • VA cho biết trạng thái tại thời điểm quét, không cho biết ai thay đổi và lúc nào; phần này lấy từ dữ liệu giám sát hoạt động qua S-TAP.​
  • Kết quả CVE chỉ cập nhật tới ngày phát hành gói DPS đang cài trên Guardium.​
  • VA chỉ đọc, không sửa CSDL; mọi khắc phục do DBA thực hiện. VA là thành phần cấp phép riêng: nếu không có menu Harden → Vulnerability Assessment thì kiểm tra lại license.​
1792647508190.png

Hình 1: Nguyên lý đánh giá lỗ hổng và cấu hình an toàn CSDL bằng Vulnerability Assessment​

3. Cấu hình​

3.1. Tải script cấp quyền gdmmonitor​

Guardium kèm sẵn bộ script cấp quyền cho VA theo từng loại CSDL.
Bước 1: SSH vào Guardium bằng tài khoản cli, mở file server cho máy quản trị trong 1 giờ:​
fileserver <IP_MAY_QUAN_TRI> 3600
1792647524715.png

Hình 2: Bật file server trên Guardium cho máy quản trị​
Bước 2: Trên máy quản trị, mở địa chỉ dưới và tải README.txt, gdmmonitor-ora.sql, gdmmonitor-mss.sql, gdmmonitor-mss-SA.sql:​
https://<IP_GUARDIUM>:8445/log/debug-logs/gdmmonitor_scripts/
1792647529643.png

Hình 3: Thư mục gdmmonitor_scripts trên Guardium​
Bước 3: Đọc README.txt và phần chú thích đầu mỗi script. README liệt kê script theo loại CSDL và yêu cầu làm theo hướng dẫn ở đầu từng file.​
1792647534304.png

Hình 4: README.txt của bộ script gdmmonitor​
Script​
Nội dung​
Dùng trong lab​
gdmmonitor-ora.sqlTạo role GDMMONITOR (CONNECT, SELECT trên các view DBA_*, V_$*, SYS.USER$), view SYS.GDM_$PARAMETER và public synonym GDM$PARAMETER để đọc tham số ẩn. Không tạo user. Chạy bằng SYSDBA, chỉ cho non-CDB.Có (mục 3.2)
gdmmonitor-mss.sqlTạo role gdmmonitor trong master, msdb và mọi database online (kể cả model), tạo user cho login trong từng database, tạo server role gdmmonitor (VIEW ANY DATABASE, VIEW ANY DEFINITION, VIEW SERVER STATE), thêm login vào setupadmin. Login phải tạo trước; tên login đặt ở dòng set @Guardium_user.Có (mục 3.3)
gdmmonitor-mss-SA.sqlThêm login vào sysadmin; chỉ cần cho 6 test: SQL Logins with NULL password, Disable Named Pipes, Shared Memory, Hide SQL Server Instance, NTP, SQL Server Browser.Không
  • oracledb01 là non-CDB nên dùng gdmmonitor-ora.sql; bản -container dành cho CDB/PDB.
  • Không chạy gdmmonitor-mss-SA.sql: tài khoản quét không cần sysadmin. Sáu test trên báo Pre Test Check Failed; Hide Instance, SQL Server Browser được kiểm tra thủ công ở KB1.
  • Không dùng SYS, sa hay GUARDIUM_ENT (tài khoản entitlement đã có trong lab) làm tài khoản quét: VA cần quyền đọc rộng hơn entitlement, tách tài khoản riêng để dễ giám sát và thu hồi.

3.2. Tạo tài khoản quét trên Oracle​

Bước 1: Từ máy quản trị, chép script sang oracledb01:​
scp gdmmonitor-ora.sql root@<IP_ORACLE>:/tmp/
Bước 2: Trên oracledb01, chuyển sang user oracle, đăng nhập SYS và chạy:​
su - oracle
cd /tmp
sqlplus / as sysdba
SELECT cdb FROM v$database;
CREATE USER guardium_va IDENTIFIED BY "<MK_GUARDIUM_VA>"
DEFAULT TABLESPACE users QUOTA 0 ON users;
GRANT CREATE SESSION TO guardium_va;
@/tmp/gdmmonitor-ora.sql
GRANT gdmmonitor TO guardium_va;
exit
grep -i error /tmp/gdmmonitor-ora.log
  • Câu SELECT cdb phải trả về NO; nếu là YES thì dùng gdmmonitor-ora-container.sql.
  • Script ghi log vào gdmmonitor-ora.log ở thư mục hiện hành (vì vậy cd /tmp trước). Dòng "object not found" chỉ là thông báo; lệnh grep cuối không được có dòng ERROR.
  • Script chạy lại được: nếu role GDMMONITOR đã có, script giữ lại danh sách thành viên rồi tạo lại role.
1792647561591.png

Hình 5: Chạy gdmmonitor-ora.sql và gán role GDMMONITOR cho GUARDIUM_VA​
Bước 3: Kiểm tra bằng chính tài khoản quét qua TCP (nhập mật khẩu khi được hỏi):​
sqlplus -L guardium_va@//<IP_ORACLE>:1521/orcl
SELECT granted_role FROM user_role_privs;
SELECT COUNT(*) FROM dba_users;
SELECT name, value FROM v$parameter WHERE name = 'audit_trail';
SELECT COUNT(*) FROM gdm$parameter;
  • Bốn câu SELECT ở bước 3 phải chạy được; lỗi ORA-00942 nghĩa là role chưa được gán hoặc script chạy lỗi. Câu cuối đọc tham số ẩn qua view GDM_$PARAMETER do script tạo.
1792647605336.png

Hình 6: Kiểm tra quyền của GUARDIUM_VA qua TCP​

3.3. Tạo tài khoản quét trên SQL Server​

Bước 1: Trên máy quản trị, đăng nhập sa (nhập mật khẩu khi được hỏi) và tạo login:​
sqlcmd -S <IP_MSSQL>,1433 -U sa -No -C
CREATE LOGIN guardium_va WITH PASSWORD = N'<MK_GUARDIUM_VA_MSS>',
DEFAULT_DATABASE = master, CHECK_POLICY = ON;
GO
exit
  • Tham số -C để go-sqlcmd tin chứng chỉ tự ký của SQLDB01, -No để câu lệnh vẫn đi dạng rõ cho S-TAP đọc.​
1792647611475.png

Hình 7: Tạo login guardium_va bằng sa​
Bước 2: Script mặc định dùng login sqlguard (dòng set @Guardium_user = N'sqlguard'). Trong thư mục chứa script, tạo bản sao đổi sang guardium_va rồi chạy bằng sa:​
(Get-Content gdmmonitor-mss.sql) -replace "N'sqlguard'", "N'guardium_va'" |
Set-Content gdmmonitor-mss-guardium_va.sql
Select-String "set @Guardium_user" gdmmonitor-mss-guardium_va.sql
sqlcmd -S <IP_MSSQL>,1433 -U sa -No -C -i gdmmonitor-mss-guardium_va.sql `
-o gdmmonitor-mss.log
Select-String "ERROR" gdmmonitor-mss.log
  • Script tạo role và user cả trong model nên database tạo sau sẽ có sẵn; database restore hoặc attach từ nơi khác thì chạy lại script.​
  • Script còn cấp EXECUTE trên xp_instance_regread, xp_servicecontrol, xp_loginconfig trong master. xp_servicecontrol hỗ trợ cả start/stop dịch vụ, nên guardium_va là tài khoản nhạy cảm: mật khẩu mạnh, chỉ dùng trong datasource.​
1792647616694.png

Hình 8: Chạy gdmmonitor-mss-guardium_va.sql, log không có dòng ERROR​
Bước 3: Đăng nhập lại bằng sa, kiểm tra server role, quyền của server role gdmmonitor và role của guardium_va trong từng database:​
sqlcmd -S <IP_MSSQL>,1433 -U sa -No -C
SELECT r.name AS server_role
FROM sys.server_role_members rm
JOIN sys.server_principals r ON rm.role_principal_id = r.principal_id
WHERE rm.member_principal_id = SUSER_ID('guardium_va');
SELECT permission_name FROM sys.server_permissions
WHERE grantee_principal_id = SUSER_ID('gdmmonitor');
EXEC sp_MSforeachdb 'USE [?];
SELECT DB_NAME() AS db, USER_NAME(role_principal_id) AS role_name
FROM sys.database_role_members
WHERE member_principal_id = USER_ID(''guardium_va'')';
GO
  • guardium_va thuộc hai server role setupadmin và gdmmonitor (VIEW ANY DATABASE, VIEW ANY DEFINITION, VIEW SERVER STATE) và role gdmmonitor trong từng database; không có sysadmin.​
1792647622620.png

Hình 9: guardium_va thuộc server role setupadmin, gdmmonitor và quyền của server role gdmmonitor
1792647626523.png

Hình 10: guardium_va có role gdmmonitor trong master, tempdb, model, msdb, RetailDB​

3.4. Khai báo datasource​

Bước 1: Truy cập Setup → Tools and Views → Datasource Definitions, chọn Application Type = Security Assessment, nhấn New và tạo hai datasource:​
Name​
DS_VA_ORA_ORACLEDB01​
DS_VA_MSS_SQLDB01​
Database TypeOracle (DataDirect - Service Name)MS SQL SERVER (DataDirect)
Host; Port<IP_ORACLE>; 1521<IP_MSSQL>; 1433
Service Name / Databaseorclmaster
UserGUARDIUM_VAguardium_va
  • Dùng driver DataDirect cho SQL Server: driver Microsoft bật mã hóa mặc định và không tin chứng chỉ tự ký của SQLDB01 nên báo Connection unsuccessful.​
  • Không dùng lại datasource entitlement đã có trong lab: GUARDIUM_ENT chỉ có quyền entitlement nên nhiều test VA sẽ báo Error.​
  • Tài khoản quét chỉ đăng nhập từ <IP_GUARDIUM>; nên thêm rule cảnh báo DB User = GUARDIUM_VA và Client IP khác <IP_GUARDIUM>, tương tự GUARDIUM_ENT.​
Bước 2: Tích Save Password, nhấn Apply, sau đó nhấn Test Connection cho từng datasource.​
1792647633415.png

Hình 11: Hai datasource VA kết nối thành công​

3.5. Tạo security assessment​

Bước 1: Truy cập Harden → Vulnerability Assessment → Assessment Builder, nhấn New và tạo hai assessment:​
Trường​
Assessment Oracle​
Assessment SQL Server​
DescriptionVA_ORA_ORACLEDB01VA_MSS_SQLDB01
DatasourceDS_VA_ORA_ORACLEDB01DS_VA_MSS_SQLDB01
TestMọi test Predefined và CVE của Oracle;
CUS_ORA_RETAIL_PUBLIC (mục 3.6)
Mọi test Predefined và CVE của MS SQL Server;
CUS_MSS_RETAIL_PUBLIC (mục 3.6)
  • Tách hai assessment để điểm của từng hệ thống không bị trộn và lịch sử kết quả theo dõi riêng được.​
Bước 2: Với từng assessment: nhập Description, nhấn Add Datasource chọn datasource tương ứng, nhấn Apply rồi nhấn Configure Tests.
Bước 3: Trang Assessment Test Selections có hai phần: bảng test đã chọn ở trên, Tests available for addition ở dưới. Ở phần dưới, đặt Test Type = All, Severity = All, để nguyên ô Include CAS đang tích, rồi chọn tab ORACLE (với VA_MSS_SQLDB01 là tab MS SQL SERVER).​
  • Test Type = All gồm test Predefined, CVE và các test gắn nhãn CIS, STIG; Query based là test tùy biến (mục 3.6); APAR chỉ dành cho DB2 z/OS.​
1792647639484.png

Hình 12: Bộ lọc và các tab loại CSDL trong Tests available for addition​
Bước 4: Nhấp vào danh sách test bên trái, nhấn Ctrl+A để chọn toàn bộ, nhấn Add Selections. Bảng phía trên hiện các test đã thêm; danh sách bên dưới báo "no more tests of this type found / available" là đã thêm hết. Nhấn Return để về Assessment Builder.​
  • Cột cuối của bảng test ghi nhóm (PRIV, CONF…) và mức của test; biểu tượng bút chì dùng để chỉnh ngưỡng, (n/a) là test không có tham số chỉnh.​
  • Nút Test Detail Exceptions ở cuối trang dùng để ghi ngoại lệ có thời hạn cho test được chấp nhận rủi ro.​
  • Chọn đủ bộ test để có Tests passing làm mốc cho các kịch bản sau.​
1792647643566.png

Hình 13: Danh sách test của VA_ORA_ORACLEDB01
1792647646834.png

Hình 14: Danh sách test của VA_MSS_SQLDB01​

3.6. Tạo test tùy biến cho dữ liệu bán lẻ​

Bộ test có sẵn không biết bảng nào là dữ liệu nghiệp vụ. Hai test dưới kiểm tra bảng của schema RETAIL không được cấp quyền cho PUBLIC, tức mọi tài khoản đều đọc được.
Bước 1: Chạy thử câu SQL của test bằng chính tài khoản quét (Oracle bằng GUARDIUM_VA trên oracledb01, SQL Server bằng guardium_va trên máy quản trị). Mỗi câu phải trả về một số, không báo lỗi quyền.
Bước 2: Truy cập Harden → Vulnerability Assessment → Assessment Builder, ở mục User-defined tests nhấn Query-based Tests, nhấn New để mở Query-based Test Builder. Khai báo theo bảng, nhấn Apply sau mỗi test:​
Trường​
CUS_ORA_RETAIL_PUBLIC​
CUS_MSS_RETAIL_PUBLIC​
Database TypeORACLEMS SQL SERVER
Category; SeverityPrivilege; MajorPrivilege; Major
Short DescriptionRETAIL tables must not be granted to PUBLICRetailDB tables must not be granted to public
Result text for passNo RETAIL table is granted to PUBLICNo RetailDB table is granted to public
Result text for failRETAIL tables are granted to PUBLIC. Revoke these grants and grant them to business rolesRETAILDB tables are granted to PUBLIC. Revoke these grants and grant them to business roles
Recommendation text for passNo action requiredNo action required
Recommendation text for failRevoke privileges on RETAIL tables from PUBLIC and grant them to business rolesRevoke privileges on RetailDB tables from public and grant them to business roles
SQL statementCâu (1) bên dướiCâu (3) bên dưới
SQL statement for detailCâu (2) bên dướiCâu (4) bên dưới
Return type; Operator; Compare to valueKiểu số nguyên; =; 0Kiểu số nguyên; =; 0

Câu (1), (2) của CUS_ORA_RETAIL_PUBLIC:​
SELECT COUNT(*) FROM dba_tab_privs WHERE grantee = 'PUBLIC' AND owner = 'RETAIL'
SELECT table_name || ' (' || privilege || ')'
FROM dba_tab_privs WHERE grantee = 'PUBLIC' AND owner = 'RETAIL'
Câu (3), (4) của CUS_MSS_RETAIL_PUBLIC:​
SELECT COUNT(*)
FROM RetailDB.sys.database_permissions p
JOIN RetailDB.sys.objects o ON p.major_id = o.object_id
WHERE p.grantee_principal_id = 0 AND p.state IN ('G','W') AND o.is_ms_shipped = 0
SELECT s.name + '.' + o.name + ' (' + p.permission_name + ')'
FROM RetailDB.sys.database_permissions p
JOIN RetailDB.sys.objects o ON p.major_id = o.object_id
JOIN RetailDB.sys.schemas s ON o.schema_id = s.schema_id
WHERE p.grantee_principal_id = 0 AND p.state IN ('G','W') AND o.is_ms_shipped = 0
  • Guardium so giá trị của SQL statement với Compare to value; SQL statement for detail chỉ chạy khi test Fail, mỗi dòng trả về là một chi tiết trong kết quả.​
  • Recommendation text for pass và for fail là ô bắt buộc trên Guardium 12.0; để trống thì Apply báo "Recommendation text for pass/fail is not valid".​
  • principal_id = 0 là role public trong mỗi database SQL Server. Câu MSSQL dùng tên ba phần vì datasource trỏ vào master; guardium_va đã có user trong RetailDB (mục 3.3).​
1792647654119.png

Hình 15: Query-based Test Builder của CUS_ORA_RETAIL_PUBLIC
1792647658736.png

Hình 16: Query-based Test Builder của CUS_MSS_RETAIL_PUBLIC
1792647662407.png

Hình 17: Hai test tùy biến trong Query-based Test Finder​
Bước 3: Mở Configure Tests của VA_ORA_ORACLEDB01, đặt Test Type = Query based, chọn tab ORACLE, chọn CUS_ORA_RETAIL_PUBLIC, nhấn Add Selections. Làm tương tự với VA_MSS_SQLDB01 và tab MS SQL SERVER.​
1792647668856.png

Hình 18: Chọn CUS_ORA_RETAIL_PUBLIC trong Tests available for addition (Query based, tab ORACLE)
1792647672514.png

Hình 19: Chọn CUS_MSS_RETAIL_PUBLIC trong Tests available for addition (Query based, tab MS SQL SERVER)​

4. Kịch bản kiểm thử​

Chạy theo thứ tự: KB1 tạo mốc; KB3, KB4 so sánh với mốc đó. Mọi lệnh thay đổi cấu hình chạy qua TCP để S-TAP ghi nhận; các lệnh này có thể sinh cảnh báo AUD_ALERT_*, DET_PRIV_ESCALATION, dùng để đối chiếu ai thay đổi và lúc nào.​

4.1. Kịch bản 1 – Đánh giá cấu hình an toàn ban đầu của Oracle và SQL Server​

Lần quét đầu tạo mốc cho các kịch bản sau. Kết quả của VA được kiểm chứng bằng truy vấn trực tiếp trên CSDL để đánh giá độ chính xác.
Bước 1: Trong Assessment Builder, lần lượt chọn VA_ORA_ORACLEDB01 và VA_MSS_SQLDB01, nhấn Run Once Now. Theo dõi report Guardium Job Queue (gõ Job Queue vào ô User Interface Search) tới khi cả hai lần chạy chuyển sang COMPLETED.​
1792647678616.png

Hình 20: Hai lần quét trong Guardium Job Queue: VA_MSS_SQLDB01 đã COMPLETED, VA_ORA_ORACLEDB01 đang RUNNING​
Bước 2: Mở View Results của từng assessment. Ghi lại Tests passing, Result Summary và số test Error.​
1792647682688.png

Hình 21: Tests passing (34%) và Result Summary của Oracle
1792647687572.png

Hình 22: Tests passing (66%) và số test CIS, STIG, CVE đạt của SQL Server​
Bước 3: Mở Filter / Sort Controls, chọn Test Severities = Critical, Major và Scores = Fail, nhấn Apply. Với từng test, ghi tên test, kết quả, dòng Details (giá trị quan sát được) và Recommendation. Ghi riêng các test Not Applicable for the DB version và Pre Test Check Failed cùng lý do.​
1792647694618.png

Hình 23: Các test Fail mức Critical, Major của Oracle
1792647697537.png

Hình 24: Các test Fail mức Critical, Major của SQL Server
1792647702761.png

Hình 25: Chi tiết, kết quả và khuyến nghị của hai test CVE Fail trên Oracle, kèm link Add test exception​
Bước 4: Kiểm chứng các phát hiện của Oracle bằng SYSTEM (role DBA) qua TCP. Câu lệnh gộp mọi mục thành một bảng hai cột để chụp trong một ảnh:​
sqlplus -L system@//<IP_ORACLE>:1521/orcl
SET LINESIZE 200 PAGESIZE 100
COLUMN muc FORMAT A30
COLUMN gia_tri FORMAT A110
SELECT 'DEFAULT ' || resource_name AS muc, limit AS gia_tri FROM dba_profiles
WHERE profile = 'DEFAULT' AND resource_name IN (
'FAILED_LOGIN_ATTEMPTS','PASSWORD_LIFE_TIME','PASSWORD_GRACE_TIME',
'PASSWORD_REUSE_MAX','PASSWORD_REUSE_TIME','PASSWORD_VERIFY_FUNCTION',
'INACTIVE_ACCOUNT_TIME','IDLE_TIME','SESSIONS_PER_USER')
UNION ALL
SELECT 'User thuong dung DEFAULT', LISTAGG(username, ', ')
WITHIN GROUP (ORDER BY username)
FROM dba_users WHERE oracle_maintained = 'N' AND profile = 'DEFAULT'
UNION ALL
SELECT 'Quyen ANY', LISTAGG(grantee || ':' || privilege, ', ')
WITHIN GROUP (ORDER BY grantee)
FROM dba_sys_privs WHERE privilege LIKE '%ANY%'
AND grantee IN (SELECT username FROM dba_users WHERE oracle_maintained = 'N')
UNION ALL
SELECT 'PUBLIC EXECUTE', LISTAGG(table_name, ', ') WITHIN GROUP (ORDER BY table_name)
FROM dba_tab_privs WHERE grantee = 'PUBLIC' AND privilege = 'EXECUTE'
AND table_name IN ('DBMS_XMLSAVE','DBMS_XMLSTORE','UTL_FILE','UTL_HTTP',
'UTL_TCP','UTL_SMTP')
UNION ALL
SELECT 'Mat khau mac dinh',
LISTAGG(u.username || '(' || u.account_status || ')', ', ')
WITHIN GROUP (ORDER BY u.username)
FROM dba_users_with_defpwd d JOIN dba_users u ON u.username = d.username
UNION ALL
SELECT 'Redo log members', LISTAGG('G' || group# || '=' || members, ', ')
WITHIN GROUP (ORDER BY group#) FROM v$log
UNION ALL
SELECT 'Unified Auditing', value FROM v$option WHERE parameter = 'Unified Auditing'
UNION ALL
SELECT 'Phien ban', banner_full FROM v$version;
  • Dùng SYSTEM, không thêm as sysdba: SYSTEM có role DBA nhưng không có quyền SYSDBA, đăng nhập as sysdba sẽ báo ORA-01017. Nếu SYSTEM bị khóa (ORA-28000), mở khóa bằng ALTER USER system ACCOUNT UNLOCK trong phiên / as sysdba trên oracledb01.​
1792647710798.png

Hình 26: Kiểm chứng trực tiếp trên Oracle​
Bước 5: Kiểm chứng các phát hiện của SQL Server: trên máy quản trị chạy sqlcmd -S <IP_MSSQL>,1433 -U sa -No -C -W rồi dán khối lệnh dưới:​
SET NOCOUNT ON;
SELECT muc, gia_tri FROM (
SELECT N'sa' AS muc,
CAST(name + N', is_disabled=' + CAST(is_disabled AS nvarchar(1))
AS nvarchar(400)) AS gia_tri
FROM sys.sql_logins WHERE sid = 0x01
UNION ALL SELECT N'Khong CHECK_POLICY',
CAST(STRING_AGG(name, N', ') AS nvarchar(400))
FROM sys.sql_logins WHERE is_policy_checked = 0 AND name NOT LIKE N'##%'
UNION ALL SELECT N'Khong CHECK_EXPIRATION',
CAST(STRING_AGG(name, N', ') AS nvarchar(400))
FROM sys.sql_logins WHERE is_expiration_checked = 0 AND name NOT LIKE N'##%'
UNION ALL SELECT N'Mat khau rong', CAST(ISNULL(STRING_AGG(name, N', '), N'khong co')
AS nvarchar(400))
FROM sys.sql_logins WHERE PWDCOMPARE(N'', password_hash) = 1
UNION ALL SELECT name, CAST(value_in_use AS nvarchar(400)) FROM sys.configurations
WHERE name IN (N'remote access', N'xp_cmdshell', N'remote admin connections')
UNION ALL SELECT N'Chu so huu RetailDB',
CAST(SUSER_SNAME(owner_sid) AS nvarchar(400))
FROM sys.databases WHERE name = N'RetailDB'
UNION ALL SELECT N'So server audit', CAST(COUNT(*) AS nvarchar(400))
FROM sys.server_audits
UNION ALL SELECT N'Phien ma hoa', CAST(encrypt_option AS nvarchar(400))
FROM sys.dm_exec_connections WHERE session_id = @@SPID
UNION ALL SELECT N'Phien ban',
CAST(CAST(SERVERPROPERTY('ProductVersion') AS nvarchar(128)) + N' ' +
ISNULL(CAST(SERVERPROPERTY('ProductUpdateLevel') AS nvarchar(128)), N'')
AS nvarchar(400))
) AS t;
GO
1792647717031.png

Hình 27: Kiểm chứng trực tiếp trên SQL Server​
Bước 6: Kiểm tra thủ công các mục VA không chạy được (cần CAS hoặc sysadmin). Cổng listener, lọc IP, mã hóa mạng trên oracledb01 (user oracle):​
lsnrctl status | grep -i -E 'PORT|Version'
grep -i -E 'VALIDNODE|INVITED|EXCLUDED|ENCRYPTION|CRYPTO_CHECKSUM' \
$ORACLE_HOME/network/admin/sqlnet.ora
1792647720994.png

Hình 28: Kiểm tra thủ công cổng listener và sqlnet.ora trên oracledb01​
SQL Server Browser, Hide Instance, Force Encryption trên SQLDB01 (PowerShell chạy bằng quyền quản trị):​
Get-Service SQLBrowser | Select-Object Status, StartType
$k = 'HKLM:\SOFTWARE\Microsoft\Microsoft SQL Server\MSSQL*.MSSQLSERVER'
Get-ItemProperty "$k\MSSQLServer\SuperSocketNetLib" |
Select-Object HideInstance, ForceEncryption
1792647726400.png

Hình 29: Kiểm tra thủ công SQL Server Browser, HideInstance, ForceEncryption trên SQLDB01​
Bước 7: Với các test Error, mở chi tiết và ghi nguyên nhân: sáu test cần sysadmin (mục 3.1) giữ nguyên Pre Test Check Failed; thiếu quyền khác thì cấp bổ sung cho role gdmmonitor rồi chạy lại; test cần CAS thì bỏ khỏi assessment.
Bước 8: Nhấn Download PDF ở kết quả của cả hai assessment, lưu làm mốc.
Đánh giá: Oracle đạt 34% (64/186 test), SQL Server 66% (61/93); giá trị VA báo khớp truy vấn trực tiếp. Điểm yếu chính: profile DEFAULT của Oracle quá lỏng; sa còn bật, chưa có SQL Server Audit. sqlnet.ora phải kiểm tra tay (không có CAS), HideInstance cũng vậy (thiếu sysadmin).
​

4.2. Kịch bản 2 – Đánh giá lỗ hổng theo phiên bản và bản vá​

Lỗ hổng đã công bố gắn với phiên bản và mức bản vá. Kịch bản đối chiếu kết quả test CVE của Guardium với phiên bản thực tế và thông báo của hãng.
Bước 1: Lấy phiên bản và bản vá đang cài trên oracledb01 (user oracle). Phiên bản SQL Server đã có ở bước 5 của KB1:​
$ORACLE_HOME/OPatch/opatch lspatches
sqlplus -S / as sysdba <<'EOF'
SET LINESIZE 200 PAGESIZE 100
COLUMN description FORMAT A60
SELECT banner_full FROM v$version;
SELECT patch_id, action, status, TO_CHAR(action_time, 'YYYY-MM-DD') AS ngay,
description
FROM dba_registry_sqlpatch ORDER BY action_time;
EOF
1792647732723.png

Hình 30: Phiên bản và bản vá đang cài trên Oracle​
Bước 2: Trong View Results của hai assessment, xem test Patch Level, Version và các test CVE (tên bắt đầu bằng CVE-). Ghi số CVE Fail theo mức, năm công bố mới nhất và bản vá khuyến nghị.​
1792647737231.png

Hình 31: Test Patch Level và test CVE-2018-11058 của Oracle
1792647740401.png

Hình 32: Test Version và test CVE-2023-23384 của SQL Server​
Bước 3: Đối chiếu với nguồn của hãng: Oracle Critical Patch Update Advisory của quý gần nhất cho 19c; danh sách build và Security Update Guide của Microsoft cho bản SQL Server đang chạy. Ghi các bản vá còn thiếu.
Bước 4: Truy cập Harden → Vulnerability Assessment → Customer Uploads, xem mục DPS Upload và Import DPS. Gói DPS (Database Protection Subscription) chứa danh sách test, CVE và phiên bản CSDL mà VA nhận biết; CVE công bố sau gói đang dùng chưa có test.​
1792647747446.png

Hình 33: Mục DPS Upload và Import DPS trong Customer Uploads​
Đánh giá: Oracle ở bản 19.3 gốc; VA báo đúng: Patch Level Fail (đề nghị từ 19.20), 80 test CVE Fail. SQL Server 17.0 chưa có trong version and patch group nên test Version Fail, test CVE Not Applicable. Cần nhập gói DPS mới, tự theo dõi bản vá hãng.​

4.3. Kịch bản 3 – Phát hiện cấu hình bị thay đổi giữa hai lần quét​

Giữa hai lần quét, DBA cấu hình sai trên cả hai CSDL: cấp quyền quản trị cho tài khoản thường, bỏ chính sách mật khẩu, bật tính năng nguy hiểm, mở bảng khách hàng cho PUBLIC.
Bước 1: Oracle, đăng nhập SYSTEM qua TCP, ghi lại giá trị resource_limit rồi chạy:​
sqlplus -L system@//<IP_ORACLE>:1521/orcl
SHOW PARAMETER resource_limit
GRANT DBA TO ops_test;
GRANT SELECT ANY TABLE TO intern_test WITH ADMIN OPTION;
CREATE PROFILE prof_va_weak LIMIT FAILED_LOGIN_ATTEMPTS UNLIMITED
PASSWORD_LIFE_TIME UNLIMITED PASSWORD_VERIFY_FUNCTION NULL;
ALTER USER intern_test PROFILE prof_va_weak;
GRANT SELECT ON retail.customers TO PUBLIC;
ALTER SYSTEM SET resource_limit = FALSE SCOPE = MEMORY;
1792647754971.png

Hình 34: Lệnh thay đổi cấu hình trên Oracle​
Bước 2: SQL Server, trên SQLDB01 (PowerShell) chạy sqlcmd -S <IP_MSSQL>,1433 -U sa -No -C -W, ghi lại kết quả câu SELECT đầu rồi chạy tiếp:​
SELECT name, value_in_use FROM sys.configurations
WHERE name IN ('show advanced options','xp_cmdshell','remote admin connections');
GO
EXEC sp_configure 'show advanced options', 1; RECONFIGURE;
EXEC sp_configure 'xp_cmdshell', 1; RECONFIGURE;
EXEC sp_configure 'remote admin connections', 1; RECONFIGURE;
CREATE LOGIN va_weak WITH PASSWORD = N'<MK_VA_WEAK>',
CHECK_POLICY = OFF, CHECK_EXPIRATION = OFF;
GRANT CONTROL SERVER TO va_weak;
GO
USE RetailDB;
GRANT SELECT ON retail.customers TO public;
GO
1792647760283.png

Hình 35: Lệnh thay đổi cấu hình trên SQL Server​
Bước 3: Run Once Now cho VA_ORA_ORACLEDB01 và VA_MSS_SQLDB01.
Bước 4: Mở View Results, nhấn Compare with other results và chọn lần quét của KB1. Ghi lại test chuyển từ Pass sang Fail, test vốn Fail nhưng Details có thêm đối tượng mới (OPS_TEST, INTERN_TEST, PROF_VA_WEAK, va_weak) và mức thay đổi của Tests passing. Nhấn Download PDF để lưu kết quả lần quét này.​
1792647767925.png

Hình 36: Kết quả VA của Oracle sau thay đổi: 30%
1792647771399.png

Hình 37: Kết quả VA của SQL Server sau thay đổi: 60%
1792647775457.png

Hình 38: So sánh kết quả Oracle với lần quét KB1: 9 test chuyển từ Pass sang Fail
1792647778933.png

Hình 39: So sánh kết quả SQL Server với lần quét KB1: 5 test chuyển từ Pass sang Fail​
Đánh giá: Oracle giảm từ 34% xuống 30% (9 test chuyển sang Fail), SQL Server từ 66% xuống 60% (5 test), kể cả hai test CUS_*_RETAIL_PUBLIC; CONTROL SERVER của va_weak làm Protect Audit Features thành Fail. PROF_VA_WEAK chỉ hiện thêm trong Details của test vốn Fail nên Compare không thấy.​

4.4. Kịch bản 4 – Khắc phục theo khuyến nghị và quét xác minh​

Bước 1: Hoàn tác thay đổi của KB3. Oracle (SYSTEM qua TCP), dùng giá trị resource_limit đã ghi ở KB3:​
REVOKE DBA FROM ops_test;
REVOKE SELECT ANY TABLE FROM intern_test;
ALTER USER intern_test PROFILE DEFAULT;
DROP PROFILE prof_va_weak;
REVOKE SELECT ON retail.customers FROM PUBLIC;
ALTER SYSTEM SET resource_limit = TRUE SCOPE = MEMORY;
1792647784618.png

Hình 40: Hoàn tác thay đổi của KB3 trên Oracle​
SQL Server (sa), dùng các giá trị đã ghi ở KB3:​
USE RetailDB;
REVOKE SELECT ON retail.customers FROM public;
GO
USE master;
DROP LOGIN va_weak;
EXEC sp_configure 'xp_cmdshell', 0; RECONFIGURE;
EXEC sp_configure 'remote admin connections', 0; RECONFIGURE;
EXEC sp_configure 'show advanced options', 0; RECONFIGURE;
GO
1792647789420.png

Hình 41: Hoàn tác thay đổi của KB3 trên SQL Server​
Chạy Run Once Now cho hai assessment và so điểm với KB1.​
1792647793934.png

Hình 42: Kết quả quét Oracle sau khi hoàn tác: 34%, bằng KB1
1792647797789.png

Hình 43: Kết quả quét SQL Server sau khi hoàn tác: 66%, bằng KB1​
Bước 2: Khắc phục thêm các phát hiện Critical, Major của KB1 mà lab sửa được, theo Recommendation của từng test. Trên Oracle, bằng SYSTEM qua TCP, giảm FAILED_LOGIN_ATTEMPTS theo Recommendation của test 131:​
ALTER PROFILE DEFAULT LIMIT FAILED_LOGIN_ATTEMPTS 3;
  • Tài khoản gõ sai mật khẩu 3 lần sẽ bị khóa 1 ngày (PASSWORD_LOCK_TIME), mở bằng ALTER USER <user> ACCOUNT UNLOCK trong phiên / as sysdba.​
Thu hồi EXECUTE của PUBLIC trên DBMS_XMLSAVE, DBMS_XMLSTORE, UTL_FILE (test 176) phải chạy bằng SYS, trên oracledb01 (user oracle). Trước khi thu hồi, khối PL/SQL cấp quyền trực tiếp cho mọi schema đang dùng các package này; sau đó biên dịch lại và đếm object INVALID:​
sqlplus / as sysdba
SET SERVEROUTPUT ON
SELECT COUNT(*) FROM dba_objects WHERE status = 'INVALID';
BEGIN
FOR r IN (SELECT DISTINCT owner, referenced_name FROM dba_dependencies
WHERE referenced_owner IN ('SYS', 'PUBLIC')
AND referenced_name IN ('DBMS_XMLSAVE', 'DBMS_XMLSTORE', 'UTL_FILE')
AND owner NOT IN ('SYS', 'PUBLIC')) LOOP
EXECUTE IMMEDIATE 'GRANT EXECUTE ON SYS.' || r.referenced_name
|| ' TO "' || r.owner || '"';
DBMS_OUTPUT.PUT_LINE('Da cap: ' || r.referenced_name || ' -> ' || r.owner);
END LOOP;
END;
/
REVOKE EXECUTE ON sys.dbms_xmlsave FROM PUBLIC;
REVOKE EXECUTE ON sys.dbms_xmlstore FROM PUBLIC;
REVOKE EXECUTE ON sys.utl_file FROM PUBLIC;
@?/rdbms/admin/utlrp.sql
SELECT COUNT(*) FROM dba_objects WHERE status = 'INVALID';
  • Quyền EXECUTE của PUBLIC trên package của SYS do SYS cấp; thu hồi bằng SYSTEM báo ORA-01927: cannot REVOKE privileges you did not grant dù SYSTEM có role DBA.​
  • Trước khi thu hồi của PUBLIC, cấp riêng EXECUTE cho các schema đang dùng các package này (lab: WMSYS, ORDPLUGINS, XDB, ORACLE_OCM, MDSYS, ORDSYS) để object của chúng không bị INVALID. Cấp riêng không làm test 176 Fail lại vì test chỉ xét PUBLIC.​
  • Số object INVALID sau utlrp.sql không được lớn hơn trước khi thu hồi. VA không kiểm tra object INVALID nên điểm tăng không có nghĩa thành phần CSDL vẫn hoạt động bình thường.​
  • DBMS_XMLSAVE, DBMS_XMLSTORE là hai package test 176 báo ở KB1; UTL_FILE cũng cấp cho PUBLIC nhưng VA không báo trên 19c.​
1792647804906.png

Hình 44: Khắc phục trên Oracle: FAILED_LOGIN_ATTEMPTS 3, thu hồi quyền của PUBLIC; số object INVALID trước và sau đều là 21​
Trên SQL Server, bật chính sách mật khẩu cho ba login bị test User Password Policy Is Checked báo Fail:​
ALTER LOGIN [guardium_cls] WITH CHECK_POLICY = ON;
ALTER LOGIN [intern_test] WITH CHECK_POLICY = ON;
ALTER LOGIN [retail_app] WITH CHECK_POLICY = ON;
GO
  • Không bật CHECK_EXPIRATION cho sa và retail_app: mật khẩu hết hạn sẽ làm hỏng các kịch bản khác trong lab đang dùng hai tài khoản này.​
1792647811425.png

Hình 45: Bật CHECK_POLICY cho ba login trên SQL Server​
Bước 3: Kiểm tra nghiệp vụ còn hoạt động: RETAIL truy vấn retail.customers trên Oracle, retail_app truy vấn retail.customers trên SQL Server:​
sqlplus -L retail@//<IP_ORACLE>:1521/orcl
SELECT COUNT(*) FROM retail.customers;
sqlcmd -S <IP_MSSQL>,1433 -U retail_app -No -C -W `
-Q "SELECT COUNT(*) FROM RetailDB.retail.customers"
1792647815239.png

Hình 46: RETAIL vẫn truy vấn được retail.customers trên Oracle sau khắc phục
1792647819862.png

Hình 47: retail_app vẫn truy vấn được retail.customers trên SQL Server sau khắc phục​
Bước 4: Run Once Now cho hai assessment, so Tests passing với lần quét sau khi hoàn tác; dùng Compare with other results để xem test nào chuyển sang Pass.​
1792647824545.png

Hình 48: Kết quả quét Oracle sau khắc phục: 35%
1792647827662.png

Hình 49: Kết quả quét SQL Server sau khắc phục: 67%​

Đánh giá: Sau khắc phục, Oracle tăng từ 34% lên 35%, SQL Server từ 66% lên 67%; tài khoản nghiệp vụ vẫn truy vấn được và số object INVALID giữ nguyên 21. Điểm tăng ít vì phần lớn lỗi còn lại cần vá RU hoặc bật audit.​
 
Back
Top