เทคนิคการจัดการระบบ Centralized Log Management แบบใหม่ร่วมกับระบบเดิม
บทสรุปองค์ความรู้
ปัจจุบันองค์กรขนาดใหญ่รวมถึงมหาวิทยาลัยบูรพา มีการจัดเก็บข้อมูลการจราจรทางคอมพิวเตอร์เพื่อให้สอดคล้องกับ พ.ร.บ. ว่าด้วยการกระทำความผิดทางคอมพิวเตอร์ แบบ Syslog Server เพื่อช่วยในการบริหารจัดการล็อกไฟล์ (Log files) ที่ส่งมาจาก อุปกรณ์เครือข่าย และเครื่องแม่ข่าย โดยใช้ซอฟต์แวร์ Rsyslog ในการจัดเก็บและจัดการล็อกไฟล์แบบรวมศูนย์ด้วย Command Line ยังไม่มีระบบจัดการแบบ GUI ทำให้การบริหารจัดการค่อนข้างยุ่งยาก การที่จะวิเคราะห์เหตุการณ์เมื่อเกิดปัญหาเกิดขึ้นกับองค์กร โดยการที่จะเข้าไปตรวจสอบข้อมูลล็อกไฟล์ต้องใช้เวลานานหรือข้อมูลไม่สัมพันธ์กันเนื่องจากแหล่งที่ส่งข้อมูลมาจัดเก็บมีหลายแหล่ง จึงได้เกิดแนวคิดนำระบบการจัดการระบบ Centralized Log Management แบบ GUI มาใช้เพื่อให้สามารถค้นหา ประมวลผล และแสดงผลข้อมูล ได้ง่ายและสะดวกมากขึ้น โดยในส่วนการจัดเก็บล็อกไฟล์ยังคงใช้การจัดเก็บแบบ Syslog Server แบบเดิมเนื่องด้วยเหตุผลด้าน Information Security (Confidentiality Integrity และ Availability)
ดังนั้นเพื่อให้บรรลุเหตุผลและวัตถุประสงค์ดังกล่าวข้างต้นจึงได้ดำเนินการค้นคว้าหาวิธีการและทำการทดสอบวิธีการที่ค้นคว้ามา นำมาพัฒนาใช้กับระบบ Central Log ที่มีอยู่เดิม โดยการติดตั้งซอฟต์แวร์ที่สามารถจัดเก็บ ค้นหา ประมวลผล และแสดงผลข้อมูล Central Log ได้ โดยขณะทำการทดสอบได้ทดลองใช้ซอฟต์แวร์ เช่น ซอฟต์แวร์ LogAnalyzer ร่วมกับ Rsyslog ชุดซอฟต์แวร์ ELK (Elasticsearch, Logstash, Kibana) ร่วมกับ Rsyslog และซอฟต์แวร์ Graylog Open Source ร่วมกับ Rsyslog จากการค้นคว้าแล้วทดสอบพบว่าซอฟต์แวร์ Graylog Open Source สามารถทำงานร่วมกับระบบ Central Log ที่มีอยู่เดิม (Rsyslog) ได้อย่างมีประสิทธิภาพดี โดยการปรับแต่งค่า Config ต่างๆของซอฟต์แวร์เดิมและซอฟต์แวร์ใหม่ โดยที่การปรับแต่งค่าซอฟต์แวร์ที่เกี่ยวข้องทำได้สะดวก ไม่ซับซ้อนเกินไป ในขณะที่ Graylog Open Source เป็นเครื่องมือโอเพนซอร์ซแพลตฟอร์มแบบบูรณาการสำหรับการรวบรวม จัดทำดัชนี และวิเคราะห์ข้อมูลบันทึก ประกอบด้วยส่วนติดต่อทางเว็บแบบ GUI ส่วนเซิร์ฟเวอร์ Graylog ส่วนโหนด Elasticsearch และส่วนฐานข้อมูล Mongo จากการทดสอบสามารถใช้งาน Graylog Open Source ร่วมกับ Rsyslog Server สำหรับใช้เป็น Centralized Log Management ตามสภาพแวดล้อมเดิมในฝั่งของ Host (Rsyslog Client) โดย Host ยังไม่ต้องแก้ไข Agent ในการส่ง Log มายัง Centralized Log Management ใหม่ Host สามารถส่ง Log มายัง Rsyslog Server แบบเดิมได้ ทำให้ระบบเครือข่ายและเครื่องแม่ข่ายที่มีจำนวนมาก และ Centralized Log Management แบบใหม่ร่วมกับระบบเดิม ยังคงทำงานต่อเนื่องได้อย่างมีประสิทธิภาพ
ภาพรวมระบบ

Log Server เดิมที่มีอยู่เป็น Linux Server ที่มีโปรแกรม Rsyslog อยู่แล้วพร้อมกับการติดตั้ง Ubuntu Server คือ Rsyslog Version: 8.2001.0-1ubuntu1.3 โดย Log Server มี Rsyslog
มีคุณสมบัติดังต่อไปนี้
Virtual Machine แบบ Hyper-V
OS: Linux Ubunutu Server 20.04
vCPU Intel(R) Xeon(R) CPU E5-2640 0 @ 2.50GHz x 24 Core
vRam 64 GB
vHarddisk 9 TB
IP 10.5.2.xx
Rsyslog
Rsyslog ที่ติดตั้งตรวจสอบโดยใช้คำสั่ง # systemctl status rsyslog
Rsyslog Config File ประกอบไปด้วยไฟล์
/etc/rsyslog.conf
/etc/rsyslog.d/
01-json-template.conf
20-ufw.conf
21-cloudinit.conf
50-default.conf
/etc/rsyslog.conf
module(load=”imuxsock”) # provides support for local system logging module(load=”immark”) # provides –MARK– message capability provides UDP syslog reception module(load=”imudp”) input(type=”imudp” port=”514″) provides TCP syslog reception module(load=”imtcp”) input(type=”imtcp” port=”514″) $template remote-incoming-logs, “/var/Example/rsyslog/%FROMHOST-IP%/%SYSLOGFACILITY-TEXT%.log” . ?remote-incoming-logs & ~ $template remote-incoming-logs,”/var/log/Centralized_Log/%HOSTNAME%/%PROGRAMNAME%/%$year%-%$month%-%$day%.log” . ?remote-incoming-logs & ~ provides kernel logging support and enable non-kernel klog messages module(load=”imklog” permitnonkernelfacility=”on”) # GLOBAL DIRECTIVES # # Use traditional timestamp format. To enable high precision timestamps, comment out the following line. # $ActionFileDefaultTemplate RSYSLOG_TraditionalFileFormat Filter duplicated messages $RepeatedMsgReduction on # Set the default permissions for all log files. # $FileOwner syslog $FileGroup adm $FileCreateMode 0640 $DirCreateMode 0755 $Umask 0022 $PrivDropToUser syslog # Where to place spool and state files # $WorkDirectory /var/spool/rsyslog # Include all config files in /etc/rsyslog.d/ # $IncludeConfig /etc/rsyslog.d/*.conf |
/etc/rsyslog.d/50-default.conf
*.* action(type=”omfwd” target=”10.5.4.xx” port=”5140″ protocol=”udp”) auth,authpriv.* /var/log/auth.log *.*;auth,authpriv.none -/var/log/syslog kern.* -/var/log/kern.log mail.* -/var/log/mail.log mail.err /var/log/mail.err *.emerg :omusrmsg:* |
โปรแกรม Rsyslog ได้ทำการ Rotate Log และบีบอัด File ที่ 90 วัน ไว้โดยตรวจสอบที่ crontab -e
# m h dom mon dow command 0 0 * * * find /var/log/Centralized_Log -type f -mtime 1 -print -exec gzip {} \; 0 0 * * * find /var/log/Centralized_Log -type f -mtime +89 -exec rm -f {} \; |
ตรวจสอบจำนวน Host (Server,Network Device) ที่ส่งมายัง Rsyslog มีจำนวนทั้งหมด 59 Host
/var/log/Centralized_Logs# |
New Centralized Log Management (เครื่องที่ทดสอบ)
มีคุณสมบัติดังต่อไปนี้
Virtual Machine แบบ Hyper-V
OS: Linux Ubunutu Server 20.04
vCPU Intel(R) Xeon(R) CPU E5-2640 0 @ 2.50GHz x 8 Core
vRam 16 GB
vHarddisk 500 GB
IP 10.5.4.xx
ติดตั้ง Docker โดยตรวจสอบด้วยคำสั่ง docker –version และ docker-compose –version
Docker version 20.10.14, build a224086349 docker-compose version 1.29.2 |
ติดตั้ง Graylog Server
Graylog Server ที่ติดตั้งผ่าน Docker ประกอบไปด้วยโปรแกรม Graylog, MongoDB และ Elasticsearch สำหรับ Graylog Server ที่ใช้เป็น Free Version (Graylog 4.2.11+ec7c16b on fe5f96b1c3ec (Oracle Corporation 1.8.0_332 on Linux 5.4.0-122-generic))
สร้าง Directory ชื่อ graylog ไปที่เว็บไซต์ https://github.com/Graylog2/docker-compose ทำการ ดาว์นโหลด File ที่เกี่ยวข้องเก็บไว้ใน graylog directory (/home/buu/graylog) ประกอบไปด้วย Directory/File ดังนี้ config/ plugin/ .env docker-compose.yml
ตั้งค่า Configuration ที่สำคัญของ Graylog บน Docker มี
ไฟล์ .env
# You MUST set a secret to secure/pepper the stored user passwords here. Use at least 64 characters. # Generate one by using for example: pwgen -N 1 -s 96 # ATTENTION: This value must be the same on all Graylog nodes in the cluster. # Changing this value after installation will render all user sessions and encrypted values in the database invalid. (e.g. encrypted access tokens) GRAYLOG_PASSWORD_SECRET=”xxxxxxxxxxx” # You MUST specify a hash password for the root user (which you only need to initially set up the # system and in case you lose connectivity to your authentication backend) # This password cannot be changed using the API or via the web interface. If you need to change it, # modify it in this file. # Create one by using for example: echo -n yourpassword | shasum -a 256 # and put the resulting hash value into the following line # CHANGE THIS! GRAYLOG_ROOT_PASSWORD_SHA2=”xxxxxxxxxx” |
File docker-compose.yml
version: “3.8” services: mongodb: image: “mongo:5.0” volumes: – “mongodb_data:/data/db” restart: “on-failure” elasticsearch: environment: #ES_JAVA_OPTS: “-Xms1g -Xmx1g -Dlog4j2.formatMsgNoLookups=true” ES_JAVA_OPTS: “-Xms2g -Xmx2g -Dlog4j2.formatMsgNoLookups=true” bootstrap.memory_lock: “true” discovery.type: “single-node” http.host: “0.0.0.0” action.auto_create_index: “false” image: “docker.elastic.co/elasticsearch/elasticsearch-oss:7.10.2” ulimits: memlock: hard: -1 soft: -1 volumes: – “es_data:/usr/share/elasticsearch/data” restart: “on-failure” graylog: image: “graylog/graylog:4.2” depends_on: elasticsearch: condition: “service_started” mongodb: condition: “service_started” entrypoint: “/usr/bin/tini — wait-for-it elasticsearch:9200 — /docker-entrypoint.sh” environment: GRAYLOG_TIMEZONE: “Asia/Bangkok” TZ: “Asia/Bangkok” GRAYLOG_NODE_ID_FILE: “/usr/share/graylog/data/config/node-id” GRAYLOG_PASSWORD_SECRET: ${GRAYLOG_PASSWORD_SECRET:?Please configure GRAYLOG_PASSWORD_SECRET in the .env file} GRAYLOG_ROOT_PASSWORD_SHA2: ${GRAYLOG_ROOT_PASSWORD_SHA2:?Please configure GRAYLOG_ROOT_PASSWORD_SHA2 in the .env file} GRAYLOG_HTTP_BIND_ADDRESS: “0.0.0.0:9000” GRAYLOG_HTTP_EXTERNAL_URI: “http://localhost:9000/” GRAYLOG_ELASTICSEARCH_HOSTS: “http://elasticsearch:9200” GRAYLOG_MONGODB_URI: “mongodb://mongodb:27017/graylog” ports: – “5044:5044/tcp” # Beats – “5140:5140/udp” # Syslog – “5140:5140/tcp” # Syslog – “5555:5555/tcp” # RAW TCP – “5555:5555/udp” # RAW TCP – “9000:9000/tcp” # Server API – “12201:12201/tcp” # GELF TCP – “12201:12201/udp” # GELF UDP #- “10000:10000/tcp” # Custom TCP port #- “10000:10000/udp” # Custom UDP port – “13301:13301/tcp” # Forwarder data – “13302:13302/tcp” # Forwarder config volumes: – “graylog_data:/usr/share/graylog/data/data” – “graylog_journal:/usr/share/graylog/data/journal” – “./config/graylog.conf:/usr/share/graylog/data/config/graylog.conf:ro,z” #- “./config/log4j2.xml:/usr/share/graylog/data/config/log4j2.xml:ro,z” #- “./config/node-id.init:/usr/share/graylog/config/node-id:ro,z” #- “./plugin:/usr/share/graylog/plugin” restart: “on-failure” volumes: mongodb_data: es_data: graylog_data: graylog_journal: |
จากนั้นให้ Graylog Server ทำงานด้วยการใช้คำสั่ง docker-compose up –d
แล้วตรวจสอบด้วยคำสั่ง docker-compose ps
Server:~/graylog$ docker-compose ps Name Command State Ports —————————————————————————————————————————————————————————————————– graylog_elasticsearch_1 /tini — /usr/local/bin/do … Up 9200/tcp, 9300/tcp graylog_graylog_1 /usr/bin/tini — wait-for- … Up (healthy) 0.0.0.0:12201->12201/tcp,:::12201->12201/tcp, 0.0.0.0:12201->12201/udp,:::12201->12201/udp, 0.0.0.0:13301->13301/tcp,:::13301->13301/tcp, 0.0.0.0:13302->13302/tcp,:::13302->13302/tcp, 0.0.0.0:5044->5044/tcp,:::5044->5044/tcp, 0.0.0.0:5140->5140/tcp,:::5140->5140/tcp, 0.0.0.0:5140->5140/udp,:::5140->5140/udp, 0.0.0.0:5555->5555/tcp,:::5555->5555/tcp, 0.0.0.0:5555->5555/udp,:::5555->5555/udp, 0.0.0.0:9000->9000/tcp,:::9000->9000/tcp graylog_mongodb_1 docker-entrypoint.sh mongod Up 27017/tcp |
เปิดโปรแกรม Graylog ที่เว็บบราวเซอร์ http://10.5.4.xx:9000/

ที่ System / Inputs


Dashboard ที่ Graylog Server สร้างไว้แบบ Default ตรวจสอบได้ที่ Dashboards > Source

สร้าง Dashboard ที่ Graylog Server ให้แสดงจำนวน Active Host โดยมีจำนวน Host ที่ Active แล้วส่ง Syslog มายัง Rsyslog Server โดยดูช่วงเวลา 1 วันย้านหลังขณะที่ตรวจสอบมีทั้งสิ้น 272 Host

ขอบคุณครับ