web-dev-qa-db-ja.com

ElasticsearchにSnortアラートログをフィードするにはどうすればよいですか?

私は昨日 ELK howto から始め、ELKを簡単に起動して実行しました。次に、Snortアラートログをプラグインに差し込みました。 grokdebug を使用してすべてのフィールドを分割し、それをテストするために、フィルターと完全に厄介なGrok正規表現を使用してLogstash(以下に表示)を構成しました。次に、Snortをオンにすると、アラートログがいっぱいになり、その後Logstashが再起動しました(もちろん--configtestを実行した後)。 ES "Head"プラグインをインストールしたので、少しお試しいただけます。ハウツーで作成したように、snortアラートがsyslogマッピングにマッピングされているようです(以下の画像)。 ESでは、logstash構成で定義されているフィールド(ids_proto、src_ip、dst_ip)を使用して検索できないようです。どうしてこれなの?マッピングを定義する必要がありますか、それともここで他に何か混乱していますか?

enter image description here

input 
{
  file {
    path => "/var/log/snort/alert"
    type => "snort_tcp"  # a type to identify those logs (will need this later)
    start_position => beginning 
    ignore_older => 0      # Setting ignore_older to 0 disables file age checking so that the tutorial file is processed even though it’s older than a day. 
    sincedb_path => "/dev/null"
  }
}


filter {
 if [type] == "snort_tcp" {
      grok {
        add_tag => [ "IDS" ]
        match => [ "message", "%{MONTHNUM:month}\/%{MONTHDAY:day}-%{HOUR:hour}:%{MINUTE:minute}:%{SECOND:second}\s+\[\*\*\]\s+\[%{INT:ids_gid}\:%{INT:ids_sid}\:%{INT:ids_rev}\]\s+%{DATA:ids_proto}\s+\[\*\*\]\s+\[Classification:\s+%{DATA:ids_classification}\]\s+\[Priority:\s+%{INT:priority}\]\s+\{%{Word:ids_proto}\}\s+%{IP:src_ip}\:%{INT:src_port}\s+\-\>\s+%{IP:dst_ip}\:%{INT:dst_port}"]
      }
    }
    geoip {
      source => "[src_ip]"
      target => "SrcGeo"
    }
    geoip {
      source => "[dst_ip]"
      target => "DstGeo"
    }
        if [priority] == "1" {
      mutate {
        add_field => { "severity" => "High" }
      }
    }
    if [priority] == "2" {
      mutate {
        add_field => { "severity" => "Medium" }
      }
    }
    if [priority] == "3" {
      mutate {
        add_field => { "severity" => "Low" }
      }
    }
    if [ids_proto] {
      if [ids_proto] =~ /^GPL/ {
        mutate {
          add_tag => [ "Snort-ET-sig" ]
          add_field => [ "ids_rule_type", "Emerging Threats" ]
        }
      }
      if [ids_proto] =~ /^ET/ {
        mutate {
          add_tag => [ "Snort-ET-sig" ]
          add_field => [ "ids_rule_type", "Emerging Threats" ]
        }
      }
      if "Snort-ET-sig" not in [tags] {
        mutate {
          add_tag => [ "Snort-sig" ]
          add_field => [ "ids_rule_type", "Snort" ]
        }
      }
    }
if "Snort-sig" in [tags] {
      if [ids_gid] == "1" {
        mutate {
          add_field => [ "Signature_Info", "http://rootedyour/.com/snortsid?sid=%{ids_sid}" ]
        }
      }
      if [ids_gid] != "1" {
        mutate {
          add_field => [ "Signature_Info", "http://rootedyour.com/snortsid?sid=%{ids_gid}-%{ids_sid}" ]
        }
      }
    }
    if "Snort-ET-sig" in [tags] {
      mutate {
        add_field => [ "Signature_Info", "http://doc.emergingthreats.net/bin/view/Main/%{ids_sid}" ]
      }
    }
  }



output 
{
  elasticsearch 
   {
    hosts => ["localhost:9200"]
    manage_template => false
    index => "snort_tcp-%{+YYYY.MM.dd}"     
  }
}
2
Server Fault

ここにいくつかのこと:

  • Logstashが作成するデフォルトのマッピングは、すべての文字列フィールドを分析されないものとして設定します。これにより、下流の表示ツールによりわかりやすくなります。
  • マッピングをまったく設定しない場合は、通常のように、デフォルトのElasticSearch 動的マッピング を使用しますが、これはLogstashには適していません。

テストを行うには、次の出力セクションをお勧めします。

output 
{
 elasticsearch 
  {
    hosts => ["localhost:9200"]
    manage_template => true
    index => "logstash-%{+YYYY.MM.dd}"     
  }
}

この方法で設定すると、logstashインデックスはデフォルトのlogstashマッピングを取得し、期待どおりに動作する場合があります。その場合は、おそらくマッピングファイルを定義する必要があります。

output 
{
 elasticsearch 
  {
    hosts => ["localhost:9200"]
    manage_template => true
    index => "snort_tcp-%{+YYYY.MM.dd}"
    template => "/etc/logstash/template.json"
    template_name => "snort_tcp"
  }
}
1
sysadmin1138