配置Linux安全日誌記錄伺服器

cnbird發表於2008-11-23
在網上越來越多的 hacker 的出現,越來越多的高手出現的情況下。如何才能確保自己可以儲存一份完整的 log 呢?稍微有點概念的 hacker 都知道,進入系統後的第一見事情就是去清理 log,而發現入侵的最簡單最直接的方法就是去看系統紀錄檔案。現在我們來說說如何設定一個安全的 log 伺服器

  想想看,如果入侵者無法連結您的log伺服器,又如何能改您的 log 呢?現在我們來學習如何設定一個無 ip 的 log 伺服器。

  現在,來介紹一下如何用 Snort來做三件事情∶

  Stealth sniffer

  stealth NIDS porbe

  stealth logger

  這一切都是用在一臺沒有ip的伺服器上面的。NIDS是Network Intrusion Dectection Server 的簡稱,也就是說入侵檢測伺服器。

  為什麼要 stealth 呢?

  在 internet 中執行任何一種服務,都是有一定的危險的。不管是http也好, ftp 也好, telnet 也好,總之都會有機會被 hack 入侵。 stealth logger 的獨特性可以讓我們在接收資料的同時,不傳送任何的資料。這樣外界的電腦(被 hack 入侵的電腦)就根本無法去更改 loger server 所收到的資訊。也就是說保證了我們資訊的完整性,以及原始性。 為了確保 log 伺服器的安全,最好不要將 log 伺服器連線在網路中。也就是說,當您需要檢查 logger 伺服器上得東西的時侯,您需要到電腦前,開啟螢幕。而不是遠端 login 進來。但是,如果說您一定要連線網路的話的話,那麼請用兩個的介面來做。也就是說兩片網路卡,並且注意,第一,IP forwarding 一定要關閉。第二就是,用來做 stealth logger 的介面是沒有 ip 的一張網路卡,這張網路卡必須不能跟另外一個有 ip 的網路卡在同一網路下面。

  設定:

  首先當然是確定您的網路卡安裝無誤,並且可以被 kernel 抓到。然後把網路卡所需要的 module 寫到 /etc/modules.conf 檔案中。

  現在我們來設定一個沒有 ip 的網路卡介面。

  編輯檔案 /etc/sysconfig/network-scripts/ifcfg-eth0

 

      vim /etc/sysconfig/network-scripts/ifcfg-eth0
  DEVICE=eth0
  USERCTL=no
  ONBOOT=yes
  BOOTPROTO=
  BROADCAST=
  NETWORK=
  NETMASK=
  IPADDR=

    
    存檔後,用 ifconfig 來 active 我們的 eth0 介面。

  初試 stealth

  這裡我們用到了 snort 這個程式。如果您的電腦中沒有這個程式,可以到 www.snort.org 下載

  現在我們執行

  snort -dvi eth0

  這裡 -d 的選項告訴 snort 對資料進行 decode (解碼)

  -v 告訴 snort 將結果顯示在螢幕上面

  -i 則是指定所需要的 interface

  可以用 -C 選項告訴 snort 只顯示 ASCII 部份。 忽略 hexadecimal 資料。

   

 ?$snort -dviC eth0
  Log directory= /var/log/snort
  Initializing Network Interface eth0
  kernel filter, protocol ALL, TURBO mode
  (63 frames), raw packet socket
  ——== Initializing Snort ==——
  Decoding Ethernet on interface eth0
  ——== Initialization Complate ==——
  -*> Snort! <*-
  Version 1.8.4 (Build 99)
  By Martin Roesch (roesch@sourcefire.com,www.snort.org)
  ……
  ……
  ……

NIDS入侵檢測本身是一件很複雜的事情。snort 本身也提供了強大的入侵檢測的功能。這裡我只做一個簡單的介紹,好讓大家有一個概念。如果真正實體去做一個 NIDS 的話。需要些更復雜的動作。例如設定更完善的 rules, 定時更新 snort.conf 中所定義的 rules (當新的攻擊方式出現以後,要及時更新)

  首先,我們需要更改一下 /etc/snort/snort.conf 具體需要參照您自己的機器來設定。

  #設定 log 存放的地方

  config logdir: /var/log/snort

  #設定網路

   

 var HOME_NET 192.168.1.0/24
  var EXTERNAL_NET any
  var SMTP ?$HOME_NET
  var HTTP_SERVERS ?$HOME_NET
  var SQL_SERVERS ?$HOME_NET
  var DNS_SERVERS 192.168.1.250/32 var RULE_PATH ./

    
    #設定 preprocessors
    
   

 preprocessor frag2
  preprocessor stream4: detect_scans
  preprocessor stream4_reassemblt
  preprocessor portscan:?$HOME_NET 4 3 portscan.log

    
    #設定 output
    
   

 output database:log,mysql,user=root
  dbname-snort host=localhost

    
     #rules
    
   

 alert tcp ?$HOME_NET 7161 -> ?$EXTERNAL_NET any(msg:”MISC Cisco Catalyst Remote Access”;flags: SA; reference:arachnids, 129;reference:cve, CVE-1999-0430;classtype:bad-unknow; sid:513; rev:1;)

    
    #設定 patch , 這些都是些附加的 rules 的檔案

  include ?$RULE_PATH/bad-traffic.rules include ?$RULE_PATH/exploit.rules include ?$RULE_PATH/scan.rules include ?$RULE_PATH/ftp.rules

  #這些 rule 其實還有很多。您可以自己去寫,也可以找人家寫好的下載拿來用。

  現在讓我們把 snort 跑起來∶

  snort -c /etc/snort/snort.conf -D -i eth0

  現在 snort NIDS 的模式跑起來了。 在 default 的情況下∶

  alerts 會放在 /var/log/snort/alert 中

  port-scanning 會放在 /var/log/snort/portscan.log

  當您真正跑 NIDS 的時侯,需要把 snort 以 daemon 的模式來跑。 如果您安裝的是 rpm 的東西,那麼 rpm 檔案中已經包含了一個 snortd 的檔案,並且會幫您安裝在 /etc/rc.d/init.d/ 下面。 當您設定好 snort 的 configure 檔案以後,只要用 chkconfig 把 snortd 開啟就可以了:

  加入 snortd

  chkconfig ——add snortd

  開啟 snortd

  chkconfig snortd on

  或者

  chkconfig ——level 3 snortd on

  這裡的 level 請自行更改到您所跑的 runlevel

  您可以用 cat /etc/inittab | grep id 來看自己在哪個runlevel 上面。

  cat /etc/inittab | grep id

  id:5:initdefault:

  這裡就是說跑在 run level 5 上面。

  設定伺服器 我們需要對伺服器做一些設定,讓伺服器把 log 送到我們的 logger 伺服器去。 首先,我們需要設定 /etc/syslog.conf 把 log 送到一個有效的,但是不存在的 ip 下面。例如我們的網路是 192.168.1.0/24 其中並沒有 192.168.1.123 這臺機器,也就是說這個 ip 實際上是空的。我們就把 log 指向這裡。您可以指向任意一個空的有效 ip.

  vim /etc/syslog.conf

  加入

  *.info @192.168.1.123

  如果您的系統是用 syslog-ng 的話

  vim /etc/syslog-ng/syslog-ng.conf

  destination d_loghost { udp(ip(192.168.123)

  port (514)); };filter f_info { level(info); };log {filter(f_info); destination(d_loghost);};

  我們還需要加入 static ARP entry 才可以。 如果您的網路只是接了記個 Hub 而已, 那麼 ARP 地址一樣可以好象 ip 一樣,設定成虛構的。 如果您有連結 switch, 您需要加入 log 伺服器的真實 MAC 地址。

我們這裡加入我們 logger 伺服器的真實 MAC 地址就可以了。

  arp -s 192.168.1.123 00:D0:B7:DB:BF:95

  在 Logger 伺服器設定 snort

  /etc/snort/snort.conf

  var EXTERNAL_NET any

  #等於 snort -d

  config dump_payload

  #等於 snort -C

  config dump_chars_only

  #設定 log 存放的 path

  config logdir: /var/log/snort

  # frag2 所做的動作就是把 fragmented 給我們 re-assembly

  preprocessor frag2

  log udp 192.168.1.1/32 any -> 192.168.1.123/32 514(logto: “logged-packets”;)

  最後一行需要稍微解釋一下∶

  我們這裡把 snort 來做 packet logger. 也就是說,並不是把所有的東西都寫入到 /var/log/snort/alert 中。而是 log any packets with match the rule without writing an alert.

  udp: 是說,我們這裡用 udp 的 protocol. system log 通常都是使用 udp 的。

  192.168.1.1/32: 就是隻我們的伺服器啦,也就是送 log 的機器。 如果您是從整個一個網路段中收 log 也可以用 192.168.1.0/24.

  any: any source port 任何 port

  ->: 這個是 direction operator 大家都知道的

  192.168.1.123/35 514 就是我們給出的那個空 ip 啦,port 514

  如果沒有指定 logto: 的話,log 會分別儲存在不同的檔案中。 而指定 logto 的話,就會把 log 全部存放到我們指定的檔案中,看起來方便多了。

  更安全的儲存 log 就可以更安全的保護伺服器。 snort 的功能實際上非常的強大, 這裡只是一個簡單的介紹而已。如果您對這些東西有興趣。可以去 www.snort.org/docs/ 下面看到非常多的有用的檔案。


相關文章