对linux系统进行安全检查的方法
1、充分利用Linux和Unix系统中内置的检查命令来检测系统。例如,下面的几个命令在
Linux和Unix系统中就很有用处:
-who,查看谁登陆到系统中;
-w,查看谁登陆到系统中,且在做什么操作;
-last,显示系统曾经被登陆的用户和TTYS;
-history,显示系统过去被运行的命令;
-netstat,可以查看现在的网络状态;
-top,动态实时察看系统的进程;
-finger,查看所有的登陆用户。
2、定期检查系统中的日志、文件、时间和进程信息。如:
-检查/var/log/messages日志文件查看外部用户的登陆状况;
-检查用户目录下/home/username下的登陆历史文件(如:.history 文件);
-检查用户目录下/home/username的.rhosts、.forward远程登陆文件;
-用“find / -ctime -2 -ctime +1 -ls”命令来查看不到两天以内修改的一些文件;
-用“ls -lac”命令去查看文件真正的修改时间;
-用“cmp file1 file2”命令来比较文件大小的变化;
3,CPU 查看方式
//查看系统cpu使用情况
top
//查看所有cpu核信息
mpstat -P ALL 1
//查看cpu使用情况以及平均负载
vmstat 1
//进程cpu的统计信息
pidstat -u 1 -p pid
//跟踪进程内部函数级cpu使用情况
perf top -p pid -e cpu-clock
4,MEM 查看方式
//查看系统内存使用情况
free -m
//虚拟内存统计信息
vmstat 1
//查看系统内存情况
top
//1s采集周期,获取内存的统计信息
pidstat -p pid -r 1
//查看进程的内存映像信息
pmap -d pid
//检测程序内存问题
valgrind --tool=memcheck --leak-check=full --log-file=./log.txt ./程序名
5,磁盘方式
//查看系统io信息
iotop
//统计io详细信息
iostat -d -x -k 1 10
//查看进程级io的信息
pidstat -d 1 -p pid
//查看系统IO的请求,比如可以在发现系统IO异常时,可以使用该命令进行调查,就能指定到底是什么原因导致的IO异常
perf record -e block:block_rq_issue -ag
^C
perf report
6,网络方式
//显示网络统计信息
netstat -s
//显示当前UDP连接状况
netstat -nu
//显示UDP端口号的使用情况
netstat -apu
//统计机器中网络连接各个状态个数
netstat -a | awk \\'/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}\\'
7,系统负载方式
//查看负载情况
uptime
top
vmstat
//统计系统调用耗时情况
strace -c -p pid
//跟踪指定的系统操作例如epoll_wait
strace -T -e epoll_wait -p pid
//查看内核日志信息
dmesg
//显示TCP连接
ss -t -a
//显示sockets摘要信息
ss -s
//显示所有udp sockets
ss -u -a
//tcp,etcp状态
sar -n TCP,ETCP 1
//查看网络IO
sar -n DEV 1
//抓包以包为单位进行输出
tcpdump -i eth1 host 192.168.1.1 and port 80
//抓包以流为单位显示数据内容
tcpflow -cp host 192.168.1.1
8,分析系统
TOP
perf top -p pid
检查脚本.sh
#!/bin/bash
echo "Version:1.3"
echo "Author:飞鸟"
echo "Mail:liuquyong112@gmail.com"
cat <<EOF
*********************************************
Linux主机安全检查:
1.首先采集原始信息保存到/tmp/liuxcheck_${ipadd}_${date}/check_file/文件夹下
2.将系统日志、应用日志打包并保存到/tmp/linuxcheck_${ipadd}_${date}/log/目录下
3.在检查过程中若发现存在问题则直接输出到/tmp/linuxcheck_${ipadd}_${date}/danger_file.txt文件中
4.有些未检查可能存在问题的需要人工分析原始文件
5.脚本编写环境Centos7,在实际使用过程中若发现问题可以邮件联系:liuquyong112@gmail.com
6.使用过程中若在windows下修改再同步到Linux下,请使用dos2unix工具进行格式转换,不然可能会报错
7.在使用过程中必须使用root账号,不然可能导致某些项无法分析
如何使用:
1.本脚本可以单独运行,单独运行中只需要将本脚本上传到相应的服务器中,然后sh linuxcheck.sh即可
2.另外本脚本可以作为多台服务器全面检查的安全检查模板,本脚本不需要手工运行,只需要将相应服务器的IP、账号、密码写到hosts.txt文件中,然后sh login.sh即可
功能设计:
1.V1.0主要功能用来采集信息
2.V1.1主要功能将原始数据进行分析,并找出存在可疑或危险项
3.V1.2增加基线检查的功能
4.V1.3对收集过来的信息,如网络连接的IP、定时任务的URL、自启动文件、关键文件的MD5通过第三方的威胁情报接口进行查询并返回相应的结果
5.V1.4可以进行相关危险项或可疑项的自动处理
检查内容
0.IP及版本
0.1 IP地址
0.2 版本信息
0.2.1 系统内核版本
0.2.2 系统发行版本
0.3 ARP
0.3.1 ARP表
0.3.2 ARP攻击
1.端口情况
1.1 开放端口
1.1.1 TCP开放端口
1.1.2 UDP开放端口
1.2 TCP高危端口
1.3 UDP高危端口
1.4 端口转发
2.网络连接
3.网卡模式
4.自启动项
4.1 用户自定义启动项
4.2 系统自启动项
5.定时任务
5.1 系统定时任务
5.1.1 时间看系统定时任务
5.1.2 分析可疑系统定时任务
5.2 用户定时任务
5.2.1 时间看用户定时任务
5.2.2 分析可疑用户定时任务
6.路由与路由转发
7.进程分析
7.1 系统进程
7.2 守护进程
8.关键文件检查
8.1 DNS文件
8.2 hosts文件
8.3 公钥文件
8.4 私钥文件
9.运行服务
10.登录情况
11.用户与用户组
11.1 超级用户
11.2 克隆用户
11.3 可登录用户
11.4 非系统用户
11.5 shadow文件
11.6 空口令用户
11.7 空口令且可登录
11.8 口令未加密
11.9 用户组分析
11.9.1 用户组情况
11.9.2 特权用户
11.9.3 相同UID用户组
11.9.4 相同用户组名
11.10 文件权限
11.10.1 etc文件权限
11.10.2 shadow文件权限
11.10.3 passwd文件权限
11.10.4 group文件权限
11.10.5 securetty文件权限
11.10.6 services文件权限
11.10.7 grub.conf文件权限
11.10.8 xinetd.conf文件权限
11.10.9 lilo.conf文件权限
11.10.10 limits.conf文件权限
12.历史命令
12.1 系统历史命令
12.1.1 系统操作历史命令
12.1.2 是否下载过脚本文件
12.1.3 是否增加过账号
12.1.4 是否删除过账号
12.1.5 历史可疑命令
12.1.6 本地下载文件
12.2 数据库历史命令
13.策略与配置
13.1 防火墙策略
13.2 远程访问策略
13.2.1 远程允许策略
13.2.2 远程拒绝策略
13.3 账号与密码策略
13.3.1 密码有效期策略
13.3.2 密码复杂度策略
13.3.3 密码已过期用户
13.3.4 账号超时锁定策略
13.3.5 grub密码策略检查
13.3.6 lilo密码策略检查
13.4 selinux策略
13.5 sshd配置
13.5.1 sshd配置
13.5.2 空口令登录
13.5.3 root远程登录
13.5.4 ssh协议版本
13.6 NIS配置
13.7 Nginx配置
13.7.1 原始配置
13.7.2 可疑配置
13.8 SNMP配置检查
14.可疑文件
14.1 脚本文件
14.2 恶意文件
14.3 最近变动的文件
14.4 文件属性
14.4.1 passwd文件属性
14.4.2 shadow文件属性
14.4.3 gshadow文件属性
14.4.4 group文件属性
15.系统文件完整性
16.系统日志分析
16.1 日志配置与打包
16.1.1 查看日志配置
16.1.2日志是否存在
16.1.3 日志审核是否开启
16.1.4 自动打包日志
16.2 secure日志分析
16.2.1 成功登录
16.2.2 登录失败
16.2.3 图形登录情况
16.2.4 新建用户与用户组
16.3 message日志分析
16.3.1 传输文件
16.3.2 历史使用DNS
16.4 cron日志分析
16.4.1 定时下载
16.4.2 定时执行脚本
16.5 yum日志分析
16.5.1 下载软件情况
16.5.2 卸载软件情况
16.5.3 可疑软件
16.6 dmesg日志分析
16.6.1 内核自检分析
16.7 btmp日志分析
16.7.1 错误登录分析
16.8 lastlog日志分析
16.8.1 所有用户最后一次登录分析
16.9 wtmp 日志分析
16.9.1 所有用户登录分析
17.内核检查
17.1 内核信息
17.2 异常内核
18.安装软件
18.1 安装软件
18.2 可疑软件
19.环境变量
20.性能分析
20.1 磁盘使用
20.1.1 磁盘使用情况
20.1.2 磁盘使用过大
20.2 CPU
20.2.1 CPU情况
20.2.2 占用CPU前五进程
20.2.3 占用CPU较多资源进程
20.3 内存
20.3.1 内存情况
20.3.2 占用内存前五进程
20.3.3 占用内存占多进程
20.4 网络连接
20.4.1 并发连接
20.5 其他
20.5.1 运行时间及负载情况
*********************************************
EOF
dos2unix linuxcheck.sh
date=$(date +%Y%m%d)
ipadd=$(ifconfig -a | grep -w inet | grep -v 127.0.0.1 | awk 'NR==1{print $2}')
check_file="/tmp/linuxcheck_${ipadd}_${date}/check_file/"
danger_file="/tmp/linuxcheck_${ipadd}_${date}/danger_file.txt"
log_file="/tmp/linuxcheck_${ipadd}_${date}/log/"
rm -rf $check_file
rm -rf $danger_file
rm -rf log_file
mkdir /tmp/linuxcheck_${ipadd}_${date}/
echo "检查发现危险项,请注意:" > ${danger_file}
mkdir $check_file
echo "" >> $danger_file
mkdir $log_file
cd $check_file
if [ $(whoami) != "root" ];then
echo "安全检查必须使用root账号,否则某些项无法检查"
exit 1
fi
saveresult="tee -a checkresult.txt"
echo "[0.1]正在检查IP地址....." && "$saveresult"
echo -------------0.IP及版本-------------------
echo -------------0.1IP地址-------------------
echo "[0.1]正在检查IP地址....." | $saveresult
ip=$(ifconfig -a | grep -w inet | awk '{print $2}')
if [ -n "$ip" ];then
(echo "[*]本机IP地址信息:" && echo "$ip") | $saveresult
else
echo "[!!!]本机未配置IP地址" | $saveresult
fi
printf "\n" | $saveresult
echo -------------0.2版本信息------------------
echo "[0.2.1]正在检查系统内核版本....." | $saveresult
corever=$(uname -a)
if [ -n "$corever" ];then
(echo "[*]系统内核版本信息:" && echo "$corever") | $saveresult
else
echo "[!!!]未发现内核版本信息" | $saveresult
fi
printf "\n" | $saveresult
echo "[0.2.2]正在检查系统发行版本....." | $saveresult
systemver=$(cat /etc/redhat-release)
if [ -n "$systemver" ];then
(echo "[*]系统发行版本:" && echo "$systemver") | $saveresult
else
echo "[!!!]未发现发行版本信息" | $saveresult
fi
printf "\n" | $saveresult
echo -------------0.3 ARP------------------
echo -------------0.3.1 ARP表项-------------
echo "[0.3.1]正在查看ARP表项....." | $saveresult
arp=$(arp -a -n)
if [ -n "$arp" ];then
(echo "[*]ARP表项如下:" && echo "$arp") | $saveresult
else
echo "[未发现arp表]" | $saveresult
fi
printf "\n" | $saveresult
echo -------------0.3.2 ARP攻击-------------
echo "[0.3.2]正在检测是否存在ARP攻击....." | $saveresult
arpattack=$(arp -a -n | awk '{++S[$4]} END {for(a in S) {if($2>1) print $2,a,S[a]}}')
if [ -n "$arpattack" ];then
(echo "[!!!]发现存在ARP攻击:" && echo "$arpattack") | tee -a $danger_file | $saveresult
else
echo "[*]未发现ARP攻击" | $saveresult
fi
printf "\n" | $saveresult
echo ------------1.查看端口情况-----------------
echo -------------1.1 查看开放端口--------------
echo -------------1.1.1 查看TCP开放端口--------------
#TCP或UDP端口绑定在0.0.0.0、127.0.0.1、192.168.1.1这种IP上只表示这些端口开放
#只有绑定在0.0.0.0上局域网才可以访问
echo "[1.1.1]正在检查TCP开放端口....." | $saveresult
listenport=$(netstat -anltp | grep LISTEN | awk '{print $4,$7}' | sed 's/:/ /g' | awk '{print $2,$3}' | sed 's/\// /g' | awk '{printf "%-20s%-10s\n",$1,$NF}' | sort -n | uniq)
if [ -n "$listenport" ];then
(echo "[*]该服务器开放TCP端口以及对应的服务:" && echo "$listenport") | $saveresult
else
echo "[!!!]系统未开放TCP端口" | $saveresult
fi
printf "\n" | $saveresult
accessport=$(netstat -anltp | grep LISTEN | awk '{print $4,$7}' | egrep "(0.0.0.0|:::)" | sed 's/:/ /g' | awk '{print $(NF-1),$NF}' | sed 's/\// /g' | awk '{printf "%-20s%-10s\n",$1,$NF}' | sort -n | uniq)
if [ -n "$accessport" ];then
(echo "[!!!]以下TCP端口面向局域网或互联网开放,请注意!" && echo "$accessport") | $saveresult
else
echo "[*]端口未面向局域网或互联网开放" | $saveresult
fi
printf "\n" | $saveresult
echo -------------1.1.2 查看UDP开放端口--------------
echo "[1.1.2]正在检查UDP开放端口....." | $saveresult
udpopen=$(netstat -anlup | awk '{print $4,$NF}' | grep : | sed 's/:/ /g' | awk '{print $2,$3}' | sed 's/\// /g' | awk '{printf "%-20s%-10s\n",$1,$NF}' | sort -n | uniq)
if [ -n "$udpopen" ];then
(echo "[*]该服务器开放UDP端口以及对应的服务:" && echo "$udpopen") | $saveresult
else
echo "[!!!]系统未开放UDP端口" | $saveresult
fi
printf "\n" | $saveresult
udpports=$(netstat -anlup | awk '{print $4}' | egrep "(0.0.0.0|:::)" | awk -F: '{print $NF}' | sort -n | uniq)
if [ -n "$udpports" ];then
echo "[*]以下UDP端口面向局域网或互联网开放:" | $saveresult
for port in $udpports
do
nc -uz 127.0.0.1 $port
if [ $? -eq 0 ];then
echo $port | $saveresult
fi
done
else
echo "[*]未发现在UDP端口面向局域网或互联网开放." | $saveresult
fi
printf "\n" | $saveresult
echo -------------1.2 TCP高危端口--------------
echo "[1.2]正在检查TCP高危端口....." | $saveresult
tcpport=`netstat -anlpt | awk '{print $4}' | awk -F: '{print $NF}' | sort | uniq | grep '[0-9].*'`
count=0
if [ -n "$tcpport" ];then
for port in $tcpport
do
for i in `cat /tmp/dangerstcpports.dat`
do
tcpport=`echo $i | awk -F "[:]" '{print $1}'`
desc=`echo $i | awk -F "[:]" '{print $2}'`
process=`echo $i | awk -F "[:]" '{print $3}'`
if [ $tcpport == $port ];then
echo "$tcpport,$desc,$process" | tee -a $danger_file | $saveresult
count=count+1
fi
done
done
fi
if [ $count = 0 ];then
echo "[*]未发现TCP危险端口" | $saveresult
else
echo "[!!!]请人工对TCP危险端口进行关联分析与确认" | $saveresult
fi
printf "\n" | $saveresult
echo -------------1.3 UDP高危端口--------------
echo "[1.3]正在检查UDP高危端口....."
udpport=`netstat -anlpu | awk '{print $4}' | awk -F: '{print $NF}' | sort | uniq | grep '[0-9].*'`
count=0
if [ -n "$udpport" ];then
for port in $udpport
do
for i in `cat /tmp/dangersudpports.dat`
do
udpport=`echo $i | awk -F "[:]" '{print $1}'`
desc=`echo $i | awk -F "[:]" '{print $2}'`
process=`echo $i | awk -F "[:]" '{print $3}'`
if [ $udpport == $port ];then
echo "$udpport,$desc,$process" | tee -a $danger_file | $saveresult
count=count+1
fi
done
done
fi
if [ $count = 0 ];then
echo "[*]未发现UDP危险端口" | $saveresult
else
echo "[!!!]请人工对UDP危险端口进行关联分析与确认"
fi
printf "\n" | $saveresult
echo ------------2.网络连接---------------------
echo "[2.1]正在检查网络连接情况....." | $saveresult
netstat=$(netstat -anlp | grep ESTABLISHED)
netstatnum=$(netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}')
if [ -n "$netstat" ];then
(echo "[*]网络连接情况:" && echo "$netstat") | $saveresult
if [ -n "$netstatnum" ];then
(echo "[*]各个状态的数量如下:" && echo "$netstatnum") | $saveresult
fi
else
echo "[*]未发现网络连接" | $saveresult
fi
printf "\n" | $saveresult
echo -------------3.网卡模式---------------------
echo "[3.1]正在检查网卡模式....." | $saveresult
ifconfigmode=$(ifconfig -a | grep flags | awk -F '[: = < >]' '{print "网卡:",$1,"模式:",$5}')
if [ -n "$ifconfigmode" ];then
(echo "网卡工作模式如下:" && echo "$ifconfigmode") | $saveresult
else
echo "[*]未找到网卡模式相关信息,请人工分析" | $saveresult
fi
printf "\n" | $saveresult
echo "[3.2]正在分析是否有网卡处于混杂模式....." | $saveresult
Promisc=`ifconfig | grep PROMISC | gawk -F: '{ print $1}'`
if [ -n "$Promisc" ];then
(echo "[!!!]网卡处于混杂模式:" && echo "$Promisc") | tee -a $danger_file | $saveresult
else
echo "[*]未发现网卡处于混杂模式" | $saveresult
fi
printf "\n" | $saveresult
echo "[3.3]正在分析是否有网卡处于监听模式....." | $saveresult
Monitor=`ifconfig | grep -E "Mode:Monitor" | gawk -F: '{ print $1}'`
if [ -n "$Monitor" ];then
(echo "[!!!]网卡处于监听模式:" && echo "$Monitor") | tee -a $danger_file | $saveresult
else
echo "[*]未发现网卡处于监听模式" | $saveresult
fi
printf "\n" | $saveresult
echo -------------4.启动项-----------------------
echo ----------

最低0.47元/天 解锁文章
2170





