一、使用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