2. Elastic Stack: การวิเคราะห์บันทึกความปลอดภัย ล็อกสแตช

2. Elastic Stack: การวิเคราะห์บันทึกความปลอดภัย ล็อกสแตช

ในที่สุด статье เราได้พบ สแต็ค ELKประกอบด้วยผลิตภัณฑ์ซอฟต์แวร์ใดบ้าง และงานแรกที่วิศวกรต้องเผชิญเมื่อทำงานกับสแต็ก ELK คือการส่งบันทึกเพื่อจัดเก็บใน ElasticSearch เพื่อการวิเคราะห์ในภายหลัง อย่างไรก็ตาม นี่เป็นเพียงบริการแบบปากเท่านั้น ElasticSearch จะจัดเก็บบันทึกในรูปแบบของเอกสารที่มีฟิลด์และค่าที่แน่นอน ซึ่งหมายความว่าวิศวกรจะต้องใช้เครื่องมือต่างๆ เพื่อแยกวิเคราะห์ข้อความที่ส่งจากระบบปลายทาง สามารถทำได้หลายวิธี - เขียนโปรแกรมด้วยตัวเองซึ่งจะเพิ่มเอกสารลงในฐานข้อมูลโดยใช้ API หรือใช้โซลูชันสำเร็จรูป ในหลักสูตรนี้เราจะพิจารณาวิธีแก้ปัญหา Logstashซึ่งเป็นส่วนหนึ่งของสแต็ก ELK เราจะดูว่าเราสามารถส่งบันทึกจากระบบปลายทางไปยัง Logstash ได้อย่างไร จากนั้นเราจะตั้งค่าไฟล์การกำหนดค่าเพื่อแยกวิเคราะห์และเปลี่ยนเส้นทางไปยังฐานข้อมูล Elasticsearch ในการดำเนินการนี้ เราจะนำบันทึกจากไฟร์วอลล์ Check Point เป็นระบบขาเข้า

หลักสูตรนี้ไม่ครอบคลุมการติดตั้งสแต็ก ELK เนื่องจากมีบทความจำนวนมากในหัวข้อนี้ เราจะพิจารณาองค์ประกอบการกำหนดค่า

มาจัดทำแผนปฏิบัติการสำหรับการกำหนดค่า Logstash:

  1. การตรวจสอบว่า elasticsearch จะยอมรับบันทึก (ตรวจสอบการทำงานและความเปิดของพอร์ต)
  2. เราพิจารณาว่าจะส่งเหตุการณ์ไปยัง Logstash เลือกวิธีการ และนำไปใช้ได้อย่างไร
  3. เรากำหนดค่าอินพุตในไฟล์กำหนดค่า Logstash
  4. เรากำหนดค่าเอาต์พุตในไฟล์การกำหนดค่า Logstash ในโหมดแก้ไขข้อบกพร่องเพื่อให้เข้าใจว่าข้อความบันทึกมีลักษณะอย่างไร
  5. การตั้งค่าตัวกรอง
  6. การตั้งค่าเอาต์พุตที่ถูกต้องใน ElasticSearch
  7. เปิดตัว Logstash
  8. ตรวจสอบบันทึกใน Kibana

มาดูรายละเอียดแต่ละจุดกันดีกว่า:

การตรวจสอบว่า elasticsearch จะยอมรับบันทึก

ในการดำเนินการนี้ คุณสามารถใช้คำสั่ง curl เพื่อตรวจสอบการเข้าถึง Elasticsearch จากระบบที่ใช้งาน Logstash หากคุณได้กำหนดค่าการรับรองความถูกต้องแล้ว เรายังถ่ายโอนผู้ใช้/รหัสผ่านผ่านทาง curl โดยระบุพอร์ต 9200 หากคุณไม่ได้เปลี่ยนแปลง หากคุณได้รับคำตอบที่คล้ายกับด้านล่างนี้ แสดงว่าทุกอย่างเป็นไปตามลำดับ

[elastic@elasticsearch ~]$ curl -u <<user_name>> : <<password>> -sS -XGET "<<ip_address_elasticsearch>>:9200"
{
  "name" : "elastic-1",
  "cluster_name" : "project",
  "cluster_uuid" : "sQzjTTuCR8q4ZO6DrEis0A",
  "version" : {
    "number" : "7.4.1",
    "build_flavor" : "default",
    "build_type" : "rpm",
    "build_hash" : "fc0eeb6e2c25915d63d871d344e3d0b45ea0ea1e",
    "build_date" : "2019-10-22T17:16:35.176724Z",
    "build_snapshot" : false,
    "lucene_version" : "8.2.0",
    "minimum_wire_compatibility_version" : "6.8.0",
    "minimum_index_compatibility_version" : "6.0.0-beta1"
  },
  "tagline" : "You Know, for Search"
}
[elastic@elasticsearch ~]$

หากไม่ได้รับการตอบกลับ อาจมีข้อผิดพลาดหลายประเภท: กระบวนการ elasticsearch ไม่ทำงาน ระบุพอร์ตผิด หรือพอร์ตถูกบล็อกโดยไฟร์วอลล์บนเซิร์ฟเวอร์ที่ติดตั้ง elasticsearch

มาดูกันว่าคุณสามารถส่งบันทึกไปยัง Logstash จากไฟร์วอลล์จุดตรวจสอบได้อย่างไร

จากเซิร์ฟเวอร์การจัดการ Check Point คุณสามารถส่งบันทึกไปยัง Logstash ผ่าน syslog โดยใช้ยูทิลิตี้ log_exporter คุณสามารถอ่านเพิ่มเติมได้ที่นี่ статьеที่นี่เราจะเหลือเพียงคำสั่งที่สร้างสตรีม:

cp_log_export เพิ่มชื่อ check_point_syslog เซิร์ฟเวอร์เป้าหมาย < > รูปแบบ TCP โปรโตคอลพอร์ตเป้าหมาย 5555 โหมดอ่านทั่วไปแบบกึ่งรวมศูนย์

< > - ที่อยู่ของเซิร์ฟเวอร์ที่ Logstash ทำงาน, พอร์ตเป้าหมาย 5555 - พอร์ตที่เราจะส่งบันทึกไป, การส่งบันทึกผ่าน TCP สามารถโหลดเซิร์ฟเวอร์ได้ ดังนั้นในบางกรณี การใช้ udp จะถูกต้องมากกว่า

การตั้งค่า INPUT ในไฟล์กำหนดค่า Logstash

2. Elastic Stack: การวิเคราะห์บันทึกความปลอดภัย ล็อกสแตช

ตามค่าเริ่มต้น ไฟล์คอนฟิกูเรชันจะอยู่ในไดเร็กทอรี /etc/logstash/conf.d/ ไฟล์การกำหนดค่าประกอบด้วย 3 ส่วนที่มีความหมาย: INPUT, FILTER, OUTPUT ใน INPUT เราระบุว่าระบบจะนำบันทึกมาจากที่ใด FILTER แยกวิเคราะห์บันทึก - ตั้งค่าวิธีแบ่งข้อความออกเป็นช่องและค่าต่างๆ ใน เอาท์พุท เรากำหนดค่าสตรีมเอาต์พุต - โดยที่ไฟล์บันทึกที่แยกวิเคราะห์จะถูกส่งไป

ขั้นแรก มากำหนดค่า INPUT พิจารณาบางประเภทที่สามารถเป็นได้ - ไฟล์, TCP และ exe

ทีซีพี:

input {
tcp {
    port => 5555
    host => “10.10.1.205”
    type => "checkpoint"
    mode => "server"
}
}

โหมด => "เซิร์ฟเวอร์"
บ่งชี้ว่า Logstash กำลังยอมรับการเชื่อมต่อ

พอร์ต => 5555
โฮสต์ => “10.10.1.205”
เรายอมรับการเชื่อมต่อผ่านที่อยู่ IP 10.10.1.205 (Logstash) พอร์ต 5555 - พอร์ตจะต้องได้รับอนุญาตตามนโยบายไฟร์วอลล์

type => "จุดตรวจ"
เราทำเครื่องหมายเอกสารสะดวกมากหากคุณมีการเชื่อมต่อขาเข้าหลายรายการ ต่อจากนั้น สำหรับการเชื่อมต่อแต่ละครั้ง คุณสามารถเขียนตัวกรองของคุณเองได้โดยใช้โครงสร้าง if แบบลอจิคัล

ไฟล์:

input {
  file {
    path => "/var/log/openvas_report/*"
    type => "openvas"
    start_position => "beginning"
    }
}

คำอธิบายของการตั้งค่า:
เส้นทาง => "/var/log/openvas_report/*"
เราระบุไดเร็กทอรีที่ต้องอ่านไฟล์

ประเภท => "openvas"
ประเภทเหตุการณ์

start_position => "จุดเริ่มต้น"
เมื่อเปลี่ยนไฟล์มันจะอ่านทั้งไฟล์ หากคุณตั้งค่า "สิ้นสุด" ระบบจะรอให้บันทึกใหม่ปรากฏที่ท้ายไฟล์

ผู้บริหาร:

input {
  exec {
    command => "ls -alh"
    interval => 30
  }
}

การใช้อินพุตนี้ คำสั่งเชลล์ (เท่านั้น!) จะถูกเรียกใช้ และเอาต์พุตจะเปลี่ยนเป็นข้อความบันทึก

คำสั่ง => "ls -alh"
คำสั่งที่เราสนใจเอาต์พุต

ช่วงเวลา => 30
ช่วงเวลาการเรียกใช้คำสั่งเป็นวินาที

ในการรับบันทึกจากไฟร์วอลล์ เราจะลงทะเบียนตัวกรอง TCP หรือ UDPขึ้นอยู่กับวิธีการส่งบันทึกไปยัง Logstash

เรากำหนดค่าเอาต์พุตในไฟล์การกำหนดค่า Logstash ในโหมดแก้ไขข้อบกพร่องเพื่อให้เข้าใจว่าข้อความบันทึกมีลักษณะอย่างไร

หลังจากที่เรากำหนดค่า INPUT แล้ว เราจำเป็นต้องเข้าใจว่าข้อความบันทึกจะมีลักษณะอย่างไร และต้องใช้วิธีใดในการกำหนดค่าตัวกรองบันทึก (parser)

ในการดำเนินการนี้ เราจะใช้ตัวกรองที่ส่งออกผลลัพธ์ไปที่ stdout เพื่อดูข้อความต้นฉบับ ไฟล์การกำหนดค่าทั้งหมดในขณะนี้จะมีลักษณะดังนี้:

input 
{
         tcp 
         {
                port => 5555
  	  	type => "checkpoint"
    		mode => "server"
                host => “10.10.1.205”
   	 }
}

output 
{
	if [type] == "checkpoint" 
       {
		stdout { codec=> json }
	}
}

รันคำสั่งเพื่อตรวจสอบ:
sudo /usr/share/logstash/bin//logstash -f /etc/logstash/conf.d/checkpoint.conf
เราเห็นผลลัพธ์แล้วคลิกรูปภาพได้:

2. Elastic Stack: การวิเคราะห์บันทึกความปลอดภัย ล็อกสแตช

หากคัดลอกก็จะมีลักษณะดังนี้:

action="Accept" conn_direction="Internal" contextnum="1" ifdir="outbound" ifname="bond1.101" logid="0" loguid="{0x5dfb8c13,0x5,0xfe0a0a0a,0xc0000000}" origin="10.10.10.254" originsicname="CN=ts-spb-cpgw-01,O=cp-spb-mgmt-01.tssolution.local.kncafb" sequencenum="8" time="1576766483" version="5" context_num="1" dst="10.10.10.10" dst_machine_name="[email protected]" layer_name="TSS-Standard Security" layer_name="TSS-Standard Application" layer_uuid="dae7f01c-4c98-4c3a-a643-bfbb8fcf40f0" layer_uuid="dbee3718-cf2f-4de0-8681-529cb75be9a6" match_id="8" match_id="33554431" parent_rule="0" parent_rule="0" rule_action="Accept" rule_action="Accept" rule_name="Implicit Cleanup" rule_uid="6dc2396f-9644-4546-8f32-95d98a3344e6" product="VPN-1 & FireWall-1" proto="17" s_port="37317" service="53" service_id="domain-udp" src="10.10.1.180" ","type":"qqqqq","host":"10.10.10.250","@version":"1","port":50620}{"@timestamp":"2019-12-19T14:50:12.153Z","message":"time="1576766483" action="Accept" conn_direction="Internal" contextnum="1" ifdir="outbound" ifname="bond1.101" logid="0" loguid="{0x5dfb8c13,

เมื่อดูข้อความเหล่านี้ เราเข้าใจว่าบันทึกมีลักษณะดังนี้: field = value หรือ key = value ซึ่งหมายความว่าตัวกรองที่เรียกว่า kv นั้นเหมาะสม ในการเลือกตัวกรองที่เหมาะสมสำหรับแต่ละกรณี เป็นความคิดที่ดีที่จะทำความคุ้นเคยกับตัวกรองเหล่านี้ในเอกสารทางเทคนิคหรือถามเพื่อน

การตั้งค่าตัวกรอง

ในขั้นตอนสุดท้ายที่เราเลือก kv การกำหนดค่าของตัวกรองนี้จะแสดงด้านล่าง:

filter {
if [type] == "checkpoint"{
	kv {
		value_split => "="
		allow_duplicate_values => false
	}
}
}

เราเลือกสัญลักษณ์ที่เราจะแบ่งฟิลด์และค่า - “=” หากเรามีรายการที่เหมือนกันในบันทึก เราจะบันทึกอินสแตนซ์เดียวในฐานข้อมูล มิฉะนั้นคุณจะพบอาร์เรย์ของค่าที่เหมือนกัน นั่นคือหากเรามีข้อความ "foo = some foo=some" เราจะเขียนเฉพาะ foo = บ้าง

การตั้งค่าเอาต์พุตที่ถูกต้องใน ElasticSearch

เมื่อกำหนดค่าตัวกรองแล้ว คุณสามารถอัปโหลดบันทึกไปยังฐานข้อมูลได้ ElasticSearch:

output 
{
if [type] == "checkpoint"
{
 	elasticsearch 
        {
		hosts => ["10.10.1.200:9200"]
		index => "checkpoint-%{+YYYY.MM.dd}"
    		user => "tssolution"
    		password => "cool"
  	}
}
}

หากเอกสารลงนามด้วยประเภทจุดตรวจสอบ เราจะบันทึกเหตุการณ์ลงในฐานข้อมูล elasticsearch ซึ่งยอมรับการเชื่อมต่อบน 10.10.1.200 บนพอร์ต 9200 ตามค่าเริ่มต้น เอกสารแต่ละฉบับจะถูกบันทึกลงในดัชนีเฉพาะ ในกรณีนี้ เราจะบันทึกลงในดัชนี “จุดตรวจสอบ-” + วันที่เวลาปัจจุบัน แต่ละดัชนีสามารถมีชุดฟิลด์เฉพาะได้ หรือสร้างขึ้นโดยอัตโนมัติเมื่อฟิลด์ใหม่ปรากฏในข้อความ การตั้งค่าฟิลด์และประเภทของฟิลด์สามารถดูได้ในการแมป

หากคุณมีการกำหนดค่าการตรวจสอบสิทธิ์ (เราจะดูในภายหลัง) จะต้องระบุข้อมูลรับรองสำหรับการเขียนไปยังดัชนีเฉพาะ ในตัวอย่างนี้คือ "tssolution" พร้อมรหัสผ่าน "cool" คุณสามารถแยกความแตกต่างสิทธิ์ของผู้ใช้ในการเขียนบันทึกเฉพาะไปยังดัชนีที่ระบุเท่านั้น และไม่มากไปกว่านั้น

เปิดตัว Logstash

ไฟล์การกำหนดค่า Logstash:

input 
{
         tcp 
         {
                port => 5555
  	  	type => "checkpoint"
    		mode => "server"
                host => “10.10.1.205”
   	 }
}

filter {
        if [type] == "checkpoint"{
	kv {
		value_split => "="
		allow_duplicate_values => false
	}
        }
}

output 
{
if [type] == "checkpoint"
{
 	elasticsearch 
        {
		hosts => ["10.10.1.200:9200"]
		index => "checkpoint-%{+YYYY.MM.dd}"
    		user => "tssolution"
    		password => "cool"
  	}
}
}

เราตรวจสอบไฟล์การกำหนดค่าเพื่อความถูกต้อง:
/usr/share/logstash/bin//logstash -f checkpoint.conf
2. Elastic Stack: การวิเคราะห์บันทึกความปลอดภัย ล็อกสแตช

เริ่มกระบวนการ Logstash:
sudo systemctl เริ่ม logstash

เราตรวจสอบว่ากระบวนการได้เริ่มต้นแล้ว:
บันทึกสถานะ sudo systemctl

2. Elastic Stack: การวิเคราะห์บันทึกความปลอดภัย ล็อกสแตช

ตรวจสอบว่าซ็อกเก็ตอยู่หรือไม่:
netstat -nat |grep 5555

2. Elastic Stack: การวิเคราะห์บันทึกความปลอดภัย ล็อกสแตช

ตรวจสอบบันทึกใน Kibana

หลังจากที่ทุกอย่างทำงานแล้ว ให้ไปที่ Kibana - Discover ตรวจสอบให้แน่ใจว่าทุกอย่างได้รับการกำหนดค่าอย่างถูกต้อง สามารถคลิกรูปภาพได้!

2. Elastic Stack: การวิเคราะห์บันทึกความปลอดภัย ล็อกสแตช

บันทึกทั้งหมดอยู่ในตำแหน่งแล้ว และเราสามารถเห็นฟิลด์และค่าทั้งหมดได้!

ข้อสรุป

เราดูวิธีการเขียนไฟล์การกำหนดค่า Logstash และด้วยเหตุนี้เราจึงได้ parser ของฟิลด์และค่าทั้งหมด ตอนนี้เราสามารถค้นหาและวางแผนสำหรับฟิลด์เฉพาะได้แล้ว ต่อไปในหลักสูตรเราจะดูการแสดงภาพใน Kibana และสร้างแดชบอร์ดที่เรียบง่าย เป็นที่น่าสังเกตว่าไฟล์การกำหนดค่า Logstash จำเป็นต้องได้รับการอัปเดตอย่างต่อเนื่องในบางสถานการณ์ เช่น เมื่อเราต้องการแทนที่ค่าของฟิลด์จากตัวเลขเป็นคำ ในบทความต่อๆ ไป เราจะทำเช่นนี้อย่างต่อเนื่อง

ดังนั้นคอยติดตามTelegram, Facebook, VK, บล็อกโซลูชัน TS), Yandex Zen.

ที่มา: will.com

เพิ่มความคิดเห็น