web-dev-qa-db-ja.com

NginXLogstashの複数のIPに関するGrokの問題

ウェブサーバーからのロギングに問題があります。ウェブサーバーには、nginxレイヤーの前にエルブとニスレイヤーがあります。

ワニスはX-Forwarded-For用に適切に設定されており、ログは正常に処理され、正しい「client.ip」がログに記録されます。

ただし、nginxログには、リクエスト内のIPの全リストが含まれています。デフォルトのgrok動作は、クライアントIPをリストの最後に設定しているようです。 elbサーバーとvarnishサーバー。これは、nginxログのclient.ipフィールドを台無しにします。正しいクライアントIPは、リストの最初(または少なくとも最初のいくつか)である必要があります。

ここに例があります:

_172.31.7.219 - - [28/Sep/2015:12:39:56 +1000] "GET /api/filter/14928/content?api_key=apikey&site=website HTTP/1.1" 403 101 "-" "-" "my.website.com" "1.144.97.102, 1.144.97.102, 1.144.97.102, 127.0.0.1, 172.31.26.59"_

問題は、このような結果を処理するためにgrokを微調整できなかったことです。このクエリと私のgrokでは、heroku grokデバッガーが機能していないようですが、logstashで機能しています。 grokの失敗にタグを付けていません。

特定の部分をデバッグしようとしましたが、IPアドレスのコンマ区切りリストがあるIP/IPORHOSTで必要なことを実行する方法が見つかりませんでした。使用するIPを指定できる必要があります。すなわち。リストの最初はclient.ipで、最後ではありません。

私のnginxgrokは:

NGINXACCESS %{IP:clientip} %{NGUSER:ident} %{NGUSER:auth} \[%{HTTPDATE:timestamp}\] "%{Word:verb} %{DATA:request} HTTP/%{NUMBER:httpversion}" %{NUMBER:response} (?:%{NUMBER:bytes}|-) (?:"(?:%{URI:referrer}|-)"|%{QS:referrer})(?:;|) %{QS:agent}

そのログをカバーするためのgrokに関するアイデアはありますか?

2
geniestacks

この問題がまだ発生しているかどうかはわかりませんが、発生している場合は、次のようになります。

このログ形式を考えると:

log_format custom '$remote_addr - $remote_user [$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent" "$Host" "$http_x_forwarded_for"';

指定したgrokパターンでは、"$Host" "$http_x_forwarded_for"部分の追加は考慮されていません。

あなたのgrokが失敗していない理由はわかりませんが、失敗するはずです。

いずれにせよ、このパターンは上記のログ形式で機能します。

%{IP:clientip} %{NOTSPACE:ident} %{NOTSPACE:auth} \[%{HTTPDATE:timestamp}\] "%{Word:verb} %{DATA:request} HTTP/%{NUMBER:httpversion}" %{NUMBER:response} (?:%{NUMBER:bytes}|-) (?:"(?:%{URI:referrer}|-)"|%{QS:referrer})(?:;|) %{QS:agent} "%{NOTSPACE:Host}" "(?<x_forwarded_for>%{IP:xff_clientip}, .*)"

そして、次のフィールドになります

httpversion      1.1
request          /api/filter/14928/content?api_key=apikey&site=website
timestamp        28/Sep/2015:12:39:56·+1000
auth             -
Host             my.website.com
agent            "-"
x_forwarded_for    1.144.97.102,·1.144.97.102,·1.144.97.102,·127.0.0.1,·172.31.26.59
clientip         172.31.7.219
bytes            101
response         403
xff_clientip     1.144.97.102
ident            -
port    
verb             GET
referrer    

以前よりもいくつかの新しいフィールドがあることに注意してください。

最初の( "x_forward_for" => 1.144.97.102, 1.144.97.102, 1.144.97.102, 127.0.0.1, 172.31.26.59)は、最後の引用符のセットの内容、またはログ形式の$http_x_forwarded_forです。
2番目( "xff_clientip" => 1.144.97.102)はjustそのリストの最初のIPであり、リクエストの実際の送信元IPに変換されます。

私の場合は、x_forwarded_forフィールドをmutateフィルターに通して、配列に分割します。

mutate {
  split  => { "x_forwarded_for" => ", " }
}
4
GregL

最後の部分では、Anton Roslovによるソリューションは、「ip1、ip2」および「single-ip」ログ行にのみ一致し、「ip1、ip2、ip3」には一致しません。
私見のようなもの

(?<x_forwarded_for>%{IP:clientip}(?:、[^、] +)*)

トリックを行う必要があります。チェックしてるだけ...

 ...\"(?:%{DATA:user_agent} |-)\"\"(?<x_forwarded_for>%{IP:clientip}(?:、[^、] +)*)? |-\ "

または

 ...\"(?:%{DATA:user_agent} |-)\"\"(-|(?<x_forwarded_for>%{IP:clientip}(?:、[^、] +) *)?)\ "

あなたの選択のパターンでなければなりません。 grokdebug.herokuapp.comでテスト済み。

0
mdb