LogWatchのインストールを行う
まずは、LogWatchのインストールを行います。
インストール済みか否かは、それぞれ以下のように確認することができます。
CentOS Scientific Linux
$ rpm -qa|grep logwatch
logwatch-7.3.6-49.el6.noarch
|
上記のようにパッケージ名が表示されればインストールされています。
Debian Ubuntu
$ dpkg --list|grep logwatch
ii logwatch 7.3.6.cvs20090906-1squeeze1 log analyser with nice output written in Perl
|
先頭に
ii が表示されるとインストールされています。
既にインストール済みの場合は、次の
設定の項へどうぞ。
CentOS Scientific Linux
$ yum install logwatch
...
|
Debian Ubuntu
$ aptitude install logwatch
...
|
これだけで、システムログの解析は行ってくれます。
毎日、root宛てに以下のようなメールでレポートしてくれます。
From - Mon Nov 12 04:26:37 2012
X-Account-Key: account5
X-UIDL: 0000126e4fb0b0c0
X-Mozilla-Status: 0001
X-Mozilla-Status2: 00000000
X-Mozilla-Keys:
Return-Path: <root@exmaple.com>
X-Original-To: root
Delivered-To: root@exmaple.com
Received: by mail.exmaple.com (unknown, from userid 0)
id 1368434E065; Mon, 12 Nov 2012 04:02:14 +0900 (JST)
To: root@exmaple.com
From: root@exmaple.com
Subject: Logwatch for example (Linux)
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Type: text/plain; charset="iso-8859-1"
Message-Id: <20121111190214.1368434E065@exmaple.com>
Date: Mon, 12 Nov 2012 04:02:07 +0900 (JST)
################### Logwatch 7.3.6 (05/19/07) ####################
Processing Initiated: Mon Nov 12 04:02:07 2012
Date Range Processed: yesterday
( 2012-Nov-11 )
Period is day.
Detail Level of Output: 0
Type of Output/Format: mail / text
Logfiles for Host: example
##################################################################
Errors when running cron:
grandchild #15678 failed with exit status 1: 1 Time(s)
Dovecot disconnects:
Logged out: 3 Time(s)
3.942K Bytes accepted 4,037
3.942K Bytes delivered 4,037
======== ==================================================
4 Accepted 80.00%
1 Rejected 20.00%
-------- --------------------------------------------------
5 Total 100.00%
======== ==================================================
1 5xx Reject unknown user 100.00%
-------- --------------------------------------------------
1 Total 5xx Rejects 100.00%
======== ==================================================
4 Connections
1 Connections lost (inbound)
4 Disconnections
4 Removed from queue
4 Delivered
1 Policy SPF
1 Hostname verification errors
Received disconnect:
2: disconnected by server request : 2 Time(s)
Filesystem Size Used Avail Use% Mounted on
/dev/vda1 38G 1.3G 35G 4% /
/dev/vdb1 60G 9.2G 47G 17% /var
###################### Logwatch End #########################
|
上記のように何も設定しなくてもSSH, Postfix(メールサーバー), Dovecot(POP3/IMAPサーバ) などは、デフォルトで出力してくれます。
( あくまでログ情報をデフォルトで出力している場合です。 )
httpdサーバーとしてapacheには対応しているようですが、残念ながら、nginxは対応していません。
次に、そのnginxに対応してみます。
nginx の LogWatch 設定を行う
先にも書きましたが、nginx は、 LogWatch のデフォルトの設定の中にありません。
ログ情報をapacheのそれと全く同じに設定していれば、httpd としてLogWatchに出力されると思います。
ただ、nginx のデフォルトの設定では、ログの内容こそ同じように設定されていますが、出力先は別になっています。
そのため、デフォルトの設定では、LogWatch はnginxのログを拾いきれずにレポートできない・・というのが真相です。
この最初は、先の本来の原因から、2つの方法で対処できます。
- nginxのログの設定をapacheのデフォルトと全く同じにする
- apacheのLogWatchの設定を真似て、nginx用を作成する
ここでは、後者で対応してみます。
http(apache) の LogWatchのデフォルトファイルをコピーする
http(apache) のLogWatchのスクリプトファイルが1つ、デフォルト設定ファイルが2つの計 3つのファイルをコピーします。
この際、http → nginx へ名前に変更している点に注意してください。
- /usr/share/logwatch/scripts/services/http
– LogWatchのサービス毎のスクリプトファイルになります。(perlで記述)
$ cp /usr/share/logwatch/scripts/services/http /etc/logwatch/scripts/services/nginx
|
– /etc/logwatch/conf/logfiles/ : 個別のLogWatchのサービス毎のスクリプトファイルのディレクトリになります。
- /usr/share/logwatch/default.conf/services/http.conf
– LogWatchのサービス毎の設定ファイルになります。
$ cp /usr/share/logwatch/default.conf/services/http.conf /etc/logwatch/conf/services/nginx.conf
|
– /etc/logwatch/conf/services/ : 個別のLogWatchのサービス毎の設定ファイルのディレクトリになります。
- /usr/share/logwatch/default.conf/logfiles/http.conf
– LogWatchのサービス毎のログファイル設定ファイルになります。
$ cp /usr/share/logwatch/default.conf/logfiles/http.conf /etc/logwatch/conf/logfiles/nginx.conf
|
– /etc/logwatch/conf/logfiles/ : 個別のLogWatchのサービス毎のログファイル設定ファイルのディレクトリになります。
http(apache) の LogWatchの設定ファイルを編集する
http(apache) のLogWatchのスクリプトファイルは、ログの出力情報が同じなので、そのまま使えます。
2つのデフォルト設定ファイルについては、若干の編集が必要です。
その編集箇所について下記に記載します。
/etc/logwatch/conf/services/nginx.conf
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
| ###########################################################################
# Configuration file for http filter
###########################################################################
# **** LogWatchのレポートに出力されるタイトル名を変更します。
# Title = "httpd"
Title = "nginx"
# Which logfile group...
# **** LogWatchで参照するログファイルの設定ファイル名を変更します。
# LogFile = http
LogFile = nginx
# **** LogWatchで認識するログのフォーマットが異なる場合は、ここで設定します。今回は、デフォルトのままです。
# Define the log file format
#
# This is now the same as the LogFormat parameter in the configuration file
# for httpd. Multiple instances of declared LogFormats in the httpd
# configuration file can be declared here by concatenating them with the
# '|' character. The default, shown below, includes the Combined Log Format,
# the Common Log Format, and the default SSL log format.
#$LogFormat = "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"|%h %l %u %t \"%r\" %>s %b|%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \"%r\" %b"
# **** これもフォーマットの定義ですが、下位互換のために残されているだけです。使わないようにしましょう。
# The following is supported for backwards compatibility, but deprecated:
# Define the log file format
#
# the only currently supported fields are:
# client_ip
# request
# http_rc
# bytes_transfered
# agent
#
#$HTTP_FIELDS = "client_ip ident userid timestamp request http_rc bytes_transfered referrer agent"
#$HTTP_FORMAT = "space space space brace quote space space quote quote"
# Define the field formats
#
# the only currently supported formats are:
# space = space delimited field
# quote = quoted ("..") space delimited field
# brace = braced ([..]) space delimited field
# **** エラー(4xx 5xx)メッセージを無視するかどうか (1:無視, 0:無視しない)
# Flag to ignore 4xx and 5xx error messages as possible hack attempts
#
# Set flag to 1 to enable ignore
# or set to 0 to disable
$HTTP_IGNORE_ERROR_HACKS = 0
# **** 無視するURL
# Ignore requests
# Note - will not do ANY processing, counts, etc... just skip it and go to
# the next entry in the log file.
# Examples:
# 1. Ignore all URLs starting with /model/ and ending with 1 to 10 digits
# $HTTP_IGNORE_URLS = ^/model/\d{1,10}$
#
# 2. Ignore all URLs starting with /model/ and ending with 1 to 10 digits and
# all URLS starting with /photographer and ending with 1 to 10 digits
# $HTTP_IGNORE_URLS = ^/model/\d{1,10}$|^/photographer/\d{1,10}$
# or simply:
# $HTTP_IGNORE_URLS = ^/(model|photographer)/\d{1,10}$
# **** 無視するIPアドレス
# To ignore a range of IP addresses completely from the log analysis,
# set $HTTP_IGNORE_IPS. For example, to ignore all local IP addresses:
#
# $HTTP_IGNORE_IPS = ^10\.|^172\.(1[6-9]|2[0-9]|3[01])\.|^192\.168\.|^127\.
#
# **** ユーザ情報を出力するかどうか (1:出力する,0:出力しない)
# **** 要は、ユーザ認証が必要なページへアクセスした際に、アクセスしたユーザ情報を出力するかどうかという意味。
# The variable $HTTP_USER_DISPLAY defines which user accesses are displayed.
# The default is not to display user accesses:
$HTTP_USER_DISPLAY = 0
# To display access failures:
# $HTTP_USER_DISPLAY = "$field{http_rc} >= 400"
# To display all user accesses except "Unauthorized":
# $HTTP_USER_DISPLAY = "$field{http_rc} != 401"
# vi: shiftwidth=3 tabstop=3 et
|
- 7行目:タイトルを変更しています。
これで、LogWatchのレポートには、nginx として出力されます。
- 12行目:ログファイルの設定ファイル名を変更しています。
これで、上記にコピーしたファイルを参照しに行ってくれます。
スクリプトファイルは、
/usr/share/logwatch/scripts/services/nginx or
/etc/logwatch/scripts/services/nginx
を探します。
サービス毎の設定ファイルは、
/usr/share/logwatch/default.conf/services/nginx.conf or
/etc/logwatch/conf/services/nginx.conf
を探します。
サービス毎のログファイル設定ファイルは、
/usr/share/logwatch/default.conf/logfiles/nginx.conf or
/etc/logwatch/conf/logfiles/nginx.conf
を探します。
/etc/logwatch/conf/logfiles/nginx.conf
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
| ########################################################
# Define log file group for httpd
########################################################
# What actual file? Defaults to LogPath if not absolute path....
# **** LogWatchでログファイルを探すファイル名(ワイルドカード使用可)を変更します。
#LogFile = httpd/*access_log
#LogFile = apache/*access.log.1
#LogFile = apache/*access.log
#LogFile = apache2/*access.log.1
#LogFile = apache2/*access.log
#LogFile = apache2/*access_log
#LogFile = apache-ssl/*access.log.1
#LogFile = apache-ssl/*access.log
LogFile = /var/log/nginx/*access.log
# If the archives are searched, here is one or more line
# (optionally containing wildcards) that tell where they are...
#If you use a "-" in naming add that as well -mgt
# **** LogWatchでアーカイブログファイルを探すファイル名(ワイルドカード使用可)を変更します。
#Archive = archiv/httpd/*access_log.*
#Archive = httpd/*access_log.*
#Archive = apache/*access.log.*.gz
#Archive = apache2/*access.log.*.gz
#Archive = apache2/*access_log.*.gz
#Archive = apache-ssl/*access.log.*.gz
Archive = /var/log/nginx/*access.log.*.gz
# Expand the repeats (actually just removes them now)
*ExpandRepeats
# Keep only the lines in the proper date range...
*ApplyhttpDate
# vi: shiftwidth=3 tabstop=3 et
|
- 15行目:ログファイル名を変更しています。
ここでは、絶対パス(先頭 “/” )を指定しています。
先頭 “/“がない場合は、デフォルトルートログディレクトリの配下と認識します。
デフォルトルートログディレクトリは、LogWatchの設定ファイルに指定されています。
/usr/share/logwatch/default.conf/logwatch.conf に
LogDir = /var/log
で指定しているディレクトリがデフォルトルートログディレクトリになります。
- 28行目:アーカイブログファイル名を変更しています。
ここでも先と同様に絶対パス(先頭 “/” )を指定しています。同様に先頭 “/“を省略して記述することもできます。
ここでの指定は、logrotateによるログファイルの保存の仕方に依存します。
( 参照 : ログローテーション(logrotate)を使ってみる ( httpd(apache)の設定例 ) )
LogWatchの基本動作は、昨日のログを解析してレポートします。
昨日のログが15行目で指定した最新のログファイルより前にある可能性が場合は、ここで指定しているアーカイブログファイルを探しに行きます。
nginx の LogWatch をテストしてみる
LogWatch の動作確認は、コマンドで確認することができます。
CentOS Scientific Linux
$ logwatch --print --service nginx --range today
Debian Ubuntu
$ logwatch --output stdout --service nginx --range today
A total of 52 sites probed the server
101.1.104.116
110.164.252.2
....
A total of 1 possible successful probes were detected (the following URLs
contain strings that match one or more of a listing of strings that
indicate a possible exploit):
//index.php?option=com_phocadownload&controller=../../../ ... HTTP Response 301
Requests with error response codes
400 Bad Request
null: 183 Time(s)
401 Unauthorized
/test/sasa/: 1 Time(s)
404 Not Found
/MyAdmin/scripts/setup.php: 1 Time(s)
/apple-touch-icon-precomposed.png: 3 Time(s)
/apple-touch-icon.png: 3 Time(s)
...
499 (undefined)
/apple-touch-icon-precomposed.png: 1 Time(s)
/categories/rakuten/index.php?id=552710: 1 Time(s)
500 Internal Server Error
/wp-comments-post.php: 14 Time(s)
/wp-comments-post.php?lang=en: 19 Time(s)
/wp-comments-post.php?lang=ja: 1 Time(s)
|
こんな感じで出力されればOKです。
一応、コマンドについて解説しておきます。
$ logwatch --help
Usage: /usr/sbin/logwatch [--detail ] [--logfile ] [--output ]
[--format ] [--encode ] [--numeric]
[--mailto ] [--archives] [--range ] [--debug ]
[--filename ] [--help|--usage] [--version] [--service ]
[--hostformat ] [--hostlimit ] [--html_wrap ]
--detail : Report Detail Level - High, Med, Low or any #.
--logfile : *Name of a logfile definition to report on.
--logdir : Name of default directory where logs are stored.
--service : サービス名を指定します。
--service : *Name of a service definition to report on.
--output : 出力先を指定します。CentOSでは、--print で --output stdout と同じ結果(標準出力先指定)を得ます。
--output
|
とりあえずテストなので、最小限のオプションを指定しています。
しかし、この出力結果は、省略していますが、かなり、アタックされた形跡がありますね。ほとんどはJoomla!系のアタックのようですが、ちゃんと確認しておかないと、あぶないですね。
httpd(apache or nginx)のログは、非常に大事です。参考記事:
アクセスログの活用
このLogWatchでは、その中で重要な部分だけを切り出してくれる非常に便利なツールです。
上記出力例を簡単に解説すると、
- A total of 52 sites probed the server : アタックしたかもしれないIPアドレスが52件あります。
- A total of 1 possible successful probes … : 以下のURLでは、アタックが突破されたかもしれないURLアドレスが1件あります。
- Requests with error response codes : エラーコードを出力した要求URLの一覧です。
こんな感じの意味になります。
上記のログは、非常に危険ですね。ちゃんと確認しておきましょう。
人気のサイトであればあるほど、アタックは多くなります。
LogWatchを確認しておけばOKというわけではありませんが、少なくとも、これぐらいのチェックは行っておきましょう。
コメントを投稿 :