zoukankan      html  css  js  c++  java
  • Linux 编写安全巡检脚本

    Linux 编写安全巡检脚本

    检测/etc/passwd,/etc/shadow文件是否锁定

    检测/etc/login.defs配置文件中密码有效期设置是否得当 

    检查所有用户账户(非系统账户)中是否存在密码永久有效问题(检查/etc/shadow文件每一行中的密码期限值)

    检查系统默认历史命令记录条数(/etc/profile)和管理员帐号的历史命令条数(~/.bash_logout)是否存在安全隐患

    检查终端自动注销功能是否启用,自动注销配置文件分为系统配置文件(/etc/profile)和各个用户自己的配置文件(~/.bash_profile)

    检查系统默认管理员账号是否为root(用户ID、组ID为0)

    检查是否禁用重启热键Ctrl+Alt+Del功能

    检查su用户切换认证功能是否启用

    检查grub.conf文件中是否开启加密功能“password --md5

    检查系统是否有足够的磁盘空间

    检查开放的终端个数

    系统弱口令检测,调用john

    端口扫描功能,调用nmap

    ###检测/etc/passwd,/etc/shadow文件是否锁定
    lock=$(lsattr /etc/passwd /etc/shadow |grep i |wc -l) 
    if [ $lock -ne 2 ]  
    then
      echo "该系统中的账户和密码配置文件没有锁定,存在安全隐患!"
    fi
    ###检测/etc/login.defs配置文件中密码有效期设置是否得当
    day=$(grep "^PASS_MAX_DAYS" /etc/login.defs |awk '{print $2}')
    if [ $day -gt 30 ]
    then
      echo "/etc/login.defs该配置文件中账户有效期设置大于30天,存在安全隐患!"    
    fi
    ###检查所有用户账户(非系统账户)中是否存在密码永久有效问题(检查/etc/shadow文件每一行中的密码期限值)
    #1.首先在/etc/passwd文件中找到所有非系统帐号(uid>500和root账户),导入到一个文件
    awk -F: '{if($3>=500|| $3==0) print $1}' /etc/passwd >account.txt
    #2.循环遍历account.txt文件,过滤/etc/shadow中存在和account.txt文件一样的账户
    for i in $(cat account.txt)
    do
     grep "^$i" /etc/shadow |awk -F: '{if($5>30) print ""$1"" ":账户存在密码有效期大于30天安全隐患!"}'
    done
    ###检查系统默认历史命令记录条数(/etc/profile)和管理员帐号的历史命令条数(~/.bash_logout)是否存在安全隐患
    history_num=$(grep "^HISTSIZE" /etc/profile |awk -F= '{print $2}')
    num=$(grep "history -c" /root/.bash_logout |wc -l)
    if [ $history_num -gt 100 ]||[ $num -eq 0 ]
    then
      echo "该系统默认历史记录存在安全隐患!"
    fi
    ###检查终端自动注销功能是否启用,自动注销配置文件分为系统配置文件(/etc/profile)和各个用户自己的配置文件(~/.bash_profile)
    #1.首先检测系统配置文件/etc/profile是否有启用终端自动注销
    #2.如何系统配置文件没有启用终端自动注销,然后在循环检查各个账户的配置文件是否启用终端自动注销功能
    timeout=$(grep "^export TMOUT" /etc/profile)
    #-n是判断一个变量是否是否有值 
    if [ ! -n "$timeout" ]
    then
      #得到位于/home目录下用户账户的个数,-w 统计单词的个数
      cd /home
      n=$(ls |wc -w)
      #把/home下的所有账户名导入到一个文件
      ls >/root/user.txt
      for((i=1;i<=$n;i++))
      do
        for j in $(cat /root/user.txt)
        do
          TMout=$(grep "^export TMOUT" /home/$j/.bash_profile)
          if [ ! -n "$TMout" ]
          then
            echo "账户$j没有启用终端自动注销,存在安全隐患!"
          fi
        done
        break    
      done
    fi
    ###检查系统默认管理员账号是否为root(用户ID、组ID为0)
     awk -F: '{if($3 == 0 && $4 == 0 && $2="root") print "root是默认管理员!" }' /etc/passwd
    ###检查/etc/passwd文件中是否存在多余的超级用户账号(用户ID、组ID为0)
    awk -F: '{if($3 == 0 && $1 != "root") print ""$1"账户具有管理员权限" }' /etc/passwd
    ###检查/etc/passwd文件中是否有可疑账号(是否存在多余的账号)
    #1.事先备份一份/etc/passwd文件,然后添加帐号测试,把添加帐号之后/etc/passwd配置文件与之前备份的文件进行逐行逐个对比(每行中每个节点),存在异常,提示哪个帐号有问题
    ###检查是否禁用重启热键Ctrl+Alt+Del功能
    start_shutdown=$(grep "^#start on control-alt-delete" /etc/init/control-alt-delete.conf)
    exec_shutdown=$(grep "^#exec /sbin/shutdown" /etc/init/control-alt-delete.conf)
    if [ ! -n "$start_shutdown" ]&&[ ! -n "$exec_shutdown" ]
    then
      echo "该系统没有禁用重启热键,存在安全隐患!"
    fi
    ###检查su用户切换认证功能是否启用
    pam_wheel=$(grep "pam_wheel.so use_uid" /etc/pam.d/su)
    if [ ! -n "$pam_wheel" ]
    then
      echo "该系统没有启用su切换用户认证,存在安全隐患!"
    else
      #NF 当前记录中的字段个数,就是有多少列
      num_in_wheel=$(cat /etc/group |grep wheel |awk -F: '{print $4}'|awk -F "," '{print NF}')
      if [ $num_in_wheel -gt 2 ]
      then
        echo "太多用户能切换到root,存在安全隐患!"
      fi
    fi
    ###检查grub.conf文件中是否开启加密功能“password --md5
    passwd_grub=$(grep "password" /boot/grub/grub.conf)
    if [ ! -n "$passwd_grub" ]
    then
      echo "grub菜单没有开启加密功能,存在安全隐患!"
    fi
    ###检查系统是否有足够的磁盘空间
    #该变量用于获取磁盘的已使用空间的百分比值
    Usedspace=$(df -hT | grep "/$" | awk '{print $6}' | awk -F% '{print $1}')
    
    if [ $Usedspace -gt 80]
    then
      echo "你的磁盘空间已不足,请清理磁盘!"
    else
      echo "你的磁盘空间很充足!已用空间为$Usedspace%"
    fi
    ###检查开放的终端个数
    tty_num=$(grep "^env ACTIVE_CONSOLES" /etc/init/start-ttys.conf|awk -F "-" '{print $2}'|awk -F "]" '{print $1}')
    echo "开放$tty_num个终端"
    ###系统弱口令检测,调用john
    #通过find查找john是否存在,存在说明john已经安装
    exist_john=$(find / -name john)
    if [ ! -n "$exist_john" ]
    then
      #不存在,编译安装john
      tar zxvf /tmp/john-1.8.0.tar.gz -C /usr/src
      cd /usr/src/john-1.8.0/src
      echo "该系统没有安装john,正在安装,请稍等......"
      make clean linux-x86-64 &>/dev/null
      echo "该系统已经安装完john"
      cd /usr/src/john-1.8.0/run/
      cp /etc/shadow /root
      #用自己的字典 --worldlist
      ./john  --wordlist=/root/dict.txt /root/shadow
    else
      cd /usr/src/john-1.8.0/run/
      cp /etc/shadow /root
      #用自己的字典
      ./john  --wordlist=/root/dict.txt /root/shadow
    fi
    ###端口扫描功能,调用nmap
    exist_nmap=$(find / -name nmap)
    if [ ! -n "$exist_nmap" ]
    then
      #不存在nmap则安装,通过搭建本地yum仓库安装
      mount /dev/sr0 /mnt &>/dev/null
      #搭建本地仓库
      cd /etc/yum.repos.d
      cat >>yuzly.repo<<OK
    [yuzly]
    name=yuzly
    baseurl=file:///mnt
    enabled=1
    gpgcheck=1
    gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-redhat-release
    OK
      #安装nmap
      echo "该系统没有安装nmap,正在安装nmap,请稍等....."
      yum -y install nmap &>/dev/null
      nmap -p 135,136,137,138,139,445,21,23,3389 192.168.133.130
    else
      nmap -p 135,136,137,138,139,445,21,23,3389 192.168.133.130
    fi

     

     

    #检测/etc/passwd文件中是否和root用户的uid相同,或者是否同时存在两个uid一样的用户
    echo "帐号存在安全隐患,该账户为root账户:"
    awk -F: '{if($3 == 0 && $1 != "root") print $1 }' /etc/passwd
    
    #检测/etc/passwd文件中,是否存在密码占位符(x)被修改
    echo "帐号存在安全隐患,该帐号存在密码占位符(x)被修改!:"
    awk -F: '{if($2!="x" && $3>=500) print $1}' /etc/passwd
    
    #检测账户是否存在未设密码
    #检测哪些账户空口令(账户被锁定)
    echo "账户没有密码!:"
    awk -F: '{if($2=="!!") print $1}' /etc/shadow
    
    #检测那些账户是空密码账户
    echo "空密码账户:"
    awk -F: '{if($2=="") print $1}' /etc/shadow
    #检测失效时间
    echo "以下账户密码没有失效时间:"
    awk -F: '{if($7=="") print $1}' /etc/shadow
    #检测密码是否永久有效
    echo "下面密码是否永久有效,存在安全风险:"
    awk -F: '{if($5==99999) print $1}' /etc/shadow
    
    #检测系统内置账户中以/bin/bash结尾的账户是否被锁定
    grep "/bin/bash$" /etc/passwd | awk -F: '{print $1}' >>account1.txt
    Name=$(cat account1.txt)
    cat /etc/shadow |grep "^$Name" |awk '{print $1}'>>account2.txt
    cat account2.txt | awk -F: '($2~/^!!/){print ""$1"" ":是以/bin/bash结尾已被锁定的账户"}'
  • 相关阅读:
    【bzoj2115】[Wc2011] Xor
    【bzoj2460】[BeiJing2011]元素
    P2300 合并神犇 DP
    P1041 传染病控制 深搜
    P1038 神经网络 图论
    树状数组模板
    送外卖 状压DP
    士兵守卫(同P2016 战略游戏) 树形DP
    P1171 售货员的难题 喻队状压 DP
    P2062 分队问题 DP
  • 原文地址:https://www.cnblogs.com/yuzly/p/10725729.html
Copyright © 2011-2022 走看看