Debian 安全手册
第 3 章 - 安装前和安装时
3.1 选择一个BIOS密码
在您的计算机上安装任何操作系统之前, 应当设置一个BIOS密码. 完成安装后(一旦您可以从硬盘引导)您应当返回BIOS并修改引导顺序, 禁止从软盘, 光盘, 和其它设备引导, 否则骇客只需物理接触, 就能使用引导磁盘就能访问您的整个系统.
没有密码就无法引导相对要好一点. 如果您运行的是一个服务器, 这将非常有效, 因为不需要经常重起. 在此情况下, 重起时需要人工干预, 如果机器不是很容易接触, 则可能变得很不方便.
注: 很多 BIOS 都有广为人知的默认密码, 并且有些程序还可以从BIOS中获取密码. 推论: 不要依靠这种方法来保证控制台访问的安全.
3.2 系统分区
3.2.1 选择明智的分区方案
一份聪明的明智分区方案依赖于机器的用途. 合理使用分区是一条不错的经验,并注意一下因素:
* 用户有写许可的任何目录树, 譬如 /home, /tmp 和 /var/tmp/, 应当放在单独的分区上. 这样可以减少用户通过填满您的 "/" 加载点的 DoS 以致使系统崩溃的风险(注: 这样讲并不是非常严谨, 因为总有写 root 用户的空间普通用户无法访问). [2]
* 变化较大的分区, /var (特别是 /var/log)/var 应该放在一个独立的分区上. 在 Debian 系统中, 您创建的 /var 应当比在其它系统中稍大一点, 因为下载的软件包(apt缓存) 存放于存放于 /var/cache/apt/archives 目录下.
* 您打算安装 non-distribution 软件的任何分区都应是是独立的. 根据文件层次标准, 应当是 /opt 或 /usr/local 目录. 如果这些在独立分区上, (必须)重装 Debian 系统时将不会被删除.
* 从安全的角度考虑, 应当将静态数据放在独立的分区上, 并将此分区以只读的方式挂载. 将这些数据存放在只读介质上会更好. 后边会详细讲解.
对于邮件服务器来说, 尤其重要的是应当把假脱机邮件( mail spool) 放在一个独立的分区上. 远程用户(已知的或未知的)能塞满(/var/mail 和/或 /var/spool/mail)假脱机邮件目录. 如果此目录放在独立的分区上, 这种情况将不会导致系统崩溃. 否则(如果 spool 目录与 /var 在同一分区上)系统可能存在严重的问题: 再也无法创建日志, 无法安装软件包, 一些程序甚至可能无法启动(如果它们使用 /var/run 目录).
某些情况下您可能无法确定是否需要独立的分区, 可以安装逻辑卷管理器(Logical Volume Manager) (lvm-common 和您的内核所需的二进制程序,可能是 lvm10, lvm6, 或 lvm5), 使用lvm 可以创造扩展多物理容量的卷组.
3.2.1.1 选择合适的文件系统
在系统分区过程中, 您还需要确定使用什么样的文件系统. Debian 系统安装默认的文件系统是ext2. 然而, 推荐您使用日志文件系统, 譬如 ext3, reiserfs, jfs 或 xfs, 当以下情况出现时, 可以将系统故障减到最小:
* 为膝上电脑安装任何文件系统. 在意外的电池耗尽或因为硬件问题(如一般的 X 配置问题) 引起系统锁死, 重起后可能丢失数据.
* 对于存放大量数据的系统来说(象邮件服务器, ftp服务器, 网络文件系统...)推荐使用这些分区格式. 这样, 系统出现故障的时候, 系统用于恢复和检查文件系统的时间就会大大缩短, 同时数据丢失的可能就会降低.
抛开日志文件系统的性能问题(因为这有时能引起一场宗教战争), 通常最好使用 ext3 文件系统. 因为它与 ext2 向后兼容, 因此如果日志系统出现问题, 您可以将其禁用, 这样, 仍然存在一个可以工作的文件系统. 并且, 如果您需要从引导盘(或 CDROM) 恢复系统时就不必需要特定内核了. 如果是 kernel2.4, 则已经开始支持 ext3 ,如果使用 kernel2.2 可以在不使用日志功能的情况下启动系统. 如果您使用的是其它日志系统, 您会发现您除非使用带有必须内值模块的 Kernel2.4 才能恢复系统. 如果您使用 kernel 2.2 的急救盘的, 那么访问 reiserfs 或 xfs 会更加困难
无论如何, 在 ext3 下数据完整性也许更好,因为它是真正的文件-数据记录, 而其它的仅仅是元-数据记录, 参见 http://lwn.net/2001/0802/a/ext3-modes.php3.
3.3 准备好前不要连入互联网
系统在安装过程中不应该被连入互联网. 这听起来很蠢, 网络安装是最常用的方法. 因为系统安装后服务马上被激活, 如果系统连入互联网但服务没有被正确配置,那么您将面临着被攻击.
同时应当注意到您所安装软件包中的一些服务可能存在着未被修复的安全漏洞. 如果您的系统是由老的版本安装的,通常会如此(象 CD ROM). 在这种情况下,安装完成前您的系统是非常脆弱的!
因为 Debian 的安装和升级可以通过互联网来完成, 可能您认为使用它的这个特性进行安装是个不错的主意. 如果系统用于直接连入互联网(且没有防火墙或NAT的保护), 那么安装过程最好不要与互联网相连, 而是使用本地软件 包镜象进行安装和安全升级. 您可以使用 Debian 的工具(如果是Debian系统)在其它和互联网相连的系统上设置软件包镜象, 譬如 apt-move 或 apt-proxy, 或其它的常见镜象工具, 来提供安装源. 如果不能实现, 您可以通过设置防火墙规则, 来限制在安装过程中对系统的访问 (参见: (see 防火墙保护下的安全更新, 附录 F)).
3.4 设置root密码
设置一个好的 root 密码是拥有一个安全系统的最基本的要求. passwd(1) 中有一些 关于如何设置一个好密码的提示. 也可以使用密码生成程序来完成这些工作(参见passwd(1)).
FIXME: 增加关于好密码的知识点.
3.5 激活shadow密码和MD5密码
在安装过程的最后, 您将被询问是否使用 shadow 密码. 回答, 是, 那么密码将会被保存在 /etc/shadow 文件中. 只有 root 用户和 shaodow 组 才能访问此文件, 因此这个文件将不会被非法获取拷贝进行破解. 您任何时候都可以使用 shadowconfig 在shadow密码和普通密码间切换.
更多信息参阅 Shadow Password (/usr/share/doc/HOWTO/en-txt/Shadow-Password.txt.gz).
此外, 安装过程中在被询问是否要使用MD5对密码进行哈希运算. 这样做很棒, 因为可以使用更长的密码和更好的加密. MD5允许密码长度大于8个字符. 因此这样设置是非常明智的, 这将给攻击者破解系统密码带来更大难度. 如果你安装的是最新的 password 软件包, MD5 密码将是默认设置. 安装完成后任何时候您都可以用dpkg-reconfigure -plow passwd 修改这一设置. 您可以使用使用其 $1$ 前缀 来重新组织 /etc/shadow 文件中的密码.
这事实上是修改 /etc/pam.d 目录下的所有文件,以包含 md5 的一下行替换密码行:
password required pam_unix.so md5 nullok obscure min=6 max=16
如果 max 的设置值不大于8, 则更改不会生效. 更多信息见 用户认证: PAM, 第 4.10.1 节.
注: 在Debian默认配置中, 既使激活 MD5 密码, 也不会修改已设置的 max 值.
3.6 运行最少服务需求
服务就是程序, 如 ftp 服务器和 web 服务. 因为它们必需 listening 连接请求, 并响应服务, 这样外部计算机就可以您的计算机建立连接. 服务器有时候是非常脆弱的(即, 可能在遭受一次攻击后瘫痪), 因此存在安全风险.
您不应该在您的机器安装不需要的服务. 每个安装的服务都可能在您的计算机上产生新的,或许不明显(或不知道)的安全漏洞.
如您所知, 当安装了某个服务, 缺省情况下是被其激活的. 缺省的 Debian 系统的安装, 是不安装任何服务的, 运行的服务涉及的范围是很小的, 如果不需要网络服务将更小. Debian2.1不如Debian 2.2 紧凑(一些 inetd 服务是激活的), Debian 2.2 安装后 rpc portmapper 是激活的. 默认安装 Rpc 是因为运行在一个给定的系统上很多服务的运行需要它的支持, 如 NFS . 但是, 删除它是很容易的, 如何操作,参阅 禁用守护进程服务, 第 3.6.1 节 .
当您在 Debian GNU/Linux 系统中安装一个新的网络相关的服务(守护进程), 有两种方式将其激活: 通过 inetd 超级守护进程(即在 /etc/inetd.conf 中加入一行)或通过一个独立的程序将自身与您的网络接口绑定. 独立程序由 /etc/init.d 目录下的文件控制, 通过SysV机制在启动时使用 /etc/rc?.d/* 下的连接来启用相应的服务 (更多信息参阅 /usr/share/doc/sysvinit/README.runlevels.gz).
如果您想要保留一些服务但又很少使用他们, 可以使用 update-commands, 如通过 update-inetd 和 update-rc.d命令将它们从启动过程中删除.
3.6.1 禁用守护进程服务
用一个守护进程服务非常简单. 有以下不同的方法:
* 删除 /etc/rc${runlevel}.d/ 目录下的链接或将其更名(即不以 'S' 开头)
* 更名脚本文件 (/etc/init.d/_service_name_) 为其它文件 (如 /etc/init.d/OFF._service_name_)
* 取消 /etc/init.d/_service_name_ 文件的可执行属性.
* 编辑 /etc/init.d/_service_name_ 脚本使其立即停止.
您可以手动或者使用 update-rc.d (见 update-rc.d(8)) 删除 /etc/rc${runlevel}.d/ 目录下的对应链接. 例如, 您可以在多用户运行模式下执行下边的命令禁用一个服务:
update-rc.d stop XX 2 3 4 5 .
请注意, 如果您not是使用 file-rc, update-rc.d -f _service_ remove 将不会正常工作, 因为链接删除后, 重新安装或升级软件包, 这些链接会重新产生(这大概不是您所希望的). 如果您认为这似乎不太正常, 也许你是对的(参阅 Bug 67095). 手册页中:
如果文件 /etc/rcrunlevel.d/[SK]??name 已经存在, update-rc.d 将不会对其做任何操作.
这样便于系统管理员重新整理链接, 如果他们保留了至少一个链接,就不必重写了.
如果您使用 file-rc 则关于服务启动的所有信息由一个共同的配置文件处理和维护, 既使软件包从系统中删除.
您可以使用 rcconf 提供的 TUI (文本用户界面)很容易的实现这一操作(rcconf 可以 工作在 file-rc 和正常 System V 运行级别下).
其他(不推荐)的禁用服务的方法: chmod 644 /etc/init.d/daemon (启动时会给出一个错误信息), 或修改 /etc/init.d/daemon 脚本(在开始处添加一行: exit 0 或将 start-stop-daemon 部分注释掉). 因为 init.d 的文件为配置文件, 在升级后不会被覆盖掉.
很不幸, 与其它 (UNIX) 操作系统不同, Debian 中的服务无法通过修改/etc/default/_servicename_ 下的文件来禁用.
FIXME: 增加更多关于处理使用file-rc出来守护进程的内容
3.6.2 禁用 inetd 服务
您应当停掉您系统中所有不必要的服务,如 echo, chargen, discard, daytime, time, talk, ntalk 和 被认为极不安全的 r-services (rsh, rlogin and rcp)(用ssh替代). 把它们禁用后, 您应当检查一下您是否真的需要 inetd 守护进程. 很多人喜欢直接使用守护进程而不是通过 inetd 加载. inetd 存在拒绝服务的可能性, 它将会极大的增加机器的负载. 如果您仍然想使用 inetd 类的服务, 请使用更加结构化的 inet 守护进程如 xinetd 或 rlinetd.
您可以通过直接编辑/etc/inetd.conf 来禁用服务, 但 Debian 提供一个更好的选择: update-inetd (当您要启用服务的时候会更方便). 您可以通过执行下边的命令来改变文件设置并重起守护进程以删除 telnet 服务 (这样 telnet 就被禁用了):
/usr/sbin/update-inetd --disable telnet
如果您想保留一项服务, 但又不想让其监听您的主机的所有IP地址, 那么您可以使用 inetd 的非归档特性. .或者使用其他的 inetd 守护进程如 xinetd.
3.7 I安装最少数量的需求软件
Debian 带有 a lot 软件,例如 Debian 3.0 woody 发行版有6张CD包括数以万计软件包. 面对这么多的软件, 即使只是要安装基本系统, 您安装的比您的系统所需要的也要多的多 [3] you might get carried away and install more than is really needed for your system.
您已经知道了系统的用途(不是吗?), 因此应该只安装真正需要的软件. 安装的任何多余的工具都可能被试图破坏系统的用户或外部入侵者所利用(或通过可利用服务执行远端代码).
例如, 开发工具 (C 编译器) 或解释型语言(譬如 perl - 后边会讲到-, python, tcl...) 可以帮助攻击者破坏系统做很多事情:
* 允许他提升权限. 这非常容易, 例如,如果装有调试器和编译器,就可以在本地系统运行 exploits, 并进行调试 !
* 提供攻击者将系统作为 跳板, 攻击其他系统的工具 [4]
当然, 一个入侵者通过本地 shell 下载他们的工具并运行, 即使是 shell 本身也能做出复杂的程序. 删除不必要的软件并不能避免问题的发生, 但是可以增加入侵者入侵的难度(并且有可能放弃它转而寻找更容易的目标). 因此, 如果在生产系统中安装了用于远程攻击的工具(参阅 远程风险评估工具, 第 8.1 节), 就不要期望入侵者不会利用它.
3.7.1 删除 Perl
您必须认识到在 Debian 系统中删除 perl 并不那么容易(实际上可能相当困难) 因为许多系统工具都要用到它. 并且, perl-base是:Priority: required(that about says it all). 但也不是办不到, 前提是您将不能在您的系统中运行任何 perl 应用程序; 还必须欺骗软件包管理系统认为您的系统中安装了 perl-base ,即使并没安装. [5]
哪些程序使用 perl? 运行下边的命令您自己可以看到:
$ for i in /bin/* /sbin/* /usr/bin/* /usr/sbin/*; do [ -f $i ] && {
type=`file $i | grep -il perl`; [ -n "$type" ] && echo $i; }; done
输出的程序是的优先级是 required 或 important:
* /usr/bin/chkdupexe of package util-linux.
* /usr/bin/replay of package bsdutils.
* /usr/sbin/cleanup-info of package dpkg.
* /usr/sbin/dpkg-divert of package dpkg.
* /usr/sbin/dpkg-statoverride of package dpkg.
* /usr/sbin/install-info of package dpkg.
* /usr/sbin/update-alternatives of package dpkg.
* /usr/sbin/update-rc.d of package sysvinit.
* /usr/bin/grog of package groff-base.
* /usr/sbin/adduser of package adduser.
* /usr/sbin/debconf-show of package debconf.
* /usr/sbin/deluser of package adduser.
* /usr/sbin/dpkg-preconfigure of package debconf.
* /usr/sbin/dpkg-reconfigure of package debconf.
* /usr/sbin/exigrep of package exim.
* /usr/sbin/eximconfig of package exim.
* /usr/sbin/eximstats of package exim.
* /usr/sbin/exim-upgrade-to-r3 of package exim.
* /usr/sbin/exiqsumm of package exim.
* /usr/sbin/keytab-lilo of package lilo.
* /usr/sbin/liloconfig of package lilo.
* /usr/sbin/lilo_find_mbr of package lilo.
* /usr/sbin/syslogd-listfiles of package sysklogd.
* /usr/sbin/syslog-facility of package sysklogd.
* /usr/sbin/update-inetd of package netbase.
因此, 没有Perl, 除非你在 shell 脚本里重新编制这些程序, 否则您将不能处理任何软件包 (因此您将不能升级系统, 这不是一件好事情).
如果您确定从 Debian 基本系统中删除 Perl, 并且您有比较宽松的时间, 递交错误报告,以及shell脚本程序作为以前的软件包(作为补丁)的替代.
3.8 阅读 Debian 的安全邮件列表
浏览一下 debian 安全公告的邮件列表, 此处 Debian 安全小组发布对已发行软件包的公告和修正, 或发邮件给mailto:debian-security@lists.debian.org, 您可以参与 Debian 安全相关问题的讨论,并不属于浪费时间.
为了收到重要的安全升级公告, 可以发送一封主题为 "subscribe" 的邮件到 debian-security-announce-request@lists.debian.org. 你也可以通过网页 http://www.debian.org/MailingLists/subscribe 来订阅这个邮件列表.
此邮件列表容量非常低, 并且通过订阅您可以非常及时的得到 Debian 公布的安全更新警告. 这样就可以及时的下载新的修正了安全问题的软件包, 这对维护一个安全的系统非常重要 (详细描述参见 进行安全更新, 第 4.2 节 )