两种名单的差别
白名单表达「允许」,语义是默认拒绝:目标不在名单内就不执行,新增主机默认安全。黑名单表达「禁止」,语义是默认允许:只有被显式点名的主机才跳过,任何新上线或改名的主机都会自动落进可执行范围。删除、清空、重装这类不可逆动作必须走白名单;临时屏蔽个别主机可以用黑名单,但不能把它当作唯一保护手段。名单还应与主机标识口径绑定:按资产编号或完全限定域名匹配,避免 IP、短名、别名混用导致匹配落空。
基本信息
| 白名单语义 | 默认拒绝,仅名单内目标执行 |
|---|---|
| 黑名单语义 | 默认允许,名单内目标跳过 |
| 落地位置 | 清单分组、脚本内过滤、平台侧授权范围、执行前校验 |
| 关键约束 | 主机标识口径统一;名单变更需审批与留痕 |
典型使用场景
- 排除禁改目标:数据库集群、网络与安全设备不参与通用批量操作
- 维护期屏蔽:某机房正在施工,临时把这批主机排除在外
- 故障隔离:把已确认异常的节点摘出名单位置,避免重复操作干扰排障
- 合规要求:变更只允许影响已审批主机,名单即执行边界
- 环境隔离:防止把测试环境主机误纳入生产批量的目标集合
- 反向操作保护:清理、下线类动作强制只走白名单
白名单为主、黑名单为辅
白名单为主、黑名单为辅
# 目标集合 = 白名单 ∩ 全量清单 - 黑名单,默认拒绝
allow=allowlist.txt
block=blocklist.txt
selected=$(grep -Fxf "$allow" hosts.txt | grep -Fvxf "$block" || true)
if [ -z "$selected" ]; then
echo "白名单未匹配到任何目标,拒绝执行" >&2; exit 1
fi
# 执行前必须打印实际目标,日志与工单对得上才算留痕
echo "本次将影响以下目标:"
printf '%s\n' "$selected"
# 规模阈值保护:超过阈值要求显式确认,避免名单写宽后无人察觉
count=$(printf '%s\n' "$selected" | wc -l)
[ "$count" -gt 20 ] && { read -r -p "目标较多($count),确认执行? " a; [ "$a" = yes ] || exit 1; }
# 真正执行:并发与失败处理另外控制
printf '%s\n' "$selected" | xargs -P 5 -I{} ssh -n {} 'uptime'名单机制对照
| 机制 | 默认行为 | 新增主机的后果 | 适合动作 |
|---|---|---|---|
| 白名单 | 拒绝执行 | 自动排除,安全 | 删除、清空、重装、下线 |
| 黑名单 | 允许执行 | 自动纳入,风险高 | 临时屏蔽个别主机 |
| 白名单加黑名单 | 拒绝执行 | 自动排除,可再临时排除 | 绝大多数生产批量作业 |
| 标签分组 | 按标签选目标 | 取决于标签维护是否及时 | 按角色的常规运维 |
名单与主机清单最好同源:清单里给主机打上角色与保护等级标签,名单由标签推导,避免同一批主机在两处各维护一份、彼此不同步。
不可逆操作不能用「黑名单兜底」的思路保护关键主机。名单写漏、主机改名、新机上线都会让保护失效,这类动作应强制白名单并限制最大影响台数。