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 发行版不同会有所区别)
文档内容是否对您有帮助?