IBM Guardium Chức năng audit và cảnh báo theo thời gian thực đối với hoạt động truy cập CSDL

AUDIT VÀ CẢNH BÁO THEO THỜI GIAN THỰC ĐỐI VỚI HOẠT ĐỘNG TRUY CẬP CSDL TRÊN ORACLE DATABASE VÀ MICROSOFT SQL SERVER​

1. Mục tiêu​

  • Ghi vết kiểm toán mọi phiên truy cập Oracle và SQL Server, thành công hay thất bại: ai, từ máy nào, bằng chương trình nào, lúc nào, chạy lệnh gì, ảnh hưởng bao nhiêu bản ghi.​
  • Đưa cảnh báo ra khỏi Guardium theo thời gian thực: cấu hình Alerter, chuyển tiếp Syslog qua TCP tới máy nhận đóng vai trò SIEM, định dạng thông điệp bằng message template.​
  • Bổ sung các rule cảnh báo theo ngữ cảnh truy cập: tài khoản quản trị đăng nhập từ máy lạ hoặc nhập sai mật khẩu, tài khoản ứng dụng bị dùng ngoài ứng dụng, sửa hàng loạt dữ liệu nhạy cảm, người dùng trong danh sách theo dõi.​
  • Đo độ trễ cảnh báo, kiểm soát số lượng cảnh báo và phát hiện truy xuất nhỏ giọt bằng correlation alert.​

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

Guardium xử lý hoạt động truy cập CSDL theo ba lớp, cần dùng cùng lúc:​
Lớp​
Cơ chế​
Kết quả​
Ghi vết kiểm toánS-TAP gửi câu lệnh về Collector; hành động LOG … DETAILS của policyDữ liệu trong domain Access, Exception, Policy Violations, ghi gần như tức thời
Cảnh báoHành động ALERT … của rule hoặc correlation alert; Alerter gửi điSyslog tới SIEM (hoặc email, SNMP), sau vài giây đến vài phút
Rà soát định kỳAudit Process chạy báo cáo trên dữ liệu đã ghiTo-Do List, PDF; người trực xem và ký duyệt
ALERT không thay thế LOG. Audit Process không tự ghi dữ liệu mà chỉ đọc dữ liệu policy đã ghi.
Guardium có hai loại cảnh báo:
​
  • Real-time alert: Collector đánh giá rule ngay khi S-TAP gửi câu lệnh về. Rule khớp thì vi phạm được ghi vào Policy Violations và thông điệp được đưa vào hàng đợi của Alerter.​
  • Correlation alert: Anomaly Detection chạy một query theo chu kỳ Run Frequency, kết quả vượt ngưỡng thì đưa thông điệp vào cùng hàng đợi. Dùng cho hành vi tích lũy theo thời gian.​
1792644308133.png

Hình 1: Luồng thu thập, ghi vết và gửi cảnh báo trên Guardium​
Độ trễ từ câu lệnh tới người nhận phụ thuộc ba tham số:​
Tham số​
Mặc định​
Tác động​
store alerter poll30 giâyChu kỳ Alerter lấy thông điệp trong hàng đợi để gửi đi
store alerter delay300 giây (tối đa 3600)Thông điệp chứa %%RecordsAffected, %%ResponseLength, %%succeeded, %%uid_chain bị giữ lại chờ S-TAP nhận đủ phản hồi
Run FrequencyĐặt trong Alert BuilderCorrelation alert chậm tối đa một chu kỳ
Hành động alert quyết định số thông báo gửi đi:​
Hành động​
Gửi khi​
Dùng cho​
ALERT PER MATCHMỗi câu lệnh khớp ruleSự kiện hiếm, nghiêm trọng
ALERT ONCE PER SESSIONCâu khớp đầu tiên của phiênĐiều kiện gắn với phiên: máy nguồn, chương trình, người dùng
ALERT DAILYLần khớp đầu tiên trong ngàySự kiện lặp lại nhiều
ALERT PER TIME GRANULARITYMỗi chu kỳ logging granularity (mặc định 60 phút)Tóm tắt định kỳ
Thông điệp Syslog chỉ là bản sao của vi phạm nên có thể đến trễ hoặc bị mất. Khi điều tra, luôn đối chiếu với dữ liệu trên Guardium qua mã vi phạm (%%violationID) trong thông điệp.​

2.1. Phân tầng kênh nhận cảnh báo​

Lab chỉ gửi cảnh báo qua Syslog (tài khoản admin chưa có email, chỉ accessmgr mới khai báo được). Các rule được gắn receiver SYSLOG trong bài gửi thông điệp tới SIEM; SIEM dựa vào trường rule và sev để phân tầng, tránh làm người trực quá tải:​
Mức​
Rule​
Xử lý trên SIEM​
HIGH, tần suất thấpRule tạo mới trong bài (trừ RT_WATCHLIST_ACTIVITY), DET_PRIV_ESCALATION, AUD_ALERT_ORA_HIGH_PRIV, AUD_ALERT_MSS_HIGH_PRIV, ALR_USER_SENSITIVE_VOLUMEBáo ngay cho người trực
HIGH/MED, có thể lặp nhiềuALERT_UNAUTHORIZED_SENSITIVE_ACCESS, RT_WATCHLIST_ACTIVITYGom nhóm, đếm, tương quan rồi mới báo
Mọi mứcTất cả rulePolicy Violations trên Guardium (luôn có)

3. Cấu hình​

3.1. Kiểm tra S-TAP, Inspection Engine​

Bước 1: Truy cập Manage → Activity Monitoring → S-TAP Control, kiểm tra S-TAP của oracledb01 và SQLDB01 ở trạng thái xanh.​
1792644332071.png

Hình 2: S-TAP của SQLDB01 và oracledb01 đang hoạt động​
Bước 2: Truy cập Manage → Activity Monitoring → Inspection Engines, kiểm tra Log Records Affected và Inspect Returned Data vẫn được bật.​
1792644337163.png

Hình 3: Inspection Engine bật Log Records Affected và Inspect Returned Data​

3.2. Chuẩn bị máy nhận cảnh báo trên oracledb01​

Nhận Syslog bằng rsyslog (chạy bằng root):
cat > /etc/rsyslog.d/10-guardium.conf <<'EOF'
module(load="imtcp")
input(type="imtcp" port="514")
module(load="imudp")
input(type="imudp" port="514")
template(name="GrdFmt" type="string"
string="%timegenerated:::date-rfc3339% %fromhost-ip% %msg%\n")
if $fromhost-ip == '<IP_GUARDIUM>' then {
action(type="omfile" file="/var/log/guardium_alerts.log" template="GrdFmt")
stop
}
EOF
rsyslogd -N1
firewall-cmd --permanent --add-port=514/tcp --add-port=514/udp --add-port=2525/tcp
firewall-cmd --reload
getenforce
semanage port -a -t syslogd_port_t -p tcp 514
systemctl restart rsyslog
ss -lntup | grep -E ':514|:2525'

  • Nếu rsyslogd -N1 báo module imtcp/imudp đã được nạp, xóa dòng module(...) tương ứng.​
  • Lệnh semanage chỉ cần khi getenforce trả về Enforcing. Trên Oracle Linux, cổng tcp/514 đã thuộc rsh_port_t nên lệnh báo already defined; nếu ss vẫn thấy rsyslogd lắng nghe tcp/514 và ausearch -m avc -ts recent -c rsyslogd trả về <no matches> thì bỏ qua, ngược lại đổi -a thành -m.​
  • Cột thời gian đầu mỗi dòng trong /var/log/guardium_alerts.log là T2 (mục 4).​
1792644362716.png

Hình 4: Cấu hình rsyslog nhận Syslog trên oracledb01 (cổng 2525/tcp mở thêm cho SMTP thử nghiệm)​

3.3. Cấu hình Alerter và chuyển tiếp Syslog trên Guardium​

SSH vào Guardium bằng tài khoản cli và chạy:​
store alerter poll 10
store alerter state startup on
store alerter state operational on
restart alerter


store remotelog add non_encrypted daemon.all <IP_ORACLE>:514 tcp
show remotelog host
show remotelog status

Kiểm tra lại bằng show alerter poll, show alerter delay (ghi lại giá trị, mặc định 300) và show anomaly-detection state. Trên oracledb01, chạy tail -f /var/log/guardium_alerts.log: sau 1–2 phút phải có dòng từ IP Guardium.​
  • store alerter poll 10 rút chu kỳ gửi từ 30 xuống 10 giây; giá trị này phải nhỏ hơn Run Frequency của correlation alert.​
  • Syslog không cần cấu hình riêng trong Alerter nhưng Alerter phải đang chạy. store remotelog chuyển syslog của Guardium tới oracledb01 qua TCP để không mất âm thầm như UDP.​
  • Lab dùng Syslog không mã hóa. Triển khai thật dùng store remotelog add encrypted qua cổng 6514.​
  • Nếu store remotelog add báo sai cú pháp, gõ lệnh không kèm tham số để xem dạng lệnh của bản đang dùng; show remotelog cũng phải kèm tham số (host, status).​
1792644387993.png

Hình 5: Kiểm tra chuyển tiếp Syslog, SMTP relay và tham số Alerter trên Guardium​

3.4. Tạo message template​

Bước 1: Truy cập Setup → Tools and Views → Global Profile, ở phần Named Template nhấn Edit, nhấn New.
Bước 2: Tạo template TPL_RT_ACCESS, Template type = RT_ALERT, nội dung (một dòng):​
GRD_RT|rule=%%ruleDescription|sev=%%severity|time=%%receiptTime|server=%%serverIP|type=%%serverType|svc=%%serviceName|dbuser=%%DBUser|osuser=%%OSUser|client=%%clientIP|prog=%%SourceProgram|vid=%%violationID|sql=%%SQLNoValue
1792644399829.png

Hình 6: Message template TPL_RT_ACCESS​
Bước 3: Clone TPL_RT_ACCESS thành TPL_RT_ACCESS_ROWS, thêm vào cuối |rows=%%RecordsAffected.​
1792644407657.png

Hình 7: Message template TPL_RT_ACCESS_ROWS​
Bước 4: Nhấn Save, sau đó truy cập Manage → Activity Monitoring → Inspection Engines, nhấn Restart Inspection Engines để template có hiệu lực.​
Biến​
Ý nghĩa​
%%receiptTimeThời điểm Guardium nhận câu lệnh (T1)
%%DBUser, %%OSUser, %%clientIP, %%SourceProgramAi, từ máy nào, bằng chương trình nào
%%violationIDMã vi phạm để đối chiếu với Policy Violations
%%SQLNoValueCâu lệnh đã thay giá trị bằng ?
%%RecordsAffectedSố bản ghi bị ảnh hưởng; làm thông điệp bị giữ theo store alerter delay
  • Dùng %%SQLNoValue thay cho %%SQLString để CCCD trong WHERE hay mật khẩu trong CREATE LOGIN không bị sao chép sang hệ thống khác.​
  • Template chỉ dùng ký tự ASCII để tránh lỗi mã hóa trên Syslog. Tiền tố GRD_RT dùng để lọc thông điệp cảnh báo trên SIEM.​

3.5. Tạo group​

Truy cập Setup → Tools and Views → Group Builder, nhấn + và tạo các group sau (Application type = Public):​
Tên group​
Group Type​
Thành viên​
GRP_DBA_ACCOUNTSUsersSYS, SYSTEM, SA
GRP_ADMIN_HOSTSClient IPIP máy quản trị
GRP_APP_ACCOUNTSUsersRETAIL_APP
GRP_APPROVED_APP_PROGRAMSSource ProgramRETAILWEB (Guardium ghi Source Program bằng chữ hoa)
GRP_WATCHLIST_USERSUsersINTERN_TEST
  • GRP_ADMIN_HOSTS chỉ có máy quản trị; phiên tài khoản quản trị từ mọi máy khác đều bị coi là bất thường.​
  • RETAIL không đưa vào GRP_APP_ACCOUNTS vì trong lab RETAIL được dùng trực tiếp bằng sqlplus.​
  • Điều kiện group chỉ khớp khi giá trị Guardium ghi nhận trùng thành viên group. Sau lần chạy đầu, đối chiếu Client IP, Source Program trong Q_RT_SESSIONS (mục 3.10) và sửa group nếu cần.​
1792644443011.png

Hình 8: Năm group mới trong Group Builder​

3.6. Tạo policy POL_RT_ACCESS_ALERT​

Bước 1: Truy cập Protect → Security Policies → Policy Builder for Data, nhấn New, đặt Policy Description = POL_RT_ACCESS_ALERT.
Bước 2: Thêm bốn access rule và một exception rule theo bảng dưới. Mọi rule đặt Category = Realtime Access Alert và tích Continue to next rule.
Bước 3: Ở hành động alert của từng rule, chọn Message Template theo bảng, thêm receiver SYSLOG. Nhấn Save.​
#​
Rule​
Điều kiện​
Hành động; template​
KB​
1RT_DBA_UNAPPROVED_HOSTDatabase user In Group GRP_DBA_ACCOUNTS; Client IP address Not In Group GRP_ADMIN_HOSTSALERT ONCE PER SESSION (HIGH); TPL_RT_ACCESS1
2RT_APP_ACCOUNT_MISUSEDatabase user In Group GRP_APP_ACCOUNTS; Source application Not In Group GRP_APPROVED_APP_PROGRAMSALERT ONCE PER SESSION (HIGH); TPL_RT_ACCESS3
3RT_SENSITIVE_BULK_DMLObject In Group GRP_SENSITIVE_OBJECTS; Command In Group GRP_DESTRUCTIVE_CMDS; Records affected threshold = 10 / queryALERT PER MATCH (HIGH); TPL_RT_ACCESS_ROWS4
4RT_WATCHLIST_ACTIVITYDatabase user In Group GRP_WATCHLIST_USERSALERT ONCE PER SESSION (MED); TPL_RT_ACCESS5
5RT_DBA_FAILED_LOGIN (exception rule)Exception type = LOGIN_FAILED; Database user In Group GRP_DBA_ACCOUNTSALERT PER MATCH (HIGH); TPL_RT_ACCESS2

  • Rule 1, 2, 4 dùng ONCE PER SESSION vì điều kiện gắn với phiên; dùng PER MATCH thì một phiên SSMS có thể sinh hàng chục thông báo.​
  • Rule 3 áp dụng cho mọi tài khoản: ứng dụng chỉ sửa từng khách hàng một, câu UPDATE/DELETE trên hơn 10 khách hàng là bất thường kể cả khi do tài khoản hợp lệ thực hiện.​
  • Rule 5 cảnh báo ngay từ lần sai đầu tiên của SYS, SYSTEM, sa; DET_BRUTE_FORCE cần 5 lần sai trong 5 phút nên bỏ sót kiểu thử chậm.​
  • Không thêm hành động LOG: dữ liệu đã được ghi bởi LOG_SENSITIVE_ACCESS và POL_AUDIT_DB_CHANGES; thêm LOG FULL DETAILS có thể làm lộ giá trị mà POL_AUDIT_DB_CHANGES đã che.​
1792644468163.png

Hình 9: Năm rule của policy POL_RT_ACCESS_ALERT
1792644473519.png

Hình 10: Điều kiện của rule RT_DBA_UNAPPROVED_HOST​

3.7. Gắn kênh cảnh báo cho rule có sẵn​

Mở từng policy trong Policy Builder for Data, sửa hành động alert của các rule sau: chọn Message Template = TPL_RT_ACCESS và thêm receiver SYSLOG. Không đổi điều kiện hay loại hành động của rule.​
Policy / nơi cấu hình​
Rule​
POL_PROTECT_SENSITIVE_DATAALERT_UNAUTHORIZED_SENSITIVE_ACCESS
DET_PRIV_ESCALATION
POL_AUDIT_DB_CHANGESAUD_ALERT_ORA_HIGH_PRIV, AUD_ALERT_MSS_HIGH_PRIV

3.8. Cài đặt policy theo đúng thứ tự​

Policy chỉ ghi nhận và cảnh báo (mọi rule tích Continue) phải đứng trước policy có rule chặn BLOCK_DESTRUCTIVE_TERMINATE.
Bước 1: Truy cập Protect → Security Policies → Policy Installation, chọn POL_AUDIT_DB_CHANGES, chọn Install and override.
Bước 2: Chọn POL_RT_ACCESS_ALERT, chọn Install last.
Bước 3: Chọn POL_PROTECT_SENSITIVE_DATA, chọn Install last.
Bước 4: Chọn POL_BASIC_DATA_SECURITY, chọn Install last.
Bước 5: Kiểm tra mục Currently Installed Policies hiển thị đúng thứ tự: 1 POL_AUDIT_DB_CHANGES, 2 POL_RT_ACCESS_ALERT, 3 POL_PROTECT_SENSITIVE_DATA, 4 POL_BASIC_DATA_SECURITY. Kiểm tra lại S-TAP Control vẫn xanh.​
1792644488212.png

Hình 11: Thứ tự cài đặt bốn policy​

3.9. Correlation alert phát hiện truy xuất nhỏ giọt theo người dùng​

DET_MASS_EXTRACTION chỉ bắt một câu lấy hơn 50 bản ghi. Correlation alert đếm số lần truy cập bảng nhạy cảm của từng người dùng trong một khoảng thời gian để bắt trường hợp chia nhỏ thành nhiều câu.
Bước 1: Trong Query-Report Builder, tạo query Q_RT_SENSITIVE_VOLUME: domain Access, Main Entity = Full SQL; cột DB User Name (Value), Timestamp của entity Full SQL với Field Mode = Max; tích Count; điều kiện Object Name LIKE GROUP GRP_SENSITIVE_OBJECTS và DB User Name NOT IN GROUP GRP_AUTHORIZED_USERS.
Bước 2: Truy cập Protect → Database Intrusion Detection → Alert Builder, nhấn New:​
Trường​
Giá trị​
Name (Description); Category; SeverityALR_USER_SENSITIVE_VOLUME; Realtime Access Alert; HIGH
Run Frequency5 (chạy query mỗi 5 phút)
Active; Log policy violation; Log full query resultsTích cả ba (Log policy violation để xem chung trong Q_RT_ALERTS)
Query; ColumnQ_RT_SENSITIVE_VOLUME; Count of FULL SQLs
Accumulation Interval10 (xét dữ liệu 10 phút gần nhất)
Threshold; Alert condition20; >=
Threshold Evaluated; Threshold Usedper line (mỗi người dùng một bộ đếm); As absolute limit
Notification frequency5 (mặc định 30; để 30 thì các lần vượt ngưỡng tiếp theo trong 30 phút không được gửi)
ReceiversSYSLOG
  • Đếm theo entity Full SQL vì mỗi lần thực thi là một dòng có thời điểm chính xác. Không dùng Access Period: entity này gom theo chu kỳ 60 phút nên query 10 phút thường không có dữ liệu.​
  • Nếu query không hiện trong Alert Builder, kiểm tra Timestamp đã chọn Max và đã tích Count.​
1792644508876.png

Hình 12: Cấu hình correlation alert ALR_USER_SENSITIVE_VOLUME​

3.10. Báo cáo và dashboard​

Truy cập Reports → Report Configuration Tools → Query-Report Builder, tạo các query sau:​
Query​
Domain​
Cột​
Điều kiện​
Q_RT_ALERTSPolicy ViolationsTimestamp, Access Rule Description, Category Name, Severity Description, Server IP, Client IP, DB User Name, Source Program, Full SQL StringKhông lọc; sắp xếp theo Timestamp giảm dần
Q_RT_ALERT_SUMMARYPolicy ViolationsAccess Rule Description, Severity Description; tích CountSắp xếp theo Count giảm dần
Q_RT_SESSIONSAccess (Main Entity = Session)Session Start, Session End, Server Type, Server IP, Service Name, DB User Name, OS User, Client IP, Source ProgramSắp xếp theo Session Start giảm dần
Q_RT_DBA_ACTIVITYAccessSession Start, Server IP, DB User Name, Client IP, Source Program, Count of SQL Verb, Count of Object Name, Count of Sql, Total accessDB User Name IN GROUP GRP_DBA_ACCOUNTS
Q_RT_FAILED_LOGINSExceptionException Timestamp, Server IP, Client IP, DB User Name, Exception DescriptionException Type ID = LOGIN_FAILED

  • Q_RT_ALERTS là bảng trực chung cho mọi cảnh báo trong lab, dùng để kiểm tra cảnh báo đã được ghi nhận dù Syslog có đến hay không.​
  • Q_RT_SESSIONS là nhật ký đăng nhập của mọi tài khoản; Q_RT_DBA_ACTIVITY thống kê theo phiên số câu lệnh, đối tượng của tài khoản quản trị, kể cả phiên không khớp rule nào.​
Bước 1: Truy cập My Dashboards → Create New Dashboard, đặt tên Real-time Access Audit, mở từng query và chọn Add to Dashboard. Thêm query Q_SRV_FAILED_LOGINS đã có trong lab.
Bước 2: Ở mỗi report, mở Customize và đặt khoảng thời gian bao trùm lúc kiểm thử.​
1792644518422.png

Hình 13: Dashboard Real-time Access Audit​

3.11. Rà soát cảnh báo hằng ngày bằng Audit Process​

Bước 1: Truy cập Comply → Tools and Views → Audit Process Builder, nhấn New:​
Trường​
Giá trị​
DescriptionAP_RT_ALERT_REVIEW
ReceiversRole admin; Action = Sign off; Email format = None; Distribution sequence = Simultaneous
TasksBa task loại Report: Q_RT_ALERT_SUMMARY, Q_RT_ALERTS, Q_RT_DBA_ACTIVITY; QUERY_FROM_DATE = NOW -1 DAY, QUERY_TO_DATE = NOW; tích Export PDF
ScheduleHằng ngày lúc 08:00

Bước 2: Nhấn Save, Run Once Now; mở To-Do List, nhấn View để xem kết quả rồi nhấn Sign viewed results.​
1792644539682.png

Hình 14: Kết quả AP_RT_ALERT_REVIEW trong To-Do List​

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

Trước khi chạy, mở một cửa sổ SSH trên oracledb01 để theo dõi Syslog:​
tail -F /var/log/guardium_alerts.log | grep --line-buffered -E 'GRD_RT|ALR_'
Mọi lệnh chạy qua TCP để S-TAP ghi nhận. Mỗi kịch bản ghi lại ba mốc để đo độ trễ: T0 lúc chạy lệnh, T1 là Timestamp của vi phạm trong Q_RT_ALERTS, T2 lúc nhận dòng Syslog. Nếu chạy sau 18:00, rule DET_OFF_HOURS_* đang cài sinh thêm vi phạm; đây là hành vi đúng.​

4.1. Kịch bản 1 – Tài khoản quản trị đăng nhập từ máy lạ​

Phiên tài khoản quản trị (SYSTEM, sa) xuất phát ngoài máy quản trị có thể do mật khẩu bị lộ hoặc làm việc ngoài quy trình. Kịch bản này cũng dùng để đo độ trễ của toàn bộ đường đi cảnh báo.
Bước 1: Trên oracledb01 (Client IP không thuộc GRP_ADMIN_HOSTS), chuyển sang user oracle bằng su - oracle, đăng nhập SYSTEM (nhập mật khẩu khi được hỏi) rồi chạy:​
date '+T0 = %H:%M:%S'
sqlplus -L system@//<IP_ORACLE>:1521/orcl
SELECT instance_name FROM v$instance;
SELECT username, account_status FROM dba_users WHERE username LIKE '%TEST';
SELECT COUNT(*) FROM retail.customers;
exit

Bước 2: Trên SQLDB01, mở PowerShell và chạy (nhập mật khẩu sa khi được hỏi):​
"T0 = " + (Get-Date -Format "HH:mm:ss")
sqlcmd -S <IP_MSSQL>,1433 -U sa -No -Q "SELECT @@SERVERNAME; SELECT name FROM sys.server_principals WHERE name LIKE '%test%'; SELECT COUNT(*) FROM RetailDB.retail.customers"

Bước 3: Trên máy quản trị, chạy hai câu đầu của bước 1 bằng SYSTEM và hai câu đầu của bước 2 bằng sa, không truy vấn bảng customers (máy quản trị không có sqlplus nên dùng script uc4_ora.py):​
python uc4_ora.py system 'SELECT instance_name FROM v$instance' 'SELECT username, account_status FROM dba_users WHERE username LIKE ''%TEST'''
sqlcmd -S <IP_MSSQL>,1433 -U sa -No -C -Q "SELECT @@SERVERNAME; SELECT name FROM sys.server_principals WHERE name LIKE '%test%'"

1792644564283.png

Hình 15: Phiên SYSTEM và sa chạy từ máy quản trị
1792644570217.png

Hình 16: Phiên từ máy quản trị vẫn được ghi trong Q_RT_SESSIONS​
Bước 4: Ghi lại T2 cho phiên SYSTEM và phiên SA. Mở Q_RT_ALERTS lấy T1.​
1792644575616.png

Hình 17: Cảnh báo RT_DBA_UNAPPROVED_HOST của phiên SYSTEM từ oracledb01 trên máy nhận Syslog
1792644580266.png

Hình 18: Cảnh báo RT_DBA_UNAPPROVED_HOST của phiên SA từ SQLDB01 trên máy nhận Syslog
1792644586328.png

Hình 19: Vi phạm RT_DBA_UNAPPROVED_HOST của SYSTEM và SA từ máy lạ trong Q_RT_ALERTS​
Bước 5: Truy vết từ dòng Syslog của phiên SYSTEM: dùng mã vi phạm (vid) tìm vi phạm trong Q_RT_ALERTS, xem ai, từ đâu, bằng chương trình gì trong Q_RT_SESSIONS, số câu lệnh, đối tượng đã truy cập trong Q_RT_DBA_ACTIVITY, thay đổi (nếu có) trong Q_CHG_USER_PRIV, Q_CHG_SCHEMA.​
1792644592634.png

Hình 20: Số câu lệnh, đối tượng theo phiên của tài khoản quản trị trong Q_RT_DBA_ACTIVITY​
Đánh giá: Rule chỉ cảnh báo phiên quản trị từ máy lạ; phiên từ máy quản trị vẫn được ghi vết. Mọi câu lệnh đều thành vi phạm nhưng cả phiên chỉ gửi một thông báo (ONCE PER SESSION), đến sau 1–3 giây, kèm mã vi phạm để truy vết.​

4.2. Kịch bản 2 – Nhập sai mật khẩu tài khoản quản trị​

Bước 1: Trên oracledb01 (user oracle):​
date '+T0 = %H:%M:%S'
sqlplus -L -S sys/"Sai#2026"@//<IP_ORACLE>:1521/orcl as sysdba </dev/null

1792644598356.png

Hình 21: Đăng nhập SYS sai mật khẩu từ oracledb01​
Bước 2: Trên SQLDB01:​
"T0 = " + (Get-Date -Format "HH:mm:ss")
sqlcmd -S <IP_MSSQL>,1433 -U sa -P "Sai#2026" -No -Q "SELECT 1"

1792644605001.png

Hình 22: Đăng nhập sa sai mật khẩu từ SQLDB01​
Bước 3: Kiểm tra Syslog, mở Q_RT_ALERTS và Q_RT_FAILED_LOGINS.​
1792644622986.png

Hình 23: Cảnh báo RT_DBA_FAILED_LOGIN trên máy nhận Syslog
1792644623011.png

Hình 24: Vi phạm RT_DBA_FAILED_LOGIN trong Q_RT_ALERTS
1792644628501.png

Hình 25: Lỗi đăng nhập trong Q_RT_FAILED_LOGINS​
Đánh giá: Chỉ một lần nhập sai mật khẩu SYS hoặc sa đã được cảnh báo sau 1–4 giây, trong khi DET_BRUTE_FORCE cần 5 lần sai trong 5 phút nên bỏ sót kiểu dò mật khẩu chậm.​

4.3. Kịch bản 3 – Tài khoản ứng dụng bị dùng ngoài ứng dụng​

Người biết mật khẩu tài khoản ứng dụng dùng nó trong công cụ truy vấn. Ứng dụng giả lập khai báo Application Name = RetailWeb, công cụ dòng lệnh thì không.
Bước 1: Trên máy quản trị, mở Windows PowerShell (bản 5.1) và chạy ứng dụng giả lập:​
$cs = "Server=<IP_MSSQL>,1433;Database=RetailDB;User ID=retail_app;" +
"Password=<MK_RETAIL_APP>;Application Name=RetailWeb;Encrypt=False"
$cn = New-Object System.Data.SqlClient.SqlConnection $cs
$cn.Open()
$cmd = $cn.CreateCommand()
$cmd.CommandText = "SELECT TOP 3 customer_id, full_name FROM retail.customers"
$rd = $cmd.ExecuteReader(); while ($rd.Read()) { "{0} {1}" -f $rd[0], $rd[1] }; $rd.Close()
$cn.Close()

1792644638486.png

Hình 26: Ứng dụng giả lập RetailWeb truy vấn bằng RETAIL_APP​
Bước 2: Mở Q_RT_SESSIONS, kiểm tra phiên RETAIL_APP vừa tạo có Source Program RETAILWEB và không sinh cảnh báo. Nếu Source Program khác, thêm giá trị đó vào GRP_APPROVED_APP_PROGRAMS rồi chạy lại bước 1.
Bước 3: Cũng trên máy quản trị, dùng chính tài khoản đó bằng go-sqlcmd:​
sqlcmd -S <IP_MSSQL>,1433 -d RetailDB -U retail_app -P "<MK_RETAIL_APP>" -No -C `
-Q "SELECT TOP 3 customer_id, full_name, cccd FROM retail.customers"

1792644646073.png

Hình 27: RETAIL_APP đọc CCCD bằng sqlcmd​
Bước 4: Kiểm tra Syslog, mở Q_RT_ALERTS và Q_RT_SESSIONS.​
1792644659748.png

Hình 28: Cảnh báo RT_APP_ACCOUNT_MISUSE trên máy nhận Syslog
1792644667270.png

Hình 29: Vi phạm RT_APP_ACCOUNT_MISUSE trong Q_RT_ALERTS
1792644672157.png

Hình 30: Hai phiên RETAIL_APP với Source Program RETAILWEB và SQLCMD​
Đánh giá: Cùng tài khoản RETAIL_APP, phiên từ ứng dụng không bị cảnh báo, còn phiên sqlcmd bị cảnh báo dù tài khoản được phép đọc dữ liệu nhạy cảm. Hạn chế: Application Name do client tự khai báo nên có thể giả mạo, cần kết hợp IP máy chủ ứng dụng.​

4.4. Kịch bản 4 – Sửa hàng loạt dữ liệu nhạy cảm và ảnh hưởng của Alerter delay​

Tài khoản hợp lệ chạy UPDATE trên nhiều khách hàng. Lệnh dùng SET email = email nên dữ liệu không đổi nhưng CSDL vẫn báo số dòng bị ảnh hưởng.
Bước 1: Trên Guardium chạy show alerter delay và ghi lại giá trị (mặc định 300).
Bước 2: Oracle, trên máy quản trị chạy hai câu UPDATE bằng RETAIL qua uc4_ora.py (script tự COMMIT; dòng đầu kết quả in thời điểm chạy, dùng làm T0):​
python uc4_ora.py retail "UPDATE retail.customers SET email = email WHERE customer_id <= 30" "UPDATE retail.customers SET email = email WHERE customer_id = 1"
Bước 3: SQL Server, cũng trên máy quản trị, chạy bằng ứng dụng giả lập RetailWeb để không sinh thêm RT_APP_ACCOUNT_MISUSE:​
$cs = "Server=<IP_MSSQL>,1433;Database=RetailDB;User ID=retail_app;" +
"Password=<MK_RETAIL_APP>;Application Name=RetailWeb;Encrypt=False"
$cn = New-Object System.Data.SqlClient.SqlConnection $cs
$cn.Open()
$cmd = $cn.CreateCommand()
"T0 = " + (Get-Date -Format "HH:mm:ss")
$cmd.CommandText = "UPDATE retail.customers SET email = email WHERE customer_id <= 30"
"rows = " + $cmd.ExecuteNonQuery()
$cn.Close()

1792644679536.png

Hình 31: UPDATE 30 dòng và 1 dòng trên Oracle, 30 dòng trên SQL Server​
Bước 4: Mở ngay Q_RT_ALERTS để lấy T1. Chờ khoảng 6 phút, ghi lại T2 và giá trị rows trong dòng Syslog của từng vi phạm.​
1792644685386.png

Hình 32: Vi phạm RT_SENSITIVE_BULK_DML trong Q_RT_ALERTS
1792644690904.png

Hình 33: Cảnh báo có rows=30 đến sau khoảng 300 giây​
Bước 5: Giảm thời gian giữ thông điệp rồi lặp lại câu UPDATE 30 dòng trên Oracle ở bước 2:​
store alerter delay 60
restart alerter
show alerter delay

1792644697379.png

Hình 34: Giảm store alerter delay xuống 60 giây
1792644702658.png

Hình 35: Chạy lại UPDATE 30 dòng trên Oracle sau khi giảm delay
1792644707368.png

Hình 36: Vi phạm RT_SENSITIVE_BULK_DML trước và sau khi giảm delay​
Đánh giá: Rule bắt đúng câu UPDATE 30 dòng và bỏ qua câu 1 dòng, kể cả với tài khoản hợp lệ. Vi phạm được ghi ngay, nhưng thông báo chứa %%RecordsAffected bị Alerter giữ theo store alerter delay (300 giây) nên đến chậm. Chỉ dùng biến này ở rule cần số dòng.​

4.5. Kịch bản 5 – Người dùng trong danh sách theo dõi truy xuất nhỏ giọt​

INTERN_TEST truy vấn từng khách hàng một trong hai phiên. Kịch bản so sánh số thông báo theo hai cách cảnh báo và kiểm tra correlation alert bắt được hành vi tích lũy mà rule thời gian thực bỏ sót.
Bước 1: Trên oracledb01, bằng root (file Syslog chỉ root đọc được), đếm số dòng Syslog trước khi chạy:​
grep -c 'rule=ALERT_UNAUTHORIZED_SENSITIVE_ACCESS' /var/log/guardium_alerts.log
grep -c 'rule=RT_WATCHLIST_ACTIVITY' /var/log/guardium_alerts.log

1792644714012.png

Hình 37: Số dòng Syslog trước khi chạy​
Bước 2: Chuyển sang user oracle, dán riêng dòng read để nhập mật khẩu INTERN_TEST (không hiện ra màn hình), rồi chạy 2 phiên, mỗi phiên 12 câu SELECT (mỗi câu lấy 1 khách hàng):​
su - oracle
read -s -p "MK INTERN_TEST: " PW; echo
date '+T0 = %H:%M:%S'
for s in 1 2; do
{ echo "CONNECT intern_test/\"$PW\"@//<IP_ORACLE>:1521/orcl"
for i in $(seq 1 12); do
echo "SELECT full_name, phone FROM retail.customers WHERE customer_id = $i;"
done; echo "exit"; } | sqlplus -S -L /nolog >> /tmp/kb5.log
done; unset PW
grep -c 'FULL_NAME' /tmp/kb5.log
grep -E 'ORA-|SP2-' /tmp/kb5.log | head -5

  • Lệnh grep -c phải trả về 24 và lệnh grep -E không in ra lỗi ORA-, SP2- nào. Mật khẩu đưa vào bằng lệnh CONNECT sau /nolog; nếu ghép mật khẩu vào chuỗi đăng nhập qua đường ống, sqlplus báo SP2-0306 và không kết nối.​
  • Không dùng uc4_ora.py (python-oracledb thin) cho INTERN_TEST: Query Rewrite đang áp dụng cho tài khoản này làm client báo ORA-03120.​
1792644720994.png

Hình 38: Hai phiên INTERN_TEST, mỗi phiên 12 câu SELECT​
Bước 3: Chờ 1 phút, đếm lại như bước 1. Mở Q_RT_ALERT_SUMMARY với khoảng thời gian bao trùm bước 2.​
1792644735903.png

Hình 39: Số dòng Syslog sau khi chạy
1792644740759.png

Hình 40: Số vi phạm theo rule trong Q_RT_ALERT_SUMMARY​
Bước 4: Chờ tối đa 5 phút (một Run Frequency) sau bước 2, theo dõi cửa sổ Syslog.​
1792644749187.png

Hình 41: Correlation alert ALR_USER_SENSITIVE_VOLUME trên máy nhận Syslog​
Bước 5: Mở Q_RT_ALERTS, lọc Access Rule Description = ALR_USER_SENSITIVE_VOLUME. Mở Q_RT_SENSITIVE_VOLUME với khoảng thời gian bao trùm bước 2.​
1792644754792.png

Hình 42: Vi phạm ALR_USER_SENSITIVE_VOLUME trong Q_RT_ALERTS​
Đánh giá: Rule PER MATCH gửi 24 thông báo, rule ONCE PER SESSION chỉ gửi 2 nhưng vẫn ghi đủ vi phạm. DET_MASS_EXTRACTION bỏ sót vì mỗi câu chỉ lấy 1 dòng, còn correlation alert phát hiện được trong một chu kỳ Run Frequency, bổ sung cho rule thời gian thực.​
 

Đính kèm

  • 1792644614580.png
    1792644614580.png
    99.5 KB · Lượt xem: 0
Back
Top