ECS自定义镜像清除SSH默认口令

更新时间:

自定义镜像安全要求

为了镜像安全管理,ECS 镜像中不允许存在默认 SSH 口令

  • 需要把 root、admin 的账号密码禁用或锁定,比如设置为!!

  • 需要把非 root、admin 的账号密码禁用或锁定,否则将用户删除

当镜像扫描发现存在默认口令后,需要在主机中执行相关操作并重新打镜像

示例修复脚本

注意,脚本仅为示范用,一切以扫描结果为准

脚本中会删除特定用户和目录,为防止误删,可修改脚本或不使用脚本,手动修改

#!/bin/bash

# 1.清空root、admin账号密码:
echo '1.开始清理root和admin账号密码...'
sed -i 's/\(^root:\)[^:]*/\1!!/' /etc/shadow
sed -i 's/\(^admin:\)[^:]*/\1!!/' /etc/shadow
echo '1.root和admin账号密码清理完毕!'


echo '2.开始清理其他账号(排除root和admin)...'
# 定义排除的用户名列表
exclude_users=("root" "admin")

while IFS=: read -r username _ _ _ _ homedir user_shell; do
  # 首先检查 shell 类型是否符合给定的列表
  case $user_shell in
    '/bin/bash'|'/bin/sh'|'/bin/zsh'\
    |'/usr/bin/bash'|'/usr/bin/sh'|'/usr/bin/zsh'\
    |'/usr/local/bin/bash'|'/usr/local/bin/sh'|'/usr/local/bin/zsh')
      
      # 然后检查用户名是否在排除列表中
      if [[ ! " ${exclude_users[@]} " =~ " $username " ]]; then
        
        # 读取用户对应的密码信息
        pass=$(grep "^$username:" /etc/shadow | cut -d: -f2)
        
        # 进行密码状态的检查
        if [[ "$pass" == "!" || "$pass" == "!!" || "$pass" == *\!* || "$pass" == "*" ]]; then
          echo "账号 $username 的密码被锁定或禁用,将不进行删除操作。"
          continue
        fi
        
        # 符合条件的账号,进行清理操作
        echo '开始清理账号:' $username
        userdel -r "$username" 2>/dev/null
        if [[ -d "$homedir" ]]; then
          rm -rf "$homedir" 2>/dev/null
        fi
      fi
      ;;

    # 如果 user_shell 不符合列表中的任何一个,此用户将被忽略
    *)
      continue
      ;;
  esac
done < /etc/passwd
echo '2.其他账号(排除root和admin)清理完毕!'

echo '3.开始清理home目录下以.DEL结尾的目录...'
# 从 /etc/passwd 读取并过滤出使用指定列表中的shell的用户数据
while IFS=: read -r username _ _ _ _ homedir user_shell; do
  case $shell in
    '/bin/bash'|'/bin/sh'|'/bin/zsh'\
    |'/usr/bin/bash'|'/usr/bin/sh'|'/usr/bin/zsh'\
    |'/usr/local/bin/bash'|'/usr/local/bin/sh'|'/usr/local/bin/zsh')
      # 若home目录存在,则查找以 .DEL 结尾的目录并删除它们
      if [[ -d "$homedir" ]]; then
        find "$homedir" -maxdepth 1 -type d -name '*.DEL' -exec rm -rf {} \;
      fi
      ;;
  esac
done < /etc/passwd
echo '3.清理home目录下以.DEL结尾的目录完毕!'

验证生效

执行如下命令

sudo cat /etc/shadow

确定用户的密码字段都为"!!""!""*"

比如root:!!:18378:0:99999:7:::

  • "!"和 "!!":表示用户账户是锁定状态,禁止密码登录。

  • "*":表示密码字段未设置

(具体含义因 linux 发行版不同会有所区别)