第 4 章。身份验证

目录

4.1. 常规 Unix 身份验证
4.2. 管理帐户和密码信息
4.3. 好的密码
4.4. 创建加密密码
4.5. PAM 和 NSS
4.5.1. PAM 和 NSS 访问的配置文件
4.5.2. 现代集中式系统管理
4.5.3. “为什么 GNU su 不支持 wheel 组”
4.5.4. 更严格的密码规则
4.6. 其他访问控制
4.6.1. sudo
4.6.2. PolicyKit
4.6.3. SELinux
4.6.4. 限制对某些服务器服务的访问
4.7. 身份验证的安全性
4.7.1. 通过互联网安全密码
4.7.2. Secure Shell
4.7.3. 互联网的额外安全措施
4.7.4. 保护 root 密码

当个人(或程序)请求访问系统时,身份验证确认其身份是可信任的。

[Warning] 警告

PAM 的配置错误可能会将您锁定在自己的系统之外。您必须手头备有救援 CD 或设置备用启动分区。要恢复,请使用它们启动系统并从那里纠正问题。

4.1. 常规 Unix 身份验证

常规 Unix 身份验证由 pam_unix(8) 模块在 PAM (可插拔身份验证模块) 下提供。其 3 个重要的配置文件,条目之间用“:”分隔,如下所示。

表 4.1. pam_unix(8) 的 3 个重要配置文件

文件 权限 用户 描述
/etc/passwd -rw-r--r-- root root (已清理)用户帐户信息
/etc/shadow -rw-r----- root shadow 安全用户帐户信息
/etc/group -rw-r--r-- root root 组信息

/etc/passwd”包含以下内容。

 ...
user1:x:1000:1000:User1 Name,,,:/home/user1:/bin/bash
user2:x:1001:1001:User2 Name,,,:/home/user2:/bin/bash
 ...

passwd(5) 中所述,此文件中每个用“:”分隔的条目表示以下内容。

  • 登录名

  • 密码规范条目

  • 数字用户 ID

  • 数字组 ID

  • 用户名或注释字段

  • 用户主目录

  • 可选用户命令解释器

/etc/passwd”的第二个条目曾用于加密密码条目。在引入“/etc/shadow”之后,此条目用于密码规范条目。

表 4.2. “/etc/passwd”的第二个条目内容

内容 含义
(空) 无密码帐户
x 加密密码在“/etc/shadow”中
* 此帐户无法登录
! 此帐户无法登录

/etc/shadow”包含以下内容。

 ...
user1:$1$Xop0FYH9$IfxyQwBe9b8tiyIkt2P4F/:13262:0:99999:7:::
user2:$1$vXGZLVbS$ElyErNf/agUDsm1DehJMS/:13261:0:99999:7:::
 ...

shadow(5) 中所述,此文件中每个用“:”分隔的条目表示以下内容。

  • 登录名

  • 加密密码(初始的“$1$”表示使用 MD5 加密。“*”表示无法登录。)

  • 自 1970 年 1 月 1 日以来密码上次更改的天数

  • 密码可以更改前的天数

  • 密码必须更改后的天数

  • 密码到期前警告用户的天数

/etc/group”包含以下内容。

group1:x:20:user1,user2

group(5) 中所述,此文件中每个用“:”分隔的条目表示以下内容。

  • 组名

  • 加密密码(实际未使用)

  • 数字组 ID

  • 用“,”分隔的用户名列表

[Note] 注意

/etc/gshadow”为“/etc/group”提供与“/etc/shadow”类似的功能,但实际未使用。

[Note] 注意

如果将“auth optional pam_group.so”行添加到“/etc/pam.d/common-auth”并在“/etc/security/group.conf”中设置它,则可以动态添加用户的实际组成员身份。请参阅 pam_group(8)

[Note] 注意

base-passwd 包包含用户和组的权威列表:“/usr/share/doc/base-passwd/users-and-groups.html”。

4.2. 管理帐户和密码信息

以下是管理帐户信息的几个值得注意的命令。

表 4.3. 管理帐户信息的命令列表

命令 功能
getent passwd <user_name> 浏览“<user_name>”的帐户信息
getent shadow <user_name> 浏览“<user_name>”的影子帐户信息
getent group <group_name> 浏览“<group_name>”的组信息
passwd 管理帐户密码
passwd -e 为帐户激活设置一次性密码
chage 管理密码老化信息

您可能需要 root 权限才能使某些功能工作。有关密码和数据加密,请参阅 crypt(3)

[Note] 注意

在配置了 PAM 和 NSS 的系统上,例如 Debian alioth 机器,本地“/etc/passwd”、“/etc/group”和“/etc/shadow”的内容可能不会被系统积极使用。即使在这种环境下,上述命令仍然有效。

4.3. 好的密码

在系统安装期间或使用 passwd(1) 命令创建帐户时,您应该选择一个好的密码,根据 passwd(1),该密码应由 6 到 8 个字符组成,其中包括以下每组字符中的一个或多个字符。

  • 小写字母

  • 数字 0 到 9

  • 标点符号

[Warning] 警告

不要选择容易猜到的单词作为密码。

4.4. 创建加密密码

有一些独立的工具可以生成带盐的加密密码。

表 4.4. 生成密码的工具列表

软件包 popcon 大小 命令 功能
whois http://qa.debian.org/popcon.php?package=whois 320 mkpasswd crypt(3) 库的过度功能前端
openssl http://qa.debian.org/popcon.php?package=openssl 1079 openssl passwd 计算密码哈希值 (OpenSSL)。passwd(1ssl)

4.5. PAM 和 NSS

现代 类 Unix 系统(例如 Debian 系统)提供 PAM (可插拔身份验证模块)NSS (名称服务切换) 机制,供本地系统管理员配置其系统。这些机制的作用可以总结如下。

  • PAM 提供了一种灵活的身份验证机制,应用程序软件使用该机制,因此涉及密码数据交换。

  • NSS 提供了一种灵活的名称服务机制,C 标准库 经常使用该机制来获取程序(如 ls(1)id(1))的用户和组名。

这些 PAM 和 NSS 系统需要配置一致。

PAM 和 NSS 系统的值得注意的软件包如下。

表 4.5. 值得注意的 PAM 和 NSS 系统列表

软件包 popcon 大小 描述
libpam-modules http://qa.debian.org/popcon.php?package=libpam-modules 813 可插拔身份验证模块(基本服务)
libpam-ldap http://qa.debian.org/popcon.php?package=libpam-ldap 205 允许 LDAP 接口的可插拔身份验证模块
libpam-cracklib http://qa.debian.org/popcon.php?package=libpam-cracklib 138 启用 cracklib 支持的可插拔身份验证模块
libpam-doc http://qa.debian.org/popcon.php?package=libpam-doc 986 可插拔身份验证模块(html 和文本格式的文档)
libc6 http://qa.debian.org/popcon.php?package=libc6 9500 GNU C 库:共享库,也提供“名称服务切换”服务
glibc-doc http://qa.debian.org/popcon.php?package=glibc-doc 1898 GNU C 库:手册页
glibc-doc-reference http://qa.debian.org/popcon.php?package=glibc-doc-reference 11816 GNU C 库:info、pdf 和 html 格式的参考手册(非自由软件)
libnss-mdns http://qa.debian.org/popcon.php?package=libnss-mdns 144 用于多播 DNS 名称解析的 NSS 模块
libnss-ldap http://qa.debian.org/popcon.php?package=libnss-ldap 226 使用 LDAP 作为命名服务的 NSS 模块
libnss-ldapd http://qa.debian.org/popcon.php?package=libnss-ldapd 155 使用 LDAP 作为命名服务的 NSS 模块(libnss-ldap 的新分支)

  • libpam-doc 中的“Linux-PAM 系统管理员指南”对于学习 PAM 配置至关重要。

  • glibc-doc-reference 中的“系统数据库和名称服务切换”部分对于学习 NSS 配置至关重要。

[Note] 注意

您可以通过“aptitude search 'libpam-|libnss-'”命令查看更广泛和最新的列表。首字母缩写词 NSS 也可能表示“网络安全服务”,这与“名称服务切换”不同。

[Note] 注意

PAM 是使用系统范围的默认值初始化每个程序的环境变量的最基本方法。

4.5.1. PAM 和 NSS 访问的配置文件

以下是 PAM 访问的几个值得注意的配置文件。

表 4.6. PAM 访问的配置文件列表

配置文件 功能
/etc/pam.d/<program_name> 为“<program_name>”程序设置 PAM 配置;请参阅 pam(7)pam.d(5)
/etc/nsswitch.conf 为每个服务设置 NSS 配置条目。请参阅 nsswitch.conf(5)
/etc/nologin 通过 pam_nologin(8) 模块限制用户登录
/etc/securetty 通过 pam_securetty(8) 模块限制 root 访问的 tty
/etc/security/access.conf 通过 pam_access(8) 模块设置访问限制
/etc/security/group.conf 通过 pam_group(8) 模块设置基于组的约束
/etc/security/pam_env.conf 通过 pam_env(8) 模块设置环境变量
/etc/environment 通过带有“readenv=1”参数的 pam_env(8) 模块设置其他环境变量
/etc/default/locale 通过带有“readenv=1 envfile=/etc/default/locale”参数的 pam_env(8) 模块设置区域设置。(Debian)
/etc/security/limits.conf 通过 pam_linits(8) 模块设置资源约束(ulimit、core、…)
/etc/security/time.conf 通过 pam_time(8) 模块设置时间约束

密码选择的限制由 PAM 模块 pam_unix(8)pam_cracklib(8) 实现。它们可以通过其参数进行配置。

[Tip] 提示

PAM 模块在其文件名中使用后缀“.so”。

4.5.2. 现代集中式系统管理

现代集中式系统管理可以使用集中式 轻型目录访问协议 (LDAP) 服务器来管理网络上的许多类 Unix 和非类 Unix 系统。OpenLDAP 软件 是轻型目录访问协议的开源实现。

LDAP 服务器通过使用 PAM 和 NSS 以及 Debian 系统的 libpam-ldaplibnss-ldap 软件包来提供帐户信息。启用此功能需要执行几个操作(我未使用过此设置,以下内容纯粹是次要信息。请在此上下文中阅读此内容。)。

  • 您可以通过运行独立 LDAP 守护程序 slapd(8) 等程序来设置集中式 LDAP 服务器。

  • 您更改“/etc/pam.d/”目录中的 PAM 配置文件,以使用“pam_ldap.so”而不是默认的“pam_unix.so”。

    • Debian 使用“/etc/pam_ldap.conf”作为 libpam-ldap 的配置文件,并使用“/etc/pam_ldap.secret”作为存储 root 密码的文件。

  • 您更改“/etc/nsswitch.conf”文件中的 NSS 配置,以使用“ldap”而不是默认的(“compat”或“file”)。

    • Debian 使用“/etc/libnss-ldap.conf”作为 libnss-ldap 的配置文件。

  • 您必须使 libpam-ldap 使用 SSL(或 TLS) 连接,以确保密码的安全。

  • 您可以使 libnss-ldap 使用 SSL(或 TLS) 连接,以确保数据完整性,但会增加 LDAP 网络开销。

  • 您应该在本地运行 nscd(8) 以缓存任何 LDAP 搜索结果,从而减少 LDAP 网络流量。

请参阅 libpam-doc 软件包提供的 pam_ldap.conf(5) 和“/usr/share/doc/libpam-doc/html/”中的文档,以及 glibc-doc 软件包提供的“info libc 'Name Service Switch'”。

同样,您可以使用其他方法设置备用集中式系统。

4.5.3. “为什么 GNU su 不支持 wheel 组”

这是 Richard M. Stallman 在旧的“info su”页面底部的名言。不用担心:Debian 中当前的 su 命令使用 PAM,因此可以通过在“/etc/pam.d/su”中启用带有“pam_wheel.so”的行,将使用 su 的能力限制为 root 组。

4.5.4. 更严格的密码规则

安装 libpam-cracklib 软件包使您可以强制执行更严格的密码规则,例如,通过在“/etc/pam.d/common-password”中激活如下行。

对于 squeeze

password required pam_cracklib.so retry=3 minlen=9 difok=3
password [success=1 default=ignore] pam_unix.so use_authtok nullok md5
password requisite pam_deny.so
password required pam_permit.so

4.6. 其他访问控制

[Note] 注意

有关限制内核 安全注意键 (SAK) 功能,请参阅 第 9.5.15 节,“Alt-SysRq 键”

4.6.1. sudo

sudo(8) 是一个程序,旨在允许系统管理员向用户授予有限的 root 权限并记录 root 活动。sudo 只需要普通用户的密码。安装 sudo 软件包,并通过在“/etc/sudoers”中设置选项来激活它。请参阅“/usr/share/doc/sudo/examples/sudoers”中的配置示例和 第 1.1.12 节,“sudo 配置”

我对单用户系统使用 sudo(请参阅 第 1.1.12 节,“sudo 配置”)旨在保护自己免受自己的愚蠢行为的影响。就我个人而言,我认为使用 sudo 比一直从 root 帐户使用系统更好。例如,以下命令将“<some_file>”的所有者更改为“<my_name>”。

$ sudo chown <my_name> <some_file>

当然,如果您知道 root 密码(就像自行安装 Debian 的用户一样),可以使用“su -c”从任何用户的帐户下以 root 身份运行任何命令。

4.6.2. PolicyKit

PolicyKit 是一个操作系统组件,用于控制类 Unix 操作系统中的系统范围权限。

较新的 GUI 应用程序并非设计为以特权进程运行。它们通过 PolicyKit 与特权进程通信以执行管理操作。

PolicyKit 将此类操作限制为属于 Debian 系统上 sudo 组的用户帐户。

请参阅 polkit(8)

4.6.3. SELinux

Security-Enhanced Linux (SELinux) 是一个框架,通过 强制访问控制 (MAC) 策略,使权限模型比普通的类 Unix 安全模型更严格。在某些条件下,root 权限可能会受到限制。

4.6.4. 限制对某些服务器服务的访问

为了系统安全,最好尽可能禁用更多服务器程序。这对于网络服务器至关重要。拥有未使用的服务器(直接作为 守护程序 激活或通过 超级服务器 程序激活)被认为是安全风险。

许多程序(如 sshd(8))使用基于 PAM 的访问控制。有很多方法可以限制对某些服务器服务的访问。

请参阅 第 3.5.3 节,“运行级别管理示例”第 3.5.4 节,“每个 init 脚本的默认参数”第 4.5.1 节,“PAM 和 NSS 访问的配置文件”第 3.5.8 节,“网络服务初始化”第 5.9 节,“Netfilter 基础设施”

[Tip] 提示

Sun RPC 服务需要处于活动状态,才能用于 NFS 和其他基于 RPC 的程序。

[Tip] 提示

如果您在最新的 Debian 系统中遇到远程访问问题,请注释掉“/etc/hosts.deny”中冒犯性的配置,例如“ALL: PARANOID”(如果存在)。(但您必须小心此类操作涉及的安全风险。)

4.7. 身份验证的安全性

此处的信息可能不足以满足您的安全需求,但这应该是一个良好的开端。

4.7.1. 通过互联网安全密码

许多流行的传输层服务以明文形式通信包含密码身份验证的消息。通过狂野的互联网传输明文密码是非常糟糕的主意,因为它可能会被拦截。您可以通过 “传输层安全”(TLS)或其前身“安全套接字层”(SSL)运行这些服务,以通过加密来保护包括密码在内的整个通信。

表 4.7. 不安全和安全服务及端口列表

不安全服务名称 端口 安全服务名称 端口
www (http) 80 https 443
smtp (邮件) 25 ssmtp (smtps) 465
ftp-data 20 ftps-data 989
ftp 21 ftps 990
telnet 23 telnets 992
imap2 143 imaps 993
pop3 110 pop3s 995
ldap 389 ldaps 636

加密需要消耗 CPU 时间。作为一种 CPU 友好的替代方案,您可以保持明文通信,同时使用安全身份验证协议(如 POP 的“验证后办公协议”(APOP)和 SMTP 和 IMAP 的“质询-响应身份验证机制 MD5”(CRAM-MD5))仅保护密码。(对于通过互联网从您的邮件客户端向您的邮件服务器发送邮件消息,最近流行使用新的邮件提交端口 587 而不是传统的 SMTP 端口 25,以避免网络提供商阻止端口 25,同时使用 CRAM-MD5 验证您的身份。)

4.7.2. Secure Shell

Secure Shell (SSH) 程序在两个不受信任的主机之间通过不安全的网络提供安全的加密通信和安全身份验证。它由 OpenSSH 客户端 ssh(1)OpenSSH 守护程序 sshd(8) 组成。此 SSH 可以用于通过端口转发功能安全地隧道传输不安全协议通信(如 POP 和 X)通过互联网。

客户端尝试使用基于主机的身份验证、公钥身份验证、质询-响应身份验证或密码身份验证来验证自身。使用公钥身份验证可以实现远程无密码登录。请参阅 第 6.9 节,“远程访问服务器和实用程序 (SSH)”

4.7.3. 互联网的额外安全措施

即使您运行安全服务(如 Secure Shell (SSH)点对点隧道协议 (PPTP) 服务器),仍然存在使用暴力密码猜测攻击等从互联网入侵的机会。使用防火墙策略(请参阅 第 5.9 节,“Netfilter 基础设施”)以及以下安全工具可以改善安全状况。

表 4.8. 提供额外安全措施的工具列表

软件包 popcon 大小 描述
knockd http://qa.debian.org/popcon.php?package=knockd 164 小型端口敲门守护程序 knockd(1) 和客户端 konck(1)
denyhosts http://qa.debian.org/popcon.php?package=denyhosts 368 帮助系统管理员阻止 ssh 黑客的实用程序
fail2ban http://qa.debian.org/popcon.php?package=fail2ban 414 禁止导致多次身份验证错误的 IP
libpam-shield http://qa.debian.org/popcon.php?package=libpam-shield 130 锁定尝试密码猜测的远程攻击者

4.7.4. 保护 root 密码

为了防止人们使用 root 权限访问您的机器,您需要执行以下操作。

  • 防止物理访问硬盘

  • 锁定 BIOS 并防止从可移动媒体启动

  • 为 GRUB 交互式会话设置密码

  • 锁定 GRUB 菜单以防止编辑

通过物理访问硬盘,使用以下步骤重置密码相对容易。

  1. 将硬盘移动到具有 CD 可启动 BIOS 的 PC。

  2. 使用救援媒体(Debian 启动盘、Knopix CD、GRUB CD 等)启动系统。

  3. 以读/写访问权限挂载 root 分区。

  4. 编辑 root 分区中的“/etc/passwd”,并将 root 帐户的第二个条目设置为空。

如果您有权编辑启动时 grub-rescue-pc 的 GRUB 菜单项(请参阅 第 3.3 节,“阶段 2:引导加载程序”),则使用以下步骤甚至更容易。

  1. 使用内核参数更改为类似“root=/dev/hda6 rw init=/bin/sh”的内容启动系统。

  2. 编辑“/etc/passwd”并将 root 帐户的第二个条目设置为空。

  3. 重启系统。

现在无需密码即可访问系统的 root shell。

[Note] 注意

一旦获得 root shell 访问权限,他就可以访问系统上的所有内容并重置系统上的任何密码。此外,他可以使用暴力密码破解工具(如 johncrack 软件包)(请参阅 第 9.6.11 节,“系统安全性和完整性检查”)来破解所有用户帐户的密码。这种破解的密码可能会导致其他系统受到威胁。

避免所有这些担忧的唯一合理的软件解决方案是使用软件加密的 root 分区(或“/etc”分区),使用 dm-crypt 和 initramfs(请参阅 第 9.4 节,“数据加密技巧”)。但是,您始终需要密码才能启动系统。