เรียนรู้การตรวจสอบระบบ Linux ด้วยเครื่องมือ Auditd บน CentOS/RHEL
การตรวจสอบระบบหมายถึงการวิเคราะห์เชิงลึกของระบบเป้าหมายเฉพาะ การตรวจสอบประกอบด้วยการตรวจสอบส่วนต่างๆ ซึ่งประกอบด้วยระบบนั้น พร้อมด้วยการประเมินที่สำคัญ (และการทดสอบหากจำเป็น) ในด้านต่างๆ ที่น่าสนใจ
อ่านเพิ่มเติม: Lynis – เครื่องมือตรวจสอบและสแกนความปลอดภัยสำหรับระบบ Linux
หนึ่งในระบบย่อยที่สำคัญบน RHEL/CentOS ซึ่งเป็นระบบตรวจสอบ Linux ที่รู้จักกันทั่วไปในชื่อ auditd ใช้วิธีการติดตามข้อมูลที่เกี่ยวข้องกับความปลอดภัยบนระบบ: ใช้กฎที่กำหนดไว้ล่วงหน้าเพื่อรวบรวมข้อมูลจำนวนมหาศาลเกี่ยวกับเหตุการณ์ที่เกิดขึ้นบนระบบ และบันทึกไว้ในไฟล์บันทึก ซึ่งทำให้เกิดการทดลองตรวจสอบ
สามารถบันทึกข้อมูล เช่น วันที่ เวลา ประเภท และผลลัพธ์ของเหตุการณ์ ผู้ใช้ที่ทำให้เกิดเหตุการณ์ การแก้ไขใดๆ ที่เกิดขึ้นกับไฟล์/ฐานข้อมูล การใช้กลไกการรับรองความถูกต้องของระบบ เช่น PAM, LDAP, SSH และอื่นๆ
Auditd ยังบันทึกการเปลี่ยนแปลงใดๆ ที่เกิดขึ้นกับไฟล์การกำหนดค่าการตรวจสอบ หรือความพยายามในการเข้าถึงไฟล์บันทึกการตรวจสอบ และความพยายามใดๆ ในการนำเข้าหรือส่งออกข้อมูลเข้าหรือออกจากระบบ รวมถึงข้อมูลที่เกี่ยวข้องกับความปลอดภัยอื่นๆ อีกมากมาย
เหตุใดระบบตรวจสอบ Linux จึงมีความสำคัญ
- ไม่จำเป็นต้องมีโปรแกรมหรือกระบวนการภายนอกใด ๆ เพื่อทำงานบนระบบทำให้สามารถพึ่งพาตนเองได้
- มีการกำหนดค่าได้สูงทำให้คุณสามารถดูการทำงานของระบบที่คุณต้องการได้
- ช่วยในการตรวจจับหรือวิเคราะห์การประนีประนอมที่อาจเกิดขึ้นของระบบ
- สามารถทำงานเป็นระบบตรวจจับอิสระได้
- สามารถทำงานร่วมกับระบบตรวจจับการบุกรุกเพื่อให้สามารถตรวจจับการบุกรุกได้
- เป็นเครื่องมือสำคัญในการตรวจสอบการสืบสวนทางนิติเวช
ส่วนประกอบของระบบตรวจสอบ Linux
ระบบการตรวจสอบมีองค์ประกอบหลัก 2 ส่วน ได้แก่
- แอปพลิเคชันพื้นที่ผู้ใช้และยูทิลิตี้/เครื่องมือ และ
- การประมวลผลการเรียกของระบบฝั่งเคอร์เนล – ยอมรับการเรียกของระบบจากแอปพลิเคชันพื้นที่ผู้ใช้และส่งผ่านตัวกรองสามประเภท ได้แก่: ผู้ใช้, งาน, ออก< หรือ ยกเว้น
ส่วนที่สำคัญที่สุดคือ พื้นที่ผู้ใช้ ดีมอนตรวจสอบ (auditd) ซึ่งรวบรวมข้อมูลตามกฎที่กำหนดค่าไว้ล่วงหน้าจากเคอร์เนลและสร้างรายการในไฟล์บันทึก: บันทึกเริ่มต้นคือ /var/log/audit/audit.log
นอกจากนี้ audispd (audit Dispatcher Daemon) ยังเป็นมัลติเพล็กเซอร์เหตุการณ์ที่โต้ตอบกับ auditd และส่งเหตุการณ์ไปยังโปรแกรมอื่นที่ต้องการดำเนินการแบบเรียลไทม์ การประมวลผลเหตุการณ์
มีเครื่องมือพื้นที่ผู้ใช้จำนวนหนึ่งสำหรับการจัดการและดึงข้อมูลจากระบบการตรวจสอบ:
- auditctl – ยูทิลิตี้สำหรับควบคุมระบบการตรวจสอบของเคอร์เนล
- ausearch – ยูทิลิตี้สำหรับค้นหาไฟล์บันทึกการตรวจสอบสำหรับเหตุการณ์เฉพาะ
- aureport – ยูทิลิตี้สำหรับสร้างรายงานเหตุการณ์ที่บันทึกไว้
วิธีติดตั้งและกำหนดค่าเครื่องมือตรวจสอบใน RHEL/CentOS/Fedora
ขั้นแรก ตรวจสอบให้แน่ใจว่าได้ติดตั้งเครื่องมือตรวจสอบบนระบบของคุณโดยใช้คำสั่ง rpm และยูทิลิตี้ grep ดังต่อไปนี้:
rpm -qa | grep audit
หากคุณไม่ได้ติดตั้งแพ็คเกจข้างต้น ให้รันคำสั่งนี้ในฐานะผู้ใช้รูทเพื่อติดตั้ง
yum install audit
จากนั้น ตรวจสอบว่า auditd เปิดใช้งานและทำงานอยู่หรือไม่ ให้ออกคำสั่ง systemctl ด้านล่างบนเทอร์มินัล
--------------- On CentOS/RHEL 7 ---------------
systemctl is-enabled auditd
systemctl status auditd
systemctl start auditd [Start]
systemctl enable auditd [Enable]
--------------- On CentOS/RHEL 6 ---------------
service auditd status
service auditd start [Start]
chkconfig auditd on [Enable]
ตอนนี้เราจะดูวิธีกำหนดค่า auditd โดยใช้ไฟล์การกำหนดค่าหลัก /etc/audit/auditd.conf พารามิเตอร์ที่นี่ช่วยให้คุณสามารถควบคุมวิธีการทำงานของบริการได้ เช่น การกำหนดตำแหน่งของไฟล์บันทึก จำนวนไฟล์บันทึกสูงสุด รูปแบบบันทึก วิธีจัดการกับดิสก์ทั้งหมด การหมุนเวียนบันทึก และตัวเลือกอื่นๆ อีกมากมาย
vi /etc/audit/auditd.conf
จากผลลัพธ์ตัวอย่างด้านล่าง พารามิเตอร์ต่างๆ อธิบายได้ในตัว
ทำความเข้าใจกฎการตรวจสอบ
ดังที่เราได้กล่าวไว้ก่อนหน้านี้ auditd ใช้กฎเพื่อรวบรวมข้อมูลเฉพาะจากเคอร์เนล กฎเหล่านี้โดยพื้นฐานแล้วคือตัวเลือก auditctl (ดูหน้าคู่มือ) ที่คุณสามารถกำหนดค่ากฎล่วงหน้าในไฟล์ /etc/audit/rules.d/audit.rules (บน CentOS 6 ให้ใช้ไฟล์ /etc/audit/audit.rules) เพื่อให้โหลดเมื่อเริ่มต้นระบบ
มีกฎการตรวจสอบสามประเภทที่คุณสามารถกำหนดได้:
- กฎการควบคุม – ช่วยให้สามารถปรับเปลี่ยนพฤติกรรมของระบบการตรวจสอบและการกำหนดค่าบางอย่างได้
- กฎของระบบไฟล์ (หรือเรียกว่าการเฝ้าดูไฟล์) – ช่วยให้สามารถตรวจสอบการเข้าถึงไฟล์หรือไดเร็กทอรีบางไฟล์ได้
- กฎการเรียกของระบบ – อนุญาตให้บันทึกการเรียกของระบบที่ทำโดยโปรแกรมใดๆ
ตอนนี้เปิดไฟล์การกำหนดค่าหลักเพื่อแก้ไข:
vi /etc/audit/rules.d/audit.rules
โปรดทราบว่าส่วนแรกของไฟล์นี้ต้องมีกฎการควบคุม จากนั้นเพิ่มกฎการตรวจสอบของคุณ (การเฝ้าดูไฟล์และกฎการเรียกใช้ระบบ) ในส่วนตรงกลาง และส่วนสุดท้ายจะมีการตั้งค่าความไม่เปลี่ยนรูปซึ่งเป็นกฎการควบคุมด้วย
ตัวอย่างของกฎการควบคุม Auditd
-D #removes all previous rules
-b 3074 #define buffer size
-f 4 #panic on failure
-r 120 #create at most 120 audit messages per second
ตัวอย่างกฎระบบไฟล์ Auditd
คุณสามารถกำหนดการเฝ้าดูไฟล์ได้โดยใช้ไวยากรณ์นี้:
-w /path/to/file/or/directory -p permissions -k key_name
ตัวเลือกอยู่ที่ไหน:
- w – ใช้เพื่อระบุไฟล์หรือไดเรกทอรีที่จะดูแล
- p – สิทธิ์ที่จะบันทึก r – สำหรับการเข้าถึงเพื่ออ่าน w – สำหรับการเข้าถึงเพื่อเขียน x – สำหรับ ดำเนินการเข้าถึงและ a – สำหรับการเปลี่ยนแปลงไฟล์หรือแอตทริบิวต์ของผู้กำกับ
- -k – ช่วยให้คุณสามารถตั้งค่าสตริงทางเลือกเพื่อระบุว่ากฎใด (หรือชุดของกฎ) ที่สร้างรายการบันทึกเฉพาะ
กฎเหล่านี้อนุญาตให้มีการตรวจสอบเพื่อดูเหตุการณ์ที่ทำการเปลี่ยนแปลงไฟล์ระบบที่สำคัญเหล่านี้
-w /etc/passwd -p wa -k passwd_changes
-w /etc/group -p wa -k group_changes
-w /etc/shadow -p wa -k shadow_changes
-w /etc/sudoers -p wa -k sudoers_changes
ตัวอย่างของกฎการโทรของระบบ Auditd
คุณสามารถตั้งค่ากฎการโทรของระบบได้โดยใช้แบบฟอร์มด้านล่าง:
-a action,filter -S system_call -F field=value -k key_name
ที่ไหน :
- การกระทำ – มีสองค่าที่เป็นไปได้: เสมอหรือไม่เคย
- ตัวกรอง – ระบุตัวกรองการจับคู่กฎเคอร์เนล (งาน ออก ผู้ใช้ และยกเว้น) ที่จะนำไปใช้กับเหตุการณ์
- การเรียกของระบบ – ชื่อการเรียกของระบบ
- ฟิลด์ – ระบุตัวเลือกเพิ่มเติม เช่น สถาปัตยกรรม, PID, GID ฯลฯ เพื่อแก้ไขกฎ
ต่อไปนี้เป็นกฎบางประการที่คุณสามารถกำหนดได้
-a always,exit -F arch=b64 -S adjtimex -S settimeofday -k time_change
-a always,exit -S sethostname -S setdomainname -k system_locale
จากนั้นสุดท้ายให้เพิ่มการตั้งค่าความไม่เปลี่ยนรูปแบบที่ส่วนท้ายของไฟล์ เช่น:
-e 1 #enable auditing
-e 2 #make the configuration immutable -- reboot is required to change audit rules
ตัวอย่างไฟล์การกำหนดค่ากฎ Auditd
วิธีการตั้งค่ากฎ Auditd โดยใช้ยูทิลิตี้ auditctl
หรือส่งตัวเลือกไปที่ auditd ในขณะที่กำลังทำงานอยู่ โดยใช้ auditctl ดังตัวอย่างต่อไปนี้ คำสั่งเหล่านี้สามารถแทนที่กฎในไฟล์การกำหนดค่าได้
หากต้องการแสดงรายการกฎการตรวจสอบที่โหลดในปัจจุบันทั้งหมด ให้ส่งแฟล็ก -l
:
auditctl -l
ต่อไป ให้ลองเพิ่มกฎสองสามข้อ:
auditctl -w /etc/passwd -p wa -k passwd_changes
auditctl -w /etc/group -p wa -k group_changes
auditctl -w /etc/sudoers -p wa -k sudoers_changes
auditctl -l
ทำความเข้าใจกับไฟล์บันทึก Auditd
ข้อความการตรวจสอบทั้งหมดจะถูกบันทึกในไฟล์ /var/log/audit/audit.log ตามค่าเริ่มต้น เพื่อให้เข้าใจถึงรูปแบบรายการบันทึก เราจะโหลดกฎและตรวจสอบรายการบันทึกที่สร้างขึ้นหลังจากเหตุการณ์ที่ตรงกับกฎ
สมมติว่าเรามีไดเร็กทอรีสำรองข้อมูลลับ กฎการตรวจสอบนี้จะบันทึกความพยายามในการเข้าถึงหรือแก้ไขไดเร็กทอรีนี้:
auditctl -w /backups/secret_files/ -p rwa -k secret_backup
ตอนนี้ เมื่อใช้บัญชีระบบอื่น ให้ลองย้ายไปยังไดเร็กทอรีด้านบนแล้วรันคำสั่ง ls:
cd /backups/secret_files/
ls
รายการบันทึกจะมีลักษณะเช่นนี้
เหตุการณ์ข้างต้นประกอบด้วยบันทึกการตรวจสอบสามประเภท อันแรกคือ type=SYSCALL:
type=SYSCALL msg=audit(1505784331.849:444): arch=c000003e syscall=257 success=yes exit=3 a0=ffffffffffffff9c a1=8ad5c0 a2=90800 a3=0 items=1 ppid=2191 pid=2680 auid=1000 uid=1000 gid=1000 euid=1000 suid=1000 fsuid=1000 egid=1000 sgid=1000 fsgid=1000 tty=pts1 ses=3 comm="ls" exe="/usr/bin/ls" subj=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 key="secret_backup"
รายการที่สองคือ type=CWD
type=CWD msg=audit(1505784331.849:444): cwd="/backups/secret_files"
และอันสุดท้ายคือ type=PATH:
type=PATH msg=audit(1505784331.849:444): item=0 name="." inode=261635 dev=08:01 mode=040755 ouid=0 ogid=0 rdev=00:00 obj=unconfined_u:object_r:default_t:s0 objtype=NORMAL
คุณสามารถดูรายการฟิลด์เหตุการณ์ทั้งหมดได้ (เช่น msg, arch, ses ฯลฯ) และความหมายในข้อมูลอ้างอิงระบบการตรวจสอบ
นั่นคือทั้งหมดที่สำหรับตอนนี้. ในบทความถัดไป เราจะดูวิธีใช้ ausearch เพื่อสืบค้นไฟล์บันทึกการตรวจสอบ: เราจะอธิบายวิธีค้นหาข้อมูลเฉพาะจากบันทึกการตรวจสอบ หากคุณมีคำถามใด ๆ โปรดติดต่อเราผ่านทางส่วนความคิดเห็นด้านล่าง