技術者になりたい何か

技術者になりたい何かの覚書的な何かです

Debianにsarを入れてシステム統計情報を見てみる

sarとは

sysstatパッケージに含まれる。
様々なシステム統計情報を表示できる高機能なツール。
日ごとにログをとっていくこともできるので、さかのぼって何日の何時ごろの状況を見たい、ってときにも使えるのが大きい。

Debianで動かす。

実はデフォルトで入ってない

# sar
bash: sar: command not found

入れるのはsysstat

# apt-get install sysstat
Reading package lists... Done
Building dependency tree

~~以下略~~

入れても設定しないと動いてくれない

# sar
Cannot open /var/log/sysstat/sa19: No such file or directory
Please check if data collecting is enabled

設定

設定ファイルでENABLED="false"⇒ENABLED="true"に。

# emacs /etc/default/sysstat

 

#
# Default settings for /etc/init.d/sysstat, /etc/cron.d/sysstat
# and /etc/cron.daily/sysstat files
#

# Should sadc collect system activity informations? Valid values
# are "true" and "false". Please do not put other values, they
# will be overwritten by debconf!
#ENABLED="false"
ENABLED="true"

 

収集間隔とローテートのタイミングはcron設定。以下はデフォルト。
/etc/cron.d/sysstat

# The first element of the path is a directory where the debian-sa1
# script is located
PATH=/usr/lib/sysstat:/usr/sbin:/usr/sbin:/usr/bin:/sbin:/bin

# Activity reports every 10 minutes everyday
5-55/10 * * * * root command -v debian-sa1 > /dev/null && debian-sa1 1 1

# Additional run at 23:59 to rotate the statistics file
59 23 * * * root command -v debian-sa1 > /dev/null && debian-sa1 60 2

 

↑ 10分おきにログ収集、23:59にログローテート

使い方

主なオプション
-q load average
-u CPU使用率
-b I/O
-r メモリとスワップ使用率
-s time time以降のデータ
-e time timeまでのデータ
-f ログファイル指定


使用例

有効にしてすぐはログが無いのでsarだけ打つとこんな感じ。
# sar
Linux 3.16.0-4-amd64 (debian) 02/19/2017 _x86_64_ (4 CPU)

すぐはログが無いけどインターバルと回数とか指定すると出てくれる。
↓は1秒置き2回

# sar 1 2
Linux 3.16.0-4-amd64 (debian) 02/19/2017 _x86_64_ (4 CPU)

07:45:43 AM CPU %user %nice %system %iowait %steal %idle
07:45:44 AM all 0.00 0.00 0.25 0.00 0.00 99.75
07:45:45 AM all 0.00 0.00 0.00 0.00 0.00 100.00
Average: all 0.00 0.00 0.12 0.00 0.00 99.88

 

CPU1秒おき5回

# sar -u 1 5
Linux 3.16.0-4-amd64 (debian) 02/19/2017 _x86_64_ (4 CPU)

07:51:38 AM CPU %user %nice %system %iowait %steal %idle
07:51:39 AM all 0.00 0.00 0.00 0.00 0.00 100.00
07:51:40 AM all 0.00 0.00 0.25 0.00 0.00 99.75
07:51:41 AM all 0.25 0.00 0.00 0.00 0.00 99.75
07:51:42 AM all 0.00 0.00 0.00 0.00 0.00 100.00
07:51:43 AM all 0.00 0.00 0.25 0.00 0.00 99.75
Average: all 0.05 0.00 0.10 0.00 0.00 99.85

 

ロードアベレージ1秒おき5回

# sar -q 1 5
Linux 3.16.0-4-amd64 (debian) 02/19/2017 _x86_64_ (4 CPU)

07:52:47 AM runq-sz plist-sz ldavg-1 ldavg-5 ldavg-15 blocked
07:52:48 AM 0 335 0.04 0.06 0.07 0
07:52:49 AM 0 335 0.04 0.06 0.07 0
07:52:50 AM 0 335 0.04 0.06 0.07 0
07:52:51 AM 0 335 0.04 0.06 0.07 0
07:52:52 AM 0 335 0.04 0.06 0.07 0
Average: 0 335 0.04 0.06 0.07 0

 


同じくメモリ

# sar -r 1 5
Linux 3.16.0-4-amd64 (debian) 02/19/2017 _x86_64_ (4 CPU)

07:53:28 AM kbmemfree kbmemused %memused kbbuffers kbcached kbcommit %commit kbactive kbinact kbdirty
07:53:29 AM 88200 922424 91.27 109656 250940 2672716 95.16 354920 383812 0
07:53:30 AM 88144 922480 91.28 109656 250940 2672716 95.16 354984 383812 0
07:53:31 AM 88144 922480 91.28 109656 250940 2672716 95.16 354988 383812 0
07:53:32 AM 88176 922448 91.28 109656 250940 2672716 95.16 354988 383812 0
07:53:33 AM 88192 922432 91.27 109656 250940 2672096 95.13 354928 383812 0
Average: 88171 922453 91.28 109656 250940 2672592 95.15 354962 383812 0

 

ずっと動いてるのだとこんな感じ

# sar
Linux 2.6.32-642.11.1.el6.x86_64 (centos) 2017年02月19日 _x86_64_ (4 CPU)

00時00分01秒 CPU %user %nice %system %iowait %steal %idle
00時10分01秒 all 2.84 0.02 0.61 0.01 0.00 96.52
00時20分01秒 all 2.77 0.02 0.59 0.01 0.00 96.61
00時30分01秒 all 3.62 0.02 0.73 0.01 0.00 95.63
00時40分01秒 all 2.94 0.02 0.63 0.01 0.00 96.40
00時50分01秒 all 2.89 0.02 0.63 0.00 0.00 96.46
01時00分01秒 all 2.70 0.02 0.59 0.00 0.00 96.68
01時10分01秒 all 3.04 0.02 0.64 0.01 0.00 96.29
01時20分01秒 all 2.80 0.02 0.60 0.01 0.00 96.57
01時30分01秒 all 3.00 0.02 0.65 0.01 0.00 96.32
01時40分01秒 all 2.61 0.02 0.54 0.01 0.00 96.83
01時50分01秒 all 2.84 0.02 0.57 0.01 0.00 96.57
02時00分01秒 all 2.57 0.02 0.54 0.00 0.00 96.87
02時10分01秒 all 2.85 0.02 0.59 0.01 0.00 96.53
02時20分01秒 all 2.80 0.02 0.58 0.01 0.00 96.60
02時30分01秒 all 3.15 0.02 0.67 0.02 0.00 96.14
02時40分01秒 all 3.08 0.02 0.65 0.01 0.00 96.24
02時50分01秒 all 2.89 0.02 0.59 0.01 0.00 96.50
03時00分01秒 all 2.93 0.02 0.58 0.10 0.00 96.38
03時10分01秒 all 2.93 0.02 0.62 0.01 0.00 96.42
03時20分01秒 all 2.97 0.02 0.59 0.01 0.00 96.42
03時30分01秒 all 2.70 0.02 0.56 0.00 0.00 96.73
03時40分01秒 all 3.19 0.02 0.70 0.02 0.00 96.07
03時50分01秒 all 3.07 0.05 0.69 0.12 0.00 96.08
04時00分01秒 all 3.10 0.02 0.63 0.01 0.00 96.25
04時10分01秒 all 3.69 0.02 0.80 0.03 0.00 95.46
04時20分01秒 all 2.84 0.02 0.63 0.01 0.00 96.50
04時30分01秒 all 3.98 0.02 0.88 0.29 0.00 94.83
04時40分01秒 all 3.44 0.01 0.85 0.04 0.00 95.65
04時50分01秒 all 3.04 0.02 0.66 0.01 0.00 96.27
05時00分01秒 all 2.71 0.02 0.60 0.01 0.00 96.67
05時10分02秒 all 3.17 0.02 0.67 0.01 0.00 96.13
05時20分01秒 all 10.00 0.01 1.94 6.41 0.00 81.63
05時30分02秒 all 7.39 0.01 1.11 1.78 0.00 89.70
05時40分01秒 all 2.91 0.02 0.66 0.01 0.00 96.40
05時50分01秒 all 3.00 0.01 0.70 0.01 0.00 96.28
06時00分01秒 all 2.65 0.02 0.61 0.01 0.00 96.72
06時10分01秒 all 3.62 0.02 1.26 0.15 0.00 94.96
06時20分01秒 all 3.22 0.02 0.93 0.08 0.00 95.75
06時30分01秒 all 2.77 0.02 0.62 0.00 0.00 96.60
06時40分01秒 all 2.63 0.02 0.57 0.01 0.00 96.78
06時50分01秒 all 3.20 0.01 0.66 0.01 0.00 96.11
07時00分01秒 all 2.71 0.01 0.65 0.01 0.00 96.62
07時10分01秒 all 2.82 0.02 0.66 0.01 0.00 96.50
07時20分01秒 all 2.74 0.02 0.61 0.01 0.00 96.62
07時30分01秒 all 2.82 0.02 0.65 0.01 0.00 96.51
07時40分01秒 all 2.58 0.01 0.63 0.00 0.00 96.77
07時50分01秒 all 2.88 0.01 0.65 0.01 0.00 96.44
平均値: all 3.21 0.02 0.70 0.20 0.00 95.87

 

時間を指定してCPU使用率を見たい。

# sar -u -s 05:00:00 -e 06:00:00
Linux 2.6.32-642.11.1.el6.x86_64 (redmine-svn-serv) 2017年02月19日 _x86_64_ (4 CPU)

05時00分01秒 CPU %user %nice %system %iowait %steal %idle
05時10分02秒 all 3.17 0.02 0.67 0.01 0.00 96.13
05時20分01秒 all 10.00 0.01 1.94 6.41 0.00 81.63
05時30分02秒 all 7.39 0.01 1.11 1.78 0.00 89.70
05時40分01秒 all 2.91 0.02 0.66 0.01 0.00 96.40
05時50分01秒 all 3.00 0.01 0.70 0.01 0.00 96.28
平均値: all 5.29 0.02 1.02 1.64 0.00 92.03

 

しばらくするとこんな感じにログがたまっていく

 

# sar
Linux 3.16.0-4-amd64 (debian) 02/19/2017 _x86_64_ (4 CPU)

07:45:01 AM CPU %user %nice %system %iowait %steal %idle
07:55:01 AM all 0.02 0.00 0.04 0.01 0.00 99.93
08:05:01 AM all 0.02 0.00 0.03 0.01 0.00 99.94
08:15:01 AM all 0.07 0.00 0.18 0.04 0.00 99.71
08:25:01 AM all 0.02 0.00 0.06 0.01 0.00 99.90
Average: all 0.03 0.00 0.08 0.02 0.00 99.87

 

ログファイル


# ls -la /var/log/sysstat/
total 28
drwxr-xr-x 2 root root 4096 Feb 19 07:45 .
drwxr-xr-x 16 root root 4096 Feb 19 07:41 ..
-rw-r--r-- 1 root root 18348 Feb 19 08:35 sa19

CentOSの場合/var/log/sa/配下

$ ls /var/log/sa
sa01 sa04 sa07 sa10 sa13 sa16 sa19 sa23 sa26 sa29 sar01 sar04 sar07 sar10 sar13 sar16 sar21 sar24 sar27 sar30
sa02 sa05 sa08 sa11 sa14 sa17 sa21 sa24 sa27 sa30 sar02 sar05 sar08 sar11 sar14 sar17 sar22 sar25 sar28 sar31
sa03 sa06 sa09 sa12 sa15 sa18 sa22 sa25 sa28 sa31 sar03 sar06 sar09 sar12 sar15 sar18 sar23 sar26 sar29

-fでファイル指定下記の場合23日の4:00-6:00のCPU使用率

# sar -u -s 04:00:00 -e 06:00:00 -f /var/log/sa/sa23
Linux 2.6.32-642.11.1.el6.x86_64 (centos) 2017年01月23日 _x86_64_ (4 CPU)

04時00分01秒 CPU %user %nice %system %iowait %steal %idle
04時10分01秒 all 3.72 0.02 0.77 0.04 0.00 95.45
04時20分01秒 all 2.66 0.02 0.56 0.01 0.00 96.75
04時30分01秒 all 2.61 0.02 0.57 0.01 0.00 96.80
04時40分01秒 all 2.45 0.02 0.55 0.01 0.00 96.98
04時50分01秒 all 2.65 0.02 0.58 0.01 0.00 96.75
05時00分01秒 all 2.40 0.02 0.53 0.01 0.00 97.04
05時10分01秒 all 3.91 0.02 0.87 0.04 0.00 95.17
05時20分01秒 all 10.19 0.01 1.91 6.16 0.00 81.72
05時30分01秒 all 7.77 0.01 1.11 1.62 0.00 89.48
05時40分01秒 all 2.47 0.01 0.52 0.01 0.00 96.99
05時50分01秒 all 2.72 0.02 0.56 0.01 0.00 96.70
平均値: all 3.96 0.02 0.77 0.72 0.00 94.53

 便利。


 

Linuxコマンドを学んでいこう(基礎その2 コマンドをつなぐ)

コマンドの出力はつなげることができる。

主なつなぎ方は下記。

command1 | command2
command1の実行結果をcommand2に渡す。

command1 && command2
command1が正常終了した際のみcommand2を実行する。

command1 ; command2
command1に続いてcommand2を実行する。
command1の実行結果が正常でも異常でも関係ない。

command1 || command2
command1がエラー終了したときのみcommand2を実行する。

command1 & command2
command1 を実行しながら、command2 を実行する。
&でたくさんつなげても、ただ単に左から順番に実行していく。
;(セミコロン)は前のコマンドの完了を待つが、&は待たない。
また、&& は正常終了を待つが、& は待たない。
ちなみに $ command1 & でそのコマンドを実行し続けるので、バックグラウンドで動かす処理とかを立ち上げるときに使ったりもする。

command1 | command2

command1の実行結果をcommand2に渡す。

1.dmesgの結果からUSBを含むものだけ表示したい

dmesgの結果をパイプでgrepに渡す。ちなみに-iオプションで大文字小文字の区別なく抽出。

$ dmesg | grep -i "usb"
usbcore: registered new interface driver usbfs
usbcore: registered new interface driver hub
usbcore: registered new device driver usb
ehci_hcd: USB 2.0 'Enhanced' Host Controller (EHCI) Driver
ehci_hcd 0000:00:1a.0: new USB bus registered, assigned bus number 1
ehci_hcd 0000:00:1a.0: USB 2.0 started, EHCI 1.00
usb usb1: New USB device found, idVendor=1d6b, idProduct=0002
usb usb1: New USB device strings: Mfr=3, Product=2, SerialNumber=1
usb usb1: Product: EHCI Host Controller
usb usb1: Manufacturer: Linux 2.6.32-573.18.1.el6.x86_64 ehci_hcd
usb usb1: SerialNumber: 0000:00:1a.0
usb usb1: configuration #1 chosen from 1 choice
hub 1-0:1.0: USB hub found
ehci_hcd 0000:00:1d.0: new USB bus registered, assigned bus number 2
ehci_hcd 0000:00:1d.0: USB 2.0 started, EHCI 1.00
usb usb2: New USB device found, idVendor=1d6b, idProduct=0002
usb usb2: New USB device strings: Mfr=3, Product=2, SerialNumber=1
usb usb2: Product: EHCI Host Controller
usb usb2: Manufacturer: Linux 2.6.32-573.18.1.el6.x86_64 ehci_hcd
usb usb2: SerialNumber: 0000:00:1d.0
usb usb2: configuration #1 chosen from 1 choice
(以下略)

2.実行中のプロセスからhttpdを探したいけどgrep httpdは表示したくない。

ps -efで実行中プロセス全表示⇒httpdを含む行を抽出⇒grepを含む行を除外

$ ps -ef | grep "httpd" | grep -v "grep"
root 2325 1 0 Mar21 ? 00:00:11 /usr/sbin/httpd
apache 6012 2325 0 03:13 ? 00:00:00 /usr/sbin/httpd
apache 6013 2325 0 03:13 ? 00:00:00 /usr/sbin/httpd
apache 6014 2325 0 03:13 ? 00:00:00 /usr/sbin/httpd
apache 6015 2325 0 03:13 ? 00:00:00 /usr/sbin/httpd
apache 6016 2325 0 03:13 ? 00:00:00 /usr/sbin/httpd
apache 6017 2325 0 03:13 ? 00:00:00 /usr/sbin/httpd
apache 6018 2325 0 03:13 ? 00:00:00 /usr/sbin/httpd
apache 6019 2325 0 03:13 ? 00:00:00 /usr/sbin/httpd
apache 6397 2325 0 03:16 ? 00:00:00 /usr/sbin/httpd
apache 8800 2325 0 04:05 ? 00:00:00 /usr/sbin/httpd

3.findで見つけたファイルをまとめてcat,zcat(アーカイブを展開して中身表示)にわたして、その中から特定の文字を含む行を表示したい。

# find /var/log/apache2 -type f -name "error.log*" | grep -v "gz"| xargs cat | grep "redmine"
# find /var/log/apache2 -type f -name "error.log*" | grep "gz" | xargs zcat | grep "redmine"

上記の場合は/var/log/apache2にあるerror.logを含むファイルを抽出。ログローテで圧縮前と後で分ける。
⇒xargsでまとめてcat,zcatに渡す。
⇒その中からredmineを含む行を検索して表示する
という流れ。

command1 && command2

command1が正常終了した際のみcommand2を実行する。

$ sudo apt-get update && sudo apt-get upgrade

Debian系にてリポジトリのパッケージ情報の更新が正常にできたら、そのままパッケージの更新を行う。

 

command1 ; command2

command1に続いてcommand2を実行する。
command1の実行結果が正常でも異常でも関係ない。

# pwd ; whoami ; id ; w
/home/tmin
root
uid=0(root) gid=0(root) groups=0(root)
23:07:27 up 36 days, 12:17, 3 users, load average: 0.26, 0.11, 0.12
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
tmin :0 :0 13Jan17 ?xdm? 2:54m 0.44s gdm-session-worker [pam/gdm-password]
tmin pts/0 :0 13Jan17 36days 0.07s 0.07s bash
tmin pts/1 192.168.12.70 22:53 2.00s 0.14s 0.08s sshd: tmin [priv]

 カレントディレクトリ表示⇒自分のユーザ確認⇒ユーザ情報確認⇒他にログインしているユーザいないか確認。
単純につないで順に実行していくので、一連の複数コマンドを一行で書きたいときに便利。

 

command1 || command2

command1がエラー終了したときのみcommand2を実行する。

$ cat test.txt || vi test.txt

test.txtというファイルがない(とcat出来ないのでエラーとなる)場合のみ
viでtest.txtを新規作成して開く。
(とはいえこの場合viはそのファイルがあれば普通に開くし、無ければ新規作成で開くのであまり意味は無い)

1回目

$ cat test.txt || vi test.txt
cat: test.txt: そのようなファイルやディレクトリはありません

catのエラー表示がされて、viエディタで新規作成が立ち上がる。
insert modeで適当に文字を入力して保存。

2回目

$ cat test.txt || vi test.txt
tt

先程保存したtest.txtの中身がcatによって表示される。
catはエラー終了していないのでviは立ち上がらない。

 

command1 & command2

command1 を実行しながら、command2 を実行する。

 

$ conky &

conkyというデスクトップアプレットが動いて、端末は使えるようになる($ の入力待ち状態に戻る)。

# pwd & whoami & id & w
[1] 68597
/home/tmin
[2] 68598
[3] 68599
root
uid=0(root) gid=0(root) groups=0(root)
23:16:20 up 36 days, 12:26, 3 users, load average: 0.12, 0.11, 0.13
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
tmin :0 :0 13Jan17 ?xdm? 2:54m 0.44s gdm-session-worker [pam/gdm-password]
tmin pts/0 :0 13Jan17 36days 0.07s 0.07s bash
tmin pts/1 192.168.12.70 22:53 4.00s 0.14s 0.08s sshd: tmin [priv]
[1] Done pwd
[2]- Done whoami
[3]+ Done id

左から順に実行してるけど、前のコマンドの終了を待ってないのでpwd whoamaiが終了ステータス返すのが後ろの方になって入り乱れている。

基本的に&で複数コマンドをつなぐ使い方は少ないと思われ。
一つのコマンドの後ろに&つけて、バックグラウンドで実行という使い方は多い。

webアプリの起動とかで、プロンプト返ってこないときとかにこれ使うとよい。(終了が面倒かもしれないが)

 

forとかwhileの繰り返し処理をワンライナーで使う

職場の先輩がサクッと書いてたけど最初何してんのかわからなかった

こんな感じ。
切れ目がわからん

# zgrep "検索ワード" 対象ファイル | while read LINE ; do 変数1=`echo $LINE | awk -F':' '{print $1}'` ; 変数2=`echo $LINE | awk '{print $6}'` ; zgrep "$変数2" 変数1 | grep " from=" | awk '{print $1,$2,$3,$6,$7}' ; done | sort -n

 

# for 変数1 in `zcat 対象ファイル | grep "検索ワード1" | grep "検索ワード2" | grep "検索ワード3" | awk '{print $6}'` ; do zgrep $変数1 対象ファイル | grep "検索ワード4" | awk '{print $1,$2,$3,$6,$7}' ; done | sort -n

 

whileの方

解析

シェルスクリプトで使うあれっすよね。そこまでは分かったから。
分解してインデントつけるとみやすいかも。

while read LINE
  do
    変数1=`echo $LINE | awk -F':' '{print $1}'`
    変数2=`echo $LINE | awk '{print $6}'`
    zgrep "$変数2" 変数1 | grep " from=" | awk '{print $1,$2,$3,$6,$7}'
  done

1. 行が出力される間繰り返す
2. 処理開始
3. 変数1の定義 ``内のコマンド出力結果なので、出力されたLINEの:区切り1カラム目が入る
4. 変数2の定義 ``内のコマンド出力結果なので、出力されたLINEの半角スペース区切り6カラム目が入る
5. 変数2と1を引数に渡してzgrepとgrepを重ねる。結果はawkで1,2,3,6,7カラム目を出力
6. 処理終了

やってみた

メールアドレスとかあれなので、ssh attackのログでやってみる。
sshのログイン失敗のログは下記な感じで出力されている。
3行1setで一行目に失敗したユーザ名とIPが出力されてるので

 

# head /var/log/secure
~~略~~
Feb 12 06:00:37 tmin-server sshd[28342]: Invalid user test from 116.104.96.125
Feb 12 06:00:37 tmin-server sshd[28343]: input_userauth_request: invalid user test
Feb 12 06:00:37 tmin-server sshd[28343]: fatal: Read from socket failed: Connection reset by peer
Feb 12 06:00:40 tmin-server sshd[28344]: Invalid user admin from 116.104.96.125
Feb 12 06:00:40 tmin-server sshd[28345]: input_userauth_request: invalid user admin
Feb 12 06:00:40 tmin-server sshd[28345]: fatal: Read from socket failed: Connection reset by peer
Feb 12 06:00:43 tmin-server sshd[28346]: Invalid user pi from 116.104.96.125
Feb 12 06:00:43 tmin-server sshd[28347]: input_userauth_request: invalid user pi
Feb 12 06:00:43 tmin-server sshd[28347]: fatal: Read from socket failed: Connection reset by peer
Feb 12 06:00:44 tmin-server sshd[28348]: Invalid user admin from 116.104.96.125
~~略~~

 こんな感じで抜き出せますね。

# grep -E 'Faild|Invalid' /var/log/secure*
~~略~~
/var/log/secure:Feb 12 06:00:37 tmin-server sshd[28342]: Invalid user test from 116.104.96.125
/var/log/secure:Feb 12 06:00:40 tmin-server sshd[28344]: Invalid user admin from 116.104.96.125
/var/log/secure:Feb 12 06:00:43 tmin-server sshd[28346]: Invalid user pi from 116.104.96.125
/var/log/secure:Feb 12 06:00:44 tmin-server sshd[28348]: Invalid user admin from 116.104.96.125
/var/log/secure:Feb 12 06:29:18 tmin-server sshd[28425]: Invalid user admin from 122.100.181.115
/var/log/secure:Feb 12 06:53:48 tmin-server sshd[28693]: Invalid user ubuntu from 195.50.5.226
/var/log/secure:Feb 12 06:53:55 tmin-server sshd[28695]: Invalid user oracle from 195.50.5.226
/var/log/secure:Feb 12 06:54:02 tmin-server sshd[28697]: Invalid user nagios from 195.50.5.226
/var/log/secure:Feb 12 06:54:10 tmin-server sshd[28699]: Invalid user git from 195.50.5.226
/var/log/secure:Feb 12 06:54:17 tmin-server sshd[28701]: Invalid user server from 195.50.5.226
/var/log/secure:Feb 12 06:54:25 tmin-server sshd[28703]: Invalid user dev from 195.50.5.226
/var/log/secure:Feb 12 06:54:32 tmin-server sshd[28705]: Invalid user oracle from 195.50.5.226
/var/log/secure:Feb 12 06:54:39 tmin-server sshd[28707]: Invalid user cs from 195.50.5.226
/var/log/secure:Feb 12 06:54:46 tmin-server sshd[28709]: Invalid user test from 195.50.5.226
/var/log/secure:Feb 12 06:54:54 tmin-server sshd[28711]: Invalid user vagrant from 195.50.5.226
/var/log/secure:Feb 12 06:55:01 tmin-server sshd[28713]: Invalid user vagrant from 195.50.5.226
/var/log/secure:Feb 12 06:55:08 tmin-server sshd[28718]: Invalid user vagrant from 195.50.5.226
/var/log/secure:Feb 12 06:55:16 tmin-server sshd[28720]: Invalid user developer from 195.50.5.226
/var/log/secure:Feb 12 06:55:23 tmin-server sshd[28722]: Invalid user developer from 195.50.5.226
/var/log/secure:Feb 12 06:55:30 tmin-server sshd[28727]: Invalid user developer from 195.50.5.226
~~略~~

:区切りの1カラム目はファイル名/var/log/secure
今回は変数2は半角スペース区切りの10カラム目、IPを入れてみましょう。


変数1にファイル名、変数2にIPが入るので、
上記grep結果の1行目

/var/log/secure:Feb 12 06:00:37 tmin-server sshd[28342]: Invalid user test from 116.104.96.125

 の場合、実際の処理は

grep " 116.104.96.125" /var/log/secure | grep -E ' Failed|Invalid' | awk '{print $1,$2,$3,$7,$8,$10}'

となる。
該当ファイルでIPでgrepして、ユーザ名とIPが出力される行を抜き出して1,2,3,7,8,10カラム目を出力。
これをLINEが出力される限り繰り返し。

# grep -E 'Faild|Invalid' /var/log/secure* | while read LINE ; do FILENAME=`echo $LINE | awk -F':' '{print $1}'` ; IP=`echo $LINE | awk '{print $10}'` ; grep " $IP" $FILENAME | grep -E ' Failed|Invalid' | awk '{print $1,$2,$3,$7,$8,$10}' ; done | sort -n
~~略~~
Feb 8 06:47:39 user qm 173.192.101.210
Feb 8 06:47:39 user qm 173.192.101.210
Feb 8 06:47:39 user qm 173.192.101.210
Feb 8 06:47:39 user qm 173.192.101.210
Feb 8 06:47:39 user qm 173.192.101.210
Feb 8 06:47:39 user qm 173.192.101.210
Feb 8 06:47:39 user qm 173.192.101.210
~~略~~

 たくさん出力されて見にくいのでちょっとsort+uniq
IPでsortしてユーザもIPも同じのはuniq
awkで出力調整。最後のカラムが回数。

# grep -E 'Faild|Invalid' /var/log/secure* | while read LINE ; do FILENAME=`echo $LINE | awk -F':' '{print $1}'` ; IP=`echo $LINE | awk '{print $10}'` ; grep " $IP" $FILENAME | grep -E ' Failed|Invalid' | awk '{print $1,$2,$3,$7,$8,$10}' ; done | sort -k6 | uniq -f4 -c | awk '{print $2,$3,$4,$5,$6,$7,$1}' | sort -n
Feb 1 00:32:41 user admin 86.96.65.236 1
Feb 1 04:22:35 user admin 185.153.19.85 1
Feb 1 05:41:20 user administrator 124.160.59.196 1
Feb 1 11:55:26 user admin 122.176.50.238 1
Feb 1 17:09:39 user admin 151.54.172.15 8
Feb 1 17:33:53 user ubnt 151.54.172.15 8
Feb 10 07:33:14 user bot1 5.189.168.214 173
Feb 10 07:33:16 user bot2 5.189.168.214 173
Feb 10 07:33:18 user arkserver 5.189.168.214 865
Feb 10 07:33:30 user arma 5.189.168.214 865
Feb 10 07:33:42 user bot 5.189.168.214 1211
Feb 10 07:33:58 user botmaster 5.189.168.214 1211
Feb 10 07:34:14 user bot 5.189.168.214 692
Feb 10 07:34:24 user butter 5.189.168.214 173
Feb 10 07:34:26 user csgo 5.189.168.214 1038
Feb 10 07:34:40 user csgoserver 5.189.168.214 1038
Feb 10 07:34:54 user csserver 5.189.168.214 173
Feb 10 07:34:56 user debian 5.189.168.214 173
Feb 10 07:34:58 user gmod 5.189.168.214 1038
Feb 10 07:35:12 user gmodserver 5.189.168.214 1211
Feb 10 07:35:29 user jenkins 5.189.168.214 346
~~略~~

ちなみにfindにgrep重ねてcutで取り出すとこれまた同じことができそう。

対象ファイル

# find /var/log -name "secure*"
/var/log/secure-20170129
/var/log/secure
/var/log/secure-20170122
/var/log/secure-20170212
/var/log/secure-20170205

 xargsでcatに渡して失敗行出力

# find /var/log -name "secure*" | xargs cat | grep  -E 'Faild|Invalid'
~~略~~
Jan 22 10:25:21 tmin-server sshd[11444]: Invalid user admin from 106.57.170.216
Jan 22 20:11:18 tmin-server sshd[13909]: Invalid user uwot from 82.85.187.101
Jan 23 00:32:00 tmin-server sshd[14771]: Invalid user admin from 45.76.134.144
Jan 23 04:24:07 tmin-server sshd[15628]: Invalid user odoo9 from 82.214.118.163
Jan 23 04:32:17 tmin-server sshd[15648]: Invalid user anonymous from 82.214.118.163
Jan 23 04:32:19 tmin-server sshd[15650]: Invalid user passwd from 82.214.118.163
Jan 23 05:25:13 tmin-server sshd[15763]: Invalid user admin from 59.49.25.107
Jan 23 06:10:18 tmin-server sshd[15872]: Invalid user mother from 58.19.145.22
Jan 23 09:37:51 tmin-server sshd[16555]: Invalid user support from 45.63.79.172
Jan 23 11:17:57 tmin-server sshd[16830]: Invalid user admin from 93.201.180.162
Jan 23 12:33:15 tmin-server sshd[17063]: Invalid user a from 178.207.153.61
Jan 23 12:33:23 tmin-server sshd[17067]: Invalid user pi from 178.207.153.61
Jan 23 12:33:25 tmin-server sshd[17069]: Invalid user osmc from 178.207.153.61
Jan 23 12:33:31 tmin-server sshd[17071]: Invalid user fmaster from 178.207.153.61
Jan 23 12:33:33 tmin-server sshd[17073]: Invalid user wildfly from 178.207.153.61
Jan 23 12:33:43 tmin-server sshd[17075]: Invalid user vnc from 178.207.153.61
Jan 23 15:16:42 tmin-server sshd[17741]: Invalid user admin from 121.12.42.113
Jan 23 17:11:58 tmin-server sshd[18441]: Invalid user user from 46.32.23.52
Jan 23 20:53:44 tmin-server sshd[19150]: Invalid user odoo9 from 210.44.144.31
Jan 23 20:53:45 tmin-server sshd[19152]: Invalid user odoo8 from 210.44.144.31
Jan 23 20:53:47 tmin-server sshd[19154]: Invalid user postgres from 210.44.144.31
Jan 23 20:53:49 tmin-server sshd[19156]: Invalid user odoo9 from 210.44.144.31
Jan 23 20:53:50 tmin-server sshd[19158]: Invalid user odoo8 from 210.44.144.31
Jan 23 20:53:51 tmin-server sshd[19160]: Invalid user odoo9 from 210.44.144.31
~~略~~

 cut で区切りを半角スペースに指定して該当カラム抜き出し

# find /var/log -name "secure*" | xargs cat | grep  -E 'Faild|Invalid' | cut -d " " -f 1,2,3,7,8,10
~~略~~
Jan 22 10:25:21 user admin 106.57.170.216
Jan 22 20:11:18 user uwot 82.85.187.101
Jan 23 00:32:00 user admin 45.76.134.144
Jan 23 04:24:07 user odoo9 82.214.118.163
Jan 23 04:32:17 user anonymous 82.214.118.163
Jan 23 04:32:19 user passwd 82.214.118.163
Jan 23 05:25:13 user admin 59.49.25.107
Jan 23 06:10:18 user mother 58.19.145.22
Jan 23 09:37:51 user support 45.63.79.172
Jan 23 11:17:57 user admin 93.201.180.162
Jan 23 12:33:15 user a 178.207.153.61
Jan 23 12:33:23 user pi 178.207.153.61
Jan 23 12:33:25 user osmc 178.207.153.61
Jan 23 12:33:31 user fmaster 178.207.153.61
Jan 23 12:33:33 user wildfly 178.207.153.61
Jan 23 12:33:43 user vnc 178.207.153.61
Jan 23 15:16:42 user admin 121.12.42.113
Jan 23 17:11:58 user user 46.32.23.52
Jan 23 20:53:44 user odoo9 210.44.144.31
~~略~~

 sortしてuniqすると・・・・

# find /var/log -name "secure*" | xargs cat | grep  -E 'Faild|Invalid' | cut -d " " -f 1,2,3,7,8,10 | sort -k6 | uniq -f4 -c

      1 Jan 31 23:55:20 user admin 1.160.122.233
      2 Feb 17 16:00:56 user admin 1.53.14.175
      1 Feb 17 16:00:57 user alex 1.53.14.175
      1 Feb 17 16:00:58 user test 1.53.14.175
      1 Feb 17 16:00:59 user pi 1.53.14.175
      1 Feb 17 16:01:00 user admin 1.53.14.175
      1 Feb 17 16:01:01 user ***** 1.53.14.175
      1 Feb 17 16:01:02 user guest 1.53.14.175
      1 Feb 17 16:01:05 user ubnt 1.53.14.175
      1 Feb 17 16:01:06 user PlcmSpIp 1.53.14.175
      1 Feb 17 16:01:07 user info 1.53.14.175
      1 Feb 17 16:01:09 user support 1.53.14.175
      1 Feb 17 16:01:10 user webmaster 1.53.14.175
      1 Feb 17 16:01:11 user git 1.53.14.175
      1 Feb 17 16:01:13 user user 1.53.14.175
      1 Feb 17 16:01:14 user ftpuser 1.53.14.175
      1 Feb 17 16:01:16 user Unknown 1.53.14.175

 同じ感じ。1カラム目が回数になってるけど。

forの方

同じくちょっと分解

for 変数1 in `zcat 対象ファイル | grep "検索ワード1" | grep "検索ワード2" | grep "検索ワード3" | awk '{print $6}'`
  do zgrep $変数1 対象ファイル | grep "検索ワード4" | awk '{print $1,$2,$3,$6,$7}'
 done

 1. 変数1に代入されるリストが``内のコマンド結果。対象ファイルのgrep抽出結果の6カラム目がリストになる
2. 変数1で対象ファイルをgrepして抜き出したいカラムをawkで切り出す。
3. 処理終了

 

whileと同じくssh attackのログで検証。
1. /var/log/secureの失敗ログの10カラム目を変数IPとしてリスト。
2. /var/log/secureのログからIPを抽出。userが出力される行でgrepawkで切り出す。
3. 時間順sort

# for IP in `cat /var/log/secure | grep -E 'Faild|Invalid' | awk '{print $10}'` ; do grep $IP /var/log/secure | grep " user" | awk '{print $1,$2,$3,$7,$8,$10}' ; done | sort -n
Feb 12 06:00:37 user test 116.104.96.125
Feb 12 06:00:37 user test 116.104.96.125
Feb 12 06:00:37 user test 116.104.96.125
Feb 12 06:00:37 user test 116.104.96.125
Feb 12 06:00:40 user admin 116.104.96.125
Feb 12 06:00:40 user admin 116.104.96.125
Feb 12 06:00:40 user admin 116.104.96.125
Feb 12 06:00:40 user admin 116.104.96.125
Feb 12 06:00:43 user pi 116.104.96.125
Feb 12 06:00:43 user pi 116.104.96.125
Feb 12 06:00:43 user pi 116.104.96.125
Feb 12 06:00:43 user pi 116.104.96.125
Feb 12 06:00:44 user admin 116.104.96.125
Feb 12 06:00:44 user admin 116.104.96.125
Feb 12 06:00:44 user admin 116.104.96.125
Feb 12 06:00:44 user admin 116.104.96.125
Feb 12 06:29:18 user admin 122.100.181.115
Feb 12 06:53:48 user ubuntu 195.50.5.226
Feb 12 06:53:48 user ubuntu 195.50.5.226
Feb 12 06:53:48 user ubuntu 195.50.5.226
Feb 12 06:53:48 user ubuntu 195.50.5.226
Feb 12 06:53:48 user ubuntu 195.50.5.226
Feb 12 06:53:48 user ubuntu 195.50.5.226
Feb 12 06:53:48 user ubuntu 195.50.5.226
Feb 12 06:53:48 user ubuntu 195.50.5.226
Feb 12 06:53:48 user ubuntu 195.50.5.226
Feb 12 06:53:48 user ubuntu 195.50.5.226
Feb 12 06:53:48 user ubuntu 195.50.5.226
Feb 12 06:53:48 user ubuntu 195.50.5.226
Feb 12 06:53:48 user ubuntu 195.50.5.226

 IPでsortしてユーザ名とIPでuniq。→回数順でsort

# for IP in `cat /var/log/secure | grep -E 'Faild|Invalid' | awk '{print $10}'` ; do grep $IP /var/log/secure | grep " user" | awk '{print $1,$2,$3,$7,$8,$10}' ; done | sort -k6 | uniq -f4 -c | sort -n
      1 Feb 12 06:29:18 user admin 122.100.181.115
      1 Feb 12 07:46:38 user ubnt 166.122.78.220
      1 Feb 13 04:37:05 user admin 114.27.186.6
      1 Feb 13 12:35:56 user admin 74.66.229.110
      1 Feb 13 12:36:10 user oracle 61.148.167.42
      1 Feb 13 18:23:09 user admin 123.202.221.133
      1 Feb 13 19:52:22 user admin 78.194.25.54
      1 Feb 14 23:19:01 user admin 119.193.140.185
      1 Feb 15 22:16:33 user admin 211.223.82.164
      1 Feb 16 05:17:58 user admin 221.189.250.38
~~略~~
    556 Feb 13 22:34:57 user openerp 58.241.227.28
    556 Feb 13 22:35:22 user hadoop 58.241.227.28
    556 Feb 13 22:38:07 user usuario 58.241.227.28
    556 Feb 13 22:39:59 user backup 58.241.227.28
    556 Feb 13 22:40:17 user mosquitto 58.241.227.28
    556 Feb 13 22:44:18 user svn 58.241.227.28
    556 Feb 13 22:44:41 user cvs 58.241.227.28
    556 Feb 13 22:45:04 user info 58.241.227.28
    556 Feb 13 22:47:00 user nagios 58.241.227.28
    556 Feb 13 22:47:30 user weblogic 58.241.227.28
    695 Feb 13 22:33:32 user ubuntu 58.241.227.28
    695 Feb 13 22:34:08 user username 58.241.227.28
    695 Feb 13 22:37:02 user test 58.241.227.28
    695 Feb 13 22:40:40 user minecraft 58.241.227.28
    695 Feb 13 22:45:27 user vyatta 58.241.227.28
    695 Feb 13 22:45:57 user redmine 58.241.227.28
    695 Feb 13 22:46:28 user testuser 58.241.227.28
    834 Feb 13 22:32:54 user oracle 58.241.227.28
    973 Feb 13 22:48:13 user postgres 58.241.227.28
    973 Feb 13 22:49:33 user tomcat 58.241.227.28

 ちょっといじったら同IPでログイン成功したやつとか見つけられそう。
ログイン成功はAcceptedで出力されるので、失敗ログからIP抽出、ログ全体から失敗したIPのログイン成功ログを抽出。
/var/log/secure*を対象にして・・・

# for IP in `cat /var/log/secure* | grep -E 'Faild|Invalid' | awk '{print $10}'` ; do grep $IP /var/log/secure* | grep "Accepted" ; done | sort -n

 /var/log/secure-20170122:Jan 21 00:45:10 tmin-server sshd[2299]: Accepted publickey for tmin from xxx.xxx.xxx.xxx port 51668 ssh2

 あぁ、自分の失敗ログがもとになってるので自分のユーザ名&IPで出てますね。。。

 

 

Sponsored Link