Centralized Log Server
การติดตั้ง Centralized Log Server บน Linux SUSE Enterprise Server 10 SP2.
# Centralize Log Server IP Address : 192.168.1.13
แก้ไขโปรแกรม syslog เพื่อให้รับ Message จากเครื่องอื่นๆ
$ vim /etc/sysconfig/syslog
SYSLOGD_PARAMS="" แก้ไขเป็น SYSLOGD_PARAMS="-r -m 0"
-r , -m เพื่ออนุญาตใหรับ Message จากเครื่องอื่นๆ
:wq! (บันทึก)
Configuration Firewall
$ vi /etc/sysconfig/scripts/SuSEfirewall2-custom
ให้เพิ่มบรรทัดข้างล่างในส่วนของ fw_custom_before_antispoofing()
#incoming syslog clients
iptables -t filter -A INPUT -p udp -s 192.168.0.2 --dport 514 -j ACCEPT
iptables -t filter -A INPUT -p udp -s 192.168.1.10 --dport 514 -j ACCEPT
iptables -t filter -A INPUT -p udp -s 192.168.11.2 --dport 514 -j ACCEPT
iptables -t filter -A INPUT -p udp -s 192.168.11.200 --dport 514 -j ACCEPT
:wq! (บันทึก)
$ vi /etc/sysconfig/SuSEfirewall2
FW_CUSTOMRULES="/etc/sysconfig/scripts/SuSEfirewall2-custom" <-uncomment
#FW_CUSTOMRULES="" <-comment
:wq! (บันทึก)
$ rcSuSEfirewall2 restart
Configuration syslog-ng
$ vim /etc/syslog/syslog-ng.conf
#
# Global options.
#
#options { long_hostnames(off); sync(0); perm(0640); stats(3600); };
options {
sync (0);
time_reopen (10);
log_fifo_size (1000);
long_hostnames (off);
use_dns (no);
<-ให้ resolve ค่า IP address ในข้อมูลล็อก เป็น hostname (default = yes)
use_fqdn (no);
<-บันทึก full name ของเครื่องที่ส่ง tcp/udp message (default = no)
create_dirs (no);
<-เป็นตัวบอกว่าจะให้ syslog-ng สร้างไดเรกทอรีใหม่ได้หรือไม่ ในกรณีที่ path ที่ระบุไม่มีอยู่จริงในระบบ (default = no)
keep_hostname (yes);
<-ให้เชื่อใจ (trust) ค่า hostname ที่อยู่ใน tcp/udp message (default = no)
};
source src {
#
internal();
<-ล็อกที่รับมาจาก syslog-ng daemon
#pipe("/proc/kmsg");
<-ล็อกที่รับมาจาก name pipe
unix-dgram("/dev/log");
<-ล็อกที่รับมาจาก Unix socket ที่อยู่ในโหมด connectionless datagram เช่น ล็อกของ klogd จาก /dev/log
#file("/proc/kmsg" log_prefix("kernel:"));
<-ล็อกที่อ่านมาจากไฟล์ที่ระบุไว้ เช่น /proc/kmsg
unix-dgram("/var/lib/dhcp/dev/log");
unix-dgram("/var/lib/named/dev/log");
};
## สำหรับค่าที่ใช้งาน ให้เพิ่มในส่วนของ options ##
options {
sync (0);
time_reopen (10);
log_fifo_size (1000);
long_hostnames (off);
use_dns (no);
use_fqdn (no);
create_dirs (no);
keep_hostname (yes);
log_msg_size (4096);
};
##-----------------------------------------------------#
#Source from remote client
source s_client {
udp(ip("0.0.0.0") port(514));
};
##-----------------------------------------------------#
# Filter Log Squid (Proxy) from clients:
#
filter f_squid { program("squid"); };
destination d_squid {
file("/var/log/$HOST/$YEAR/$MONTH/squid_access.log"
owner(root) group(root) perm(0600)
create_dirs(yes) dir_perm(0700));
};
log { source(s_client); filter(f_squid); destination(d_squid); };
##-----------------------------------------------------#
# Filter Log ssh from clients:
#
filter f_ssh { program("sshd") and facility(auth, authpriv); };
destination d_ssh {
file("/var/log/$HOST/$YEAR/$MONTH/ssh_access.log"
owner(root) group(root) perm(0600)
create_dirs(yes) dir_perm(0700));
};
log { source(s_client); filter(f_ssh); destination(d_ssh); };
##-----------------------------------------------------#
# Filter Log Firewall (iptables) from clients:
#
destination d_firewall {
file("/var/log/$HOST/$YEAR/$MONTH/firewall"
owner(root) group(root) perm(0600)
create_dirs(yes) dir_perm(0700));
};
log { source(s_client); filter(f_iptables); destination(d_firewall); };
##-----------------------------------------------------#
# Log apache2 (httpd) web server:
#
filter f_apache { program("apache")or match ("logger:");};
destination d_apache {
file("/var/log/$HOST/$YEAR/$MONTH/apache_access.log"
owner(root) group(root) perm(0640)
create_dirs(yes) dir_perm(0700));
};
log { source(s_client); filter(f_apache); destination(d_apache); };
##------------------------------------------------------#
# Log pop3 from mail_server Server:
#
filter f_pop3 { match("vpopmail_server|pop3"); };
destination d_pop3 {
file("/var/log/$HOST/$YEAR/$MONTH/pop3.log"
owner(root) group(root) perm(0600)
create_dirs(yes) dir_perm(0700));
};
log { source(s_client); filter(f_pop3); destination(d_pop3); };
##-------------------------------------------------------#
# Log IMAP from mail_server Server:
#
filter f_imap { match("imap"); };
destination d_imap {
file("/var/log/$HOST/$YEAR/$MONTH/imap.log"
owner(root) group(root) perm(0600)
create_dirs(yes) dir_perm(0700));
};
log { source(s_client); filter(f_imap); destination(d_imap); };
##---------------------------------------------------------#
# Log SMTP or Sendmail_server from mail_server Server:
#
filter f_smtp { match("qmail_server-scanner"); };
destination d_smtp {
file("/var/log/$HOST/$YEAR/$MONTH/smtp.log"
owner(root) group(root) perm(0600)
create_dirs(yes) dir_perm(0700));
};
log { source(s_client); filter(f_smtp); destination(d_smtp); };
:wq (บันทึก)
Note: MTA is Qmail_server.
- vpopmain คือ Package สำหรับทำ Multiple domain name.
-Courier-imap คือ IMAP จาก Courier mail_server server บริการ POP3, POP3-SSL, IMAP และ IMAP-SSL
-qmail_serveradmin คือ Web-based สำหรับผู้ดูแลระบบ (administrator) ที่สามารถเข้าถึง mail_serverboxes, autoresponders, และ mail_serverling lists ภายใต้ domain นั้นๆ.
-vqadmin คือ Web-based สำหรับจัดการ สร้าง, แก้ไข, ลบ, อีเมล์บนโดเมน.
-ucspi-ss คือ โปรแกรมเปิดบริการ socket SSL.
$ SuSEconfig --module syslog-ng
$ rcsyslog restart
$ syslog-ng <-ถ้าไม่ขึ้น error ก็ผ่านครับ.
หรือ
$ syslog-ng -d <- ดู debug
Configuration Apache2 (เครื่องเครื่อง mail_server server.)
$ vi /etc/apache2/httpd.conf
ErrorLog /var/log/apache2/error_log
ErrorLog syslog
LogLevel notice
CustomLog "|/bin/logger -p local1.info" combined
:wq! (บันทึก)
$ rcapache2 reload
Ref : http://www.devshed.com/c/a/Apache/Logging-in-Apache/4/
ตรวจสอบ Log ว่ามี client ติดต่อเข้ามายัง.
$ tail -f /var/log/messages
syslog-ng[5236]: AF_INET client connected from 192.16 8.1.11
แสดงว่ามีการติดต่อเข้ามาแล้ว.
สร้างไฟล์สำหรับ rotateใน /etc/logrotate.d/
$ vi /etc/logrotate.d/logserver
#Rotate 90
/var/log/mail_server/*/*/squid_access.log
/var/log/mail_server/*/*/ssh_access.log
/var/log/mail_server/*/*/firewall.log
/var/log/mail_server/*/*/apache_access.log
/var/log/pattayapdc/*/*/squid_access.log
/var/log/pattayapdc/*/*/ssh_access.log
/var/log/pattayapdc/*/*/firewall.log
/var/log/pattayapdc/*/*/apache_access.log
/var/log/koratpdc/*/*/squid_access.log
/var/log/koratpdc/*/*/ssh_access.log
/var/log/koratpdc/*/*/firewall.log
/var/log/chaingmaipdc/*/*/squid_access.log
/var/log/chaingmaipdc/*/*/ssh_access.log
/var/log/chaingmaipdc/*/*/firewall.log
{
compress
dateext
maxage 365
rotate 90
missingok
notifempty
size +4096k
create 640 root root
postrotate
/etc/init.d/syslog reload
endscript
}
:wq! (บันทึก)
ตั้งเวลาให้ทำการ ratate ด้วย crontab.
$ crontab -e
# logserver
59 23 * * * /usr/sbin/logrotate -f /etc/logrotate.d/logserver > /dev/null
สั่ง Logrotate ทําการ Reload เฉพาะ Configuration File (ถ้าต้องการทดสอบ)
$ logrotate -f /etc/logrotate.d/logserver
สร้าง Script ดู Log. (ในกรณีที่ไม่ได้ติดตั้ง mullitaill)
ตัวอย่าง : Script สำหรับดู log proxy (squid)
$ vi /logsquid-koratpdc
#!/bin/sh
ylog=$(date +%Y)
mlog=$(date +%m)
curelog=squid_access.log
hostlog=pattayapdc
tail -f /var/log/$hostlog/$ylog/$mlog/$curelog
$ chmod 700 /logsquid-koratpdc
รันคำสั่งสำหรับดู Log.
$ /logsquid-koratpdc
เข้ารหัสไฟล์ (Encryption Log files and md5sum):
สร้าง Directory สำหรับเก็บ Encrypt Logs
$ mkdir /var/log/backup
$ cd /var/log/backup
สร้าง Scripts Encryption
$ vi encrypt.sh
#!/bin/sh
## Script encryption log files. ##
mkdir $(date +%F)
cd $(date +%F)
pass="1234"
server1=mail_serverserver
server2=koratpdc
server3=chaingmaipdc
server4=pattayapdc
# Path files.
log_path1=/var/log/mail_server
log_path2=/var/log/koratpdc
log_path3=/var/log/chaingmaipdc
log_path4=/var/log/pattayapdc
# Create archive.
tar zcvf $server1.tar.gz $log_path1
tar zcvf $server2.tar.gz $log_path2
tar zcvf $server3.tar.gz $log_path3
tar zcvf $server4.tar.gz $log_path4
# Encryption files.
openssl des -in "$server1".tar.gz -k "$pass" -out "$server1".tar.gz.sec
openssl des -in "$server2".tar.gz -k "$pass" -out "$server2".tar.gz.sec
openssl des -in "$server3".tar.gz -k "$pass" -out "$server3".tar.gz.sec
openssl des -in "$server4".tar.gz -k "$pass" -out "$server4".tar.gz.sec
# Check sum.
md5sum "$server1".tar.gz.sec > MD5SUM-$server1
md5sum "$server2".tar.gz.sec > MD5SUM-$server2
md5sum "$server3".tar.gz.sec > MD5SUM-$server3
md5sum "$server4".tar.gz.sec > MD5SUM-$server4
# Delete archive.
rm *.tar.gz
echo "encrypt finish. "
:wq! (บันทึก)
$ chmod 700 encrypt.sh
ถอดรหัสไฟล์ (Decryption Log files):
$ vi decrypt.sh
#!/bin/sh
## Script encryption log files. ##
mkdir $(date +%F)
cd $(date +%F)
pass="1234"
server1=mail_serverserver
server2=koratpdc
server3=chaingmaipdc
server4=pattayapdc
# Decryption files.
openssl des -d -in "$server1".tar.gz.sec -k "$pass" -out "$server1".tar.gz
openssl des -d -in "$server2".tar.gz.sec -k "$pass" -out "$server2".tar.gz
openssl des -d -in "$server3".tar.gz.sec -k "$pass" -out "$server3".tar.gz
openssl des -d -in "$server4".tar.gz.sec -k "$pass" -out "$server4".tar.gz
# Check SUM.
md5sum -c MD5SUM-$server1 >> OUTPUT_MD5
md5sum -c MD5SUM-$server2 >> OUTPUT_MD5
md5sum -c MD5SUM-$server3 >> OUTPUT_MD5
md5sum -c MD5SUM-$server4 >> OUTPUT_MD5
# Extact files
tar zxvf $server1.tar.gz
tar zxvf $server2.tar.gz
tar zxvf $server3.tar.gz
tar zxvf $server4.tar.gz
# Delete archive.
rm *.tar.gz
echo "decrypt finish. "
:wq! (บันทึก)
$ chmod 700 decrypt.sh
ตรวจสอบ Log ไฟล์ว่ามีการแก้ใขหรือไม่ (Check sum):
$ cat OUTPUT_MD5
# ถ้า Log files อยู่ในสภาพเดิม :
pattayapdc.tar.gz.sec: OK
# ถ้า Log files มีการแก้ไข :
pattayapdc.tar.gz.sec: no properly formatted MD5 checksum lines found.
ตั้งเวลาให้ Scripts ทำงาน
#encryption log
0 0 * * 0 /var/log/backup/encrypt.sh 2>&1 > /dev/null
ติดตั้งโปรแกรมเพื่อดู Log ไฟล์ (Log Monitoring by multitail):
$ wget http://www.vanheusden.com/multitail/multitail-5.2.2.tgz
$ tar xvf multitail-5.2.2.tgz
$ cd multitail-5.2.2
$ make install
$ make thanks
ตัวอย่างการใช้คำสั่ง
Show 5 logfiles while merging 2 and put them in 2 columns with only one in the left column:
$ multitail -s 2 -sn 1,3 /var/log/mail_server/2008/09/apache_access.log -I /var/log/mail_server/2008/09/pop3.log /var/log/pattayapdc/2008/09/squid_access.log /var/log/koratpdc/2008/09/squid_access.log /var/log/squid/access.log
Show 3 logfiles in 2 columns:
$ multitail -s 2 /var/log/mail_server/2008/09/smtp.log /var/log/mail_server/2008/09/imap.log /var/log/mail_server/2008/09/pop3.log
แก้ไขให้เมล์ที่ส่งภายใน โดเมน (local to local) ให้เข้าqmail_server-scanner (Changing Your Tcp Rules):
$ /etc/tcprules.d/tcp.smtp
# adding the Qmail_serverQUEUE variables to 127.
127.:allow,RELAYCLIENT="",Qmail_serverQUEUE="/var/qmail_server/bin/qmail_server-scanner-queue.pl"
192.168.1.1:allow,BADMIMETYPE="",BADLOADERTYPE="M",CHKUSER_RCPTLIMIT="50",
CHKUSER_WRONGRCPTLIMIT="10",Qmail_serverQUEUE="/var/qmail_server/bin/qmail_server-scanner-queue.pl"
192.168.:allow,RELAYCLIENT="",Qmail_serverQUEUE="/var/qmail_server/bin/qmail_server-scanner-queue.pl"
:allow,BADMIMETYPE="",BADLOADERTYPE="M",CHKUSER_RCPTLIMIT="50",
CHKUSER_WRONGRCPTLIMIT="10",Qmail_serverQUEUE="/var/qmail_server/bin/qmail_server-scanner-queue.pl"
:wq! (บันทึก)
Rebuild cdb file:
$ qmail_serverctl cdb
Restart Qmail_server Server:
$ qmail_serverctl restart
ตรวจสอบ log (qmail_server-scanner): ที่เครื่อง Centralized Log Server
$ tail -f /var/log/mail_server
สำหรับ Client
Firewall Setting:
$ vi /etc/sysconfig/SuSEfirewall2
FW_CUSTOMRULES="/etc/sysconfig/scripts/SuSEfirewall2-custom" <-uncomment
#FW_CUSTOMRULES="" <-comment
:wq! (บันทึก)
$ rcSuSEfirewall2 restart
$ vi /etc/sysconfig/scripts/SuSEfirewall2-custom
#example: allow incoming multicast packets for any routing protocol
#iptables -A INPUT -j ACCEPT -d 224.0.0.0/24
#Syslog-ng
iptables -t filter -A OUTPUT -p udp -s 192.168.1.13 --dport 514 -j ACCEPT
true
}
:wq! (บันทึก)
Update Squid 2.5 to 2.6 (Version 2.5 ไม่สนับสนุน syslog)
$ rcsquid stop
$ rpm -Uvh squid-2.6.STABLE5-31.1.i586.rpm
(created as /etc/squid/squid.conf.rpmnew)
(rpm -Fvh ) -F : upgrade package(s) if already installed
$ vim /etc/squid/squid.conf
# comments
#httpd_accel_host virtual
#httpd_accel_port 80
#httpd_accel_with_proxy on
#httpd_accel_uses_host_header on
http_port 3128 transparent
##Additional line for Log Server
access_log syslog squid
access_log /var/log/squid/access.log squid
cache_dir ufs /var/cache/squid 2000 16 256
access_log /var/log/squid/access.log squid
cache_log /var/log/squid/cache.log
cache_store_log /var/log/squid/store.log
:wq! (บันทึก)
$ rcsquid start
Config syslog-ng (Version 1.6.8)
$ vim /etc/syslog-ng/syslog-ng.conf
#options { long_hostnames(off); sync(0); perm(0640); stats(3600); };
options {
sync (0);
time_reopen (10);
log_fifo_size (1000);
long_hostnames (off);
use_dns (no);
use_fqdn (no);
create_dirs (no);
keep_hostname (yes);
};
source src {
internal();
unix-dgram("/dev/log");
unix-dgram("/var/lib/dhcp/dev/log"); # for dhcp server, if you run service dhcp.
unix-dgram("/var/lib/named/dev/log");
};
ให้พิมพ์เพิ่ม ต่อจากบรรทัดสุดท้าย
## LogServer additional by Sontaya Photibut ##
destination logserver {udp("192.168.1.13" port(514));};
#
# Squid log to Centralized Log Server:
#
filter f_squid { program("squid"); };
destination d_squid {
file("/var/log/$HOST/$YEAR/$MONTH/squid.$YEAR-$MONTH-$DAY"
owner(root) group(root) perm(0600)
create_dirs(yes) dir_perm(0700));
};
log { source(src); filter(f_squid); destination(logserver); };
#
# SSH log to Centralized Log Server:
#
filter f_ssh { program("sshd") and facility(auth, authpriv); };
destination d_ssh {
file("/var/log/$HOST/$YEAR/$MONTH/ssh.$YEAR-$MONTH-$DAY"
owner(root) group(root) perm(0600)
create_dirs(yes) dir_perm(0700));
};
log { source(src); filter(f_ssh); destination(logserver); };
#
# Firewall (iptables) log to Centralized Log Server:
#
destination d_firewall {
file("/var/log/$HOST/$YEAR/$MONTH/firewall.$YEAR-$MONTH-$DAY"
owner(root) group(root) perm(0600)
create_dirs(yes) dir_perm(0700));
};
log { source(src); filter(f_iptables); destination(logserver); };
#
# Apache2 (httpd) log to Centralized Log Server:
#
filter f_apache { program("apache") or match ("logger:"); };
destination d_apache {
file("/var/log/$HOST/$YEAR/$MONTH/apache.$YEAR-$MONTH-$DAY"
owner(root) group(root) perm(0600)
create_dirs(yes) dir_perm(0700));
};
log { source(src); filter(f_apache); destination(logserver); };
#
# POP3 Log Service.
#
filter f_pop3 { match("vpopmail|pop3"); };
destination d_pop3 {
file("/var/log/$HOST/$YEAR/$MONTH/pop3.log"
owner(root) group(root) perm(0600)
create_dirs(yes) dir_perm(0700));
};
log { source(src); filter(f_pop3); destination(logserver); };
#
# IMAP Log Service.
#
filter f_imap { match("imap"); };
destination d_imap {
file("/var/log/$HOST/$YEAR/$MONTH/imap.log"
owner(root) group(root) perm(0600)
create_dirs(yes) dir_perm(0700));
};
log { source(src); filter(f_imap); destination(logserver); };
#
# SMTP or Sendmail Log Service.
#
filter f_smtp { match("qmail-scanner"); };
destination d_smtp {
file("/var/log/$HOST/$YEAR/$MONTH/smtp.log"
owner(root) group(root) perm(0600)
create_dirs(yes) dir_perm(0700));
};
log { source(src); filter(f_smtp); destination(logserver); };
:wq (บันทึก)
$ SuSEconfig --module syslog-ng
$ rcsyslog restart
แก้ไข httpd.conf
$ vi /etc/apache2/httpd.conf
ErrorLog /var/log/apache2/error_log
## Add line for syslog-ng
ErrorLog syslog
LogLevel notice
CustomLog "|/bin/logger -p local1.info" combined
:wq! (บันทึก)
$ rcapache2 restart

SUSE Linux Enterprise Cool Solutions
|












