ฟิลด์ของ Linux
log จาก Linux agent เป็นข้อความ syslog ซึ่งไม่มีโครงสร้างตายตัว L-Flow อ่านข้อความของโปรแกรมที่รู้จัก (sshd, sudo, auditd ฯลฯ) แล้วแยกออกเป็นฟิลด์ ECS ก่อนจัดเก็บ ข้อความที่ไม่รู้จักจะถูกเก็บไว้ใน message ทั้งบรรทัด
ตัวอย่าง
syslog หนึ่งบรรทัดจาก sshd:
<38>Sep 24 10:15:32 3f9a1c7e2b8d4e6fa1b2c3d4e5f60718 sshd[2211]: Failed password for invalid user admin from 203.0.113.50 port 51122 ssh2
หลังแปลงแล้ว จะเห็นใน Explore เป็น:
vendor linux
devid linux-3f9a1c7e2b8d4e6fa1b2c3d4e5f60718
type auth
process.name sshd
event.action login_failed
user.name admin
source.ip 203.0.113.50
severity high
message Failed password for invalid user admin from 203.0.113.50 port 51122 ssh2
ฟิลด์ที่มีในทุก log
| ฟิลด์ ECS | มาจาก | ความหมาย |
|---|
| timestamp | syslog header | เวลาที่เครื่องบันทึก log ตามรูปแบบ syslog ซึ่งไม่มีปีและ timezone |
| vendor | — | ค่าคงที่ linux |
| devid | syslog hostname | รหัสเครื่องที่ได้ตอนลงทะเบียน agent รูปแบบ linux- ตามด้วย machine ID ของเครื่อง (agent ใส่ค่านี้แทน hostname ใน syslog) |
| type | ชื่อโปรแกรม | หมวดของ log ดู ค่าของ type |
| process.name | syslog tag | ชื่อโปรแกรมที่เขียน log เช่น sshd, sudo (log ของ auditd ใช้ comm แทน) |
| severity | syslog severity | ระดับความรุนแรง ดู severity |
| event.action | — | สิ่งที่เกิดขึ้น แยกได้เฉพาะโปรแกรมที่รู้จัก ดูแต่ละหัวข้อด้านล่าง |
| message | ข้อความ syslog | ข้อความเต็มของ log ไม่ตัด |
ค่าของ type
| type | โปรแกรม | ความหมาย |
|---|
| auth | sshd, sshd-session, sudo, su, login, pam_unix, passwd, useradd, userdel, usermod, unix_chkpwd | การเข้าสู่ระบบ การใช้สิทธิ์ root และการจัดการบัญชี |
| system | kernel, systemd, systemd-logind, systemd-journald, cron, crond, anacron, init, klogd, auditd, audit, audispd, audisp-syslog | เหตุการณ์ระบบ, service, cron และ auditd |
| system | l-flow-container, l-flow-filedrop, l-flow-asset, l-flow-usb | เหตุการณ์ที่ agent ของ L-Flow ตรวจเอง |
| syslog | อื่นๆ | โปรแกรมอื่นทั้งหมด เก็บเฉพาะ message ไม่แยกฟิลด์ |
severity
เริ่มจาก severity ของ syslog แล้วบางเหตุการณ์จะปรับขึ้นตามความสำคัญ เช่น login ไม่สำเร็จเป็น high ค่าที่ปรับแล้วระบุไว้ในแต่ละหัวข้อด้านล่าง
| severity | syslog severity |
|---|
| critical | emerg, alert, crit |
| high | err |
| medium | warning |
| information | notice, info, debug และค่าอื่น |
การเข้าสู่ระบบและสิทธิ์
sshd
| event.action | ข้อความที่ตรง | ฟิลด์ที่ได้ |
|---|
| login_success | Accepted … for USER from IP | user.name, source.ip |
| login_failed | Failed … for USER from IP, Invalid user USER from IP | user.name, source.ip · severity high |
| session_open | session opened for user USER | user.name |
| session_close | session closed for user USER | user.name |
บรรทัด Disconnected from user USER IP ให้ user.name และ source.ip แต่ไม่มี event.action
sudo
| event.action | ข้อความที่ตรง | ฟิลด์ที่ได้ |
|---|
| command | USER : … USER=TARGET ; COMMAND=CMD | user.name (คนที่สั่ง), user.target.name (สิทธิ์ที่ได้ ปกติคือ root), process.command_line · severity อย่างน้อย medium |
| auth_failed | N incorrect password attempts, authentication failure | user.name หรือ user.target.name · severity high |
| session_open / session_close | session opened/closed … by USER(uid=…) | user.name |
su
| event.action | ข้อความที่ตรง | ฟิลด์ที่ได้ |
|---|
| switch_user | (to TARGET) USER on … | user.name (คนที่สั่ง), user.target.name (บัญชีปลายทาง) · severity medium |
| auth_failed | authentication failure; ruser=USER … user=TARGET | user.name, user.target.name · severity high |
useradd, userdel, usermod
| event.action | โปรแกรม | ฟิลด์ที่ได้ |
|---|
| user_add | useradd | user.name = บัญชีที่ถูกสร้าง · severity high |
| user_delete | userdel | user.name = บัญชีที่ถูกลบ · severity high |
| user_modify | usermod | user.name = บัญชีที่ถูกแก้ · severity high |
systemd-logind, unix_chkpwd
| event.action | ข้อความที่ตรง | ฟิลด์ที่ได้ |
|---|
| session_open | systemd-logind: New session N of user USER. | user.name |
| session_close | systemd-logind: logged out, Removed session | — |
| login_failed | unix_chkpwd: … for user (USER) | user.name · type auth · severity high |
ระบบและ service
| event.action | มาจาก | ฟิลด์ที่ได้ |
|---|
| cron_cmd | cron: (USER) CMD (COMMAND) | user.name, process.command_line |
| started | systemd: Started / Finished | service.name (เช่น nginx.service) |
| stopped | systemd: Stopped / Deactivated | service.name |
| failed | systemd: Failed / error | service.name · severity high |
auditd
agent ติดตั้ง audit rule ชุดพื้นฐานให้ทุกเครื่อง แต่ละ rule มี key ที่บอกว่าจับอะไร L-Flow ใช้ key นี้กำหนด event.action และ severity ของบรรทัด type=SYSCALL
| key | event.action | severity | จับอะไร |
|---|
| identity | file_change | high | แก้ /etc/passwd, shadow, group, gshadow |
| privilege-escalation | privilege-escalation | high | แก้ /etc/sudoers, sudoers.d หรือเรียก setuid/setgid |
| ssh-config | file_change | medium | แก้ /etc/ssh/sshd_config |
| ssh-key | file_change | high | แก้ /root/.ssh/authorized_keys |
| pam-config | file_change | high | แก้ /etc/pam.d หรือ /etc/security |
| dns-config | file_change | high | แก้ /etc/hosts, resolv.conf, nsswitch.conf |
| persistence | file_change | high | แก้ crontab, cron.d, cron.daily, cron.weekly, /etc/systemd/system |
| kernel-module | kernel_module_change | high | โหลดหรือถอด kernel module |
| download | download | medium | รัน wget หรือ curl |
| netcat | netcat | high | รัน nc |
| recon | recon | high | รัน nmap |
| firewall-change | firewall-change | high | รัน iptables, nft, ufw, firewall-cmd |
| defense-evasion | defense-evasion | high | รัน setenforce, semanage, auditctl |
| anti-forensics | anti-forensics | high | แก้ .bash_history ของ root, wtmp, btmp, lastlog หรือรัน shred |
| agent-tamper | agent-tamper | high | แก้ไฟล์ใน /etc/l-flow (ค่าตั้งของ agent) |
| custom-watch | file_change | medium | path ที่เพิ่มเองในหน้า การเฝ้าดูไฟล์ (File Watches) |
| proc | process_exec | information | ทุกโปรแกรมที่ถูกรัน (เฉพาะเครื่องที่เปิด การติดตามโปรเซส) |
| netconn | net_connect | low | ทุกการเชื่อมต่อออกของผู้ใช้ (ปิดได้ต่อเครื่องที่ บันทึกการเชื่อมต่อเครือข่าย) |
ฟิลด์ที่ได้จากบรรทัด SYSCALL:
| ฟิลด์ ECS | มาจาก | ความหมาย |
|---|
| process.executable | exe | path ของโปรแกรม |
| process.name | comm | ชื่อโปรแกรม |
| process.pid | pid | process ID |
| process.parent.pid | ppid | process ID ของ process แม่ |
| user.id | auid | UID ของคนที่ login เข้ามาตั้งแต่แรก ไม่เปลี่ยนแม้ใช้ sudo หรือ su |
| user.name | AUID | ชื่อบัญชีของ auid |
| event.outcome | success | success หรือ failure |
| event.id | audit(…:SERIAL) | หมายเลขของ audit event ใช้รวมบรรทัด SYSCALL, EXECVE, PATH และ SOCKADDR ของเหตุการณ์เดียวกัน |
| file.hash.sha256 | LFLOW_EXE_SHA256 | hash ของโปรแกรมที่ถูกรัน agent คำนวณเอง (เฉพาะ key proc, download, netcat, recon, firewall-change, defense-evasion) |
auditd เขียนหนึ่งเหตุการณ์เป็นหลายบรรทัด บรรทัดอื่นที่มี event.id เดียวกันให้ข้อมูลเพิ่ม:
| event.action | บรรทัด | ฟิลด์ที่ได้ |
|---|
| process_args | type=EXECVE | process.command_line (argument ทั้งหมดต่อกัน) |
| file_path | type=PATH | file.path (ไฟล์ที่ถูกแตะ) |
| net_sockaddr | type=SOCKADDR | destination.ip, destination.port (เฉพาะ IPv4) |
| selinux_denied / apparmor_denied | type=AVC, type=APPARMOR | process.name, process.pid, file.path, rule.name (AppArmor profile) · severity high |
Note:ในหน้า Explore ให้ค้นด้วย event.id ของบรรทัด SYSCALL เพื่อเห็นคำสั่งเต็มและไฟล์ที่เกี่ยวข้องของเหตุการณ์นั้น
เหตุการณ์จาก L-Flow agent
ไฟล์ใหม่ใน Downloads และ /tmp
| ฟิลด์ ECS | ความหมาย |
|---|
| event.action | file_download ถ้า browser บันทึก URL ต้นทางไว้, ไม่เช่นนั้น file_drop |
| file.path | path ของไฟล์ |
| file.hash.sha256 | hash ของไฟล์ |
| file.size | ขนาดไฟล์ หน่วย byte |
| user.name | เจ้าของไฟล์ |
| url.original | URL ที่ดาวน์โหลดมา |
| http.request.referrer | หน้าเว็บที่กดดาวน์โหลด |
| severity | medium ถ้าไฟล์รันได้ (executable), ไม่เช่นนั้น information |
Docker container
| ฟิลด์ ECS | ความหมาย |
|---|
| event.action | container_ ตามด้วยเหตุการณ์ เช่น container_start, container_die, container_exec_start |
| container.id | container ID |
| container.name | ชื่อ container |
| container.image.name | image |
| container.exit_code | exit code เมื่อ container หยุด |
| severity | high เมื่อมีการ exec เข้า container, medium เมื่อหยุดด้วย exit code ไม่ใช่ 0 หรือ oom/kill |
USB และ SD card
| ฟิลด์ ECS | ความหมาย |
|---|
| event.action | usb_add หรือ usb_remove |
| file.path | ชื่ออุปกรณ์ เช่น sdb |
| severity | medium |
ข้อมูลเครื่อง
ส่งตอน agent เริ่มทำงานแล้วทุก 6 ชั่วโมง event.action เป็น asset_inventory
| ฟิลด์ ECS | ความหมาย |
|---|
| host.os.full | ชื่อและเวอร์ชันของ OS |
| host.os.kernel | เวอร์ชัน kernel |
| host.architecture | สถาปัตยกรรม CPU เช่น x86_64 |
| l_flow.package_count | จำนวน package ที่ติดตั้ง -1 แปลว่านับไม่ได้ (ไม่ใช่ Debian/Ubuntu) |
| l_flow.listening_tcp_ports | พอร์ต TCP ที่เปิดรอรับการเชื่อมต่อ |
CPU, RAM, ดิสก์
ส่งประมาณนาทีละครั้ง เก็บแยกด้วย vendor:l-flow-agent และ type:health ไม่ใช่เหตุการณ์ความปลอดภัย
| ฟิลด์ ECS | ความหมาย |
|---|
| host.cpu.usage | CPU ที่ใช้โดยโปรแกรมผู้ใช้ (%) |
| host.cpu.system_pct | CPU ที่ใช้โดย kernel (%) |
| host.memory.used_pct | หน่วยความจำที่ใช้ (%) |
| host.memory.total_bytes | หน่วยความจำทั้งหมด (byte) |
| host.memory.available_bytes | หน่วยความจำที่ยังใช้ได้ (byte) |
| host.disk.used_pct | ดิสก์ที่ใช้ (%) |
| host.disk.total_bytes | ขนาดดิสก์ (byte) |
| host.disk.free_bytes | ดิสก์ว่าง (byte) |
| host.network.ingress.bytes | byte ที่รับเข้าสะสมตั้งแต่เปิดเครื่อง |
| host.network.egress.bytes | byte ที่ส่งออกสะสมตั้งแต่เปิดเครื่อง |
log ของ Apache และ Nginx
ถ้าเครื่องมี Apache หรือ Nginx agent จะส่ง access log และ error log มาด้วย เก็บด้วย vendor เป็น apache หรือ nginx ใช้ devid เดียวกับ log ระบบของเครื่องนั้น
access log (type: webaccess)
| ฟิลด์ ECS | ความหมาย |
|---|
| source.ip | IP ของผู้เรียก |
| user.name | ผู้ใช้จาก HTTP authentication (ถ้ามี) |
| http.request.method | HTTP method เช่น GET |
| url.original | path ที่ร้องขอ |
| url.domain | virtual host (ถ้า log format มีชื่อ host) |
| http.version | เช่น HTTP/1.1 |
| http.response.status_code | HTTP status code |
| source.bytes | ขนาด response ที่ส่งกลับ (byte) |
| http.request.referrer | HTTP referrer |
| user_agent.original | User-Agent |
| severity | ตาม status code: 5xx = high, 4xx = medium, 3xx = low, อื่นๆ = information |
| message | METHOD path STATUS |
error log (type: weberror)
| ฟิลด์ ECS | ความหมาย |
|---|
| severity | จาก level ของ log: emerg/alert/crit = critical, error = high, warn = medium, notice/info/debug = information |
| source.ip | IP ของ client (Apache เท่านั้น) |
| message | ข้อความ error |
Restriction:เวลาใน error log ของ Apache และ Nginx ไม่มี timezone L-Flow จึงถือเป็น UTC ถ้าเครื่องไม่ได้ตั้งเวลาเป็น UTC เวลาของ error log จะคลาดจาก access log เท่ากับ timezone ของเครื่อง
ข้อความที่ไม่ได้แยกฟิลด์
log ของโปรแกรมที่ไม่อยู่ในหน้านี้ หรือข้อความที่ไม่ตรงรูปแบบที่ระบุ จะมีเพียง process.name, severity และ message ค้นเนื้อหาได้ด้วยการค้นข้อความใน message เช่น process.name:postfix "reject"
ติดตั้ง agent ดูที่ Linux · ฟิลด์ของ Windows ดูที่ ฟิลด์ของ Windows