Linux无原生用户黑名单,需通过SSH配置、shell禁用、sudo限制或账户锁定实现;推荐用Git托管blacklisted_users.yml清单,Ansible一键分发并校验执行结果。

Linux系统本身没有“用户黑名单”这个原生概念,所谓“用户黑名单”通常指禁止特定用户登录或执行命令的策略,它不等同于证书CRL或IP封禁。实现一键分发与更新,关键在于明确目标场景、选择适配机制,并用Ansible/Salt等工具批量落地。
先确认你要拦的是哪类“用户”
不同拦截层级对应不同技术方案:
-
禁止SSH登录:通过
/etc/ssh/sshd_config的DenyUsers或DenyGroups配置,配合systemctl reload sshd生效; -
禁止所有shell访问:将用户默认shell设为
/sbin/nologin或/bin/false,用usermod -s批量修改; -
限制sudo权限:在
/etc/sudoers.d/下创建规则文件,用Defaults:user_name !authenticate或直接移除其sudo组成员身份; -
完全禁用账户:用
usermod -L加锁密码,或chage -E 0设置过期日期。
把黑名单变成可版本化管理的配置文件
不要手动编辑系统文件。推荐做法是维护一个中心化清单,例如blacklisted_users.yml:
users:
- name: "hacker123"
reason: "brute-force attempt on SSH"
action: "lock_shell"
- name: "testdev"
reason: "contract ended"
action: "disable_account"
该文件可存入Git仓库,作为配置源。每次变更都触发CI流水线,避免人工误操作。
用Ansible实现“一键分发+更新”
编写playbook,按action字段自动执行对应操作:
- 对
lock_shell:运行usermod -s /sbin/nologin {{ item.name }}; - 对
disable_account:运行usermod -L {{ item.name }} && chage -E 0 {{ item.name }}; - 同步前用
getent passwd {{ item.name }}校验用户是否存在,不存在则跳过并记录警告; - 任务末尾加入
ansible.builtin.debug输出本次生效的用户数及变更摘要。
配套机制让更新真正可靠
光推送不够,还要验证和兜底:
- 每次执行后,用
awk -F: '$7 ~ /nologin|false$/ {print $1}' /etc/passwd检查实际锁定用户是否匹配清单; - 在
/etc/sudoers.d/99-blacklist-audit中写入注释行,记录上次更新时间与Git commit ID; - 设置定期巡检任务(如每天凌晨),比对当前锁定状态与清单差异,异常时发告警;
- 保留白名单机制,在同一playbook中支持
whitelisted_users字段,确保运维账号永不被误锁。











