服务器租用到手第一件事,十个人里有九个是去改 SSH:换个端口、关掉密码登录、把 root 封了。改完重启 sshd 一测,傻眼——密码复杂度策略没生效,连着输错五次也不锁,root 还是能从某个角落登进来。这时候多数人第一反应是「sshd 是不是没重载」,其实方向就错了。密码策略、失败锁定、来源限制这些东西压根不在 sshd 里,在 PAM 里。
PAM(Pluggable Authentication Modules,可插拔认证模块)是 Linux 上 sshd、su、sudo、login 这些服务共用的认证框架。服务不自己实现认证,它只负责把「这个人是谁、密码对不对、账号还能不能用」这类问题丢给 PAM 栈,栈里从上到下跑一串模块,每个模块给一个结论,最后靠这些结论的组合决定放行还是拒绝。听着简单,真上手你会发现它有个很不讲道理的地方:同样几行配置,换个顺序,语义就完全变了。
我写这篇的出发点很实在——机器托管在机房,人在外面,改登录策略最大的风险不是被黑,是把自己关在门外。密码策略配错了顶多是不严,顺序配错了可能是所有登录方式全废,本地控制台也进不去。所以下面每一节我都会顺带交代一句「这步错了会怎样、退路在哪」。
· PAM 是「栈」不是「开关」,你改的不是某一行,是行与行之间的顺序和语义。
· sshd_config 与 PAM 是两层:前者管 sshd 用什么方式接,后者管认证这件事怎么判。
· 失败锁定没配自动解锁时间和白名单,一次脚本输错密码就能把人锁在机房外面。
· 禁 root 直登之前必须先验证 sudo 通路,顺序反了就是自锁门外。
· 改 PAM 时永远留一个不退出的话,这是唯一靠谱的回退通道。
把一次 SSH 登录拆开看,链条是三段:服务 → PAM 栈 → 模块。sshd 接到连接,自己先按 sshd_config 判断要不要接受密码、要不要接受密钥、允不允许 root;这些是 sshd 的活。一旦决定「这次走密码认证」,sshd 就把用户名和口令交给 PAM,去 /etc/pam.d/sshd 里那张栈表跑一遍。栈表里每一行是一个模块,比如 pam_unix 去 /etc/shadow 比对密码,pam_faillock 去查失败计数,pam_access 去查来源地址。跑完栈,PAM 给 sshd 回一个成功或失败,sshd 再决定放不放行。
关键在于:栈是服务共享的。/etc/pam.d/ 下一个服务一个文件,sshd 有自己的,su 有自己的,sudo 有自己的,很多发行版还会抽出一个公共文件(RHEL 系常是 /etc/pam.d/system-auth,Debian 系常见 common-auth、common-account 这类),让 sshd 用 include 去引用。你在公共文件里动一行,可能同时影响 ssh、su、sudo、图形登录和屏幕解锁。这就是「改一处、坏一片」的根源。
/etc/pam.d/ 里每行四段:类型 / 控制标记 / 模块路径 / 参数。
第一段是类型(也叫 group),四个值各管一段:auth 管身份校验,密码对不对、OTP 对不对;account 管账号本身是否有效,过没过期、是不是被锁、这个时间点允不允许登;password 管改密码这件事,新密码够不够复杂;session 管会话建立与收尾,挂载家目录、打日志、套资源限制。很多新手把失败锁定一股脑全写在 auth 段,其实 pam_faillock 这类模块在 auth、account 两段都有事做,account 段那行漏了,锁定就只做一半。
第二段是控制标记,决定这行的返回值怎么影响最终结果,也决定栈要不要继续往下走——这是全文最该看懂的一段,下一节单说。
第三段是模块路径,一般写 pam_unix.so 这种相对名,实际文件在 /lib64/security/ 或 /lib/security/ 下;写绝对路径也行。第四段是参数,比如 pam_faillock.so preauth silent deny=5 unlock_time=600,参数名和可用值在不同版本之间差别不小,照抄别的发行版的教程经常直接报错「unknown option」,sshd 重启后登录直接失败——这类报错不是危言耸听,是我见过最多的翻车方式。
/etc/ssh/sshd_config 里的 UsePAM yes 决定 sshd 到底走不走 PAM;PasswordAuthentication、PubkeyAuthentication、PermitRootLogin 这三个是 sshd 自己的开关,跟 PAM 没有隶属关系。于是一个非常常见的误解就出现了:有人想加密码复杂度,去 sshd_config 里翻半天找不到对应项,改了几个看着像的参数,测下来没反应——因为复杂度是 pam_pwquality 在 password 段管的,sshd_config 里根本没有这一项。
反过来也成立:你在 PAM 里配了严格的失败锁定,但 sshd_config 里 UsePAM no,那这条栈一次都不会跑,白配。两层之间还有一个容易忽略的点——公钥登录通常不经过 PAM 的 auth 栈里那些密码相关模块,所以你配的失败锁定对走密钥的人不一定生效,对改密码的人也不一定生效。想全覆盖,得先弄清哪条登录路径走哪一段栈,而不是拍脑袋觉得「配了就都管」。
常见的控制标记有 required、requisite、sufficient、optional,还有较新的 include 与 substack。前四个说的是「这一个模块的结果怎么算」,后两个说的是「把另一个文件整段搬进来跑」。
两者都会让失败最终导致认证失败,区别在于:required 失败后继续把栈走完,只是最后一定报失败;requisite 失败后立刻返回,后面的模块一行都不跑。
这个差别有两个实际用途。一是安全:账号已经被锁的时候,用 requisite 可以立刻停下,后面的 pam_unix 根本不会去比对密码——没必要在明知要拒的情况下还把口令送进校验流程。二是排错:用 required 时,后面模块的日志照样打出来,你能看到完整链路;用 requisite 时栈在中途就断了,日志只有前半截,看日志的人容易误判「模块没加载」。
但反过来说,requisite 也会掩盖问题:某一行 requisite 一直失败,你永远看不到后面模块其实也坏了。optional 则是「结果基本不参与最终判定」,除非它是栈里唯一有结论的模块——这个例外条件记一下就行,日常用得少。
sufficient 的意思是「成功了就直接通过」,前提是前面那些 required 都过了。它一旦成功,同一个类型段里后面剩下的行会被跳过。这就是顺序即语义的由来。
看一个真实的翻车写法。有人想给 sshd 加失败锁定,图省事把 pam_unix 那行留在原位,把 faillock 的行追加到了后面:
auth sufficient pam_unix.so try_first_pass nullok auth required pam_faillock.so preauth silent deny=5 unlock_time=600 auth required pam_faillock.so authfail deny=5 unlock_time=600
问题在哪:密码输对了,第一行 sufficient 直接成功返回,第二行的 preauth 检查一次都没跑——于是账号明明还在锁定期内,照样能登进去。密码输错了呢,第一行失败,栈继续走到第三行 authfail,计数倒是记上了,但第二行的 preauth 从来没在成功路径上生效过。结果就是「锁了跟没锁一样」,而这个人还以为自己配好了。
正确做法是 preauth 必须排在 pam_unix 之前,用 requisite 立刻拦下已锁账号:
auth requisite pam_faillock.so preauth silent deny=5 unlock_time=600 auth sufficient pam_unix.so try_first_pass nullok auth required pam_faillock.so authfail deny=5 unlock_time=600 auth required pam_deny.so
同一类错误还有另一种更狠的:把 pam_deny(永远返回失败)挪到栈的开头,或者复制粘贴时把结尾那行 auth required pam_deny.so 挪到了中间。前者是所有人都进不去,后者是它下面的模块永远走不到。我的习惯是:pam_deny 只出现在 auth 段的最后一行,紧跟在所有实际校验之后,作为兜底。
下面这些模块是日常最常碰到的。每个模块都有明确的「能力边界」,超纲的期待是很多误解的来源——比如指望 pam_limits 去限制 nginx 的打开文件数,这在 systemd 时代基本是白搭,原因后面单说。
| 模块 | 管什么 | 常见坑 | 生效前提 | 是否建议默认启用 |
|---|---|---|---|---|
| pam_unix | 本地 /etc/passwd、/etc/shadow 口令校验,也兼管账号与改密码 | 以为它管密码复杂度,其实复杂度是 pwquality 的事;nullok 会让空口令账号直接通过 |
服务走 PAM,且本机确实有本地账号体系 | 建议,基础项 |
| pam_faillock | 失败次数计数与锁定,可设计数窗口、解锁时间、白名单 | preauth 行写在 pam_unix 之后等于没配;不设解锁时间会把人永久锁死 | auth 段 preauth + authfail 成对,account 段再补一行 | 建议,但必须先定解锁时间 |
| pam_pwquality (旧称 pam_cracklib) |
改密码时的复杂度校验:长度、字符类别、与旧密码差异 | 只在 password 段生效,对已有密码不做追溯;用密钥登录的人改不到它 | 走 password 类型;通过 passwd 或 chage 触发 | 建议,别设成反人类的强度 |
| pam_limits | 登录会话套用 /etc/security/limits.conf 里的 nofile、nproc 等 | 只对登录会话有效,管不到 systemd 拉起的服务 | session 段有 session required pam_limits.so |
建议,服务侧另配 |
| pam_access | 按来源地址与用户名做访问控制,配合 /etc/security/access.conf | access.conf 写错顺序(前面的 ALL 吃掉后面的 DENY)会全放行 | account 段启用,且规则文件顺序先验证 | 视场景,托管机建议配 |
| pam_google_authenticator /pam_oath 一类 |
第二因子(OTP,一次性口令),叠加在口令或密钥之上 | 用 required 强推会导致没有绑定 OTP 的账号也进不去;会话没设宽限会每人卡在二次输入 | 用户已绑定并备份了恢复码,带外通道可用 | 谨慎,先给管理员试点 |
| pam_mkhomedir | 首次登录自动创建家目录并拷骨架文件 | 集中账号场景下每次登录都尝试建目录,日志里一堆噪音 | session 段启用,且磁盘与权限正常 | 可选,按需 |
表里还有一个没写进去的补充:pam_tally2 是 pam_faillock 的前身,在较新的发行版上已经被取代。你照着一份五年前的教程去写 pam_tally2,要么模块不存在(加载失败,视控制标记而定可能直接拒绝登录),要么参数名全变了。看到教程里的模块名,第一反应应该是「我这套系统上有这个 .so 吗」,而不是直接抄。
失败锁定是 PAM 配置里最有价值、也最容易伤到自己的一项。价值不用多说——密码爆破是托管机器最常挨的招呼。问题在于它是无差别的:不管对面是攻击者还是你自己那个写错了密码的批量脚本,锁就是锁。
我见过最典型的自锁场景:一台机器上有几个定时同步脚本,某次改了密码没同步过去,脚本每隔几分钟跑一次。阈值设低、没有自动解锁时间,几分钟之内这台机器的账号就锁死了,而人还在几百公里外。这时候唯一的通道就是带外控制台。
所以配锁定,我按四条走:
第一,阈值和窗口要成对看。失败次数不是孤立的数字,得配一个计数窗口——窗口内累计到 N 次才锁,过了窗口计数就清零。只写次数不写窗口,等于把历史上所有输错都累计起来,一年输错十次也能把人锁了,这显然不是你要的效果。
第二,解锁时间必须写死,别留空。没有 unlock_time 的锁定就是永久锁定,解锁只能靠管理员手工清计数——而管理员自己可能就是被锁的那个。解锁时间宁可设得宽松一点(十五分钟到半小时这种量级),也不要不设。锁定的目的是拖慢爆破,不是永久封号,攻击者等得起十五分钟,但你等不起一次出差。具体数值按你的运维习惯定,我这里给的是经验起点,不是任何标准。
第三,分清 root、白名单和运维账号。锁定要不要对 root 生效是个取舍:对 root 生效更安全,但 root 一旦被锁,sudo 通路也一起断,退路只剩带外;不对 root 生效,等于给爆破留了一个固定靶子。我更倾向于给 root 设一个更宽松的阈值,同时保留一个不在爆破面上的管理员账号,而不是二选一。白名单那一项也要慎用——加进去的账号等于绕过了锁定,别图省事把整个运维组都塞进去。
第四,托管场景下带外控制台是最后的救命通道。IPMI、iDRAC 这一类带外管理口不经过操作系统里的 PAM,机器锁死了它照样能进。托管机器我都会先确认带外控制台能用再动登录策略,一万网络这边 7×24 中文工单、平均 5 分钟响应,真把自己锁在外面也有个能打通的电话。
「禁掉 root 直登」这句话在实际配置里对应三个不同的东西,混着改很容易改出一个四不像。
第一层是 sshd 自己的 PermitRootLogin。它在 /etc/ssh/sshd_config 里,管的是「sshd 这个服务允不允许 root 通过 SSH 进来」,跟 PAM 无关。设成 no,root 走 SSH 就进不来,但走本地控制台、走 su 切换依然可以。
第二层是 pam_securetty。它管的是 root 能从哪些终端登录,配合 /etc/securetty 使用。这一层针对的是本地与串口终端,跟 SSH 是另一条路。很多人改了 sshd_config 就以为 root 全封了,结果发现串口还能直接进——就是这一层没管。
第三层是日常做法:普通用户登录 + sudo 提权。这才是我们真正推荐的形态——审计有迹可循,误操作有缓冲,谁在什么时候干了什么一目了然。但这三层有个严格的先后顺序:禁用 root 直登之前,必须先确认 sudo 通路是通的。
怎么确认才算通?不是「我装的镜像里默认有个 sudo 组」就算通。你得:用一个新开的终端(不要复用当前会话,因为当前会话可能继承了旧的权限缓存),用普通用户登录,执行 sudo 提权,确认能拿到 root shell;再确认这个账号的 sudo 规则不会因为改了 PAM 的 session 段而失效;最后确认这台机器上还有第二个能提权的账号,防止唯一管理员账号被锁定后无人可解。
顺序反了的代价是什么?PermitRootLogin 改了、sudo 又没配通,而你恰好把所有会话都退了——那就只剩带外控制台。如果这台机器还没开带外,那就是一次重装。我自己的习惯是:先在一个不重要的窗口验证 sudo 能提权,验证完了再改 root 相关配置,改完再开第三个窗口从零验证一遍,全程保持最早那个 root 会话不退出。
session required pam_limits.so 这一行决定登录会话要不要套用 /etc/security/limits.conf 里的资源限制——nofile(打开文件数)、nproc(进程数)这些。这一行漏了,limits.conf 写得再漂亮也没用,因为没人去读它。
这也是「命令行里 ulimit 改了没生效」这类问题的另一条线索。PAM 只在会话建立这个时间点读一次 limits.conf,你登录之后再改文件、或者在 shell 里 ulimit -n 改当前值,都不会回头去改已经建立的会话。要生效就退出重登。
更常见的一个坑是:系统服务根本不走 PAM。由 systemd 拉起的 nginx、数据库、中间件,它们的资源限制走的是 unit 文件里的 LimitNOFILE、LimitNPROC 这类 Limit* 参数,跟 limits.conf 是两套体系,互不相干。你在 limits.conf 里把 nofile 调得再大,nginx 该报 too many open files 还是照报。这类服务的限制要去 unit 文件或全局的 systemd 配置里改,改完 daemon-reload 再重启服务。
一句话总结这一节:登录会话看 PAM + limits.conf,常驻服务看 systemd 的 Limit*,别指望改一个地方全生效。我见过太多人两边各改一半,然后花半天排查「为什么有的进程生效有的不生效」。
PAM 配错的后果比绝大多数配置都要重:所有登录方式都进不去,包括本地控制台。不是「SSH 连不上」这种级别,是真的进不去系统。所以排错和回退必须提前想好,不能等出事再想。
日志在哪:RHEL 系(CentOS、Rocky、Alma 等)一般看 /var/log/secure,Debian 系(Debian、Ubuntu)一般看 /var/log/auth.log。PAM 模块加载失败、参数不认识、返回什么码,基本都在这里。看不到日志的时候先确认 rsyslog 或 journald 在跑,很多最小化镜像默认没装 rsyslog,日志只在 journald 里,得用 journalctl 查。
改配置的习惯:保持一个已登录的 root 会话不退出,用另一个终端开新窗口做验证。这个习惯救过我很多次——PAM 是即时生效的(不需要重启服务,下一次认证就走新栈),所以「改错了但还没退出」和「改错了且已经退出」是两个完全不同的世界。前者改回来就行,后者要联系机房。
修改顺序:不要直接编辑正在用的文件。先把原文件复制一份带日期的备份,改完立刻用另一个终端、另开一次完整登录验证,验证通过再收工。别用当前会话里的 su 来「验证」——su 走的是 /etc/pam.d/su 那条栈,跟你改的 sshd 那條不是同一条,验证了个寂寞。
还有一条容易忽略:sshd 的配置语法检查可以用 sshd -t,但 PAM 没有等价的「干跑校验」工具。sshd -t 过了不代表 PAM 没错,PAM 的错只有真正跑一次认证才会暴露。这也是为什么「留一个不退出的话」这件事没有任何替代方案。
不是所有环境都值得在 PAM 上花时间。
容器里改 PAM 通常没意义。容器的 /etc/pam.d/ 可能不完整,甚至整个 PAM 体系就没装。容器里一般也不跑 sshd,进程是直接 exec 起来的,压根不经过 PAM 栈。你在 Dockerfile 里认真配半天 faillock,最后发现这个容器里连 su 都没人用——白费劲。容器场景的登录控制应该放在宿主机和编排层,而不是容器内部的 PAM。
最小化镜像类似。很多 minimal、cloud 类镜像为了体积裁掉了不少包,PAM 可能在,但模块不全、配置文件是精简版。改之前先确认 /etc/pam.d/ 里有没有你要改的那个服务文件,以及 /lib64/security/ 下有没有对应的 .so。
云主机镜像一般是完整的,但发行版之间差异很大:同样一个「失败锁定」,RHEL 系 8/9 用 pam_faillock 且常有专门的 authselect 配置入口,Debian 系的路径和公共文件名又是另一套;旧教程里的 pam_tally2、pam_cracklib 在新版本上要么没了要么改了名。跨发行版照抄是最省事也最容易出事的做法。我建议先跑一句 man pam_模块名 或查所用发行版的文档,确认模块存在、参数支持,再动手。
坑一:把 sufficient 写在 required 前面,锁定检查被整个跳过。坑在哪——pam_unix 成功后直接返回,后面的 faillock preauth 一次都不跑,账号锁了照样登。怎么避——preauth 行必须排在 pam_unix 之前,且用 requisite;改完用真实账号在锁定窗口内实测一次。
坑二:锁定不配解锁时间,把人永久锁死。坑在哪——一次脚本输错密码就把账号锁住,管理员自己也进不去,只能走带外。怎么避——unlock_time 必须写死,宁可宽松也不要空着;给 root 单独设更宽松的阈值,或保留一个不在爆破面上的备用管理员账号。
坑三:只改 sshd_config,以为密码策略会跟着生效。坑在哪——复杂度是 pam_pwquality 在 password 段管的,sshd_config 里压根没有这一项,改几个看着像的参数毫无作用。怎么避——先分清这条策略属于哪一层:sshd 的开关、还是 PAM 的模块;属于 PAM 就去 /etc/pam.d/ 下找对应服务的栈。
坑四:禁 root 直登之前没验证 sudo 通路。坑在哪——PermitRootLogin 关了、sudo 又没配通,所有会话一退就只剩带外或重装。怎么避——用新开的终端以普通用户登录并实测 sudo 提权成功,再改 root 相关配置;全程保持一个 root 会话不退出。
坑五:拿 limits.conf 去限制 systemd 服务。坑在哪——服务走 systemd 的 Limit* 参数,不经过 pam_limits,改了完全没反应,还容易误判成「配置没生效」。怎么避——登录会话改 limits.conf,常驻服务改 unit 文件的 LimitNOFILE 一类参数,改完 daemon-reload 并重启服务,两边各管各的。
问:改完 PAM 或 sshd 配置,sshd 重启失败或起不来怎么办?
先分清是 sshd 自己的问题还是 PAM 的问题。sshd_config 的语法可以用 sshd -t 检查,它会直接报哪一行有问题;PAM 没有等价的干跑校验工具,错误只在真正跑一次认证时才暴露,所以症状常常是「sshd 进程在、但谁都登不进去」。处理顺序:第一,别退出你已经登录的那个会话,这是唯一的回退通道;第二,从备份文件把改动回滚,PAM 是即时生效的,回滚后下一次认证就走旧栈,不需要重启 sshd;第三,看 /var/log/secure(RHEL 系)或 /var/log/auth.log(Debian 系),模块加载失败和参数错误都会留下记录。如果会话已经全部退出且本机进不去,那就只能走带外控制台,这也是托管前必须确认带外可用的原因。
问:为什么我在 sshd_config 里改了半天,密码策略还是不生效?
因为密码复杂度这类策略属于 PAM 的 password 段,由 pam_pwquality(旧称 pam_cracklib)负责,sshd_config 里根本没有对应项。你在 sshd_config 里能改的是 PasswordAuthentication、PubkeyAuthentication、PermitRootLogin、UsePAM 这几个 sshd 自己的开关。要加复杂度,去 /etc/pam.d/ 下找对应服务的栈,在 password 类型那几行里加 pam_pwquality,并确认 /lib64/security/ 下这个模块存在。还有两个容易漏的点:一是复杂度只在改密码时校验,对已经存在的弱口令不做追溯,所以配完之后要让所有账号改一次密码;二是走密钥登录的人如果永远不改密码,这条策略对他事实上不起作用。
问:失败锁定的阈值设多少合适?
别问「哪个数字最安全」,要问「我的场景能承受多大的误伤」。阈值和计数窗口必须成对设:窗口内累计 N 次才锁,过了窗口清零,否则历史输错会一直累计。次数上,设得太低(一两次)会让正常的输错也被锁,太高(十几次以上)又拉不住爆破;窗口和解锁时间才是真正决定体验的两项——解锁时间宁可宽松也不要留空,没有解锁时间就是永久锁定,管理员自己被锁了只能走带外。具体数值按你的运维习惯和账号数量自己定,我这里只给方向:先宽松上线,观察一两周日志里真实的失败来源,再慢慢收紧。另外给 root 单独设一个更宽松的阈值,或者保留一个不在爆破面上的备用管理员账号,别把唯一的管理员账号放进无差别锁定里。
问:OTP 第二因子和普通密码怎么叠加?
pam_google_authenticator、pam_oath 这类模块提供的是第二因子(OTP,一次性口令),叠加在口令或密钥之上。控制标记的选择是这里的关键:用 required 或 requisite 强推,会导致还没绑定 OTP 的账号也一起进不去——包括你自己的应急账号。稳妥做法是先在管理员小范围试点,确认绑定流程、恢复码备份、时间同步都没问题,再逐步推开;同时保留一个不强制 OTP 的应急通路(比如只允许从内网或带外走),并让每个人都把恢复码离线存一份。还有一个现实问题:OTP 对自动化脚本是噩梦,跑批机器的账号不要加 OTP,改用密钥加来源限制更合适。
问:容器里要不要配 PAM?
一般不配。容器的 /etc/pam.d/ 可能不完整甚至整个 PAM 体系就没装,容器里通常也不跑 sshd,进程直接 exec 起来,压根不经过 PAM 栈——你认真配了也是白配。容器场景的登录与访问控制应该放到宿主机和编排层:谁能 exec 进容器、谁能拉镜像、镜像来自哪个仓库,这些才是真正的边界。如果确实需要在容器里跑 sshd(我不推荐这种用法),那就按完整系统的标准去配,先确认模块文件都在,别指望基础镜像帮你准备好了。
问:云主机上改 PAM 有风险吗?
有,而且风险点跟物理机不太一样。云主机镜像一般是完整的,但发行版之间差异很大:模块名、参数名、公共配置文件(RHEL 系的 system-auth、Debian 系的 common-*)都不一样,跨发行版照抄教程是最容易出事的做法。风险本身不在「云」这个形态,而在「你人不在机器旁边」——PAM 配错是所有登录方式全废,包括本地控制台,云主机如果没开带外控制台或救援模式,恢复起来比重装还麻烦。我的建议是改之前先确认三件事:镜像里 /etc/pam.d/ 下有没有你要改的服务文件、/lib64/security/ 下有没有对应的 .so、服务商有没有提供带外控制台或救援入口。三件都齐了再动手,动手时留一个不退出的话。
PAM 最忌讳的就是「从某篇博客抄一段」。这篇博客可能是五年前写的,可能是另一个发行版,可能是另一个 PAM 版本——模块名都变了,你抄过来只会得到一个加载失败。三个查证渠道按优先级排:
第一是本机手册。man pam_模块名(比如 man pam_faillock)会给出这个版本实际支持的参数列表和默认值,比任何二手教程都准。没有 man 页就先装对应文档包,或者去看 /usr/share/doc/ 下的说明。第二是所用发行版的官方文档,尤其是 RHEL 系那边的 authselect 配置入口——它管理着 PAM 栈的生成,你手工改的文件可能下次被它覆盖掉,这种情况必须走官方推荐的改法。第三是服务商能提供的部分。
服务商这边能帮到的通常是这三件事:提供带外控制台(IPMI/iDRAC 一类)的访问方式,让你在锁死时有路可退;提供救援模式或系统盘快照回滚,出事后能快速回到改之前的系统盘状态;提供镜像层面的说明,告诉你这个镜像的 PAM 是不是完整的、有没有做过裁剪。一万网络深耕 IDC 19 年(成立于 2007 年),深圳南山总部,自营机柜最快 1 分钟上架,免费系统盘快照每日 3 份、30 秒回滚,硬件故障 10 分钟自动迁移——这些能力在你真把登录改坏的时候,就是实打实的恢复手段。但有一条要说清:PAM 栈本身是你自己的系统配置,服务商一般不会代你逐行改,能给你的是通道和回滚手段,不是替你承担配置责任。
策略配完不是结束,是开始。我一般会盯着三件事复查一周:
一是锁定有没有误伤。前三天每天看一次认证日志,重点看被锁的是谁、来自哪、是不是脚本和定时任务。如果发现某个内部脚本一直在撞,别急着放宽阈值,先把脚本的凭据修好——放宽阈值只是把问题藏起来。真正合理的状态是:日志里有爆破的痕迹(说明外面确实有人在扫),但没有任何一次锁定落在自己人头上。
二是 sudo 通路是否始终可用。每次改完 PAM 的 auth 或 session 段之后,都要重新用新终端完整验证一遍 sudo。PAM 是栈,你在 session 段加的东西可能间接影响提权后的会话环境,而这类问题在旧的、已经登录的会话里看不出来。验证方式固定:新终端、普通用户、sudo 提权、拿到 root shell,四步都过才算通。
三是带外控制台是否真的能进。这一条最容易被跳过,因为它平时用不上。但恰恰是它,决定了「锁死」这个事故的上限——能用带外,是十几分钟的事;不能用,是一次重装加一次数据恢复。建议每个季度实测一次带外登录,别等到真出事才发现账号过期或者网络策略挡着。
最后一句结论:PAM 这套东西,技术难度不高,难在你对顺序的敬畏。改之前想清楚「错了怎么退」,比改得多严格重要得多。
数据来源:文中为通用框架行为与常见模块用途(模块名、参数名、配置文件路径与日志路径因发行版和 PAM 版本而异,实际以所用发行版、PAM 版本与服务商镜像为准,改配置前请以本机 man 手册与发行版官方文档为准);文中涉及的服务能力描述以服务商公开信息为准,具体以签约时最新报价与合同为准。
Copyright © 2013-2020 idc10000.net. All Rights Reserved. 一万网络 科技有限公司 版权所有 深圳市科技有限公司 粤ICP备07026347号
本网站的域名注册业务代理北京新网数码信息技术有限公司的产品