這兩個禮拜測試了不少網路機器,其中不乏一些資安設備如IDP、Firewall跟UTM,當決定要加上這些網路監控設備時,第一個要考量的就是如何蒐集這些分散在網路各個節點上的設備log,syslog當然就是一個好選擇囉,因此很多大廠的設備都會支援syslogd,這樣一來我們就可以把所有的log資料吐給同一台syslog server處理,但是如果有一個可以分析這些成千上萬log資料的機器,那就更完美了,好在我們公司資本夠厚,當然有採購這樣的一套設備,所以很順理成章的,要把這些log全部乖乖的送到log分析server上面去分析。

有大廠的支援,大部分的設備都能夠很順利的餵進分析Server上的syslog daemon,只有Sysmantec的endpiont protection (SEP)的log出問題,原因是Symantec果然是國際級大廠,所有的log輸出全部採UTF-8編碼,但是,我們分析Server的資料庫編碼是Big5阿@@

在survey眾多可能的solution之後,我們決定在不更動原有設備設定的情況下,來修正這個問題,所以,我們需要一個能夠將SEP所送出的log轉碼成server讀得懂的格式,最快的方法就是架一個syslog server,讓這個server把資料轉成big5之後在餵給分析器,於是乎下面這個東西就出現了。

import java.net.*;
import java.io.*;

public class ConvertUDP {
  // 要綁定的port,要轉送給自身的syslog server就不要設成514(syslogd預設是udp 514 port)
  public static final int SERVICE_PORT = 1234;

  // 封包長度上限
  public static final int BUFSIZE = 4096;

  //要轉送的syslog Server IP,如果送給自己就是127.0.0.1
  public static final String syslogHost="10.1.1.7";

  // Socket used for reading and writing UDP packets
  private DatagramSocket socket;

  public ConvertUDP() {
    try {
    // 在Server上面開一個UDP的port

    socket = new DatagramSocket( SERVICE_PORT );

    System.out.println ("Server active on port " + socket.getLocalPort() );
    } catch (Exception e) {
      System.err.println ("Unable to bind port");
    }
  }

  public void procPacket() {

    byte[] buffer = new byte[BUFSIZE];

    for (;;) {
      try {

        DatagramPacket packet = new DatagramPacket ( buffer, BUFSIZE );

        // 接收封包
        socket.receive(packet);

        System.out.println ("Packet received from " + packet.getAddress() +
                ":" + packet.getPort() + " of length " + packet.getLength() );

    //將utf8編碼的封包內容讀出來

    ByteArrayInputStream bin = new ByteArrayInputStream(packet.getData(),0,packet.getLength());
    BufferedReader reader = new BufferedReader(new InputStreamReader(bin,"utf-8"));
    String x = reader.readLine();
    System.out.println(x);   

     //修改封包內容送回去給Server

    InetAddress addr=InetAddress.getByName(syslogHost);
    packet.setAddress(addr);
    packet.setPort(514);
    packet.setData(x.getBytes());
    packet.setLength(x.getBytes().length);
        socket.send(packet);
      } catch (IOException ioe) {
        System.err.println ("Error : " + ioe);
      }
    }   
  }

  public static void main(String args[]) {
    ConvertUDP server = new ConvertUDP();
    server.procPacket();
  }
}

以上程式是參考,中興大學某一堂java課程的範例所改編而來的轉碼程式,不過事實上還有一個更快的解決方法,那就是裝一個kiwi syslogd,kiwi syslog是一個免費的syslog軟體(也有要收費的版本),它除了可以蒐集log之外,還可以將蒐集的log轉送,方法很簡單,在kiwi syslog的setup中有一個action,這個action是用來告訴kiwi syslog蒐集到log後要做些什麼,在action上面點"右鍵",就可以新增action,選擇forward選項,就可以告訴kiwi syslog要把蒐集到的syslog送到哪,不過kiwi syslog預設的編碼是system,也就是系統預設編碼(windows的話就是big5),所以如果要收UTF-8編碼的話,記得要在UDP那裡將系統編碼改為UTF-8,這樣kiwi轉送時就會幫你把UTF-8轉成big5送給你想送達的syslog server,這樣是不是很簡單呢?

所以我就說嘛,寫程式的人遇到什麼都會想到用程式解決,一點都不會善用工具,很遺憾我就是那種人....嗚嗚...我花時間寫這支程式是為了啥?算了,當作練功吧,大學畢業後就沒碰過java了。
arrow
arrow
    全站熱搜

    nsysumis94 發表在 痞客邦 留言(0) 人氣()