Linux 系统管理:用户指南
当您拿到这期 Linux Journal 时,我的新书 Linux 系统管理:用户指南 应该已经上架了。Linux Journal 的朋友们非常酷,他们在今期杂志中给了我一些版面,让我可以向大家展示这本书的精彩内容。
以我的性格,我在想要展示什么内容时感到很为难,同时又想保持简短。毕竟,有太多内容可以选择了。设置扫描仪?CD 刻录机?阻止对您网络的未授权访问?打印?备份?Sendmail 调整?什么呢?最后,我决定谈谈在当今互联网世界中没有得到足够重视的东西,那就是传统的用户安全。您即将阅读的是本书第七章“用户和组”的节选。这不是完整的章节,也不是所有的内容都按顺序排列。“厨师是不是喝多了自己的酒?”您可能会这样说?完全不是。事实上,就像我的另一个自我一样,我想利用这个空间给您一个样本,如果您愿意的话,可以尝尝我新书中的内容。把它想象成在自助餐桌上小口品尝。正如 Marcel 主厨会说的那样,Bon appétit!
Linux 是一个多用户操作系统,意味着一个或多个用户可以同时在其上工作。每个用户都通过其用户名引用。每个用户名都有一个与之关联的用户 ID (UID) 以及一个或多个组。与用户名类似,组名也由一个数字标识符表示,这次称为组 ID (GID)。用户的 UID 是唯一的,组的 GID 也是唯一的。
当涉及到您的文件和目录时,Linux 系统上的安全性是通过权限定义的,权限直接与用户 ID 相关。用户分为管理用户或普通用户。主要的管理用户称为 root。用户的 ID 用于决定可以执行哪些命令以及可以读取或写入哪些文件。
每个用户 ID 也都关联着一个密码。该密码可以并且应该定期更改。
简短的答案是,除非绝对必要,否则您永远不应该使用 root 用户。危险在于 root 用户在系统上几乎是万能的。一个错误可能会产生严重的后果,甚至可能摧毁您的整个系统。除非绝对必要,最好以非管理用户的身份工作。还有其他原因。
首先是安全。由于 root 用户可以访问所有内容,因此只有那些真正需要访问权限的人才应该获得 root 密码。有权访问 root 的人越少越好。让我给您几个充分理由来谨慎保护 root 访问权限:它使维护安全性更容易,它降低了危险代码的风险,并且错误通常不会产生全局影响。是的,非 root 用户仍然有可能对系统造成重大损害,但风险要小得多。
好像您还没有足够的事情要做一样,这里又有一项任务。您应该定期运行报告,以识别已休眠的帐户或登录名。这是一种委婉的说法,意思是“已经离开并且近期不会回来的人”。
本书的前一章解释了 finger 命令,该命令显示与帐户上次使用时间相关的信息。尝试键入此命令以列出每个用户 ID 并检查上次登录时间。请注意,单引号(在 sort 命令之前和管道符号之前)实际上是反引号(或反撇号)。反引号通常与波浪号 (~) 一起位于大多数键盘上的 Esc 键下方。
finger 'sort /etc/passwd | cut -f1 -d":"' | grep -i log | more
此命令的输出看起来像这样
Login: aeinstein Name: A. Einstein Never logged in. Login: guitux Name: Tux the Penguin Last login Mon Jan 8 14:54 (EST) on tty2 Login: halt Name: halt Never logged in. Login: lp Name: lp Never logged in. Login: mail Name: mail Never logged in. Login: mgag Name: Marcel Gagné Last login Wed Mar 7 17:29 (EST) on 1 from website Login: named Name: Named Never logged in. Login: natika Name: Natika the Cat警告: 在这里您必须运用您的良好判断力(系统管理的绝对要求)。其中一些帐户(例如 sync 和 lp)是系统帐户。没有人通过它们登录过是很正常的。另一方面,Einstein 先生(在列表顶部)也从未登录过,而且他肯定不是管理登录名。可能是这是一个新帐户(事实如此),或者您为从未使用的用户创建了一个帐户。在后一种情况下,您可能应该删除该帐户。
现在,我使用这个例子是为了让您了解您的命令行能力。但是,我应该告诉您,还有一种更简洁的方法可以做到这一点。您的 Linux 系统附带了一个方便的小命令 lastlog,它可以做到这一点
[root@scigate /root]# lastlog | more Username Port From Latest root tty1 Wed Mar 7 17:18:40 -0500 2001 bin **Never logged in** daemon **Never logged in** adm **Never logged in** lp **Never logged in** sync **Never logged in** shutdown **Never logged in** mgagne 1 scigate Wed Mar 7 17:29:55 -0500 2001 postgres **Never logged in** www **Never logged in** natika 8 localhost.locald Thu Dec 7 14:30:15 -0500 2000 guitux tty2 Mon Jan 8 14:54:55 -0500 2001
Geek 小知识: 您无法编辑或修改此文件,但 lastlog 命令信息来自文件 /var/log/lastlog。
这是您应该做的另一件事。每隔一段时间,运行命令 pwck。默认情况下,它会遍历您的 /etc/passwd 和 /etc/shadow 文件,并进行一些基本的完整性检查,例如确保存在正确数量的字段,并且每个名称都被唯一标识。对于组文件,有一个配套命令 grpck。
设置强密码的原因可以追溯到本书前面我对密码文件的描述,特别是它与非 shadow 文件中的密码字段的关系。这是一个快速提醒,说明其格式
root:2IsjW45pb4L56:0:0:root:/root:/bin/bash
密码字段(字段 2)通过哈希算法进行编码。如果您对详细的细节感到好奇,请键入 <@cxb>man crypt<@$p>,您将找到您想知道的关于密码编码的所有内容。简而言之:那个奇怪的密码实际上是您的密码的编码版本,它基于一个双字符的随机生成的盐值。然后,该盐值用于播种哈希例程以生成最终的字符组。
术语哈希表示一种技术,用于获取一串字符(例如,一个人的姓氏)并生成一个唯一的键(理想情况下),以便于从数据库中检索信息。您所做的是将普通文本编码为更短的(通常是)数字表示形式。
密码破解者通过使用该盐值针对字典中的每个单词生成密码来破解密码。虽然这听起来很复杂,但事实并非如此。一个简单的程序调用 crypt 例程,对一个单词运行哈希,然后将其与 /etc/passwd 文件中的密码条目进行比较。如果匹配,宾果!他们就得到了您的密码。如果不匹配,他们就移到下一个单词。在一个性能不错的系统上,破解者不需要太长时间就可以遍历书中的每个密码。
不相信我?看看图 1 中名为 Nutcracker 的小程序(一个免费软件工具,可以进行我所说的暴力密码检查)的输出。

图 1. 为什么字典单词是糟糕的密码
如图 1 所示,选择容易记住的东西(因为它是一个常用词)是密码的糟糕选择。
看看当我登录到一台机器时会发生什么。一切看起来都很正常。我有登录名,密码请求。我输入密码,voilà,我就进去了。但是等等——阅读一下在我输入密码后出现的那条单行消息
login: mgagne Password: Last login: Mon Jan 8 16:00:39 from energize
“energize”到底是什么?Energize 显然是我上次登录的计算机的主机名,但我没有一个名为 energize 的系统。此外,假设我不认识任何使用该系统的人,并且我总是从同一个地方登录。唯一的解释是,有人从一个名为 energize 的系统使用我的登录名和密码登录到服务器。
这只是一个假设的情况,但它确实说明了您应该考虑培训用户养成的另一个习惯。如果他们日复一日地从同一台 PC 登录,则该消息永远不应更改。如果他们不认识上次登录消息中的主机名,他们应该将其作为一项策略来提醒您。
安全不仅仅是系统管理员的领域。毕竟,您已经有很多事情要处理了。任何帮助都值得感谢。您需要让用户参与进来。让他们知道系统安全既是他们的事,也是您的事。

Marcel Gagné (mggagne@salmar.com) 是 Salmar Consulting, Inc. 的总裁,这是一家系统集成和网络咨询公司,也是由 Addison-Wesley 出版的《Linux 系统管理:用户指南》的作者。