Linux_Shell腳本學習第九章-明察秋毫(下)

一、使用logrotate 管理日誌文件

logrotate能夠限制日誌文件的大小。系統的日誌記錄程序將信息添加到日誌文件的同時並不會刪除先前的數據。日誌文件因此會變得越來越大。logrotate命令根據配置文件掃描特定的日誌文件。它只保留文件中最近添加的100KB內容(假設指定了SIZE = 100k),將多出的數據(舊的日誌數據)不斷移入新文件logfile_name.1。當該文件(logfile_name.1)中的內容超出了SIZE的限定, logrotate 會將其重命名爲logfile_name.2 並再創建一個新的logfile_name.1 。logrotate命令還會將舊的日誌文件壓縮成logfile_name.1.gz、logfile_name.2.gz,以此類推。

logrotate的配置文件位於/etc/logrotate.d/
我們可以爲自己的日誌文件(比如/var/log/program.log)編寫一個自定義的配置:

$ cat /etc/logrotate.d/program
/var/log/program.log {
missingok
notifempty
size 30k
	compress
weekly
	rotate 5
create 0600 root root
}

這就是全部的配置。其中,/var/log/program.log指定了日誌文件路徑。logrotate會將舊日誌文件的歸檔也放入同一個目錄中。
logrotate命令支持的配置如下圖
在這裏插入圖片描述

二、通過監視用戶登錄找出入侵者

日誌文件可以收集系統狀態以及攻擊者的詳細信息。
假設我們有一個能夠通過SSH連接到Internet的系統。很多攻擊者試圖登入這個系統。我們需要設計一個入侵檢測系統來識別登錄失敗的那些用戶。出現這種行爲的用戶可能是採用字典攻擊的駭客。這樣的腳本應該生成包含以下細節信息的報告:

 登錄失敗的用戶;
 嘗試登錄的次數;
 攻擊者的IP地址;
 IP地址所對應的主機名;
 登錄行爲發生的時間。

我們可以編寫一個shell腳本,對日誌文件進行掃描並從中採集所需要的信息。登錄細節都記錄在/var/log/auth.log或/var/log/secure中。腳本從日誌文件中找出失敗的登錄記錄並進行分析。host命令可以用來將IP地址映射爲主機名。

#!/bin/bash
#文件名:intruder_detect.sh
#用途:入侵報告工具,以auth.log作爲輸入
AUTHLOG=/var/log/auth.log
if [[ -n $1 ]];
then
AUTHLOG=$1
	echo Using Log file : $AUTHLOG
fi
# 採集失敗的登錄記錄
LOG=/tmp/failed.$$.log
grep -v "Failed pass" $AUTHLOG > $LOG

# 提取登錄失敗的用戶名
users=$(cat $LOG | awk '{ print $(NF-5) }' | sort | uniq)
# 提取登錄失敗用戶的IP地址
ip_list="$(egrep -o "[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+" $LOG | sort | uniq)"
printf "%-10s|%-3s|%-16s|%-33s|%s\n" "User" "Attempts" "IP address" "Host" "Time range"

# 遍歷登錄失敗的IP地址和用戶
for ip in $ip_list;
	do
		for user in $users;
		do
			# 統計來自該IP的用戶嘗試登錄的次數
			attempts=`grep $ip $LOG | grep " $user " | wc -l`
			if [ $attempts -ne 0 ]
			then
				first_time=`grep $ip $LOG | grep " $user " | head -1 | cut -c-16`
				time="$first_time"
				if [ $attempts -gt 1 ]
				then
					last_time=`grep $ip $LOG | grep " $user " | tail -1 | cut -c-16`
					time="$first_time -> $last_time"
				fi
				HOST=$(host $ip 8.8.8.8 | tail -1 | awk '{ print $NF }' )
				printf "%-10s|%-3s|%-16s|%-33s|%-s\n" "$user" "$attempts" "$ip""$HOST""$time";
			fi
	done
done
rm $LOG

輸出結果如下

Using Log file : secure
User |Attempts|IP address|Host |Time range
pi |1 |10.251.90.93 |3(NXDOMAIN) |Jan 2 03:50:24
root |1 |10.56.180.82 |2(SERVFAIL) |Dec 26 04:31:29
root |6 |10.80.142.25 |example.com |Dec 19 07:46:49 -> Dec 19 07:47:38

腳本intruder_detect.sh默認使用/var/log/auth.log作爲輸入。另外也可以用命令行參數來提供指定的日誌文件。失敗的登錄記錄被收集並存入臨時文件中,以減少處理量。

如果登錄失敗,SSH會記錄類似於下面的日誌信息:

sshd[21197]: Failed password for bob1 from 10.83.248.32 port 50035

腳本會利用grep命令找出含有字符串Failed passw的行,然後將其放入/tmp/failed.$$.log中。

下一步是提取出登錄失敗的用戶。awk命令提取出倒數第5個字段(用戶名),通過管道將其傳給sort和uniq,生成一個用戶列表。

接下來,利用正則表達式和egrep命令提取出不重複的IP地址。

嵌套的for循環對所有的IP地址及用戶名進行迭代,提取出每個IP地址與用戶名的組合。如果某個IP/User(IP/用戶名)組合嘗試登錄的次數大於0,使用grep、head和cut命令提取出第一次登錄的時間。如果嘗試登錄的次數大於1,則使用tail提取出最後一次登錄的時間。

嘗試登錄的詳細信息通過printf命令進行格式化並輸出。

最後,刪除用到的臨時文件。

三、電源使用情況的測量與優化

powertop能夠測量每個電源模塊的消耗,支持交互式的電源優化。
如果不加任何選項,powertop將直接在終端上輸出:

# powertop

powertop會開始測量並顯示出有關電源使用情況、耗電最多的進程等詳細信息:

PowerTOP 2.3 Overview Idle stats Frequency stats Device stats Tunable
Summary: 1146.1 wakeups/sec, 0.0 GPU ops/secs, 0.0 VFS ops/sec and 73.0% C
Usage Events/s Category Description
407.4 ms/s 258.7 Process /usr/lib/vmware/bin/vmware
64.8 ms/s 313.8 Process /usr/lib64/firefox/firefox

選項-html會使得powertop測量一段時間,然後生成一份默認名稱爲PowerTOP.html的HTML報表,你可以使用Web瀏覽器來查看:

# powertop --html

四、監視磁盤活動

iotop可以持續進行監視,也可以生成固定時間段的監視報告。

4.1 持續監視

# iotop -o

iotop的-o選項只顯示出那些正在進行I/O活動的進程。該選項有助於減少輸出干擾。

4.2 選項-n指示iotop執行N次後退出

# iotop -b -n 2

4.3 選項-p可以監視特定進程

# iotop -p PID

PID是你想要監視的進程。
在如今大多數的Linux發行版中,不需要先查找PID,然後再提供給iotop。你可以使用pidof命令將上面的命令寫作:

# iotop -p 'pidof cp'

五、檢查磁盤及文件系統錯誤

檢查文件系統的標準工具是fsck。如果文件系統長時間沒有檢查或是出於某種原因(電源故障導致的不安全重啓)懷疑文件系統有損壞,Linux會在啓動的時候自動執行fsck。

5.1 檢查分區或文件系統的錯誤

要檢查分區或文件系統的錯誤,只需要將路徑作爲fsck的參數

# fsck /dev/sdb3
fsck from util-linux 2.20.1
e2fsck 1.42.5 (29-Jul-2012)
HDD2 has been mounted 26 times without being checked, check forced.
Pass 1: Checking inodes, blocks, and sizes
Pass 2: Checking directory structure
Pass 3: Checking directory connectivity
Pass 4: Checking reference counts
Pass 5: Checking group summary information
HDD2: 75540/16138240 files (0.7% non-contiguous),
48756390/64529088 blocks

5.2 選項-A可以檢查/etc/fstab中配置的所有文件系統

# fsck -A

該命令會依次檢查/etc/fstab中列出的文件系統。fstab文件定義了磁盤分區與掛載點之間的映射關係。它用於在系統啓動的過程中掛載文件系統。

5.3 選項-a指示fsck嘗試自動修復錯誤,無需詢問用戶是否進行修復。使用這個選項的時候要小心:

# fsck -a /dev/sda2

5.4 選項-N可以模擬fsck要執行的操作

# fsck -AN
fsck from util-linux 2.20.1
[/sbin/fsck.ext4 (1) -- /] fsck.ext4 /dev/sda8
[/sbin/fsck.ext4 (1) -- /home] fsck.ext4 /dev/sda7
[/sbin/fsck.ext3 (1) -- /media/Data] fsck.ext3 /dev/sda6
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章