> For the complete documentation index, see [llms.txt](https://freebsd-journal-cn.bsdcn.org/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://freebsd-journal-cn.bsdcn.org/20220910-an-quan-xing/we-get-letters.md).

# 读者来信

* 原文链接：[We Get Letters](https://freebsdfoundation.org/wp-content/uploads/2022/11/letters.pdf)
* 作者：**Michael W Lucas**

亲爱的期刊来信专栏：

我得把这个新硬件小玩意儿集成到所有主机的所有认证系统里，不管它们用的是哪种操作系统。这比我想象的难多了。OpenSolaris、FreeBSD、Linux、AIX、HP/UX、其他 Unix 之间的差异都很小，但加起来就显得巨大。有更简单的办法吗？

——困惑的人

困惑的人：

我最近有机会去听了三年来第一场音乐会——九寸钉（Nine Inch Nails）、Nitzer Ebb 和 Ministry。我把自己保护得好好的——粘上口罩、塞好耳塞、戴好护目镜、穿好全身防护服，更别说那带刺铁丝的光环了，但至少我能去参加这场辉煌的怒火倾泻、正义的背叛、那种叛逆苦涩——让我每天早晨有理由爬出笼子，刮掉牙齿上的胆汁。

这接近我对 PAM 的感受。

“但你必须用 PAM 啊，”人们喊道，“它是必要的恶，是标准！” 不，它不是。只要你不去细看，它确实像标准。Sun Microsystems——NFSv2、Java、许多其他诱人且不朽的梦魇的发源地——把它公之于众，希望它能被采纳。它被采纳了。Sun 没有像对 NFS 那样组织互操作活动，也没有像 Java 那样维持控制。相反，他们让每个人都以自己偏好的、略有不同的方式去实现。是的，是的，公共桌面环境（CDE）在 1990 年代成为标准并提及了 PAM 集成，但任何与周六晨间动画片和甲龙共存的“标准”都不应被视为今日仍然相关。我们最接近 PAM 标准的东西是 X/Open 单一登录服务（XSSO）——可插拔认证模块的文档，源自把它钉入 POSIX 的一次尝试，但人们只遵循了大约百分之九十，而我们都知道，百分之九十兼容等于百分之零互操作。

我们甚至没有标准用语。是 PAM 策略还是链？规则还是模块？类型还是规则？即便你读了文档，也只能靠直觉和善业来贯通。

《期刊》的编辑觉得有必要让某位 PAM 辩护士为本期写一篇稿子。我不会称它为“文章”来美化它，因为他多半是从自己的书里剪贴片段拼出来的，最后还无耻地附上了同一本书的广告。我不是说他会为了一块钱什么都干——但如果我不幸在他附近，我绝对会用我平时留着对 Al Jourgensen 吼回去的那种嗓音提一句：即使在信息技术领域，“道德”也是存在的，而他这一切都摆在公众面前，任何稍微费点心机的人都能识破他那点小把戏。算他走运，没人对他那点拙劣把戏有足够兴趣去费神。

别提标准化。不是所有东西都必须成为标准——否则，我们就不能犯下发明新东西的错误了。看看 PAM 是怎么工作的。你抓来这些共享库，别管它们从哪儿来、被审计得多仔细，把它们串在一起，强迫它们集体决定你的认证要怎么运作？我们都知道访问控制列表怎么工作。这个允许，那个不行。你仔细定义允许活动的特征，然后屏蔽其余一切。你不会去做的事情，是实施一个软弱的系统，规则可以说“是的，但只有在其他人都同意的情况下”或“我要否决它，但你们先投吧”。

投票？安全不是民主制度！它甚至不是共和制。

倒不是说 PAM 会正经投票。它更像一群醉醺醺的程序员决定晚饭点什么。你确实会绕桌一圈，但最后那个对编译器内部机制最了解的人会选出让所有人宿醉最严重的东西。其他人能点几道配菜，也许还能要一包幸运饼干，尽管收银员不停提醒所有人，他们做的是希腊式 saganaki 幸运饼，因为这是家希腊店，而你的命运总是美味的。

没有馄饨汤，这算什么访问控制？

好吧。好吧。事已至此。

但还有一件事——调试。我完全理解所有调试归根结底都是在代码里撒打印语句，然后看着它疯狂跑偏，但 PAM 连个标准的调试方法都没有。也许调试语句会管用。也许你可以用 PAM 的 `echo` 模块把东西吐回给用户，这绝对永远不会吓坏那个来自收发部、需要尝试三次加上神迹才能成功登录菜单式库存系统的家伙。他会没事的。我以小指发誓。

所以你用 pam\_exec 写个小脚本，把信息倒进日志文件，或者干脆塞进 **logger(1)** 直接进系统日志。在认证系统里用 shell 脚本并不保证你会被攻破——尤其是脚本极其简单时——但 shell 脚本有这种可怕的扩张倾向，每一行代码都是漏洞。你不如写个 Perl 小脚本，通过网络把认证凭据和 Microsoft Excel 表格对一遍。

等等——那位 PAM 辩护士已经建议这么做了？

是时候降低我的标准了。又一次。

但又一次，事已至此。PAM 是那个不是标准的标准。我们被它困住了。

我能给你的唯一安慰是：你的印象是合理的。没有东西互相兼容。每样东西都有自己的语言。不过我听说教皇宣布过，配置 PAM 的时间可以算作在炼狱中服刑，所以一定要正确填写你的工时表。

希望？是的，我有希望。我的希望是 systemd 吞掉 Linux-PAM，OpenPAM 成为最后的幸存者。也许到那时我们就能拥有一个由清醒的、懂得如何点幸运饼干的人设计的认证系统。

不过以我们的运气，我们会得到一个涉及电子表格和 Perl 脚本的。

有问题想问 Michael？请发送至 <letters@freebsdjournal.org>

**MICHAEL W LUCAS** 是《Networking for System Administrators》、《$ git commit murder》等众多著作的作者。他的新书包括《OpenBSD Mastery: Filesystems》和《Prohibition Orcs》。完整的冗长清单可从他的 SNMP OID 或 <https://mwl.io> 获取。

***

《PAM Mastery》 by Michael W Lucas

可插拔认证模块（PAM）：威胁还是祸害？

PAM 是系统管理中最容易被误解的部分之一。许多系统管理员宁愿忍受认证问题，也不愿冒险把事情弄得更糟。PAM 的本质使它不同于任何其他 Unix 访问控制系统。如果你有 PAM 苦恼或 PAM 谜团，你需要《PAM Mastery》！

“Michael W Lucas 又一次精准命中。”——nixCraft


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://freebsd-journal-cn.bsdcn.org/20220910-an-quan-xing/we-get-letters.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
