当个人(或程序)请求访问系统时,身份验证确认其身份是可信任的。
![]() |
警告 |
---|---|
PAM 的配置错误可能会将您锁定在自己的系统之外。您必须手头备有救援 CD 或设置备用启动分区。要恢复,请使用它们启动系统并从那里纠正问题。 |
常规 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
”之后,此条目用于密码规范条目。
“/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
用“,”分隔的用户名列表
![]() |
注意 |
---|---|
“ |
![]() |
注意 |
---|---|
如果将“ |
![]() |
注意 |
---|---|
|
以下是管理帐户信息的几个值得注意的命令。
表 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)。
![]() |
注意 |
---|---|
在配置了 PAM 和 NSS 的系统上,例如 Debian alioth 机器,本地“ |
在系统安装期间或使用 passwd(1) 命令创建帐户时,您应该选择一个好的密码,根据 passwd(1),该密码应由 6 到 8 个字符组成,其中包括以下每组字符中的一个或多个字符。
小写字母
数字 0 到 9
标点符号
![]() |
警告 |
---|---|
不要选择容易猜到的单词作为密码。 |
有一些独立的工具可以生成带盐的加密密码。
表 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) |
现代 类 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 配置至关重要。
![]() |
注意 |
---|---|
您可以通过“ |
![]() |
注意 |
---|---|
PAM 是使用系统范围的默认值初始化每个程序的环境变量的最基本方法。 |
以下是 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) 实现。它们可以通过其参数进行配置。
![]() |
提示 |
---|---|
PAM 模块在其文件名中使用后缀“ |
现代集中式系统管理可以使用集中式 轻型目录访问协议 (LDAP) 服务器来管理网络上的许多类 Unix 和非类 Unix 系统。OpenLDAP 软件 是轻型目录访问协议的开源实现。
LDAP 服务器通过使用 PAM 和 NSS 以及 Debian 系统的 libpam-ldap
和 libnss-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'
”。
同样,您可以使用其他方法设置备用集中式系统。
用户和组与 Windows 系统的集成。
通过 winbind
和 libpam_winbind
软件包访问 Windows 域 服务。
请参阅 winbindd(8) 和 将 MS Windows 网络与 Samba 集成。
用户和组与旧式类 Unix 系统的集成。
通过 nis
软件包访问 NIS(最初称为 YP) 或 NIS+。
这是 Richard M. Stallman 在旧的“info su
”页面底部的名言。不用担心:Debian 中当前的 su
命令使用 PAM,因此可以通过在“/etc/pam.d/su
”中启用带有“pam_wheel.so
”的行,将使用 su
的能力限制为 root
组。
安装 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
![]() |
注意 |
---|---|
有关限制内核 安全注意键 (SAK) 功能,请参阅 第 9.5.15 节,“Alt-SysRq 键”。 |
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 身份运行任何命令。
PolicyKit 是一个操作系统组件,用于控制类 Unix 操作系统中的系统范围权限。
较新的 GUI 应用程序并非设计为以特权进程运行。它们通过 PolicyKit 与特权进程通信以执行管理操作。
PolicyKit 将此类操作限制为属于 Debian 系统上 sudo
组的用户帐户。
请参阅 polkit(8)。
Security-Enhanced Linux (SELinux) 是一个框架,通过 强制访问控制 (MAC) 策略,使权限模型比普通的类 Unix 安全模型更严格。在某些条件下,root 权限可能会受到限制。
为了系统安全,最好尽可能禁用更多服务器程序。这对于网络服务器至关重要。拥有未使用的服务器(直接作为 守护程序 激活或通过 超级服务器 程序激活)被认为是安全风险。
许多程序(如 sshd(8))使用基于 PAM 的访问控制。有很多方法可以限制对某些服务器服务的访问。
请参阅 第 3.5.3 节,“运行级别管理示例”、第 3.5.4 节,“每个 init 脚本的默认参数”、第 4.5.1 节,“PAM 和 NSS 访问的配置文件”、第 3.5.8 节,“网络服务初始化” 和 第 5.9 节,“Netfilter 基础设施”。
![]() |
提示 |
---|---|
如果您在最新的 Debian 系统中遇到远程访问问题,请注释掉“ |
此处的信息可能不足以满足您的安全需求,但这应该是一个良好的开端。
许多流行的传输层服务以明文形式通信包含密码身份验证的消息。通过狂野的互联网传输明文密码是非常糟糕的主意,因为它可能会被拦截。您可以通过 “传输层安全”(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 验证您的身份。)
Secure Shell (SSH) 程序在两个不受信任的主机之间通过不安全的网络提供安全的加密通信和安全身份验证。它由 OpenSSH 客户端 ssh(1) 和 OpenSSH 守护程序 sshd(8) 组成。此 SSH 可以用于通过端口转发功能安全地隧道传输不安全协议通信(如 POP 和 X)通过互联网。
客户端尝试使用基于主机的身份验证、公钥身份验证、质询-响应身份验证或密码身份验证来验证自身。使用公钥身份验证可以实现远程无密码登录。请参阅 第 6.9 节,“远程访问服务器和实用程序 (SSH)”。
即使您运行安全服务(如 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 | 锁定尝试密码猜测的远程攻击者 |
为了防止人们使用 root 权限访问您的机器,您需要执行以下操作。
防止物理访问硬盘
锁定 BIOS 并防止从可移动媒体启动
为 GRUB 交互式会话设置密码
锁定 GRUB 菜单以防止编辑
通过物理访问硬盘,使用以下步骤重置密码相对容易。
将硬盘移动到具有 CD 可启动 BIOS 的 PC。
使用救援媒体(Debian 启动盘、Knopix CD、GRUB CD 等)启动系统。
以读/写访问权限挂载 root 分区。
编辑 root 分区中的“/etc/passwd
”,并将 root
帐户的第二个条目设置为空。
如果您有权编辑启动时 grub-rescue-pc
的 GRUB 菜单项(请参阅 第 3.3 节,“阶段 2:引导加载程序”),则使用以下步骤甚至更容易。
使用内核参数更改为类似“root=/dev/hda6 rw init=/bin/sh
”的内容启动系统。
编辑“/etc/passwd
”并将 root
帐户的第二个条目设置为空。
重启系统。
现在无需密码即可访问系统的 root shell。
![]() |
注意 |
---|---|
一旦获得 root shell 访问权限,他就可以访问系统上的所有内容并重置系统上的任何密码。此外,他可以使用暴力密码破解工具(如 |
避免所有这些担忧的唯一合理的软件解决方案是使用软件加密的 root 分区(或“/etc
”分区),使用 dm-crypt 和 initramfs(请参阅 第 9.4 节,“数据加密技巧”)。但是,您始终需要密码才能启动系统。