Từ Chí Kiên
Intern
I. Elastic Common Schema
1. Định nghĩa
Là một chuẩn cấu trúc nguồn mở được người dùng trong cộng đồng Elastic tạo ra, chuẩn này định dạng một tập hợp các trường thường dùng để lưu trữ trong ElasticSearch, dữ liệu như log và chỉ số [1]. Chuẩn này phân các trường thành hai dạng chính:
- Các trường cốt lõi: Các trường xuất hiện phổ biến nhất trong mọi trường hợp sử dụng, mang tính tổng quát này được sử dụng bởi các thành phần phân tích.
- Các trường mở rộng: Các trường áp dụng cho những trường hợp sử dụng cụ thể hơn, hoặc có thể linh hoạt hơn về cách diễn giải tùy theo từng trường hợp sử dụng.
2. Các trường cho phân tích log
2.1. Các trường cơ sở
Bao gồm tất cả các trường nằm ở gốc của các sự kiện, là thành phần chính của tất cả các sự kiện. Chi tiết các trường sau:
- @timestamp: Là ngày và giờ được trích xuất từ sự kiện, thường thể hiện thời điểm sự kiện được tạo ra bởi nguồn, nếu nguồn sự kiện không có dấu thời gian gốc, giá trị này thường được điền bằng thời gian đầu tiên sự kiện được nhận bởi hệ thống xử lý dữ liệu. Trường bắt buộc đối với tất cả các sự kiện.
- labels: Là các cặp khóa-giá trị tùy chỉnh, có thể được sử dụng để thêm thông tin meta vào các sự kiện.
- messages: Là chứa nội dung log được tối ưu hóa để hiển thị trong các công cụ xem log, trong trường hợp log không chứa trường này các trường khác có thể được kết hợp lại để tạo thành một bản tóm tắt sự kiện mà con người có thể đọc hiểu được.
- tags: Là một danh sách các từ khóa dùng để gán thể cho từng sự kiện.
2.2. Các trường máy chủ
Các trường thuộc nhóm "host.*" trong chuẩn cần được điền thông tin chi tiết về máy chủ nơi sự kiện xảy ra hoặc nơi thực hiện phép đo.
- host.name: tên của máy chủ đó, chứa giá trị trả về của các hệ thống Unix, tên miền đầy đủ hoặc một tên do người dùng chỉ định.
- host.ip: địa chỉ ip của máy chủ.
- host.os.name: tên hệ điều hành chạy trên máy chủ, không bao gồm phiên bản.
2.3. Các trường log
Thông tin chi tiết về cơ chế ghi log hoặc phương thức truyền log của sự kiện.
- log.file.path: Đường dẫn đầy đủ bao gồm cả ký tự ổ đĩa đến tệp log chứa sự kiện này, bao gồm cả tên tệp.
- log.level: Mức độ nghiêm trọng của log, trong trường hợp nguồn không có, người dùng có thể tự định nghĩa trong bộ vận chuyển.
- log.logger: Tên của bộ ghi log bên trong một ứng dụng.
- log.syslog.hostname: Tên máy chủ, FQDN hoặc địa chỉ IP của thiết bị đã gửi thông điệp Syslog ban đầu.
2.4. Các trường tạo ngữ cảnh khác
- event.category: Phân nhóm cấp cao
- event.action: Hành động cụ thể được theo dõi
- event.outcome: Kết quả của hành động
- event.ingested: Thời điểm bộ lưu trữ nhận được log
- network.protocol, iana_number: Loại giao thức mạng
- service.name, service.environment, service.version: Các trường dịch vụ
- source.ip, source.port, destination.ip, destination.port: Các trường nguồn/đích
II. FortiGate
1. Định nghĩa
Là tường lửa thế hệ mới và hệ thống bảo mật mạng của Fortinet, cung cấp các tính năng tường lửa thế hệ mới, ngăn chặn xâm nhập, lọc web, quản lí ứng dụng. [2]
Khi lựa chọn phiên bản để cài đặt, người dùng có thể lựa chọn phiên bản 7.6 cho sử dụng dài hạn và 8.0 cho tính năng mới nhất. [3]
Hình 1. Các phiên bản FortiGate còn hỗ trợ
2. Cài đặt và cấu hình
Tường lửa sẽ cần ít nhất 2 interface:
- Một interface cho kết nối WAN phục vụ cho việc chuyển các log đến SIEM
- Một interface cho kết nối LAN là hệ thống nằm sau tường lửa thực hiện các sự kiện để tường lửa tạo log
Hình 2. Cấu hình 2 interface cho tường lửa
Mô hình hệ thống sử dụng một máy linux chạy web và máy windows kết nối đến web thông qua tường lửa
Hình 3. Mô hình hệ thống tường lửa
Mục tiêu: giám sát kết nối của máy Windows đến máy chủ web trên Linux
Trên tường lửa cần tạo một quy tắc cho phép máy windows kết nối đến web qua tường lửa thông qua cơ chế forward.
Hình 4. Quy tắc forward truy cập web
Với lưu lại tất cả mọi session đi qua tường lửa để thuận tiện cho việc phân tích
Hình 5. Bật log all session
Sau đó cấu hình để tường lửa gửi log dưới dạng syslog đến SIEM, vào giao diện cli trong giao diện đồ họa của FortiGate [4]:
- Đặt ip của SIEM và cổng muốn gửi đến dưới giao thức UDP
- Dạng rfc5424 là do đầu vào dạng syslog của Vector bắt buộc phải là dạng này
- Đặt facility local7 sẽ đánh dấu trong log là log giám sát mạng
III. Vector chuẩn hóa syslog forward
1. Phân tích cấu trúc log
Trước khi chuẩn hóa log sẽ cần biết log chứa những thông tin nào, ví dụ sau là log nhận được sau khi máy Windows đăng xuất khỏi web trên Linux. Sẽ bao gồm một số thông tin quan trọng:
- facility local7, hostname, source_ip: Cho biết là log về đường truyền mạng, tên và ip máy chủ tường lửa.
- timestamp: Chứa thời gian Vector nhận log
- Trong message sẽ chứa thông tin của sự kiện:
+ eventtime: Lúc xảy ra sự kiện
+ type và subtype: Cho biết loại log lưu lượng mạng
+ srcip, scrport, dstip, dstport, sentbyte, rcvdbyte, duration: Thông tin nguồn, đích và độ dài của sự kiện
+ service và action: Cho biết dịch vụ và hành động của client lên web
+ transip và transport: Thông tin máy chủ vận chuyển
+ policyid, policyname, poluuid, level: Thông tin quy tắc làm cho tường lửa tạo log và cấp độ
2. Cấu hình
Để Vector có thể thu thập log cần mở cổng 5140 ở phần sources
Vào phần transform sẽ cần chuyển cấu trúc log trên về chuẩn ESC và sẽ cần các trường sau:
- @timestamp: Sẽ lấy thời điểm xảy ra sự kiện
- event.ingested: Sẽ chứa thời điểm Vector nhận được log
- event.severity: Lấy thông tin level của sự kiện nhưng chuyển sang dạng số lưu lại
- Còn các thông tin còn lại lưu lại dưới tên theo chuẩn.
Ở phần sinks sẽ lưu vào OpenSearch
Sau khi chuyển đến OpenSearch thành công sẽ có thể truy vấn, như sau sẽ truy vấn đến log có điểm đích là ip của webserver.
Hình 6. Truy vấn trên OpenSearch
Tài liệu tham khảo
[1] Elastic, "Elastic Common Schema (ECS) reference", Elastic Documents. Available: https://www.elastic.co/docs/reference/ecs
[2] Fortinet, "FortiGate / FortiOS", Fortinet Documents. Available: https://docs.fortinet.com/product/fortigate/8.0#section-getting-started
[3] bkrishnan, "Technical Tip: FortiOS End of Support change for FortiOS v7.4 and v7.6", Fortinet Community. Available: https://community.fortinet.com/fort...pport-change-for-fortios-v7-4-and-v7-6-224876
[4] Fortinet, "config log syslogd setting", Fortinet Documents. Available: https://docs.fortinet.com/document/...eference/141516630/config-log-syslogd-setting
1. Định nghĩa
Là một chuẩn cấu trúc nguồn mở được người dùng trong cộng đồng Elastic tạo ra, chuẩn này định dạng một tập hợp các trường thường dùng để lưu trữ trong ElasticSearch, dữ liệu như log và chỉ số [1]. Chuẩn này phân các trường thành hai dạng chính:
- Các trường cốt lõi: Các trường xuất hiện phổ biến nhất trong mọi trường hợp sử dụng, mang tính tổng quát này được sử dụng bởi các thành phần phân tích.
- Các trường mở rộng: Các trường áp dụng cho những trường hợp sử dụng cụ thể hơn, hoặc có thể linh hoạt hơn về cách diễn giải tùy theo từng trường hợp sử dụng.
2. Các trường cho phân tích log
2.1. Các trường cơ sở
Bao gồm tất cả các trường nằm ở gốc của các sự kiện, là thành phần chính của tất cả các sự kiện. Chi tiết các trường sau:
- @timestamp: Là ngày và giờ được trích xuất từ sự kiện, thường thể hiện thời điểm sự kiện được tạo ra bởi nguồn, nếu nguồn sự kiện không có dấu thời gian gốc, giá trị này thường được điền bằng thời gian đầu tiên sự kiện được nhận bởi hệ thống xử lý dữ liệu. Trường bắt buộc đối với tất cả các sự kiện.
- labels: Là các cặp khóa-giá trị tùy chỉnh, có thể được sử dụng để thêm thông tin meta vào các sự kiện.
- messages: Là chứa nội dung log được tối ưu hóa để hiển thị trong các công cụ xem log, trong trường hợp log không chứa trường này các trường khác có thể được kết hợp lại để tạo thành một bản tóm tắt sự kiện mà con người có thể đọc hiểu được.
- tags: Là một danh sách các từ khóa dùng để gán thể cho từng sự kiện.
2.2. Các trường máy chủ
Các trường thuộc nhóm "host.*" trong chuẩn cần được điền thông tin chi tiết về máy chủ nơi sự kiện xảy ra hoặc nơi thực hiện phép đo.
- host.name: tên của máy chủ đó, chứa giá trị trả về của các hệ thống Unix, tên miền đầy đủ hoặc một tên do người dùng chỉ định.
- host.ip: địa chỉ ip của máy chủ.
- host.os.name: tên hệ điều hành chạy trên máy chủ, không bao gồm phiên bản.
2.3. Các trường log
Thông tin chi tiết về cơ chế ghi log hoặc phương thức truyền log của sự kiện.
- log.file.path: Đường dẫn đầy đủ bao gồm cả ký tự ổ đĩa đến tệp log chứa sự kiện này, bao gồm cả tên tệp.
- log.level: Mức độ nghiêm trọng của log, trong trường hợp nguồn không có, người dùng có thể tự định nghĩa trong bộ vận chuyển.
- log.logger: Tên của bộ ghi log bên trong một ứng dụng.
- log.syslog.hostname: Tên máy chủ, FQDN hoặc địa chỉ IP của thiết bị đã gửi thông điệp Syslog ban đầu.
2.4. Các trường tạo ngữ cảnh khác
- event.category: Phân nhóm cấp cao
- event.action: Hành động cụ thể được theo dõi
- event.outcome: Kết quả của hành động
- event.ingested: Thời điểm bộ lưu trữ nhận được log
- network.protocol, iana_number: Loại giao thức mạng
- service.name, service.environment, service.version: Các trường dịch vụ
- source.ip, source.port, destination.ip, destination.port: Các trường nguồn/đích
II. FortiGate
1. Định nghĩa
Là tường lửa thế hệ mới và hệ thống bảo mật mạng của Fortinet, cung cấp các tính năng tường lửa thế hệ mới, ngăn chặn xâm nhập, lọc web, quản lí ứng dụng. [2]
Khi lựa chọn phiên bản để cài đặt, người dùng có thể lựa chọn phiên bản 7.6 cho sử dụng dài hạn và 8.0 cho tính năng mới nhất. [3]
Hình 1. Các phiên bản FortiGate còn hỗ trợ
2. Cài đặt và cấu hình
Tường lửa sẽ cần ít nhất 2 interface:
- Một interface cho kết nối WAN phục vụ cho việc chuyển các log đến SIEM
- Một interface cho kết nối LAN là hệ thống nằm sau tường lửa thực hiện các sự kiện để tường lửa tạo log
Hình 2. Cấu hình 2 interface cho tường lửa
Mô hình hệ thống sử dụng một máy linux chạy web và máy windows kết nối đến web thông qua tường lửa
Hình 3. Mô hình hệ thống tường lửa
Mục tiêu: giám sát kết nối của máy Windows đến máy chủ web trên Linux
Trên tường lửa cần tạo một quy tắc cho phép máy windows kết nối đến web qua tường lửa thông qua cơ chế forward.
Hình 4. Quy tắc forward truy cập web
Với lưu lại tất cả mọi session đi qua tường lửa để thuận tiện cho việc phân tích
Hình 5. Bật log all session
Sau đó cấu hình để tường lửa gửi log dưới dạng syslog đến SIEM, vào giao diện cli trong giao diện đồ họa của FortiGate [4]:
- Đặt ip của SIEM và cổng muốn gửi đến dưới giao thức UDP
- Dạng rfc5424 là do đầu vào dạng syslog của Vector bắt buộc phải là dạng này
- Đặt facility local7 sẽ đánh dấu trong log là log giám sát mạng
Bash:
config log syslogd setting
set status enable
set server "192.168.248.132"
set mode udp
set port 5140
set format rfc5424
set facility local7
end
III. Vector chuẩn hóa syslog forward
1. Phân tích cấu trúc log
Trước khi chuẩn hóa log sẽ cần biết log chứa những thông tin nào, ví dụ sau là log nhận được sau khi máy Windows đăng xuất khỏi web trên Linux. Sẽ bao gồm một số thông tin quan trọng:
- facility local7, hostname, source_ip: Cho biết là log về đường truyền mạng, tên và ip máy chủ tường lửa.
- timestamp: Chứa thời gian Vector nhận log
- Trong message sẽ chứa thông tin của sự kiện:
+ eventtime: Lúc xảy ra sự kiện
+ type và subtype: Cho biết loại log lưu lượng mạng
+ srcip, scrport, dstip, dstport, sentbyte, rcvdbyte, duration: Thông tin nguồn, đích và độ dài của sự kiện
+ service và action: Cho biết dịch vụ và hành động của client lên web
+ transip và transport: Thông tin máy chủ vận chuyển
+ policyid, policyname, poluuid, level: Thông tin quy tắc làm cho tường lửa tạo log và cấp độ
JSON:
{"facility":"local7",
"host":"FGVMEVO5JLN2R5B8",
"hostname":"FGVMEVO5JLN2R5B8",
"message":"eventtime=1792660915764434427 tz=\"-0700\" logid=\"0000000013\" type=\"traffic\" subtype=\"forward\" level=\"notice\" vd=\"root\" srcip=192.168.10.130 srcport=63519 srcintf=\"port2\" srcintfrole=\"undefined\" dstip=192.168.10.129 dstport=80 dstintf=\"port2\" dstintfrole=\"undefined\" srccountry=\"Reserved\" dstcountry=\"Reserved\" sessionid=3505 proto=6 action=\"close\" policyid=1 policytype=\"policy\" poluuid=\"00906cc8-cd51-51f1-5ba2-ca01d9da7d79\" policyname=\"Intra-Zone\" service=\"HTTP\" trandisp=\"snat\" transip=192.168.10.30 transport=63519 appcat=\"unscanned\" duration=140 sentbyte=4791 rcvdbyte=4825 sentpkt=18 rcvdpkt=13 sentdelta=40 rcvddelta=40 durationdelta=1 sentpktdelta=1 rcvdpktdelta=1",
"severity":"notice",
"source_ip":"10.120.253.15",
"source_type":"syslog",
"timestamp":"2026-10-22T09:21:56Z",
"version":1
}
2. Cấu hình
Để Vector có thể thu thập log cần mở cổng 5140 ở phần sources
JSON:
fortigate_syslog:
type: "syslog"
address: "0.0.0.0:5140"
mode: "udp"
Vào phần transform sẽ cần chuyển cấu trúc log trên về chuẩn ESC và sẽ cần các trường sau:
- @timestamp: Sẽ lấy thời điểm xảy ra sự kiện
- event.ingested: Sẽ chứa thời điểm Vector nhận được log
- event.severity: Lấy thông tin level của sự kiện nhưng chuyển sang dạng số lưu lại
- Còn các thông tin còn lại lưu lại dưới tên theo chuẩn.
JSON:
parse_fortigate:
type: "remap"
inputs:
- "fortigate_syslog"
source: |
# Get the info in message
kv, err = parse_key_value(.message)
if err != null {
if !is_array(.tags) {
.tags = []
}
.tags = push!(.tags, "failed_kv_parse")
log("Failed to parse Fortinet KV message: " + err, level: "error")
}
# The ingested time is when vector receive the logs
.event.ingested = .timestamp
# The @timestamp will be when the event happend
if kv.eventtime != null {
ts_time, ts_err = from_unix_timestamp(to_int!(kv.eventtime), unit: "nanoseconds")
if ts_err == null {
.@timestamp = ts_time
}
else {
.@timestamp = .timestamp
}
}
# Host will be the Fw itself
.host.name = .hostname
# Source and destination will be the event ip and port
.source.ip = kv.srcip
.source.port = to_int(kv.srcport) ?? 0
.destination.ip = kv.dstip
.destination.port = to_int(kv.dstport) ?? 0
# NAT is the FW ip and port use
if kv.transip != null {
.source.nat.ip = kv.transip
.source.nat.port = to_int(kv.transport) ?? 0
}
# Event related
.event.action = kv.action
.event.category = [kv.type]
.event.type = [kv.subtype]
if kv.level != null {
lvl_str = to_string(kv.level) ?? ""
if lvl_str == "emergency" {
.event.severity = 0
} else if lvl_str == "alert" {
.event.severity = 1
} else if lvl_str == "critical" {
.event.severity = 2
} else if lvl_str == "error" {
.event.severity = 3
} else if lvl_str == "warning" {
.event.severity = 4
} else if lvl_str == "notice" {
.event.severity = 5
} else if lvl_str == "information" {
.event.severity = 6
} else if lvl_str == "debug" {
.event.severity = 7
} else {
.event.severity = to_int(kv.level) ?? 0
}
} else {
.event.severity = 0
}
.network.protocol = kv.service
.network.iana_number = to_string(kv.proto) ?? ""
# Rule on fw that trigger the logs
.rule.id = to_int(kv.policyid) ?? 0
.rule.name = kv.policyname
.rule.uuid = kv.poluuid
# The bytes and duration
.source.bytes = to_int(kv.sentbyte) ?? 0
.destination.bytes = to_int(kv.rcvdbyte) ?? 0
.event.duration = to_int(kv.duration) ?? 0
# The device or software ip that collected the log
.observer.ip = .source_ip
# Clean up
del(.timestamp)
del(.hostname)
del(.facility)
del(.severity)
del(.source_type)
del(.source_ip)
del(.version)
del(.message)
Ở phần sinks sẽ lưu vào OpenSearch
JSON:
opensearch_fortigate:
type: "elasticsearch"
inputs:
- "parse_fortigate"
endpoints:
- "https://127.0.0.1:9200"
tls:
verify_certificate: false
auth:
strategy: "basic"
user: "admin"
password: "<password>"
api_version: "v7"
suppress_type_name: true
bulk:
index: "fortigate-logs-%Y.%m.%d"
Sau khi chuyển đến OpenSearch thành công sẽ có thể truy vấn, như sau sẽ truy vấn đến log có điểm đích là ip của webserver.
Hình 6. Truy vấn trên OpenSearch
Tài liệu tham khảo
[1] Elastic, "Elastic Common Schema (ECS) reference", Elastic Documents. Available: https://www.elastic.co/docs/reference/ecs
[2] Fortinet, "FortiGate / FortiOS", Fortinet Documents. Available: https://docs.fortinet.com/product/fortigate/8.0#section-getting-started
[3] bkrishnan, "Technical Tip: FortiOS End of Support change for FortiOS v7.4 and v7.6", Fortinet Community. Available: https://community.fortinet.com/fort...pport-change-for-fortios-v7-4-and-v7-6-224876
[4] Fortinet, "config log syslogd setting", Fortinet Documents. Available: https://docs.fortinet.com/document/...eference/141516630/config-log-syslogd-setting
Bài viết liên quan
Được quan tâm
Bài viết mới