@iamproz2911
@kidwine29
# Week4: Ulogd
[4th week] Ulogd
ulogd là một trình nền báo cáo các vấn đề liên quan đến netfilter/iptables. Việc này bao gồm báo cáo vi phạm bảo mật và kiểm toán trên mỗi gói tin. Ulogd còn cho phép báo cáo bảo mật và kiểm toán 1 cách linh hoạt (do người dùng tuỳ chỉnh) trên mỗi luồng lưu lượng.
Giả sử WebOS trên các thiết bị Rasberry đã được cài đặt sẵn ulogd2. Để thực thi báo cáo tuỳ biến thì cần tìm hiểu các plugins đầu vào (Input), đầu ra (Output) và thực hiện các công việc sau:
1. Tìm hiểu các plugins
1. 1. Input plugins: ULOG, NFLOG, NFCT --> để làm gì và cách vận hành?
1.2. Output plugins: LOGEMU, OPRINT, SYSLOG, MYSQL, PGSQL, SQLITE3, PCAP, IPFIX, NACCT, JSON --> để làm gì và cách vận hành?
1.3. Tìm hiểu trên Ulogd trên WebOS hiện tại hỗ trợ những plugins (Input, Output) nào?
2. Xây dựng Ulogd tuỳ biến dựa vào các plugins
Giả sử đã tìm hiểu được các Input/ Output plugins trên hệ thống WebOS của mình. Xây dựng Ulogd tuỳ biến để báo cáo các vi phạm/ kiểm toán về gói tin/ luồng lưu lượng (tất nhiên cần xây dựng trước chính sách bảo mật --> iptables --> kiểm tra vi phạm/kiểm toán dựa vào Ulogd tuỳ biến)
# Ulogd INPUT
Input plugins: ULOG, NFLOG, NFCT
Input plugins là thành phần chịu trách nhiệm thu thập thông tin từ hệ thống mạng và gửi dữ liệu đó cho các stack của ulogd để ghi lại hoặc xử lý thêm. Mỗi plugin đầu vào phục vụ một mục đích riêng biệt và sử dụng các nguồn dữ liệu khác nhau từ hệ thống mạng.
ULOG là một plugin đầu vào cũ hơn, được sử dụng để thu thập các bản ghi về các gói tin mà hệ thống netfilter/iptables gửi tới.
Cách hoạt động:
+ Dữ liệu được gửi từ iptables thông qua các quy tắc ulog hoặc NFLOG.
+ Các gói tin được gửi vào không gian người dùng thông qua một socket và sau đó được ulogd xử lý.
NFLOG là một plugin mới hơn, được thiết kế để thay thế ULOG trong nhiều trường hợp, vì nó cung cấp khả năng ghi lại hiệu quả hơn và hỗ trợ các tính năng hiện đại của hệ thống netfilter.
Cách hoạt động:
+ Giống như ULOG, NFLOG cũng thu thập dữ liệu từ iptables, nhưng sử dụng cơ + chế nf_log của kernel thay vì ulog.
NFCT (Netfilter Connection Tracking)
NFCT là một plugin đầu vào cho phép ulogd thu thập các bản ghi liên quan đến theo dõi kết nối từ netfilter.
Cách hoạt động:
+ Plugin này sử dụng thông tin từ nf_conntrack (connection tracking) của + + netfilter để ghi lại các kết nối mạng.
# Ulogd OUTPUT
Output plugins: LOGEMU, OPRINT, SYSLOG, MYSQL, PGSQL, SQLITE3, PCAP, IPFIX, NACCT, JSON
Các Output plugins trong ulogd là các thành phần chịu trách nhiệm xử lý và lưu trữ thông tin mà các plugin đầu vào thu thập được (như các gói tin hoặc sự kiện mạng).
Mỗi plugin đầu ra có mục đích riêng và hỗ trợ lưu trữ hoặc gửi dữ liệu tới các hệ thống khác nhau.
1. LOGEMU (Log Emulator)
Chức năng: Ghi các bản ghi vào file dưới dạng văn bản.
Ứng dụng: Ghi lại các gói tin mạng và sự kiện hệ thống vào file log, dễ dàng để theo dõi và phân tích.
2. OPRINT (Output Print)
Chức năng: In dữ liệu trực tiếp ra màn hình hoặc stdout.
Ứng dụng: Hữu ích khi cần kiểm tra thông tin trực tiếp trong quá trình phát triển hoặc giám sát tạm thời.
3. SYSLOG
Chức năng: Gửi bản ghi đến hệ thống syslog.
Ứng dụng: Thích hợp để gửi log tới hệ thống quản lý log (như rsyslog), giúp tổ chức và phân tích log trên các hệ thống tập trung.
4. MYSQL
Chức năng: Ghi dữ liệu vào cơ sở dữ liệu MySQL.
Ứng dụng: Lưu trữ các sự kiện mạng và gói tin vào cơ sở dữ liệu MySQL để phân tích sau này, dễ dàng truy vấn và tìm kiếm.
5. PGSQL (PostgreSQL)
Chức năng: Ghi dữ liệu vào cơ sở dữ liệu PostgreSQL.
Ứng dụng: Giống như MySQL, dùng để lưu trữ log vào cơ sở dữ liệu PostgreSQL, hỗ trợ phân tích nâng cao và truy vấn.
6. SQLITE3
Chức năng: Ghi dữ liệu vào cơ sở dữ liệu SQLite.
Ứng dụng: Lưu trữ log vào một cơ sở dữ liệu SQLite nhẹ, thích hợp cho các hệ thống không cần cơ sở dữ liệu phức tạp.
7. PCAP (Packet Capture)
Chức năng: Ghi dữ liệu vào file pcap (dạng file gói tin mạng).
Ứng dụng: Thu thập và lưu trữ gói tin mạng theo định dạng pcap, có thể được mở và phân tích bởi các công cụ như Wireshark.
8. IPFIX (IP Flow Information Export)
Chức năng: Gửi dữ liệu theo định dạng IPFIX (chuẩn định dạng cho xuất khẩu thông tin luồng mạng).
Ứng dụng: Dùng để ghi và xuất thông tin luồng mạng, hỗ trợ giám sát mạng và phân tích lưu lượng.
9. NACCT (Network Accounting)
Chức năng: Ghi thông tin về việc sử dụng mạng (tính toán và thống kê).
Ứng dụng: Phân tích băng thông và sử dụng tài nguyên mạng, thường được dùng trong các hệ thống tính phí hoặc giám sát lưu lượng.
10. JSON
Chức năng: Ghi dữ liệu dưới định dạng JSON.
Ứng dụng: Thích hợp cho việc xuất dữ liệu mạng dưới dạng cấu trúc dễ đọc và dễ sử dụng trong các ứng dụng phân tích dữ liệu (như ELK stack hoặc các công cụ phân tích dữ liệu).
# Build custom Ulogd based on plugins
## Iptables
VietRules
Xây dựng Rules Iptables ghi lại (logging) các gói tin vào log của hệ thống:
iptables -A INPUT -p icmp -m limit --limit 1/s --limit-burst 1 -j NFLOG --nflog-prefix "ping!!!" --nflog-group 1
Rule này ghi lại các gói ICMP (ping) đến hệ thống, với tốc độ giới hạn là 1 gói mỗi giây, và prefix"ping!!!" sẽ được thêm vào log.
iptables -A INPUT -p tcp -m limit --limit 1/s --limit-burst 1 -j NFLOG --prefix "tcp!!!" --nflog-group 1
Rule này ghi lại các gói TCP đến hệ thống, với tốc độ giới hạn là 1 gói mỗi giây, và prefix"tcp!!!" sẽ được thêm vào log.
Log nhóm chọn là Log2 và khai báo group=1
## View Log in Ulogd
ViewLog
### NFLOG
- **LOGEMU**:
Logemu ghi lại các gói tin mạng dưới dạng văn bản
Stack: stack=log2:NFLOG,base1:BASE,ifi1:IFINDEX,ip2str1:IP2STR,print1:PRINTPKT,emu1:LOGEMU
Cấu hình:
BASE: Lưu trữ thông tin cơ bản của gói tin.
IFINDEX: Lấy chỉ số giao diện mạng.
IP2STR: Chuyển đổi địa chỉ IP thành dạng chuỗi dễ đọc.
PRINTPKT: In thông tin chi tiết của gói tin.

- **Json & Xml**:
ulogd với module JSON và XML xuất thông tin gói tin mạng dưới định dạng JSON hoặc XML dễ phân tích và lưu trữ.
Stack:
stack=log2:NFLOG,base1:BASE,ifi1:IFINDEX,ip2str1:IP2STR,mac2str1:HWHDR,json1:JSON,xml1:XML
Kết quả:

- **PCAP**:
Ulogd lưu trữ các gói tin mạng được ghi lại dưới dạng tệp PCAP để phân tích bằng các công cụ như Wireshark.
Stack:
stack=log2:NFLOG,base1:BASE,pcap1:PCAP

- **Gprint**:
In ra thông tin gói tin mạng dưới dạng văn bản (plaintext) theo định dạng tùy chỉnh, giúp dễ dàng theo dõi và phân tích.
Stack: stack=log2:NFLOG,base1:BASE,gp1:GPRINT

- **OPRINT**:
In thông tin gói tin mạng ra đầu ra chuẩn (stdout) hoặc các hệ thống log khác theo định dạng cấu hình.
Stack: stack=log2:NFLOG,base1:BASE,ifi1:IFINDEX,ip2str1:IP2STR,print1:PRINTPKT,op1:OPRINT


- **SQLITE3**:
Lưu vào Database và truy vấn để xem thông tin log
Stack: stack=log20:NFLOG,base1:BASE,ifi1:IFINDEX,ip2str1:IP2STR,mac2str1:HWHDR,boot_sqlt:SQLITE3
Cấu hình:
Log20: Group20
[boot_sqlt]
table="all_in"
db="/var/log/ulog/bootlog-sqlt3.db"
Tạo bảng all_in bằng lệnh SQL với các trường là các thông tin của gói tin.
```
CREATE TABLE all_in (
oob_prefix TEXT,
oob_time_sec INT UNSIGNED,
oob_time_usec INT UNSIGNED,
oob_uid INT UNSIGNED,
ip_protocol INT UNSIGNED,
ip_tos INT UNSIGNED,
ip_ttl INT UNSIGNED,
ip_totlen INT UNSIGNED,
ip_ihl INT UNSIGNED,
ip_csum INT UNSIGNED,
ip_id INT UNSIGNED,
ip_fragoff INT UNSIGNED,
ip6_payloadlen INT UNSIGNED,
ip6_priority INT UNSIGNED,
ip6_flowlabel INT UNSIGNED,
ip6_hoplimit INT UNSIGNED,
ip6_nexthdr INT UNSIGNED,
ip6_fragoff INT UNSIGNED,
ip6_fragid INT UNSIGNED,
tcp_sport INT UNSIGNED,
tcp_dport INT UNSIGNED,
tcp_seq INT UNSIGNED,
tcp_ackseq INT UNSIGNED,
tcp_window INT UNSIGNED,
tcp_offset INT UNSIGNED,
tcp_reserved INT UNSIGNED,
tcp_urg INT UNSIGNED,
tcp_urgp INT UNSIGNED,
tcp_ack INT UNSIGNED,
tcp_psh INT UNSIGNED,
tcp_rst INT UNSIGNED,
tcp_syn INT UNSIGNED,
tcp_fin INT UNSIGNED,
tcp_res1 INT UNSIGNED,
tcp_res2 INT UNSIGNED,
tcp_csum INT UNSIGNED,
udp_sport INT UNSIGNED,
udp_dport INT UNSIGNED,
udp_len INT UNSIGNED,
udp_csum INT UNSIGNED,
icmp_type INT UNSIGNED,
icmp_code INT UNSIGNED,
icmp_echoid INT UNSIGNED,
icmp_echoseq INT UNSIGNED,
icmp_fragmtu INT UNSIGNED,
icmp_csum INT UNSIGNED,
icmpv6_type INT UNSIGNED,
icmpv6_code INT UNSIGNED,
icmpv6_echoid INT UNSIGNED,
icmpv6_echoseq INT UNSIGNED,
icmpv6_csum INT UNSIGNED,
ahesp_spi INT UNSIGNED,
arp_hwtype INT UNSIGNED,
arp_protocoltype INT UNSIGNED,
arp_operation INT UNSIGNED,
sctp_sport INT UNSIGNED,
sctp_dport INT UNSIGNED,
sctp_csum INT UNSIGNED,
oob_in TEXT,
oob_out TEXT,
mac_saddr_str TEXT,
mac_daddr_str TEXT,
ip_saddr_str TEXT,
ip_daddr_str TEXT,
orig_ip_saddr_str TEXT,
orig_ip_daddr_str TEXT,
reply_ip_saddr_str TEXT,
reply_ip_daddr_str TEXT,
arp_saddr_str TEXT,
arp_daddr_str TEXT,
PRIMARY KEY ( oob_time_sec, oob_time_usec )
);
```

### NFCT
NFCT trong ulogd bắt và ghi lại các thông tin về trạng thái kết nối (connection tracking) của các gói tin mạng, giúp theo dõi và phân tích các kết nối mạng.
- **LOGEMU**:
Stack:
stack=ct1:NFCT,ip2str1:IP2STR,print1:PRINTFLOW,emu1:LOGEMU


- **JSON, XML**:
Stack:
stack=ct1:NFCT,json1:JSON
stack=ct1:NFCT,xml1:XML


- Nacct
nacct là một module được sử dụng để tính toán số lượng các gói dữ liệu trong một khoảng thời gian nhất định
Stack:
stack=ct1:NFCT,ip2str1:IP2STR,nacct1:NACCT

- **Oprint**:
Stack:
stack=ct1:NFCT,op1:OPRINT


- **IPFIX**:
Cho biết các thông tin về lưu lượng mạng (như địa chỉ IP nguồn, đích, cổng, số lượng byte/gói)
Stack:
stack=ct1:NFCT,iffix1:IPFIX
Cấu hình:
Ở máy đích bật netcat lắng nghe và bắt gói tin bằng wireshark


## Demo
Đầu vào:
- Giả sử đã tuỳ chỉnh file ulogd.conf.in.user:
- Input plugin: NFLOG
- Output: JSON and LOGEMU
Đầu ra:
Gồm 2 file full.log và firewall_log.json
iptables: Thiết lập 2 Rules vào hệ thống


Json

## Conclusion
Triển khai Ulogd thành công với Input: Nflog và NFCT, Output: Logemu, Json Xml, PCAP, NACCT, Oprint, Gprint, SQLITE3, IPFIX... Các kết quả cho thấy đã trích xuất log thành công, với Nflog là tùy biến theo Iptables và Nfct theo dõi các kết nối mạng.
