如何编写自己的Linux安全检查脚本

如何编写自己的Linux安全检查脚本,第1张

脚本大致内容: 基本信息统计(IP地址、MAC地址、端口信息、服务信息等)、主机安全检查(包括等保三级要求主机相关的检查点)、系统性能统计(暂时未加入分析)、恶意代码、程序检查等检查点。

脚本内容涉及到:

1、查看系统密码文件修改时间

2、查看是否开启了ssh服务

3、查看系统SSH远程访问设置策略(host.deny拒绝列表)

4、查看shell是否设置超时锁定策略

5、查看syslog日志审计服务是否开启

6、查看syslog日志是否开启外发

7、查看passwd文件中有哪些特权用户

8、查看系统中是否存在空口令账户

9、PHP、JSP、perl、Python、HTML、以及linux下可执行文件内容的检查

里面列举了一些常见webshell、提权EXP、以及Python扫描工具、嗅探工具的特征,如果发现此类相关的文件,则会显示出来,或者拷贝一份到/tmp/目录下

例如:能扫描到的linux下提权工具:

一共是172个文件。都可以扫描的到。。。。

其实整个脚本相对起来比较简单,主要用到的命令为

find / -type

if语句

awk命令

more

egrep

等命令组成。

比如说awk命令,我们用more或cat命令,读取某个文件内容,然后通过awk进行筛选和输出,来显示我们想要看的东西

例如:

more /etc/login.defs | grep -E "PASS_MAX_DAYS" | grep -v "#" |awk -F' ' '{if($2!=90){print "/etc/login.defs里面的"$1 "设置的是"$2"天,请管理员改成90天。"}}'

从这里我们可以看到,通过more来打开/etc/login.defs文件,并查找关键字 “PASS_MAX_DAYS”, 用awk命令,筛选以”为分隔符的内容,用作判断,如果$2第二个分隔符位置的内容不等于90,则输出该内容。

同理,任意针对文件内容做筛选的结果,都可以通过这样的方式去显示我们想要显示的内容。

又例如:

echo "查看系统中存在哪些非系统默认用户"

echo "root:x:“该值大于500为新创建用户,小于或等于500为系统初始用户”"

more /etc/passwd |awk -F ":" '{if($3>500){print "/etc/passwd里面的"$1 "的值为"$3",请管理员确认该账户是否正常。"}}'

echo ------------------------------------------------------------------------

if语句相关:

echo --------------------------------------------------------------------------

echo "检查系统文件完整性2(MD5检查)"

echo "该项会获取部分关键文件的MD5值并入库,默认保存在/etc/md5db中"

echo "如果第一次执行,则会提示md5sum: /sbin/portmap: 没有那个文件或目录"

echo "第二次重复检查时,则会对MD5DB中的MD5值进行匹配,来判断文件是否被更改过"

file="/etc/md5db"

if [ -e "$file" ]then md5sum -c /etc/md5db 2>&1

else

md5sum /etc/passwd >>/etc/md5db

md5sum /etc/shadow >>/etc/md5db

md5sum /etc/group >>/etc/md5db

md5sum /usr/bin/passwd >>/etc/md5db

md5sum /sbin/portmap>>/etc/md5db

md5sum /bin/login >>/etc/md5db

md5sum /bin/ls >>/etc/md5db

md5sum /bin/ps >>/etc/md5db

md5sum /usr/bin/top >>/etc/md5db

fi

echo ----------------------------------------------------------------------

这里呢,对部分敏感文件的MD5值做了下验证,大致思路是,先检查 /etc/md5db 是否存在,如果不存在的话,则将所涉及文件的MD5值入库,并保存到 /etc/md5db文件中,当我们第二次对服务器进行检查时,则会对比两次的MD5值,如果MD5值发生变化,则会进行提醒。

脚本本身没什么复杂的东西,我先贴出部分内容,供大家参考下。

#!/bin/bash

echo " (__)"

echo " (oo)"

echo " /------\/ "

echo " / ||| "

echo " * /\---/\ "

echo " ~~ ~~ "

echo "...."Are You Ready?"..."

read key

echo "警告:本脚本只是一个检查的 *** 作,未对服务器做任何修改,管理员可以根据此报告进行相应的设置。"

echo ---------------------------------------主机安全检查-----------------------

echo "系统版本"

uname -a

echo --------------------------------------------------------------------------

echo "本机的ip地址是:"

ifconfig | grep --color "\([0-9]\{1,3\}\.\)\{3\}[0-9]\{1,3\}"

echo --------------------------------------------------------------------------

awk -F":" '{if($2!~/^!|^*/){print "("$1")" " 是一个未被锁定的账户,请管理员检查是否需要锁定它或者删除它。"}}' /etc/shadow

echo --------------------------------------------------------------------------

more /etc/login.defs | grep -E "PASS_MAX_DAYS" | grep -v "#" |awk -F' ' '{if($2!=90){print "/etc/login.defs里面的"$1 "设置的是"$2"天,请管理员改成90天。"}}'

echo --------------------------------------------------------------------------

more /etc/login.defs | grep -E "PASS_MIN_LEN" | grep -v "#" |awk -F' ' '{if($2!=6){print "/etc/login.defs里面的"$1 "设置的是"$2"个字符,请管理员改成6个字符。"}}'

echo --------------------------------------------------------------------------

more /etc/login.defs | grep -E "PASS_WARN_AGE" | grep -v "#" |awk -F' ' '{if($2!=10){print "/etc/login.defs里面的"$1 "设置的是"$2"天,请管理员将口令到期警告天数改成10天。"}}'

echo --------------------------------------------------------------------------

grep TMOUT /etc/profile /etc/bashrc >/dev/null|| echo "未设置登录超时限制,请设置之,设置方法:在/etc/profile或者/etc/bashrc里面添加TMOUT=600参数"

echo --------------------------------------------------------------------------

if ps -elf |grep xinet |grep -v "grep xinet"then

echo "xinetd 服务正在运行,请检查是否可以把xinnetd服务关闭"

else

echo "xinetd 服务未开启"

fi

echo --------------------------------------------------------------------------

echo "查看系统密码文件修改时间"

ls -ltr /etc/passwd

echo --------------------------------------------------------------------------

echo "查看是否开启了ssh服务"

if service sshd status | grep -E "listening on|active \(running\)"then

echo "SSH服务已开启"

else

echo "SSH服务未开启"

fi

echo --------------------------------------------------------------------------

echo "查看是否开启了TELNET服务"

if more /etc/xinetd.d/telnetd 2>&1|grep -E "disable=no"then

echo "TELNET服务已开启 "

else

echo "TELNET服务未开启 "

fi

echo --------------------------------------------------------------------------

echo "查看系统SSH远程访问设置策略(host.deny拒绝列表)"

if more /etc/hosts.deny | grep -E "sshd: "more /etc/hosts.deny | grep -E "sshd"then

echo "远程访问策略已设置 "

else

echo "远程访问策略未设置 "

fi

echo --------------------------------------------------------------------------

    平时在Linux做巡视时,都通过命令行来输入指令,比如df -k等等,但是对于多指令多任务来说,单个指令就显得不够效率。于是笔者想着有没有啥脚本可以自动完成这个任务呢?笔者以前的文章-sysstat性能监控工具,里面有系统监控工具 Sysstat,可以查看CPU使用率、硬盘和网络吞吐数据等等信息。但是这个也是命令行,并且也没有集合的脚本。带着问题,笔者想着自己写一个脚本来,但是想着检查项目还是不熟悉,于是在github上搜索一番,找到一款老外写的脚本,于是乎,clone下来测试一番。

    github真是太劲了。

    开始clone脚本:

    sudo  git clone  https://github.com/SimplyLinuxFAQ/health-check-script.git

    进入目录:cd health-check-script/

    由于health-check.sh文件没有执行权限,需要加上可执行权限sudo chmod +x health-check.sh,然后执行./health-check.sh。

    脚本大概分为几个部分,现罗列其中的几个。

1、 系统基本信息

    脚本写的非常好,比如查看hostname,即/etc/hostname文件里面的内容。整个指令结构显示看hostname -f是否执行成功,然后hostname -f或者hostname -s,也就是 long host name或者 short host name。 &&为与, ||时或。

hostname -f &>/dev/null &&printf "Hostname : $(hostname -f)" || printf "Hostname : $(hostname -s)"

2、 磁盘Disk Usage

FS_USAGE=$(df -PThl -x tmpfs -x iso9660 -x devtmpfs -x squashfs|awk '!seen[$1]++'|sort -k6n|tail -n +2)

3、负载率uptime

echo -e "Current Load Average : $(uptime|grep -o "load average.*"|awk '{print $3" " $4" " $5}')"

4、三次重启事件

last -x 2> /dev/null|grep reboot 1> /dev/null && /usr/bin/last -x 2> /dev/null|grep reboot|head -3 || \

5、三次关机事件

last -x 2> /dev/null|grep shutdown 1> /dev/null && /usr/bin/last -x 2> /dev/null|grep shutdown|head -3 || \

6、占用cpu最高的进程

ps -eo pcpu,pid,ppid,user,stat,args --sort=-pcpu|grep -v $$|head -6|sed 's/$/\n/'

7、占用内存最高的进程

ps -eo pmem,pid,ppid,user,stat,args --sort=-pmem|grep -v $$|head -6|sed 's/$/\n/'

    这个脚本关注点在系统信息、磁盘、内存、进程信息,没有打印网络状态,需要监控的进程等等信息,可以使用指令iostat、ps -ef | grep your_process。在局域网中,如果循环可以读取/etc/hosts文件内容,按照ip来远程到linux主机ssh ip_addrsss,执行脚本内容来检查整个服务器的信息。

    最后看一下测试效果,检查结果正常的话,会有颜色提示的,这也是笔者才知道shell可以设置颜色的。开始位是\e[  , 结束位是\e[0m  ,第一个数字代表字体颜色,第二个数字代表底色,当然还可以有其他下划线等等特殊效果。

GCOLOR="\e[4732m ------ OK/HEALTHY \e[0m"

WCOLOR="\e[4331m ------ WARNING \e[0m"

CCOLOR="\e[4731m ------ CRITICAL \e[0m"

#!/bin/sh

echo '########################系统信息####################'

OS_TYPE=`uname`

OS_HOSTNAME=`hostname`

OS_IP=`ifconfig ens33 | grep inet | head -1 |awk '{print $2}'`

OS_banben=`uname -a | awk '{print $3}'`

OS_DATE=`date +%F_%T`

OS_RUNING=`uptime |awk '{print $3 $4}' | awk -F, '{print $1}'`

OS_MEM=`free -m |grep Mem |awk '{print $2}'`

OS_MEM_FREE=`free -m | grep Mem |awk '{print $4}'`

OS_MEM_PER=`free -m | grep Mem |awk '{printf ("%.2f\n",$3/$2*100)}'`     #awk保留小数后两位需要 print换printf ("%.2f\n",$3/$2*100")

echo "          主机类型  $OS_TYPE                        "

echo "          主 机 名  $OS_HOSTNAME               "

echo "          主 机 IP  $OS_IP                                 "

echo "          系统版本  $OS_banben                       "

echo "          系统时间  $OS_DATE                          "

echo "          运行时间  $OS_RUNING                      "

echo "          语言环境  $LANG                                  "

echo "          总 内 存  ${OS_MEM}M                         "

echo "          剩余内存  ${OS_MEM_FREE}M            "

echo "        内存使用率  ${OS_MEM_PER}%             "

echo '####################################################'


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/yw/8301901.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-15
下一篇 2023-04-15

发表评论

登录后才能评论

评论列表(0条)

保存