当前位置:   article > 正文

centos6-8 rockyliunx ubuntu 安全加固_rocky 密码复杂度

rocky 密码复杂度

#!/bin/bash
#####################操作系统环境初始化含常用加固#################################
#说明:1.脚本需要使用root用户执行                               version 3.2
#     2.centos8,rockylinux8,centos7,ubuntu18,ubuntu20,版本测试无问题
#     3.脚本中系统判断只区分是否 linux或ubuntu 未做小版本判断
#     4.磁盘分区等操作部分与实际系统环境有关,使用前慎重查看本地环境,修改脚本
#     5.系统加固:密码周期,复杂度,登录超时时间,登录失败锁定,历史记录条目
#
############################################################################

function usercreate() {
    grep testuser /etc/group &>/dev/null
    if [ $? -ne 0 ];then
      groupadd -g 1001 testusert      #部分GNU linux会占用1000组需要更改其他id
    fi 
    id 1001
    if [ $? -ne 0 ];then
      useradd -m testuser -s /bin/bash -g testuser -u 1001 
      echo testuser:testuser | chpasswd
      
      cat /proc/version |grep "Ubuntu" &>/dev/null
      if [ $? == '0' ]
      then
        usermod -G 27 testuser
      fi
      echo 'testuser ALL=(ALL) NOPASSWD:ALL' >> /etc/sudoers #sudo免输入密码
      echo -e "\e[32m `id testuser` \e[0m"
    fi 
}

function workcreate() {
    lsblk
    echo -e "\e[31m 有破坏性的操作,请谨慎执行 \e[0m"
    read -p "选择要使用的空磁盘? [例如:sdb/vdb ,直接回车则在/分区建立]" input
    case "$input" in
      sd* | vd*) 
        echo -e "\e[32m-------------------  创建work lv  ------------------\e[0m"
        pvcreate /dev/$input
        vgcreate workvg /dev/$input
        #lvcreate -L 99G -n worklv workvg         #指定大小创建lv
        lvcreate -l 100%VG -n worklv workvg       #百分百使用vg空间创建lv
        mkfs.ext4 /dev/workvg/worklv

        lvdisplay /dev/workvg/worklv &>/dev/null
        if [ $? == '0' ];then
          echo -e "\e[32m-----------------  自动挂载work lv  ----------------\e[0m"
          echo '/dev/mapper/workvg-worklv       /work   ext4 defaults 0 0' >> /etc/fstab
          mkdir /work
          mount /work
          chown neuqsoft:neuqsoft /work
          echo -e "\e[32m `df -h |grep work` \e[0m"
        else
          ehco "请检查 worklv 是否建立成功"
        fi
      ;;
      *) 
        mkdir /work
        chown testuser:testuser /work
        echo "跳过建磁盘分区, 在 / 所在分区创建 work 目录"        
      ;;
    esac
}

function safepwd() {
  grep  ^[^#] /etc/security/pwquality.conf|grep $1 &>/dev/null
  if [ $? -ne '0' ];then
    sed -i "/$1/a$1 = $2" /etc/security/pwquality.conf
    echo -e "# 配置密码含$3"
  else
    echo -e "\e[31m 原系统已配置密码含`grep ^[^#] /etc/security/pwquality.conf|grep $1 |awk -F"=" '{print $2}'` $3\e[0m"    # 密码长度
  fi
}


function osProtective() {
    echo -e "\e[32m---------------- 设置中文系统时区----------------\e[0m"
    timedatectl &>/dev/null
    if [ $? = '0' ];then
      timedatectl set-timezone "Asia/Shanghai"
      timedatectl
    elif [ -f /usr/share/zoneinfo/Asia/Shanghai ];then
      cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && date -R
    else
      echo "时区修改失败,请检查系统环境"  
    fi

    echo -e "\e[32m---------------- history 命令加时间戳----------------\e[0m"
    grep  ^[^#].*HISTTIMEFORMAT /etc/profile &>/dev/null
    if [ $? != '0' ];then
      echo 'export HISTTIMEFORMAT="%F %T `whoami`: "' >> /etc/profile && source /etc/profile
      echo -e "# 设置 history 命令加时间戳"
    elif [[ -n $(grep '^[^#].*HISTTIMEFORMAT="%F %T `whoami`: "' /etc/profile) ]]; then
      echo -e "\e[31m# 原系统已配置过 history 命令加时间戳\e[0m"
    else
      sed -i '/^[^#].*HISTTIMEFORMAT/s/^/#/' /etc/profile
      echo 'export HISTTIMEFORMAT="%F %T `whoami`: "' >> /etc/profile && source /etc/profile
      echo -e "\e[31m# 已修改原系统已配置 history 命令格式为:日期+时间+用户名\e[0m"
    fi

    echo -e "\e[32m----------------  设置密码周期、长度要求   ------------------\e[0m"    
    sed -i "/PASS_MAX_DAYS/s/`sed -n '/^PASS_MAX_DAYS/p' /etc/login.defs |awk '{print $2}'`/90/g" /etc/login.defs
    echo -e "# 设置密码过期时间90天"
    
    sed -i 's/^#\?PASS_MIN_LEN.*/PASS_MIN_LEN    8/' /etc/login.defs
    echo -e "# 设置密码最小长度8"
    echo -e "# 现生效密码周期、长度要求"
    grep -v "#" /etc/login.defs | grep -E "PASS_MAX_DAYS|PASS_MIN_DAYS|PASS_MIN_LEN|PASS_WARN_AGE"

    echo -e "\e[32m----------------  修改强密码策略   ------------------\e[0m"
    
    cat /proc/version |grep "Ubuntu" &>/dev/null
    if [ $? == '0' ];then
      dpkg -l libpam-cracklib  &>/dev/null
      if [ $? -ne 0 ];then
        apt-get install -y libpam-cracklib 
        dpkg -l libpam-cracklib  &>/dev/null
        if [ $? -ne 0 ];then
          echo -e "\e[31m libpam-cracklib 安装失败\e[0m"
        else
          echo -e "\e[32m libpam-cracklib 安装成功\e[0m"
        fi  
      else
        echo -e "\e[33m libpam-cracklib 已经安装\e[0m"
      fi 
    fi

    cat /proc/version |grep "Ubuntu" &>/dev/null
    if [ $? == '0' ];then
      grep 'pam_unix.so.*remember' /etc/pam.d/common-password &>/dev/null
      if [ $? -ne '0' ];then
      sed -i '/pam_unix.so/s/$/ remember=3/' /etc/pam.d/common-password
      echo -e "# 设置密码最近三次密码不能重复"
      fi
      sed -i '/pam_cracklib.so/s/^/#/' /etc/pam.d/common-password    #源配置行加注释保存
      sed -i '/pam_cracklib.so/apassword        requisite                       pam_cracklib.so retry=3 minlen=8 difok=3 ucredit=-1 lcredit=-1 dcredit=-1 ocredit=-1' /etc/pam.d/common-password
      echo -e "# 设置密码复杂度:必须包含大写、小写、数字、特殊字符 最少各一个,新旧密码必须3个以上字符不一样"
      echo -e "\e[32m重启系统后,强密码策略生效\e[0m"
    fi
    
    cat /proc/version |grep "Red Hat 4" &>/dev/null
    if [ $? == '0' ];then
      grep "password.*sufficient.*remember" /etc/pam.d/system-auth &>/dev/null
      if [ $? -ne '0' ];then
        sed -i '/password    sufficient/s/$/ remember=3/' /etc/pam.d/system-auth    # 禁止使用最近用过的3个密码
      fi
      echo -e "# 设置密码最近 `grep 'remember=.*' /etc/pam.d/system-auth |awk -F"=" '{print $2}'` 次密码不能重复"
      grep "password.*requisite.*minlen" /etc/pam.d/system-auth &>/dev/null
      if [ $? -ne '0' ];then
        sed -i '/pam_pwquality.so/s/^/#/' /etc/pam.d/system-auth                #禁用默认配置
        sed -i '/pam_cracklib.so/s/^/#/' /etc/pam.d/system-auth
        sed -i '/pam_pwquality.so/apassword    requisite     pam_cracklib.so try_first_pass retry=3  minlen=8 difok=3 dcredit=-1 lcredit=-1 ucredit=-1 ocredit=-1' /etc/pam.d/system-auth
        echo -e "# 设置密码复杂度:必须包含大写、小写、数字、特殊字符 最少各一个,新旧密码必须3个以上字符不一样"
        echo -e "\e[32m重启系统后,强密码策略生效\e[0m"
      fi
      echo -e "\e[32m----------------   禁止 root 用户远程登录   ------------------\e[0m"
      sed -i 's/PermitRootLogin yes/PermitRootLogin no/g' /etc/ssh/sshd_config 
      echo -e "\e[32m重启系统后,禁止 root 用户远程登录生效\e[0m"  
    fi
    
    cat /proc/version |grep "Red Hat 8" &>/dev/null
    if [ $? == '0' ];then
      declare -A dic
      dic=([difok]="3,与原密码不重复" [minlen]="8,最小长度" [dcredit]="-1,最少一个数字" [ucredit]="-1,最少一个大写" [lcredit]="-1,最少一个小写" [ocredit]="-1,最少一个特殊字符" [retry]="3,重试次数")      
      for key in $(echo ${!dic[*]})
        do
        #    echo "$key : ${dic[$key]}"
            num=`echo "${dic[$key]}" | awk -F"," '{print $1}'`
            note=`echo "${dic[$key]}" | awk -F"," '{print $2}'`  
            safepwd $key $num $note
        done

      grep  ^[^#] /etc/security/pwquality.conf |grep enforce_for_root &>/dev/null
      if [ $? -ne '0' ];then
        sed -i '/enforce_for_root/aenforce_for_root' /etc/security/pwquality.conf
        echo -e "# 配置密码策略对 root 用户有效"
      else
        echo -e "\e[31m 原系统已配置密码策略对 root 用户有效\e[0m"    # 对 root 用户也生效
      fi
      echo -e "\e[32m强密码策略下次修改密码时生效\e[0m"
    fi    

    echo -e "\e[32m----------------   设置登录超时时间   ------------------\e[0m"
    grep 'TMOUT' /etc/profile &>/dev/null
    if [ $? -ne '0' ];then
      sed -i '$a\export TMOUT=600' /etc/profile
      echo -e "# 登录超时10分钟"
    else
      echo -e "\e[31m# 原系统已配置过登录超时时间 为 `grep 'TMOUT=' /etc/profile |awk -F"=" '{print $2}'` 秒\e[0m"
    fi

    echo -e "\e[32m----------------   登录失败锁定   ------------------\e[0m"
    cat /proc/version |grep -E 'Red Hat 4|Ubuntu' &>/dev/null
    if [ $? == '0' ];then    
      grep 'auth.*required.*deny=' /etc/pam.d/login &>/dev/null
      if [ $? -ne '0' ];then
        sed -i '1a\auth      required  pam_tally2.so   deny=3  unlock_time=120 even_deny_root root_unlock_time=120' /etc/pam.d/login
        echo -e "# 限制终端用户登录失败 3 次锁定 120 秒"
      else
        echo -e "\e[31m# 原系统已配置过终端用户登录失败 `grep -o 'deny=[0-9]*' /etc/pam.d/login | awk -F"=" '{print $2}'` 次锁定\e[0m"
      fi
      
      grep 'auth.*required.*deny' /etc/pam.d/sshd &>/dev/null
      if [ $? -ne '0' ];then
        sed -i '1a\auth      required  pam_tally2.so   deny=3  unlock_time=120 even_deny_root root_unlock_time=120' /etc/pam.d/sshd
        echo -e "# 限制ssh用户登录失败 3 次锁定 120 秒"
      else
        echo -e "\e[31m# 原系统已配置过限制ssh用户登录失败 `grep -o 'deny=[0-9]*' /etc/pam.d/sshd | awk -F"=" '{print $2}'` 次锁定\e[0m"
      fi
    fi

    cat /proc/version |grep "Red Hat 8" &>/dev/null
    if [ $? == '0' ];then
      grep 'auth.*deny=' /etc/pam.d/system-auth &>/dev/null
      if [ $? -ne '0' ];then
        sed -i '/auth.*sufficient.*pam_unix.so/iauth        requisite                                    pam_faillock.so preauth even_deny_root deny=3 unlock_time=120    # add by neuqsoft' /etc/pam.d/system-auth
        sed -i '/auth.*sufficient.*pam_unix.so/aauth        sufficient                                   pam_faillock.so authsucc even_deny_root deny=2 unlock_time=60    # add by neuqsoft' /etc/pam.d/system-auth
        sed -i '/auth.*sufficient.*pam_unix.so/aauth        [default=die]                                pam_faillock.so authfail even_deny_root deny=2 unlock_time=60    # add by neuqsoft' /etc/pam.d/system-auth
        echo -e "# 限制终端用户登录失败 3 次锁定 120 秒"
      else
        echo -e "\e[31m# 原系统已配置过终端用户登录失败 `grep -o 'auth.*requisite.*deny=[0-9]*' /etc/pam.d/system-auth | awk -F"=" '{print $2}'` 次锁定\e[0m"
      fi

      grep 'auth.*deny=' /etc/pam.d/password-auth &>/dev/null
      if [ $? -ne '0' ];then
        sed -i '/auth.*sufficient.*pam_unix.so/iauth        requisite                                    pam_faillock.so preauth even_deny_root deny=3 unlock_time=120    # add by neuqsoft' /etc/pam.d/password-auth
        sed -i '/auth.*sufficient.*pam_unix.so/aauth        sufficient                                   pam_faillock.so authsucc even_deny_root deny=2 unlock_time=60    # add by neuqsoft' /etc/pam.d/password-auth
        sed -i '/auth.*sufficient.*pam_unix.so/aauth        [default=die]                                pam_faillock.so authfail even_deny_root deny=2 unlock_time=60    # add by neuqsoft' /etc/pam.d/password-auth
        echo -e "# 限制终端用户登录失败 3 次锁定 120 秒"
      else
        echo -e "\e[31m# 原系统已配置过限制ssh用户登录失败 `grep -o 'auth.*requisite.*deny=[0-9]*' /etc/pam.d/password-auth | awk -F"=" '{print $2}'` 次锁定\e[0m"
      fi
    fi  

    cat /proc/version |grep "Red Hat" &>/dev/null
    if [ $? == '0' ];then
      echo -e "\e[32m----------------   禁止 root 用户远程登录   ------------------\e[0m"
      sed -i 's/PermitRootLogin yes/PermitRootLogin no/g' /etc/ssh/sshd_config 
      echo -e "\e[32m重启系统后,禁止 root 用户远程登录生效\e[0m"
    fi  

    echo -e "\e[32m----------------   初始化 完成   ------------------\e[0m"    
}

function main() {

    read -p "是否要建立 neuqsoft用户 ?[y/n]" input
    if [ $input = "y" ];then
        usercreate
        sleep 3
    else
        echo "跳过建立 neuqsoft 用户"
        sleep 2
    fi
    read -p "是否要建立 /work 目录 ?[y/n]" input
    if [ $input = "y" ];then
        workcreate
        sleep 3
    else
      echo "跳过建磁盘分区, work 目录"
      sleep 2
    fi
    read -p "是否进行安全加固 ?[y/n]" input
    if [ $input = "y" ];then
        osProtective
        sleep 3
    else
      echo "跳过安全加固"
      sleep 2        
    fi
}

if [ $UID != '0' ]
then
    echo -e "\e[31m 请使用 root 用户执行 \e[0m"
else
    main
fi

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/190781
推荐阅读
相关标签
  

闽ICP备14008679号