系统管理:最大化系统安全性,第一部分
在所有 UNIX 文化中,最陈词滥调的说法之一就是 UNIX 安全性是自相矛盾的。虽然情况并非像这种愤世嫉俗的观点那样绝望,但重要的是要认识到,安全的系统是您创建的东西,而不是您在安装任何当前的 Linux 发行版(或任何其他 UNIX 操作系统)时自动获得的东西。
本文概述了 UNIX 安全问题,并讨论了 Linux 系统管理员或任何负责管理 Linux 系统的人员可用的资源和工具——这两者不一定是同义词。它考虑了最重要的问题是什么,以及存在哪些措施来保护系统。由于许多最严重的“UNIX”安全问题实际上是 TCP/IP 网络及其组件协议中的漏洞,因此我们自然会考虑网络安全问题,以及与隔离的计算机系统相关的问题。
关于计算机安全的一般讨论传统上侧重于可能因安全措施不足而造成的损失类型
设备丢失。任何计算机系统的第一个或最后一个威胁(取决于您的观点)都是计算机本身的丢失。这可能是由多种原因造成的:盗窃、火灾、水灾、地震和其他自然灾害、故意破坏和事故(例如,用户将咖啡洒在上面)。
数据丢失。这种类型的丢失也可能以多种方式发生:数据可能被不应拥有它的人获取(例如,竞争对手),文件可能被意外或故意损坏或销毁,或者应该保持私有的信息可能变得公开可访问或广播。
使用损失。第三种类型的损失可能发生在设备及其数据均未损坏、销毁或移除的情况下,但系统仍然无法执行其部分或全部正常功能。例如,长时间的停电可能会导致这种使用损失;1988 年的互联网蠕虫事件就是一个软件导致计算机无法使用的例子。
根据您的具体情况,其中一些威胁显然比其他威胁对您更具潜在危险。
有效思考安全性始于考虑潜在损失而不是潜在威胁,因为这样做可以让您将威胁置于系统的上下文中,从而就如何预防和应对威胁做出适当的选择。例如,每个系统都有可能被未经授权的人闯入。然而,这种威胁的具体性质会随着最严重的后果而变化——相应的预防损失的措施也会随之变化。
成功的入侵者始终有可能更改或销毁系统上的任何文件,因此每个系统都需要防范这种情况,并制定从该事件中恢复的计划。此外,对于包含敏感或专有数据(客户信用卡号、正在开发中的软件产品的源代码等)的系统,可能需要考虑如何保护此类数据,即使是 root 帐户也无法访问。另一方面,如果使用损失是系统需要防范的主要损失,那么制定快速识别和消除此类攻击的方法比为系统上的任何数据提供额外的安全性要重要得多。
正如这些场景所示,安全不仅仅涉及预防攻击。计算机安全同样重要的组成部分是恢复计划,其中规定了出现问题时该怎么做。计算机安全不是您偶尔想到的事情,而是在您执行的每项管理活动中,都应成为您思考和行动的组成部分。它包括以下关注点(并非所有关注点都一定适用于任何特定系统)
物理系统访问
防盗——锁等
防止物理和电子破坏
通过不间断电源 (UPS) 装置确保持续供电
防火系统、浪涌抑制器和其他设备,以防止外部环境造成的损坏
用户身份验证:密码和其他机制
调制解调器访问(拨入和拨出)
文件所有权和保护
非常敏感或私有数据的加密
网络访问策略和网络软件配置
NFS 配置
与构建、测试、安装和使用公共域软件相关的程序和策略
备份程序
备份介质的安全存储(包括异地副本)
原始操作系统介质的存储
灾难恢复计划
用户良好安全实践培训
对所有这些主题的全面讨论将占用数期《Linux Journal》,因此我们专注于操作系统级别的保护和对 Linux 系统有用的解决方案,包括“标准”功能和有用的附加软件包。各种 Linux 发行版提供的安全设施差异很大,但没有哪个当前的发行版包含谨慎的系统管理员想要拥有和使用的一切。
Package ftp Location COPS ftp.cert.org:/pub/tools/cops Courtney ftp.best.com:/pub/lat Crack ftp.cert.org:/pub/tools/crack Gabriel ftp.best.com:/pub/lat Merlin ciac.llnl.gov:/pub/ciac/sectools/unix/merlin Netscape ftp.netscape.com:/netscape/unix npasswd ee.utah.edu:/admin/passwd/npasswd passwd+ ee.utah.edu:/admin/passwd/passwd+ Perl prep.ai.mit.edu:/pub/gnu Satan ftp.win.tue.nl:/pub/security shadow sunsite.unc.edu:/pub/Linux/system/Admin sudo sunsite.unc.edu:/pub/Linux/system/Admin swatch sierra.stanford.edu:/pub/sources TCP Wrappers ftp.win.tue.nl:/pub/security/tcp_wrapper Tripwire coast.cs.purdue.edu:/pub/COAST/Tripwire
密码是在 Linux 系统上保护用户帐户的主要方式。但是,密码提供的保护仅与密码本身一样好。如果黑客决定攻击您系统上的帐户,那么糟糕的密码几乎和没有密码一样糟糕。
您可以采取以下几项措施来确保密码设施提供尽可能好的保护
确保所有活动帐户都设置了密码,并且禁用了不用于用户登录的系统帐户(例如 bin)(通过在该帐户的密码字段中放置星号来执行此操作)。
通过使用影子密码文件来保护系统密码的编码版本。
教育用户了解密码保密的重要性,选择难以破解的密码,根据需要更改密码,在不同的站点使用不同的密码以及类似的安全实践。如果合适,实施密码老化和/或新密码模糊检查。
第一项是不言自明的;我们详细了解其他项。
影子密码文件旨在纠正由普通密码文件世界可读性造成的安全漏洞。每个人都需要能够查看 /etc/passwd 的内容,以便文件所有权等内容正确显示(UID 被转换为用户名)。但是,由于该文件是可读的,因此任何人都可以复制它。这意味着,拥有合法或非法访问普通用户帐户权限的人可以复制它,并从容地尝试破解更强大的帐户的密码。
影子密码文件工具从普通密码文件中删除编码后的密码,并将它们放置在另一个文件中,通常是 /etc/shadow,该文件只能由 root 用户读取。影子软件包为各种 UNIX 系统(包括 Linux)提供影子密码文件功能。默认情况下,它包含在某些 Linux 发行版中。它包括用于登录、passwd 和 su 命令的替换项,以及用于创建和操作影子密码文件及其中的帐户条目的许多实用程序。
构建影子软件包非常简单。如果您检索到的版本已移植到 Linux,则通常只需修改 config.h 文件。我建议以下设置(从该文件中的各个点收集而来)
/* Use shadow password file. */ #define SHADOWPWD /* Use up to 16 char. passwords. */ #define DOUBLESIZE /* Enable password aging checks. */ #define AGING /* Log events to syslog facility. */ #define USE_SYSLOG /* Support for remote logins. */ #define RLOGIN #define UT_HOST /* Data file for most recent login time records */ #define LASTFILE "/var/adm/lastlog"
一旦软件包构建并安装完成,就可以使用 pwconv 命令来创建初始的 /etc/shadow 文件。它会创建文件 /etc/npasswd 和 /etc/nshadow。前者是原始密码文件的修改版本,其中每个条目中的密码字段都已被 x 替换;后者是相应的影子密码文件。为了激活它们,您必须手动重命名它们
# cd /etc # mv passwd passwd.prev # cp npasswd passwd # cp nshadow shadow
用户不喜欢更改密码,如果放任他们自己,他们实际上永远不会这样做。影子软件包包含一个可选的密码老化工具,系统管理员可以使用该工具指定用户必须多久更改一次密码。是否需要使用这些功能取决于您站点的需求。
/etc/shadow 中的条目具有以下格式
username:password:change_date:min_change:\ max_change:warn:inactive:expire:
其中前两个字段是帐户的用户名和编码后的密码。其他字段与帐户过期和密码老化有关。[请注意,在影子文件中,它不能像我们在此处为了使其适合杂志而做的那样跨两行——编者]
change_date 编码了最近一次密码更改的日期。min_change 和 max_change 指示密码更改之间的最小和最大天数,而 warn 指示在密码过期前多少天警告用户这一事实。inactive 指定帐户密码过期后多少天会自动禁用,而 expire 编码了帐户本身将过期并被禁用的日期。
以下是 /etc/shadow 中的示例条目
chavez:XdleIqAert:9422:7:180:5:21::
用户 chavez 最多可以保持相同的密码 180 天,并且她将在密码过期前 5 天收到警告。当她确实更改密码时,她必须将新密码保留至少 7 天。如果她 21 天未使用她的帐户,则该帐户将自动禁用。未为用户 chavez 的帐户设置过期日期。
一旦安装了 /etc/shadow,就可以直接对其进行编辑。但是,影子软件包还提供了用于操作其中条目的工具。其版本的 passwd 命令更新影子密码文件中的密码,并且该命令还具有用于修改其他密码设置的其他选项。例如,以下命令将用户 chavez 的最短密码生存期更改为 2 天,最长密码生存期更改为 1 年,警告期更改为 3 天,非活动期更改为 2 个月
# passwd -n 2 -x 365 -w 3 -i 60 chavez
如果您想从帐户中删除所有老化控制,请使用以下选项组合
# passwd -n 0 -x 99999 -i -1 angela
这些是默认值(以及 14 天的警告期,当密码基本上永不过期时,警告期是不相关的)。
帐户过期日期使用 usermod 命令设置。以下命令将用户 chavez 的帐户过期日期设置为 1999 年 1 月 1 日
# usermod -e 1/1/1999 chavez
请注意,useradd 和 usermod 命令也可用于创建用户帐户并指定或更改这些和其他帐户设置。
passwd 的 -l 和 -u 选项可用于手动锁定(即,阻止登录)和解锁帐户
# passwd -l badboy
最后,chage -d 命令可用于强制用户在其下次登录时更改密码;此选项设置上次密码更改字段的日期。它可以用于强制用户在其下次登录时更改密码,前提是还设置了最长密码生存期。这是一个简单的脚本,可以完成此操作
#!/bin/csh
# force_change username -- run as root
chage -l $1 >& /dev/null
if ($status == 1) then
echo force_change: invalid user "\$1\"
exit 1
endif
set max=`grep ^$1\: /etc/shadow | \
awk -F: '{print $5}'`
chage -d `date +%D` $1
set today=`grep ^$1\: /etc/shadow | \
awk -F: '{print $3}'`
set yest=`expr $today - 1`
if ($max >= $yest) set max=`expr $yest - 1`
set date=`expr $yest - $max`
chage -M $max -I 2 -W 7 -d $date $1
该脚本提取当前的最长密码生存期设置,将密码更改日期设置为今天,然后提取等效的整数值(自 1970 年 1 月 1 日以来的天数)。然后,它将密码更改日期设置为昨天,并在必要时减少最长生存期,以便密码可以在该日期过期。它还将非活动期设置为 2 天,警告期设置为 1 周。
密码老化设置的默认设置在 shadow 软件包的配置文件中定义,通常定义为 /etc/login.defs。此文件包含控制软件包功能各个方面的各种条目,所有这些条目都在其注释行中得到了很好的记录,您应该仔细检查此文件并选择对您的系统有意义的设置。
以下是此文件中一些最重要的条目,以及我对它们值的建议
# Enable dialup passwords. DIALUPS_CHECK_ENAB yes # Track login failures in /var/adm/faillog. FAILLOG_ENAB yes LOG_UNKFAIL_ENAB yes # Track login times in /var/adm/lastlog. LASTLOG_ENAB yes # Enable password obscurity checking. OBSCURE_CHECKS_ENAB yes # Enable login time restrictions (/etc/porttime). PORTTIME_CHECKS_ENAB yes # Specify the su log file. SULOG_FILE /var/adm/sulog # Enable use of /etc/nologin file to prevent # non-root logins. The contents of the file # is displayed as an error message. NOLOGINS_FILE /etc/nologin # Password aging settings. PASS_MAX_DAYS 186 PASS_MIN_DAYS 7 PASS_WARN_AGE 14 # Set minimum password length. PASS_MIN_LEN 12
确保所有帐户都设置了密码并定期更改密码只是从密码获得最大保护所需工作的一部分。密码还必须保密,并且必须难以猜测——对于程序或人类来说——才能最有效。第一点只能通过教育用户了解密码对系统安全的重要性来确保。可以对第二点进行更多控制。
糟糕的密码选择包括所有正确拼写的单词、专有名词以及对选择密码的人有意义的名称或数字,以及这些项目的简单转换:反转、简单的大小写更改、轮换、在末尾添加数字等等。
好的密码包括各种字符类型——大写和小写字母、数字和符号以及控制字符。较长的密码也比短密码更好。我强烈建议启用影子软件包的双倍长度密码功能,设置最小长度为 10 或 12 个字符,并允许最多 16 个字符。
影子软件包仅具有检查用户选择的密码质量的最低限度能力。但是,还有其他软件包通过替换 passwd 命令的替代版本来提供此功能。npasswd 软件包可以根据在线词典中的单词检查建议的密码。passwd+ 软件包根据一个或多个词典检查建议的密码,并根据配置文件提供的说明测试建议密码的转换。系统管理员可以自定义文件 /etc/passwd.test。列表 1 给出了文件中的一些示例条目,这些条目将使您了解 passwd+ 的功能。
# sample passwd+ configuration file # Test Error Message # (%#a==8)&((%#c==0)|(%#w==0)) Include a capital letter or numeral. (%#l>5)|(%#c==0) Must include a nonalphabetic character. # "%*p"=~"^%*u$" Can't use username as password. "%*p"=~"^%-*u$" Can't use reversed username as password. "%*p"=~"^%*f%*f$" Can't use doubled first name as password. # {tr A-Z a-z < /usr/dict/words} =~ "%*p" Password found in dictionary.
每个条目都列出了一种不可接受的密码类型,并给出了如果提出此类密码时要向用户显示的相应错误消息。以下符号用于定义不可接受密码的示例规则中(passwd+ 还提供更多符号)
<ul> <li>%p proposed password <li>%a alphanumeric character <li>%l lowercase letters <li>%c capital letters <li>%w numerals <li>%u username <li>%f first name <li>%-x reversed version of x (e.g. %-p = reversed proposed password) <li>%*x lowercased version of x <li>%# number of x's in proposed password (e.g. %#w = # of numerals) <li>& logical AND <li>| logical OR <li>== equals <li>=~ matches pattern <li>^ beginning of line <li>$ end of line </ul>
示例文件的第一部分检查建议密码的结构。第一个条目拒绝 8 个字符的全小写密码,第二个条目表示包含 6 个或更多小写字母的密码还必须包含一个大写字母。
文件的第二部分根据用户的密码文件条目以及它们的一些转换来测试密码。第三部分对密码与系统词典文件中的单词执行不区分大小写的比较。
默认情况下,passwd+ 设计为用作普通 passwd 命令的独立替代品,并且它不知道影子密码文件。但是,将其修改为在具有影子密码的系统上使用并不困难;一种方法是修改影子软件包中的 obscure 例程以调用 passwd+ 软件包中的 verify 例程。
您还可以使用 Crack 工具来检查用户现有密码的质量。(请注意,未经系统管理员许可,在您不是系统管理员的系统上运行 Crack 的密码文件是不道德的!)Crack 易于构建和使用,并且它包含一个 shadmrg 实用程序(在其 Scripts 子目录中),该实用程序可以在使用影子软件包的系统上重建传统的 /etc/passwd 样式文件。例如
# cd /usr/src/Crack* # Scripts/shadmrg > passwd.test # Crack passwd.test
如果您选择使用 Crack,则务必确保程序及其创建的所有数据和结果文件都受到保护,以防止所有非 root 访问。
在某些情况下,您可能希望使用一些方法来确定用户是否是她所说的身份,除了标准密码之外。为了满足这种需求,影子软件包还支持 /etc/shadow 中如下所示的条目
chavez:XdleIqAert;@/sbin/extra:9422:7:180:5:21:: harvey:<\@>/sbin/extra:9233:0:99999:0:-1::
当用户 chavez 登录时,系统会提示她输入密码,然后程序 /sbin/extra 作为辅助身份验证程序运行。此程序由系统管理员提供,可以执行任何所需的其他身份验证,根据用户是否通过或失败返回 0 或 1 的值。第二个条目指示用户 harvey 将 /sbin/extra 作为他的唯一身份验证方法运行。在影子文件语法中,@ 符号引入了备用或附加身份验证程序,分号用于将其与编码后的密码分隔开。
我们考虑的影子软件包的最后一个功能是其拨号密码工具,它允许您要求通过拨号线路连接到系统的用户提供额外的密码。启用此功能后,将使用两个附加的配置文件,/etc/dialups 和 /etc/d_passwd。/etc/dialups 包含要使用附加密码保护的串行线路的特殊文件名列表(每行一个),只要有人拨入系统,/etc/d_passwd 就会保存编码后的拨号密码。
拨号密码是按 shell 分配的,dpasswd 命令用于创建和更改它们。例如,以下命令将允许您更改 shell /bin/bash 的当前拨号密码
# dpasswd /bin/bash
对于使用未在 /etc/d_passwd 中列出的 shell 的用户,将不需要拨号密码。
UNIX 安全性总体上最大的弱点之一是其对系统权限的非全有即全无的方法:root 用户功能强大,因此尽可能限制对 root 帐户的访问是明智之举。sudo 工具使非 root 用户能够以 root 身份运行指定的命令,而无需知道 root 密码,从而允许系统管理员向用户提供他们实际需要的访问级别。
用户通过在想要运行的命令前加上 sudo 命令来使用该工具
$ sudo mount hamlet:/data /mnt
:sudo 将要求用户输入自己的密码,然后才能完成命令。因此,在这种情况下,使用 sudo 允许此用户使用 mount 命令,而无需知道 root 密码。
对 sudo 的访问由其配置文件 /etc/sudoers 控制。此文件指定哪些用户可以使用 sudo 以及他们允许执行的命令。以下是该文件的一小部分摘录
chavez ALL=ALL harvey ALL=/bin/mount,/bin/umount nelson ALL=!/sbin/shutdown
用户名是每个条目中的第一个字段,后跟一个或多个访问描述字符串,其通用形式为:host(s)=command(s)。根据这些条目,用户 chavez 可以使用 sudo 在任何系统上运行任何命令,用户 harvey 可以挂载和卸载磁盘,用户 nelson 可以运行除 shutdown 之外的任何命令。请注意,这些示例仅代表此文件的最简单形式;它的实际语法非常灵活和强大,允许您定义主机和/或命令的命名组,从而尽可能详细地指定每个用户-主机-命令组合的确切访问权限。
书籍
实用互联网和 UNIX 安全,(实用 UNIX 安全第二版),Simson Garfinkel 和 Gene Spafford(O'Reilly & Associates,1995 年末或 1996 年初)。一本关于系统安全以及相关的系统管理问题和任务的优秀长篇著作。
基本系统管理,第二版,Æleen Frisch(O'Reilly & Associates,1995 年)。本书中有一章专门讨论系统安全,并且在整本书中还有许多其他章节也涉及系统安全。
防火墙和互联网安全,William R. Cheswick 和 Steven M. Bellovin,(Addison-Wesley,1994);构建互联网防火墙,D. Brent Chapman 和 Elizabeth D. Zwicky(O'Reilly & Associates,1995 年)。对于任何考虑建立防火墙系统的人来说,这两本书都是必不可少的。
安全警报邮件列表
计算机紧急响应小组 (CERT) 管理主要的 UNIX 相关安全警报系统。发送邮件至 cert-advisory-request@cert.org 以添加到邮件列表。过去的公告和更新可通过匿名 ftp 在 info.cert.org:/pub/cert_advisories 获取。
还有一个特定于 Linux 的安全公告邮件列表。发送邮件至 majordomo@linux.nrao.edu,并在邮件正文中包含 subscribe linux-alert 以添加到列表。您可能还想订阅 linux-security 邮件列表,这是一个关于 Linux 相关安全主题的审核讨论列表。(要订阅,请在发送到同一电子邮件地址的消息正文中包含 subscribe linux-security。)这些邮件列表的存档可通过匿名 ftp 在 linux.nrao.edu:/pub/linux/security/list-archive 获取。
Æleen Frisch (aefrisch@lorentzian.com) 管理着一个非常异构的 Linux 和其他 UNIX 系统以及 PC 的网络。最近完成了两本书的第二版后,她期待着追求她真正的使命:为她的猫 Daphne 和 Sarah 拉绳子。