@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. ![image](https://hackmd.io/_uploads/HJCU7IUr1l.png) - **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ả: ![image](https://hackmd.io/_uploads/r13s7IUrJx.png) - **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 ![image](https://hackmd.io/_uploads/Skry48IBJe.png) - **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 ![image](https://hackmd.io/_uploads/H18M4I8Bye.png) - **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 ![image](https://hackmd.io/_uploads/Hy64NILSyg.png) ![image](https://hackmd.io/_uploads/HJ2HNLLHkg.png) - **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 ) ); ``` ![image](https://hackmd.io/_uploads/Bkkq4LIH1e.png) ### 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 ![image](https://hackmd.io/_uploads/r1i34ULrke.png) ![image](https://hackmd.io/_uploads/HJs6NLUH1g.png) - **JSON, XML**: Stack: stack=ct1:NFCT,json1:JSON stack=ct1:NFCT,xml1:XML ![image](https://hackmd.io/_uploads/S1R1SUIHkl.png) ![image](https://hackmd.io/_uploads/Syl-rUIBJg.png) - 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 ![image](https://hackmd.io/_uploads/HkPmBLUBye.png) - **Oprint**: Stack: stack=ct1:NFCT,op1:OPRINT ![image](https://hackmd.io/_uploads/ByWtBU8BJe.png) ![image](https://hackmd.io/_uploads/H1bcBIIr1e.png) - **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 ![image](https://hackmd.io/_uploads/HktaB8IS1e.png) ![image](https://hackmd.io/_uploads/ryvASI8HJx.png) ## 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 ![image](https://hackmd.io/_uploads/B101ILIH1g.png) ![image](https://hackmd.io/_uploads/SJ0e88UBJg.png) Json ![image](https://hackmd.io/_uploads/BJeM8UISyl.png) ## 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. ![image](https://hackmd.io/_uploads/B1cH8IUSJe.png)