[ 上一页 ] [ 目录 ] [ 1 ] [ 2 ] [ 3 ] [ 4 ] [ 5 ] [ 6 ] [ 7 ] [ 8 ] [ 9 ] [ 10 ] [ 11 ] [ 12 ] [ A ] [ B ] [ C ] [ D ] [ E ] [ F ] [ G ] [ H ] [ 下一页 ]


Debian 手册安全加固
第 4 章 - 安装后


一旦系统安装完成,您仍然可以做更多事情来保护系统安全;本章描述了一些可以采取的步骤。当然,这实际上取决于您的设置,但对于物理访问预防,您应该阅读 更改 BIOS(再次),第 4.3 节设置 LILO 或 GRUB 密码,第 4.4 节移除内核上的 root 提示符,第 4.6 节限制控制台登录访问,第 4.7 节限制通过控制台重启系统,第 4.8 节

在连接到任何网络之前,尤其是公共网络,您至少应该执行安全更新(请参阅 执行安全更新,第 4.2 节)。或者,您可以拍摄系统快照(请参阅 拍摄系统快照,第 4.18 节)。


4.1 订阅 Debian 安全公告邮件列表

为了接收有关可用安全更新的信息,您应该订阅 debian-security-announce 邮件列表,以便接收 Debian 安全公告 (DSA)。有关 Debian 安全团队如何工作的更多信息,请参阅 Debian 安全团队,第 7.1 节。有关如何订阅 Debian 邮件列表的信息,请阅读 http://lists.debian.org

DSA 使用 Debian 安全团队的签名进行签名,可以从 http://security.debian.org 获取。

您还应该考虑订阅 debian-security 邮件列表,以进行有关 Debian 操作系统中安全问题的一般性讨论。您将能够在列表中联系其他系统管理员以及 Debian 开发人员和安全工具的上游开发人员,他们可以回答您的问题并提供建议。

FIXME:也在此处添加密钥?


4.2 执行安全更新

一旦在软件包中检测到新的安全漏洞,Debian 维护人员和上游作者通常会在几天甚至几小时内修复它们。修复漏洞后,将在 http://security.debian.org 上提供新的软件包。

如果您正在安装 Debian 发行版,则必须考虑到自发行版发布以来,在确定给定软件包存在漏洞之后,可能已经进行了安全更新。此外,可能还有次要版本(Debian 3.0 sarge 版本有四个),其中包括这些软件包更新。

在安装期间,安全更新会为您的系统配置,并下载和应用待处理的更新,除非您明确选择退出或系统未连接到 Internet。即使在首次启动之前也会应用更新,因此新系统从一开始就尽可能保持最新状态。

要手动更新系统,请在您的 sources.list 中添加以下行,您将在每次更新系统时自动获得安全更新。将 [CODENAME] 替换为发行版代号,例如 squeeze

       deb http://security.debian.org/ [CODENAME]/updates main contrib non-free

注意:如果您正在使用 testing 分支,请使用安全测试镜像源,如 测试分支的安全支持,第 10.1.4 节 中所述。

完成此操作后,您可以使用多种工具来升级系统。如果您正在运行桌面系统,您将拥有[9] 一个名为 update-notifier 的应用程序,通过选择它可以轻松检查是否有新的更新可用,您可以从桌面进行系统升级(使用 update-manager)。有关更多信息,请参阅 在桌面检查更新,第 10.1.2.2 节。在桌面环境中,您还可以使用 synaptic (GNOME)、kpackageadept (KDE) 以获得更高级的界面。如果您正在运行纯文本终端,则可以使用 aptitudeaptdselect(已弃用)进行升级

如果您愿意,您也可以将 deb-src 行添加到 /etc/apt/sources.list 中。有关更多详细信息,请参阅 apt(8)


4.2.1 库的安全更新

执行安全更新后,您可能需要重启一些系统服务。如果您不这样做,一些服务在安全升级后可能仍然容易受到攻击。原因是升级之前正在运行的守护程序可能仍在升级之前使用旧库 [10]。为了检测哪些守护程序可能需要重启,您可以使用 checkrestart 程序(在 debian-goodies 软件包中可用)或使用此单行命令[11](以 root 身份)

     # lsof | grep <the_upgraded_library> | awk '{print $1, $9}' | uniq | sort -k 1

一些软件包(如 libc6)将在 postinst 阶段为有限的服务集执行此检查,特别是因为基本库的升级可能会破坏某些应用程序(直到重启)[12]。

将系统置于运行级别 1(单用户模式),然后再返回到运行级别 3(多用户模式)应该可以处理大多数(如果不是全部)系统服务的重启。但这如果您是通过远程连接(如 ssh)执行安全升级,则不是一个选项,因为它将被断开。

如果您通过远程连接(如 ssh)执行安全升级,请谨慎操作。涉及服务重启的安全升级的建议程序是重启 SSH 守护程序,然后立即尝试新的 ssh 连接,而无需断开之前的连接。如果连接失败,请恢复升级并调查问题。


4.2.2 内核的安全更新

首先,确保您的内核是通过软件包管理系统进行管理的。如果您使用 Debian 3.0 或更早版本的安装系统进行安装,则您的内核集成到软件包管理系统中,并且可能已过时。您可以通过运行以下命令轻松确认这一点

     $ dpkg -S `readlink -f /vmlinuz`
     linux-image-2.6.18-4-686: /boot/vmlinuz-2.6.18-4-686

如果您的内核未被管理,您将看到一条消息,提示软件包管理器未找到与任何软件包关联的文件,而不是上面的消息,该消息表明与当前运行内核关联的文件由 linux-image-2.6.18-4-686 提供。因此,首先,您需要手动安装内核映像软件包。您需要安装的确切内核映像取决于您的架构和您首选的内核版本。完成此操作后,您将能够像管理任何其他软件包一样管理内核的安全更新。在任何情况下,请注意内核更新针对您正在使用的相同内核版本的内核更新进行,也就是说,apt 不会自动将您的内核从 2.4 版本升级到 2.6 版本(或从 2.4.26 版本升级到 2.4.27 版本[13])。

最近 Debian 版本的安装系统将处理所选内核作为软件包系统的一部分。您可以通过运行以下命令查看已安装的内核

     $ COLUMNS=150 dpkg -l 'linux-image*' | awk '$1 ~ /ii/ { print $0 }'

要查看您的内核是否需要更新,请运行

     $ kernfile=`readlink -f /vmlinuz`
     $ kernel=`dpkg -S $kernfile | awk -F : '{print $1}'`
     $ apt-cache policy $kernel
     linux-image-2.6.18-4-686:
       Installed: 2.6.18.dfsg.1-12
       Candidate: 2.6.18.dfsg.1-12
       Version table:
      *** 2.6.18.dfsg.1-12 0
             100 /var/lib/dpkg/status

如果您正在进行的安全更新包括内核映像,则您需要重启系统,以便安全更新生效。否则,您仍将运行旧的(且易受攻击的)内核映像。

如果您需要重启系统(因为内核升级),您应该确保内核将正确启动并且网络连接将恢复,尤其是在通过远程连接(如 ssh)完成安全升级的情况下。对于前者,您可以配置引导加载程序,以便在发生故障时重启到原始内核(有关更多详细信息,请阅读 远程重启 Debian GNU/Linux 机器)。对于后者,您必须引入一个网络连接测试脚本,该脚本将检查内核是否已正确启动网络子系统,如果未启动则重启系统[14]。这应该可以防止出现糟糕的意外情况,例如更新内核,然后在重启后意识到它没有正确检测或配置网络硬件,并且您需要长途跋涉才能再次启动系统。当然,在系统中连接到控制台或终端服务器的系统串行控制台 [15] 也应有助于远程调试重启问题。


4.3 更改 BIOS(再次)

还记得 选择 BIOS 密码,第 3.1 节 吗?那么,现在您应该在不需要从可移动介质启动时,更改默认 BIOS 设置,使其从硬盘驱动器启动。确保您不会丢失 BIOS 密码,否则,在硬盘驱动器发生故障时,您将无法返回 BIOS 并更改设置,以便您可以使用例如 CD-ROM 恢复它。

另一种不太安全但更方便的方法是更改设置为从硬盘启动系统,如果失败,则尝试可移动介质。顺便说一句,这通常是因为大多数人不经常使用 BIOS 密码;它很容易被遗忘。


4.4 设置 LILO 或 GRUB 密码

任何人都可以轻松获得 root shell 并通过在启动提示符下输入 <name-of-your-bootimage> init=/bin/sh 来更改您的密码。在更改密码并重启系统后,该人将拥有无限的 root 访问权限,并且可以对系统执行任何操作。在此过程之后,您将无法 root 访问您的系统,因为您不知道 root 密码。

为了确保这种情况不会发生,您应该为引导加载程序设置密码。您可以选择全局密码或特定映像的密码。

对于 LILO,您需要编辑配置文件 /etc/lilo.conf 并添加 passwordrestricted 行,如下例所示。

       image=/boot/2.2.14-vmlinuz
          label=Linux
          read-only
          password=hackme
          restricted

然后,确保配置文件不是全局可读的,以防止本地用户读取密码。完成后,重新运行 lilo。省略 restricted 行会导致 lilo 始终提示输入密码,无论是否向 LILO 传递了参数。/etc/lilo.conf 的默认权限授予 root 用户读取和写入权限,并为 lilo.conf 的组 root 启用只读访问权限。

如果您使用 GRUB 而不是 LILO,请编辑 /boot/grub/menu.lst 并在顶部添加以下两行(当然,将 hackme 替换为所需的密码)。这可以防止用户编辑启动项。timeout 3 指定在 grub 引导默认项之前延迟 3 秒。

       timeout 3
       password hackme

为了进一步加强密码的完整性,您可以将密码以加密形式存储。实用程序 grub-md5-crypt 生成与 GRUB 的加密密码算法 (MD5) 兼容的哈希密码。要在 grub 中指定将使用 MD5 格式的密码,请使用以下指令

       timeout 3
       password --md5 $1$bw0ez$tljnxxKLfMzmnDVaQWgjP0

添加了 --md5 参数以指示 grub 执行 MD5 身份验证过程。提供的密码是 hackme 的 MD5 加密版本。使用 MD5 密码方法比选择其明文对应方法更可取。有关 grub 密码的更多信息,请参见 grub-doc 软件包。


4.5 禁用 initramfs 上的 root 提示符

注意:这适用于 Debian 3.1 之后版本提供的默认内核

Linux 2.6 内核提供了一种在启动时访问 root shell 的方法,该 shell 将在错误时加载 initramfs 期间显示。这有助于允许管理员输入具有 root 权限的救援 shell。此 shell 可用于在自动检测失败时手动加载模块。此行为是 initramfs-tools 生成的 initramfs 的默认行为。将显示以下消息

       "ALERT!  /dev/sda1 does not exist.  Dropping to a shell!

为了删除此行为,您需要设置以下启动参数:panic=0。将其添加到 /boot/grub/menu.lst 的 kopt 部分并执行 update-grub,或添加到 /etc/lilo.conf 的 append 部分。


4.6 移除内核上的 root 提示符

注意:这不适用于为 Debian 3.1 提供的内核,因为内核延迟的超时已更改为 0。

Linux 2.4 内核提供了一种在启动时访问 root shell 的方法,该 shell 将在加载 cramfs 文件系统后立即显示。将显示一条消息,允许管理员输入具有 root 权限的可执行 shell,此 shell 可用于在自动检测失败时手动加载模块。此行为是 initrdlinuxrc 的默认行为。将显示以下消息

       Press ENTER to obtain a shell (waits 5 seconds)

为了删除此行为,您需要更改 /etc/mkinitrd/mkinitrd.conf 并设置

       # DELAY  The  number  of seconds the linuxrc script should wait to
       # allow the user to interrupt it before the system is brought up
       DELAY=0

然后重新生成 ramdisk 映像。例如,您可以使用

       # cd /boot
       # mkinitrd -o initrd.img-2.4.18-k7 /lib/modules/2.4.18-k7

或(首选)

       # dpkg-reconfigure -plow kernel-image-2.4.x-yz

4.7 限制控制台登录访问

一些安全策略可能会强制管理员通过控制台使用其用户/密码登录系统,然后成为超级用户(使用 susudo)。Debian 中通过编辑 /etc/login.defs 文件或使用 PAM 时编辑 /etc/securetty 来实现此策略。在

使用 PAM 时,可以修改 /etc/pam.d/login 中登录过程的其他更改,其中可能包括对给定时间的用户和组的限制。可以禁用的一个有趣的功能是使用空(空白)密码登录的可能性。可以通过从以下行中删除 nullok 来限制此功能

       auth       required   pam_unix.so nullok

4.8 限制通过控制台重启系统

如果您的系统连接了键盘,则任何人(是的,任何人)都可以在不登录系统的情况下通过键盘重启系统。这可能符合或不符合您的安全策略。如果您想限制此行为,则必须检查 /etc/inittab,以便包含 ctrlaltdel 的行调用带有 -a 开关的 shutdown(请记住在对此文件进行任何更改后运行 init q)。Debian 中的默认设置包括此开关

       ca:12345:ctrlaltdel:/sbin/shutdown -t1 -a -r now

现在,为了允许某些用户关闭系统,如手册页 shutdown(8) 所述,您必须创建文件 /etc/shutdown.allow 并在其中包含可以启动系统的用户名。当给出三指礼(又名 ctrl+alt+del)时,程序将检查文件中列出的任何用户是否已登录。如果他们都没有登录,shutdown不会重启系统。


4.9 以正确的方式挂载分区

当挂载 ext2ext3 文件系统时,您可以应用几个额外的选项到 mount 调用或 /etc/fstab。例如,这是我的 /tmp 分区的 fstab 条目

       /dev/hda7    /tmp    ext2    defaults,nosuid,noexec,nodev    0    2

您可以看到选项部分的不同。选项 nosuid 完全忽略 setuid 和 setgid 位,而 noexec 禁止在该挂载点上执行任何程序,nodev 忽略设备文件。这听起来很棒,但是它

noexec 选项阻止直接执行二进制文件,但在早期版本的内核中很容易被规避

       alex@joker:/tmp# mount | grep tmp
       /dev/hda7 on /tmp type ext2 (rw,noexec,nosuid,nodev)
       alex@joker:/tmp# ./date
       bash: ./date: Permission denied
       alex@joker:/tmp# /lib/ld-linux.so.2 ./date
       Sun Dec  3 17:49:23 CET 2000

但是,较新版本的内核确实可以正确处理 noexec 标志

       angrist:/tmp# mount | grep /tmp
       /dev/hda3 on /tmp type ext3 (rw,noexec,nosuid,nodev)
       angrist:/tmp# ./date
       bash: ./tmp: Permission denied 
       angrist:/tmp# /lib/ld-linux.so.2 ./date 
       ./date: error while loading shared libraries: ./date: failed to map segment 
       from shared object: Operation not permitted

但是,许多脚本小子都有漏洞,试图在 /tmp 中创建和执行文件。如果他们没有线索,他们就会陷入这个陷阱。换句话说,用户不会被欺骗执行 /tmp 中的特洛伊木马二进制文件,例如,当他偶然将 /tmp 添加到他的 PATH 中时。

另请注意,某些脚本可能依赖于 /tmp 是可执行的。最值得注意的是,Debconf 在这方面有一些问题(曾经有?),有关更多信息,请参阅 Bug 116448

以下是一个更彻底的示例。但请注意:/var 可以设置为 noexec,但某些软件 [21] 将其程序保存在 /var 下。nosuid 选项也是如此。

     /dev/sda6   /usr          ext3    defaults,ro,nodev       0       2
     /dev/sda12  /usr/share    ext3    defaults,ro,nodev,nosuid        0       2
     /dev/sda7   /var          ext3    defaults,nodev,usrquota,grpquota 0      2
     /dev/sda8   /tmp          ext3    defaults,nodev,nosuid,noexec,usrquota,grpquota    0       2
     /dev/sda9   /var/tmp      ext3    defaults,nodev,nosuid,noexec,usrquota,grpquota    0       2
     /dev/sda10  /var/log      ext3    defaults,nodev,nosuid,noexec    0       2
     /dev/sda11  /var/account  ext3    defaults,nodev,nosuid,noexec    0       2
     /dev/sda13  /home         ext3    rw,nosuid,nodev,exec,auto,nouser,async,usrquota,grpquota                0       2
     /dev/fd0    /mnt/fd0      ext3    defaults,users,nodev,nosuid,noexec      0       0
     /dev/fd0    /mnt/floppy   vfat    defaults,users,nodev,nosuid,noexec      0       0
     /dev/hda    /mnt/cdrom    iso9660 ro,users,nodev,nosuid,noexec            0       0

4.9.1 设置 /tmp 为 noexec

当您要安装新软件时,如果设置 /tmp 为 noexec,请小心,因为某些程序可能会将其用于安装。apt 就是这样一个程序(请参阅 http://bugs.debian.org/116448),如果配置不正确 APT::ExtractTemplates::TempDir(请参阅 apt-extracttemplates(1))。您可以在 /etc/apt/apt.conf 中将此变量设置为另一个具有 exec 权限的目录,而不是 /tmp


4.9.2 设置 /usr 为只读

如果您将 /usr 设置为只读,您将无法在 Debian GNU/Linux 系统上安装新软件包。您必须首先将其重新挂载为读写,安装软件包,然后再将其重新挂载为只读。可以配置 apt 在安装软件包之前和之后运行命令,因此您可能需要正确配置它。

要执行此操作,请修改 /etc/apt/apt.conf 并添加

       DPkg
       {
           Pre-Invoke  { "mount /usr -o remount,rw" };
           Post-Invoke { "mount /usr -o remount,ro" };
       };

请注意,Post-Invoke 可能会因“/usr busy”错误消息而失败。这主要发生在您在使用更新过程中更新的文件时。您可以通过运行以下命令找到这些程序

     # lsof +L1

停止或重启这些程序并手动运行 Post-Invoke。注意! 这意味着您可能需要在每次对系统进行重大升级时重启您的 X 会话(如果您正在运行一个)。您可能需要重新考虑只读 /usr 是否适合您的系统。另请参阅此 关于 debian-devel 上关于只读 /usr 的讨论


4.10 提供安全的用户访问


4.10.1 用户身份验证:PAM

PAM(可插拔身份验证模块)允许系统管理员选择应用程序如何验证用户身份。请注意,除非应用程序编译时支持 PAM,否则 PAM 无能为力。Debian 附带的大多数应用程序都内置了此支持(Debian 在 2.2 之前没有 PAM 支持)。任何启用 PAM 的服务的当前默认配置是模拟 UNIX 身份验证(阅读 /usr/share/doc/libpam0g/Debian-PAM-MiniPolicy.gz 以获取有关 PAM 服务在 Debian 中应该如何工作的更多信息)。

每个具有 PAM 支持的应用程序都在 /etc/pam.d/ 中提供了一个配置文件,可用于修改其行为

以下描述远非完整,有关更多信息,您可能需要阅读 Linux-PAM 系统管理员指南(在 主要的 PAM 发行站点)。本文档也在 libpam-doc Debian 软件包中提供。

PAM 使您可以一次完成多个身份验证步骤,而用户无需知晓。您可以针对 Berkeley 数据库和普通 passwd 文件进行身份验证,并且只有当用户在两者中都正确进行身份验证时才能登录。您可以使用 PAM 限制很多内容,就像您可以将系统大门敞开一样。所以要小心。典型的配置行以控制字段作为其第二个元素。通常,它应设置为 requisite,如果一个模块失败,则返回登录失败。

我喜欢做的第一件事是为 PAM 应用程序添加 MD5 支持,因为这有助于防止字典破解(如果使用 MD5,密码可以更长)。以下两行应添加到 /etc/pam.d/ 中授予计算机访问权限的所有文件中,例如 loginssh

       # Be sure to install libpam-cracklib first or you will not be able to log in
       password   required     pam_cracklib.so retry=3 minlen=12 difok=3
       password   required     pam_unix.so use_authtok nullok md5

那么,这个咒语是做什么的?第一行加载 cracklib PAM 模块,该模块提供密码强度检查,提示输入长度至少为 12 个字符的新密码,与旧密码至少相差 3 个字符,并允许 3 次重试。Cracklib 依赖于单词列表软件包(例如 wenglishwspanishwbritish、...),因此请确保安装一个适合您语言的软件包,否则 cracklib 可能对您根本没有用。[22] 第二行引入了带有 MD5 密码的标准身份验证模块,并允许零长度密码。use_authtok 指令是必要的,以便从上一个模块传递密码。

为了确保 root 用户只能从本地终端登录系统,应在 /etc/pam.d/login 中启用以下行

       auth     requisite  pam_securetty.so

然后,您应该修改 /etc/securetty 中允许直接 root 登录的终端列表。或者,您可以启用 pam_access 模块并修改 /etc/security/access.conf,这允许更通用和微调的访问控制,但不幸的是,缺乏体面的日志消息(PAM 中的日志记录未标准化,并且是特别令人不快的难题)。稍后我们将回到 access.conf

最后但并非最不重要的一点,应在 /etc/pam.d/login 中启用以下行以设置用户资源限制。

       session  required   pam_limits.so

这限制了用户被允许使用的系统资源(请参阅下面的 限制资源使用:limits.conf 文件,第 4.10.2 节)。例如,您可以限制并发登录数(给定用户组或系统范围)、进程数、内存大小等。

现在编辑 /etc/pam.d/passwd 并更改第一行。您应该添加选项“md5”以使用 MD5 密码,将密码的最小长度从 4 更改为 6(或更多),并根据需要设置最大长度。结果行将如下所示

       password   required   pam_unix.so nullok obscure min=6 max=11 md5

如果您想保护 su,以便只有某些人可以使用它来成为您系统上的 root 用户,则需要在您的系统中添加一个新的组“wheel”(这是最干净的方法,因为尚无文件具有此类组权限)。将 root 和其他应该能够 su 到 root 用户的用户添加到此组。然后将以下行添加到 /etc/pam.d/su

       auth        requisite   pam_wheel.so group=wheel debug

这确保只有来自“wheel”组的人员才能使用 su 成为 root。其他用户将无法成为 root。事实上,如果他们尝试成为 root,他们将收到拒绝消息。

如果您只想允许某些用户在 PAM 服务中进行身份验证,这很容易通过使用存储允许登录(或不允许)的用户的文件来实现。假设您只想允许用户“ref”通过 ssh 登录。因此,您将他放入 /etc/sshusers-allowed 并将以下内容写入 /etc/pam.d/ssh

       auth        required    pam_listfile.so item=user sense=allow file=/etc/sshusers-allowed onerr=fail

由于出现了很多所谓的不安全临时文件漏洞,thttpd 就是一个例子(请参阅 DSA-883-1),libpam-tmpdir 是一个很好的安装软件包。您要做的就是将以下内容添加到 /etc/pam.d/common-session

      session    optional     pam_tmpdir.so

关于默认在 etch 中添加此内容的讨论也很多。有关更多信息,请参阅 http://lists.debian.org/debian-devel/2005/11/msg00297.html

最后但并非最不重要的一点,创建 /etc/pam.d/other 并输入以下行

       auth     required       pam_securetty.so
       auth     required       pam_unix_auth.so
       auth     required       pam_warn.so
       auth     required       pam_deny.so
       account  required       pam_unix_acct.so
       account  required       pam_warn.so
       account  required       pam_deny.so
       password required       pam_unix_passwd.so
       password required       pam_warn.so
       password required       pam_deny.so
       session  required       pam_unix_session.so
       session  required       pam_warn.so
       session  required       pam_deny.so

这些行将为所有支持 PAM 的应用程序提供良好的默认配置(默认情况下拒绝访问)。


4.10.2 限制资源使用:limits.conf 文件

您真的应该认真研究一下此文件。在这里您可以定义用户资源限制。在旧版本中,此配置文件为 /etc/limits.conf,但在较新版本(使用 PAM)中,应使用 /etc/security/limits.conf 配置文件。

如果您不限制资源使用,则系统中具有有效 shell 的任何用户(甚至是通过服务或失控守护程序入侵系统的入侵者)都可以使用系统可以提供的尽可能多的 CPU、内存、堆栈等。此资源耗尽问题可以通过使用 PAM 来解决。

有一种方法可以为某些 shell 添加资源限制(例如,bash 具有 ulimit,请参阅 bash(1)),但由于并非所有 shell 都提供相同的限制,并且用户可以更改 shell(请参阅 chsh(1)),因此最好将限制放在 PAM 模块上,因为它们将适用于所使用的 shell,并且也适用于非面向 shell 的 PAM 模块。

资源限制由内核强制执行,但它们需要通过 limits.conf 进行配置,并且不同服务的 PAM 配置需要加载相应的 PAM。您可以通过运行以下命令检查哪些服务正在强制执行限制

     $ find /etc/pam.d/ \! -name "*.dpkg*" | xargs -- grep limits |grep -v ":#"

通常,loginssh 和图形会话管理器(gdmkdmxdm)应该强制执行用户限制,但您可能希望在其他 PAM 配置文件中执行此操作,例如 cron,以防止系统守护进程占用所有系统资源。

您可能想要强制执行的具体限制设置取决于您系统的资源,这是默认安装中未强制执行任何限制的主要原因之一。

例如,下面的配置示例为所有用户强制执行 100 个进程的限制(以防止fork 炸弹),以及每个进程 10MB 内存的限制和 10 个并发登录的限制。 adm 组中的用户具有更高的限制,并且如果他们愿意(只有限制),可以生成核心文件。

     *              soft    core            0
     *              hard    core            0
     *              hard    rss             1000
     *              hard    memlock         1000
     *              hard    nproc           100
     *              -       maxlogins       1
     *              hard    data            102400
     *              hard    fsize           2048
     @adm           hard    core            100000
     @adm           hard    rss             100000
     @adm           soft    nproc           2000
     @adm           hard    nproc           3000
     @adm           hard    fsize           100000
     @adm           -       maxlogins       10

这些将是默认用户(包括系统守护进程)将拥有的限制

     $ ulimit -a
     core file size        (blocks, -c) 0
     data seg size         (kbytes, -d) 102400
     file size             (blocks, -f) 2048
     max locked memory     (kbytes, -l) 10000
     max memory size       (kbytes, -m) 10000
     open files                    (-n) 1024
     pipe size          (512 bytes, -p) 8
     stack size            (kbytes, -s) 8192
     cpu time             (seconds, -t) unlimited
     max user processes            (-u) 100
     virtual memory        (kbytes, -v) unlimited

这些是管理用户的限制

     $ ulimit -a
     core file size        (blocks, -c) 0
     data seg size         (kbytes, -d) 102400
     file size             (blocks, -f) 100000
     max locked memory     (kbytes, -l) 100000
     max memory size       (kbytes, -m) 100000
     open files                    (-n) 1024
     pipe size          (512 bytes, -p) 8
     stack size            (kbytes, -s) 8192
     cpu time             (seconds, -t) unlimited
     max user processes            (-u) 2000
     virtual memory        (kbytes, -v) unlimited

欲了解更多信息,请阅读


4.10.3 用户登录操作:编辑 /etc/login.defs

下一步是编辑基本配置和用户登录时的操作。 请注意,此文件不是 PAM 配置的一部分,它是 loginsu 程序遵守的配置文件,因此对于至少间接调用这两个程序的情况(位于控制台上并提供初始登录提示的 getty 程序调用 login),调整它没有意义。

       FAIL_DELAY          10

此变量应设置为更高的值,以使其更难使用终端通过暴力破解方式登录。 如果输入了错误的密码,可能的攻击者(或普通用户!)必须等待 10 秒才能获得新的登录提示,这在测试密码时非常耗时。 请注意,如果使用 getty 以外的程序,例如 mingetty,则此设置无效。

       FAILLOG_ENAB        yes

如果启用此变量,则会记录失败的登录尝试。 跟踪它们以捕获试图进行暴力破解攻击的人员非常重要。

       LOG_UNKFAIL_ENAB    no

如果将此变量设置为“yes”,则如果登录失败,它将记录未知的用户名。 最好使用“no”(默认值),因为否则,用户密码可能会在此处被无意中记录(如果用户输入错误并且他们将密码作为用户名输入)。 如果将其设置为“yes”,请确保日志具有适当的权限(例如 640,并具有适当的组设置,例如 adm)。

       SYSLOG_SU_ENAB      yes

此项启用将 su 尝试记录到 syslog。 在严肃的机器上非常重要,但请注意,这也可能造成隐私问题。

       SYSLOG_SG_ENAB      yes

SYSLOG_SU_ENAB 相同,但适用于 sg 程序。

       MD5_CRYPT_ENAB      yes

如上所述,MD5 校验和密码大大减少了字典攻击的问题,因为您可以使用更长的密码。 如果您正在使用 slink,请在启用此选项之前阅读有关 MD5 的文档。 否则,此项在 PAM 中设置。

       PASS_MAX_LEN        50

如果在您的 PAM 配置中激活了 MD5 密码,则此变量应设置为与那里使用的值相同的值。


4.10.4 限制 ftp:编辑 /etc/ftpusers

/etc/ftpusers 文件包含不允许使用 ftp 登录到主机的用户列表。 仅当您真的想允许 ftp 时才使用此文件(通常不建议这样做,因为它使用明文密码)。 如果您的守护进程支持 PAM,您也可以使用它来允许和拒绝某些服务的用户。

FIXME (BUG):Debian 中的默认 ftpusers包含所有管理用户(在 base-passwd 中)是否是一个错误。

将所有系统帐户添加到 /etc/ftpusers 的便捷方法是运行

     $ awk -F : '{if ($3<1000) print $1}' /etc/passwd > /etc/ftpusers

4.10.5 使用 su

如果您确实需要用户成为系统上的超级用户,例如用于安装软件包或添加用户,则可以使用命令 su 来更改您的身份。 您应该尽量避免以 root 用户身份登录,而是使用 su。 实际上,最好的解决方案是删除 su 并切换到 sudo 机制,该机制具有比 su 更广泛的逻辑和更多功能。 但是,su 更常见,因为它在许多其他 Unix 系统上使用。


4.10.6 使用 sudo

sudo 允许用户以另一个用户的身份(甚至是 root 用户)执行定义的命令。 如果用户被添加到 /etc/sudoers 并正确验证了自己的身份,则他能够运行在 /etc/sudoers 中定义的命令。 违规行为(例如不正确的密码或尝试运行您没有权限的程序)将被记录下来并通过邮件发送给 root 用户。


4.10.7 禁止远程管理访问

您还应该修改 /etc/security/access.conf 以禁止远程登录到管理帐户。 这样,用户需要调用 su(或 sudo)才能使用任何管理权限,并且始终会生成适当的审计跟踪。

您需要将以下行添加到 /etc/security/access.conf,默认的 Debian 配置文件中有一行示例被注释掉了

        -:wheel:ALL EXCEPT LOCAL

如果您希望您的更改在 /etc/security/access.conf 中生效,请记住为 /etc/pam.d/ 中的每个服务(或默认配置)启用 pam_access 模块。


4.10.8 限制用户的访问权限

有时您可能会认为您需要在本地系统中创建用户才能提供给定的服务(pop3 邮件服务或 ftp)。 在这样做之前,首先请记住 Debian GNU/Linux 中的 PAM 实现允许您使用 libpam 软件包提供的各种外部目录服务(radius、ldap 等)来验证用户。

如果需要创建用户并且可以远程访问系统,请考虑到用户将能够登录到系统。 您可以通过为用户提供空 shell (/dev/null) 来解决此问题(它需要列在 /etc/shells 中)。 如果您想允许用户访问系统但限制他们的活动,您可以使用 /bin/rbash,相当于在 bash 中添加 -r 选项(受限 SHELL,请参阅 bash(1))。 请注意,即使使用受限 shell,访问交互式程序(可能允许执行子 shell)的用户也可能能够绕过 shell 的限制。

Debian 目前在不稳定版本中提供(并且可能会包含在下一个稳定版本中)pam_chroot 模块(在 libpam-chroot 中)。 它的替代方案是对提供远程日志记录的服务 (ssh, telnet) 进行 chroot。[23]

如果您希望限制用户何时可以访问系统,则必须根据您的需要自定义 /etc/security/access.conf

有关如何为通过 ssh 服务访问系统的用户进行 chroot 的信息,请参阅 Chroot 环境用于 SSH,附录 G


4.10.9 用户审计

如果您真的非常偏执,您可能需要添加一个系统范围的配置来审计用户在您的系统中执行的操作。 本节介绍了一些使用您可以使用的各种实用程序的技巧。


4.10.9.1 使用 script 进行输入和输出审计

您可以使用 script 命令来审计用户运行的内容以及这些命令的结果。 您无法将 script 设置为 shell(即使您将其添加到 /etc/shells)。 但是您可以让 shell 初始化文件运行以下命令

     umask 077
     exec script -q -a "/var/log/sessions/$USER"

当然,如果您在系统范围内执行此操作,则意味着 shell 将不会继续读取个人初始化文件(因为 shell 被 script 覆盖)。 另一种方法是在用户的初始化文件中执行此操作(但这样用户可以删除它,请参阅下面关于此的评论)

您还需要在审计目录(在示例中为 /var/log/sessions/)中设置文件,以便用户可以写入它但不能删除该文件。 例如,可以通过预先创建用户会话文件并使用 chattr 将它们设置为仅追加标志来完成此操作。

对于系统管理员来说,一个有用的替代方案是包含日期信息

     umask 077
     exec script -q -a "/var/log/sessions/$USER-`date +%Y%m%d`"

4.10.9.2 使用 shell 历史记录文件

如果您想查看用户在 shell 中键入的内容(但不是结果),您可以设置一个系统范围的 /etc/profile,配置环境以便将所有命令保存到历史记录文件中。 系统范围的配置需要以用户无法从其 shell 中删除审计功能的方式进行设置。 这在某种程度上是 shell 特定的,因此请确保所有用户都使用支持此功能的 shell。

例如,对于 bash,/etc/profile 可以设置为如下所示 [24]

       HISTFILE=~/.bash_history
       HISTSIZE=10000
       HISTFILESIZE=999999
       # Don't let the users enter commands that are ignored
       # in the history file
       HISTIGNORE=""
       HISTCONTROL=""
       readonly HISTFILE
       readonly HISTSIZE
       readonly HISTFILESIZE
       readonly HISTIGNORE
       readonly HISTCONTROL
       export HISTFILE HISTSIZE HISTFILESIZE HISTIGNORE HISTCONTROL

为了使其工作,用户只能将信息附加到 .bash_history 文件。 您需要使用 chattr 程序为所有用户的 .bash_history 设置仅追加选项。[25]。

请注意,您可以在用户的 .profile 中引入上述配置。 但是,您需要正确设置权限,以防止用户修改此文件。 这包括:用户的家目录属于用户(因为否则他将能够删除该文件),但同时允许他们读取 .profile 配置文件并在 .bash_history 上写入。 如果您这样做,最好也为 .profile 设置不可变标志(也使用 chattr)。


4.10.9.3 使用记帐实用程序进行完整的用户审计

前面的示例是配置用户审计的简单方法,但可能不适用于复杂系统或用户根本不运行 shell(或专门运行 shell)的系统。 如果是这种情况,您需要查看记帐实用程序 acct。 这些实用程序将记录系统中的用户或进程运行的所有命令,但会占用磁盘空间。

激活记帐后,有关进程和用户的所有信息都保存在 /var/account/ 下,更具体地说是保存在 pacct 中。 记帐软件包包含一些工具(saaclastcomm)来分析这些数据。


4.10.9.4 其他用户审计方法

如果您完全偏执,并想审计每个用户的命令,您可以获取 bash 源代码,对其进行编辑,并使其将用户键入的所有内容发送到另一个文件。 或者让 ttysnoop 不断监视任何新的 tty [26] 并将输出转储到文件中。 另一个有用的程序是 snoopy(另请参阅 项目页面),这是一个用户透明的程序,它作为库挂钩,围绕 execve() 调用提供了一个包装器,任何执行的命令都会使用 authpriv 工具(通常存储在 /var/log/auth.log 中)记录到 syslogd


4.10.10 审查用户配置文件

如果您想查看用户在登录系统时实际在做什么,您可以使用包含所有登录信息的 wtmp 数据库。 可以使用多个实用程序处理此文件,其中包括 sac,它可以输出每个用户的配置文件,显示他们通常在哪个时间段登录系统。

如果您已激活记帐,您还可以使用它提供的工具来确定用户何时访问系统以及他们执行的操作。


4.10.11 设置用户 umask

根据您的用户策略,您可能想要更改用户之间共享信息的方式,即用户创建的新文件的默认权限是什么。

Debian 的默认 umask 设置为 022,这意味着文件(和目录)可以被用户的组和系统中的任何其他用户读取和访问。 此定义在所有 shell 都使用的标准配置文件 /etc/profile 中设置。

如果 Debian 的默认值对于您的系统来说过于宽松,您将必须更改所有 shell 的 umask 设置。 更严格的 umask 设置包括 027(其他组,即系统中的其他用户,不允许访问新文件)或 077(用户的组成员不允许访问新文件)。 Debian(默认情况下[27])为每个用户创建一个组,以便只有用户包含在其组中。 因此,027 和 077 是等效的,因为用户的组仅包含用户本身。

此更改是通过为所有用户定义适当的 umask 设置来设置的。 您可以通过在 shell 配置文件中引入 umask 调用来更改此设置:/etc/profile(所有 Bourne 兼容的 shell 都使用它作为源),/etc/csh.cshrc/etc/csh.login/etc/zshrc 以及可能还有其他一些(取决于您在系统上安装的 shell)。 您也可以更改 /etc/login.defs 中的 UMASK 设置。 在所有这些设置中,shell 加载的最后一个设置优先。 顺序是:用户 shell 的默认系统配置(即 /etc/profile 和其他系统范围的配置文件),然后是用户的 shell(他的 ~/.profile~/.bash_profile 等...)。 但是,某些 shell 可以使用 nologin 值执行,这可能会跳过一些这些文件的获取。 有关更多信息,请参阅您的 shell 的手册页。

对于使用 login 的连接,/etc/login.defs 中的 UMASK 定义在任何其他定义之前使用。 但是,该值不适用于不使用 login 的用户执行的程序,例如通过 sucronssh 运行的程序。

不要忘记审查并可能修改 /etc/skel/ 下的点文件,因为这些将是使用 adduser 命令创建新用户的默认值。 Debian 默认点文件不包含任何 umask 调用,但如果点文件中存在任何调用,则新创建的用户可能会有不同的值。

但是请注意,如果用户愿意,他们可以通过更改自己的点文件来修改自己的 umask 设置,使其更宽松或更严格。

libpam-umask 软件包使用 PAM 调整用户的默认 umask。 安装软件包后,将以下内容添加到 /etc/pam.d/common-session

     session    optional     pam_umask.so umask=077

最后,您应该考虑将 root 用户的默认 022 umask(在 /root/.bashrc 中定义)更改为更严格的 umask。 这将防止系统管理员在以 root 用户身份在全局可读目录(例如 /tmp)中工作时无意中删除敏感文件,并使其可供普通用户使用。


4.10.12 限制用户可以查看/访问的内容

FIXME:需要内容。 描述在升级时更改软件包权限的后果(如果未使用 dpkg-statoverride,则对此偏执的管理员应 chroot 其用户)。

如果您需要授予用户访问系统的 shell 权限,请非常仔细地考虑一下。 默认情况下,除非在严重受限的环境(如 chroot jail)中,否则用户可以从您的系统中检索相当多的信息,包括

用户可以在您的系统中看到什么? 可能很多东西,试试这个(深吸一口气)

       find / -type f -a -perm +006 2>/dev/null  
       find / -type d -a -perm +007 2>/dev/null

输出是用户可以看到的文件列表以及他有权访问的目录。


4.10.12.1 限制对其他用户信息的访问

如果您仍然授予用户 shell 访问权限,您可能想要限制他们可以查看的其他用户的信息。 具有 shell 访问权限的用户倾向于在其 $HOME 下创建大量文件:邮箱、个人文档、X/GNOME/KDE 应用程序的配置...

在 Debian 中,每个用户都与一个关联的组创建,并且没有两个用户属于同一个组。 这是默认行为:创建用户帐户时,也会创建同名的组,并将用户分配给该组。 这避免了公共 users 组的概念,这可能会使用户更难以向其他用户隐藏信息。

但是,用户的 $HOME 目录是使用 0755 权限(组可读和全局可读)创建的。 组权限不是问题,因为只有用户属于该组,但是全局权限可能(或可能不是)根据您的本地策略成为问题。

您可以更改此行为,以便用户创建提供不同的 $HOME 权限。 要更改用户在创建时的行为,请将配置文件 /etc/adduser.conf 中的 DIR_MODE 更改为 0750(无全局可读访问权限)。

用户仍然可以共享信息,但不能直接在其 $HOME 目录中共享,除非他们更改其权限。

请注意,禁用全局可读的家目录将阻止用户在 ~/public_html 目录中创建个人网页,因为 Web 服务器将无法读取路径中的一个组件 - 即他们的 $HOME 目录。 如果您想允许用户在其 ~/public_html 中发布 HTML 页面,则将 DIR_MODE 更改为 0751。 这将允许 Web 服务器访问最终的 public_html 目录(它本身应具有 0755 模式)并提供用户发布的内容。 当然,我们这里只讨论默认配置; 用户通常可以完全根据自己的喜好调整自己文件的模式,或者您可以将用于 Web 的内容保存在单独的位置,而不是用户 $HOME 目录的子目录中。


4.10.13 生成用户密码

在许多情况下,管理员需要创建许多用户帐户并为所有用户帐户提供密码。 当然,管理员可以轻松地将密码设置为与用户帐户名相同,但这在安全方面不是很明智。 更好的方法是使用密码生成程序。 Debian 提供了 makepasswdapgpwgen 软件包,这些软件包提供了可用于此目的的程序(名称与软件包相同)。 Makepasswd 将生成真正的随机密码,重点是安全性而不是可发音性,而 pwgen 将尝试生成无意义但可发音的密码(当然,这可能取决于您的母语)。 Apg 具有为两者提供算法的功能(此程序有一个客户端/服务器版本,但未包含在 Debian 软件包中)。

Passwd 不允许非交互式分配密码(因为它使用直接 tty 访问)。 如果您想在创建大量用户时更改密码,您可以使用带有 --disabled-login 选项的 adduser 创建它们,然后使用 usermodchpasswd [28](两者都来自 passwd 软件包,因此您已经安装了它们)。 如果您想使用包含所有信息的文件来批量创建用户,您最好使用 newusers


4.10.14 检查用户密码

用户密码有时可能成为给定系统安全性的最薄弱环节。 这是由于一些用户为其帐户选择了弱密码(并且有权访问它的用户越多,这种情况发生的可能性就越大)。 即使您按照 用户身份验证:PAM,第 4.10.1 节 中所述使用 cracklib PAM 模块和密码限制建立了检查,用户仍然可以使用弱密码。 由于用户访问可能包括远程 shell 访问(希望通过 ssh),因此对于远程攻击者来说,尽可能难以猜测密码非常重要,特别是如果他们能够以某种方式收集重要信息(例如用户名,甚至是 passwdshadow 文件本身)。

系统管理员必须在有大量用户的情况下,检查他们拥有的密码是否与本地安全策略一致。 如何检查? 像攻击者一样尝试破解它们,如果他可以访问哈希密码(/etc/shadow 文件)。

管理员可以使用 johncrack(两者都是暴力破解密码的工具)以及适当的单词列表来检查用户密码,并在检测到弱密码时采取适当的措施。 您可以使用 apt-cache search wordlist 搜索包含单词列表的 Debian GNU 软件包,或访问经典的 Internet 单词列表站点,例如 ftp://ftp.ox.ac.uk/pub/wordlistsftp://ftp.cerias.purdue.edu/pub/dict


4.10.15 注销空闲用户

空闲用户通常是一个安全问题,用户可能空闲可能是因为他外出吃午饭,或者因为远程连接挂起且未重新建立。 无论出于何种原因,空闲用户都可能导致妥协

一些远程系统甚至通过空闲(和分离的)screen 被攻破。

自动断开空闲用户的连接通常是必须强制执行的本地安全策略的一部分。 有几种方法可以做到这一点

timeoutdautolog 守护进程是首选方法,因为毕竟,用户可以更改其默认 shell,或者可以在运行其默认 shell 后切换到另一个(不受控制的)shell。


4.11 使用 tcpwrappers

TCP wrappers 是在没有真正的可用数据包过滤器并且需要访问控制时开发的。 然而,它们仍然非常有趣和有用。 TCP wrappers 允许您为主机或域允许或拒绝服务,并定义默认的允许或拒绝规则(所有操作都在应用程序级别执行)。 如果您想了解更多信息,请查看 hosts_access(5)

Debian 中安装的许多服务要么

一方面,对于在 /etc/inetd.conf 中配置的服务(包括 telnetftpnetbiosswatfinger),您将看到配置文件首先执行 /usr/sbin/tcpd。 另一方面,即使服务不是由 inetd 超级守护进程启动的,也可以将对 tcp wrappers 规则的支持编译到其中。 在 Debian 中使用 tcp wrappers 编译的服务包括 sshportmapin.talkrpc.statdrpc.mountdgdmoaf(GNOME 激活器守护进程)、nessus 和许多其他服务。

要查看哪些软件包使用 tcpwrappers [29],请尝试

       $ apt-cache rdepends libwrap0

在运行 tcpdchk(一个非常有用的 TCP wrappers 配置文件规则和语法检查器)时,请考虑到这一点。 当您将独立服务(直接链接到 wrapper 库的服务)添加到 hosts.denyhosts.allow 文件中时,tcpdchk 会警告您它无法找到提到的服务,因为它仅在 /etc/inetd.conf 中查找它们(手册页在这里并不完全准确)。

现在,这里有一个小技巧,并且可能是最小的可用入侵检测系统。 通常,您应该有一个体面的防火墙策略作为第一道防线,而 tcp wrappers 作为第二道防线。 一个小技巧是在 /etc/hosts.deny 中设置一个 SPAWN [30] 命令,以便每当被拒绝的服务触发 wrappers 时,都向 root 用户发送邮件

       ALL: ALL: SPAWN ( \
         echo -e "\n\
         TCP Wrappers\: Connection refused\n\
         By\: $(uname -n)\n\
         Process\: %d (pid %p)\n\
         User\: %u\n\
         Host\: %c\n\
         Date\: $(date)\n\
       " | /usr/bin/mail -s "Connection to %d blocked" root) &

警告:上面打印的示例容易受到 DoS 攻击,方法是在短时间内建立许多连接。 许多电子邮件意味着大量文件 I/O,而只发送少量数据包。


4.12 日志和警报的重要性

很容易看出,日志和警报的处理是安全系统中一个重要的问题。 假设一个系统配置完美且 99% 安全。 如果发生 1% 的攻击,并且没有安全措施来首先检测到这一点,其次,发出警报,那么系统根本不安全。

Debian GNU/Linux 提供了一些工具来执行日志分析,最著名的是 swatch,[31] logchecklog-analysis(所有这些都需要一些自定义才能从报告中删除不必要的内容)。 如果系统在附近,将系统日志打印在虚拟控制台上也可能很有用。 这很有用,因为您可以(从远处)查看系统是否运行正常。 Debian 的 /etc/syslog.conf 附带了一个注释掉的默认配置; 要启用它,请取消注释这些行并重新启动 syslogd (/etc/init.d/syslogd restart)

       daemon,mail.*;\
             news.=crit;news.=err;news.=notice;\
             *.=debug;*.=info;\
             *.=notice;*.=warn       /dev/tty8

要为日志着色,您可以查看 colorizecczeglark。 日志分析的内容很多,无法在此处完全涵盖,因此一个好的信息资源应该是诸如 安全日志管理:识别混乱中的模式 之类的书籍。 在任何情况下,即使是自动化工具也无法与最佳分析工具:您的大脑相提并论。


4.12.1 使用和自定义 logcheck

Debian 中的 logcheck 软件包分为三个子包:logcheck (主程序)、logcheck-database (程序的正则表达式数据库) 和 logtail (打印尚未读取的日志行)。Debian 默认设置 (在 /etc/cron.d/logcheck 中) 是 logcheck 每小时运行一次,并在重启后运行。

如果正确自定义此工具以提醒管理员注意异常系统事件,则它可能非常有用。Logcheck 可以完全自定义,以便根据日志中发现的值得关注的事件发送邮件。默认安装包含用于忽略事件和策略违规的配置文件,适用于三种不同的设置 (工作站、服务器和偏执狂)。Debian 软件包包含一个配置文件 /etc/logcheck/logcheck.conf,程序会读取该文件,该文件定义了检查结果发送给哪个用户。它还为提供服务的软件包提供了一种在以下目录中实施新策略的方法:/etc/logcheck/cracking.d/_packagename_/etc/logcheck/violations.d/_packagename_/etc/logcheck/violations.ignore.d/_packagename_/etc/logcheck/ignore.d.paranoid/_packagename_/etc/logcheck/ignore.d.server/_packagename_/etc/logcheck/ignore.d.workstation/_packagename_。但是,目前没有太多软件包这样做。如果您有可以对其他用户有用的策略,请将其作为相应软件包的错误报告 (作为愿望清单错误) 发送。有关更多信息,请阅读 /usr/share/doc/logcheck/README.Debian

配置 logcheck 的最佳方法是在安装后编辑其主配置文件 /etc/logcheck/logcheck.conf。将默认用户 (root) 更改为接收报告的用户。您也应该在那里设置报告级别。logcheck-database 具有三个报告级别,详细程度递增:工作站、服务器、偏执狂。“服务器”是默认级别,偏执狂仅推荐用于运行尽可能少服务的高安全性机器,而工作站适用于相对安全、非关键的机器。如果您想添加新的日志文件,只需将它们添加到 /etc/logcheck/logcheck.logfiles。它针对默认的 syslog 安装进行了调整。

完成此操作后,您可能需要检查发送的邮件,持续几天/几周/几个月。如果您发现收到不想收到的消息,只需将与这些消息对应的正则表达式 (请参阅 regex(7)egrep(1)) 添加到 /etc/logcheck/ignore.d.reportlevel/local。尝试匹配整个日志行。有关如何编写规则的详细信息,请参见 /usr/share/doc/logcheck-database/README.logcheck-database.gz。这是一个持续的调整过程;一旦发送的消息始终相关,您就可以认为调整完成。请注意,如果 logcheck 在您的系统中没有找到任何相关内容,即使它运行了也不会向您发送邮件 (因此,如果您幸运的话,您可能每周只会收到一次邮件)。


4.12.2 配置警报发送位置

Debian 附带标准的 syslog 配置 (在 /etc/syslog.conf 中),该配置根据系统工具将消息记录到适当的文件中。您应该熟悉这一点;如果没有,请查看 syslog.conf 文件和文档。如果您打算维护一个安全的系统,您应该了解日志消息发送到哪里,以便它们不会被忽视。

例如,将消息发送到控制台也是一种有趣的设置,对许多生产级系统很有用。但是对于许多此类系统,添加一台新机器作为日志主机 (即,它接收来自所有其他系统的日志) 也很重要。

也应考虑 root 的邮件,许多安全控制 (如 snort) 会将警报发送到 root 的邮箱。此邮箱通常指向系统中创建的第一个用户 (检查 /etc/aliases)。请注意将 root 的邮件发送到可以读取的地方 (本地或远程)。

您的系统上还有其他角色帐户和别名。在小型系统上,最简单的方法可能是确保所有此类别名都指向 root 帐户,并将发送给 root 的邮件转发到系统管理员的个人邮箱。

FIXME: 讲述 Debian 系统如何发送/接收与安全问题相关的 SNMP trap (jfs) 将很有趣。检查:snmptrapfmtsnmpsnmpd


4.12.3 使用日志主机

日志主机是一台通过网络远程收集 syslog 数据的计算机。如果您的某台机器被破解,入侵者将无法掩盖其踪迹,除非他同时也黑掉了日志主机。因此,日志主机应该特别安全。将机器设置为日志主机很简单。只需使用 syslogd -r 启动 syslogd,一个新的日志主机就诞生了。为了在 Debian 中永久执行此操作,请编辑 /etc/default/syslogd 并更改行

     SYSLOGD=""

     SYSLOGD="-r"

接下来,配置其他机器将数据发送到日志主机。将如下条目添加到 /etc/syslog.conf

       facility.level            @your_loghost

请参阅文档,了解在 facilitylevel 中使用什么 (它们不应像这样逐字输入)。如果您想远程记录所有内容,只需写入

       *.*                       @your_loghost

到您的 syslog.conf 中。远程和本地日志记录是最佳解决方案 (攻击者可能会认为在删除本地日志文件后掩盖了踪迹)。有关更多信息,请参阅 syslog(3)syslogd(8)syslog.conf(5) 手册页。


4.12.4 日志文件权限

不仅决定如何使用警报很重要,而且谁有权读取/修改日志文件 (如果未使用远程日志主机) 也很重要。入侵者可以更改或禁用的安全警报在入侵事件中毫无价值。此外,您还必须考虑到,如果入侵者可以访问日志文件,则日志文件可能会向入侵者泄露有关您系统的相当多的信息。

某些日志文件权限在安装后并不完善 (但这当然确实取决于您的本地安全策略)。首先,普通用户不需要读取 /var/log/lastlog/var/log/faillog。在 lastlog 文件中,您可以看到谁最近登录,而在 faillog 中,您可以看到登录失败的摘要。作者建议对两者使用 chmod 660。简要查看您的日志文件,并非常仔细地决定哪些日志文件可以供 UID 不是 0 且组不是 'adm' 或 'root' 的用户读取/写入。您可以使用以下命令在您的系统中轻松检查这一点

       #  find /var/log -type f -exec ls -l {} \; | cut -c 17-35 |sort -u
       (see to what users do files in /var/log belong)
       #  find /var/log -type f -exec ls -l {} \; | cut -c 26-34 |sort -u
       (see to what groups do files in /var/log belong)
       # find /var/log -perm +004
       (files which are readable by any user)
       #  find /var/log \! -group root \! -group adm -exec ls -ld {} \;
       (files which belong to groups not root or adm)

要自定义日志文件的创建方式,您可能需要自定义生成日志文件的程序。但是,如果日志文件被轮换,您可以自定义创建和轮换的行为。


4.13 添加内核补丁

Debian GNU/Linux 为 Linux 内核提供了一些增强其安全性的补丁。这些包括

以下安全内核补丁仅适用于 woody 中的旧内核版本,并且已被弃用

但是,某些补丁尚未在 Debian 中提供。如果您认为应该包含其中一些补丁,请在 需要工作和潜在软件包 中提出要求。


4.14 防范缓冲区溢出

缓冲区溢出是一种常见的软件攻击名称 [33],它利用边界检查不足 (编程错误,最常见于 C 语言) 以通过程序输入执行机器代码。这些针对远程监听连接的服务器软件和针对授予用户更高权限 (setuidsetgid) 的本地软件的攻击可能导致任何给定系统受到威胁。

主要有四种方法可以防止缓冲区溢出

自 3.0 版本起,Debian GNU/Linux 提供了引入所有这些方法的软件,除了源代码编译保护 (但这已在 Bug #213994 中请求)。

请注意,即使 Debian 提供了具有堆栈/缓冲区溢出保护功能的编译器,也需要重新编译所有软件包才能引入此功能。实际上,这正是 Adamantix 发行版所做的 (以及其他功能)。此新功能对软件稳定性的影响尚待确定 (某些程序或某些处理器架构可能会因此而崩溃)。

在任何情况下,请注意,即使这些解决方法也可能无法阻止缓冲区溢出,因为有一些方法可以绕过这些方法,如 phrack 杂志 第 58 期 或 CORE 的咨询报告 堆栈粉碎保护技术中的多个漏洞 中所述。

如果您想在实施缓冲区溢出保护后对其进行测试 (无论使用哪种方法),您可能需要安装 paxtest 并运行它提供的测试。


4.14.1 缓冲区溢出的内核补丁保护

与缓冲区溢出相关的内核补丁包括 Openwall 补丁,它为 2.2 linux 内核提供缓冲区溢出保护。对于 2.4 或更新的内核,您需要使用 Exec-shield 实现或 PaX 实现 (在 grsecurity 补丁 kernel-patch-2.4-grsecurity 和 Adamantix 补丁 kernel-patch-adamantix 中提供)。有关使用这些补丁的更多信息,请阅读 添加内核补丁,第 4.13 节


4.14.2 测试程序的溢出

在任何情况下,使用工具检测缓冲区溢出都需要编程经验才能修复 (和重新编译) 代码。例如,Debian 提供了:bfbtester (一个缓冲区溢出测试器,它通过命令行和环境溢出暴力破解二进制文件)。其他感兴趣的软件包还包括 ratspscanflawfindersplint


4.15 安全文件传输

在正常的系统管理期间,通常需要将文件移入和移出已安装的系统。可以使用 ssh 服务器软件包以安全的方式将文件从一台主机复制到另一台主机。另一种可能性是使用 ftpd-ssl,这是一种使用安全套接字层来加密传输的 ftp 服务器。

这些方法中的任何一种都需要特殊的客户端。Debian 确实提供了客户端软件,例如来自 ssh 软件包的 scp,它的工作方式类似于 rcp,但完全加密,因此坏人甚至无法知道您复制了什么。还有一个用于等效服务器的 ftp-ssl 软件包。您甚至可以为其他操作系统 (非 UNIX) 找到这些软件的客户端,puttywinscp 为任何版本的 Microsoft 操作系统提供安全复制实现。

请注意,除非如 Chrooting ssh,第 5.1.1 节 中所述进行 chroot,否则使用 scp 会让用户访问所有文件系统。FTP 访问可以进行 chroot,这可能更容易,具体取决于您选择的守护程序,如 Securing FTP,第 5.3 节 中所述。如果您担心用户浏览您的本地文件并希望进行加密通信,您可以选择使用支持 SSL 的 ftp 守护程序,或者结合明文 ftp 和 VPN 设置 (请参阅 虚拟专用网络,第 8.5 节)。


4.16 文件系统限制和控制


4.16.1 使用配额

拥有良好的配额策略非常重要,因为它可以防止用户填满硬盘。

您可以使用两种不同的配额系统:用户配额和组配额。正如您可能已经想到的,用户配额限制了用户可以占用的空间量,组配额对组执行相同的操作。在制定配额大小时,请牢记这一点。

在设置配额系统时,需要考虑一些要点

应为用户具有完全写入权限的每个分区或目录启用配额。为那些分区和目录计算和分配可用的配额大小,这结合了可用性和安全性。

所以,现在您想使用配额。首先,您需要检查是否在内核中启用了配额支持。如果没有,您将需要重新编译它。之后,控制是否安装了 quota 软件包。如果没有,您也需要这个软件包。

为相应的文件系统启用配额就像在您的 /etc/fstab 文件中将 defaults 设置修改为 defaults,usrquota 一样简单。如果您需要组配额,请将 usrquota 替换为 grpquota。您也可以同时使用两者。然后在您要使用配额的文件系统的根目录中创建空的 quota.user 和 quota.group 文件 (例如,对于 /home 文件系统,touch /home/quota.user /home/quota.group)。

通过执行 /etc/init.d/quota stop;/etc/init.d/quota start 重新启动 quota。现在配额应该正在运行,并且可以设置配额大小。

可以使用 edquota -u <user> 完成编辑特定用户的配额。可以使用 edquota -g <group> 修改组配额。然后根据需要设置软配额和硬配额和/或 inode 配额。

有关配额的更多信息,请阅读配额手册页和配额迷你指南 (/usr/share/doc/HOWTO/en-html/mini/Quota.html)。您可能还需要查看 pam_limits.so


4.16.2 ext2 文件系统特定属性 (chattr/lsattr)

除了通常的 Unix 权限之外,ext2 和 ext3 文件系统还提供一组特定的属性,使您可以更好地控制系统上的文件。与基本权限不同,这些属性不会通过常用的 ls -l 命令显示或使用 chmod 更改,您需要另外两个实用程序 lsattrchattr (在 e2fsprogs 软件包中) 来管理它们。请注意,这意味着当您备份系统时,通常不会保存这些属性,因此如果您更改了其中任何一个属性,则可能值得将连续的 chattr 命令保存在脚本中,以便您可以在以后必须恢复备份时再次设置它们。

在所有可用属性中,对提高安全性最重要的两个属性用字母 'i' 和 'a' 表示,并且只能由超级用户设置 (或删除)

这些属性也可以为目录设置,在这种情况下,每个人都被拒绝修改目录列表内容的权利 (例如,重命名或删除文件,...)。当应用于目录时,追加属性仅允许文件创建。

很容易看出 'a' 属性如何提高安全性,通过赋予未以超级用户身份运行的程序向文件添加数据而无需修改其先前内容的能力。另一方面,'i' 属性似乎不太有趣:毕竟,超级用户已经可以使用基本的 Unix 权限来限制对文件的访问,并且获得超级用户帐户的入侵者始终可以使用 chattr 程序来删除该属性。这样的入侵者最初可能会感到困惑,当他看到自己无法删除文件时,但您不应认为他是瞎子 - 毕竟,他已经进入了您的系统!一些手册 (包括本文档的先前版本) 建议简单地从系统中删除 chattrlsattr 程序以提高安全性,但这种策略 (也称为“隐蔽式安全”) 绝对应该避免,因为它会提供一种虚假的安全感。

解决此问题的安全方法是使用 Linux 内核的功能,如 主动防御,第 10.4.2.1 节 中所述。此处感兴趣的功能称为 CAP_LINUX_IMMUTABLE:如果您从功能边界集中删除它 (例如,使用命令 lcap CAP_LINUX_IMMUTABLE),则即使是超级用户也无法再更改系统上的任何 'a' 或 'i' 属性!一个完整的策略可能是这样的

  1. 在您想要的任何文件上设置属性 'a' 和 'i';

  1. 将命令 lcap CAP_LINUX_IMMUTABLE (以及 lcap CAP_SYS_MODULE,如 主动防御,第 10.4.2.1 节 中建议的) 添加到启动脚本之一;

  1. 在脚本和其他启动文件以及 lcap 二进制文件本身上设置 'i' 属性;

  1. 手动执行上述命令 (或重新启动系统以确保一切按计划工作)。

现在,该功能已从系统中删除,入侵者无法更改受保护文件上的任何属性,因此无法更改或删除文件。如果他强制机器重新启动 (这是恢复功能边界集的唯一方法),它将很容易被检测到,并且该功能将在系统重新启动后立即再次被删除。更改受保护文件的唯一方法是在单用户模式下或使用另一个启动盘启动系统,这两种操作都需要物理访问机器!


4.16.3 检查文件系统完整性

您确定硬盘上的 /bin/login 仍然是您几个月前安装的二进制文件吗?如果它是被黑的版本,它会将输入的密码存储在隐藏文件中,或者以明文版本通过互联网发送邮件,该怎么办?

拥有某种保护的唯一方法是每小时/每天/每月 (我更喜欢每天) 检查您的文件,方法是将此文件的实际 md5sum 与旧的 md5sum 进行比较。两个文件不可能具有相同的 md5sum (MD5 摘要为 128 位,因此两个不同文件具有相同 md5sum 的概率约为 3.4e3803 分之一),因此您在这里是安全的,除非有人也黑掉了在该机器上创建 md5sum 的算法。这非常困难且极不可能。您真的应该将二进制文件的审计视为非常重要,因为它是一种识别二进制文件更改的简单方法。

常用的工具包括 sxidaide (高级入侵检测环境)、tripwireintegritsamhain。安装 debsums 也有助于您检查文件系统完整性,方法是将每个文件的 md5sum 与 Debian 软件包存档中使用的 md5sum 进行比较。但请注意:这些文件很容易被攻击者更改,并非所有软件包都为其提供的二进制文件提供 md5sum 列表。有关更多信息,请阅读 定期进行完整性检查,第 10.2 节拍摄系统快照,第 4.18 节

您可能想使用 locate 来索引整个文件系统,如果是这样,请考虑其影响。Debian findutils 软件包包含 locate,它以用户 nobody 的身份运行,因此它只索引每个人都可见的文件。但是,如果您更改其行为,您将使所有文件位置对所有用户可见。如果您想索引整个文件系统 (而不是用户 nobody 可以看到的部分),您可以将 locate 替换为软件包 slocate。slocate 被标记为 GNU locate 的安全增强版本,但它实际上提供了额外的文件定位功能。使用 slocate 时,用户只能看到他真正有权访问的文件,并且您可以排除系统上的任何文件或目录。slocate 软件包以比 locate 更高的权限运行其更新过程,并索引每个文件。然后,用户可以快速搜索他们能够看到的每个文件。slocate 不允许他们看到新文件;它根据您的 UID 过滤输出。

您可能想使用 bsignelfsignelfsign 提供了一个实用程序,用于向 ELF 二进制文件添加数字签名,以及第二个实用程序,用于验证该签名。当前的实现使用 PKI 对二进制文件的校验和进行签名。这样做的好处是,它使人们能够确定二进制文件是否已被修改以及谁创建了它。bsign 使用 GPG,elfsign 使用 PKI (X.509) 证书 (OpenSSL)。


4.16.4 设置 setuid 检查

Debian checksecurity 软件包提供了一个 cron 作业,该作业每天在 /etc/cron.daily/checksecurity [34] 中运行。此 cron 作业将运行 /usr/sbin/checksecurity 脚本,该脚本将存储有关此更改的信息。

默认行为不会将此信息发送给超级用户,而是将更改的每日副本保存在 /var/log/setuid.changes 中。您应该将 MAILTO 变量 (在 /etc/checksecurity.conf 中) 设置为 'root',以便将此信息通过邮件发送给他。有关更多配置信息,请参阅 checksecurity(8)


4.17 保护网络访问

FIXME: 需要更多 (Debian 特有的) 内容。


4.17.1 配置内核网络功能

内核的许多功能可以在运行时通过将某些内容回显到 /proc 文件系统或使用 sysctl 来修改。通过输入 /sbin/sysctl -A,您可以看到可以配置的内容和选项是什么,并且可以通过运行 /sbin/sysctl -w variable=value (请参阅 sysctl(8)) 进行修改。在极少数情况下,您才需要在此处编辑某些内容,但您也可以通过这种方式提高安全性。例如

     net/ipv4/icmp_echo_ignore_broadcasts = 1

这是一个Windows 模拟器,因为如果此选项设置为 1,它在广播 ping 上就像 Windows 一样工作。也就是说,发送到广播地址的 ICMP 回显请求将被忽略。否则,它什么也不做。

如果您想阻止您的系统响应 ICMP 回显请求,只需启用此配置选项

     net/ipv4/icmp_echo_ignore_all = 1

要在您的网络上记录具有不可能地址 (由于错误路由) 的数据包,请使用

     /proc/sys/net/ipv4/conf/all/log_martians = 1

有关可以使用 /proc/sys/net/ipv4/* 完成哪些操作的更多信息,请阅读 /usr/src/linux/Documentation/filesystems/proc.txt。所有选项都在 /usr/src/linux/Documentation/networking/ip-sysctl.txt [35] 中进行了详细描述。


4.17.2 配置 syncookies

此选项是一把双刃剑。一方面,它可以保护您的系统免受 syn 数据包泛洪的攻击;另一方面,它违反了已定义的标准 (RFC)。

     net/ipv4/tcp_syncookies = 1

如果您想在内核每次工作时更改此选项,则需要在 /etc/network/options 中通过设置 syncookies=yes 来更改它。这将会在每次运行 /etc/init.d/networking 时生效 (这通常在启动时完成),而以下操作将具有一次性效果,直到重新启动

     echo 1 > /proc/sys/net/ipv4/tcp_syncookies

仅当内核使用 CONFIG_SYNCOOKIES 编译时,此选项才可用。所有 Debian 内核都编译了内置此选项,但您可以通过运行以下命令来验证它

     $ sysctl -A |grep syncookies
     net/ipv4/tcp_syncookies = 1

有关 TCP syncookies 的更多信息,请阅读 http://cr.yp.to/syncookies.html


4.17.3 启动时保护网络安全

在为内核网络设置配置选项时,您需要对其进行配置,以便在每次系统重新启动时加载它。以下示例启用了许多先前的选项以及其他有用的选项。

实际上,有两种方法可以在启动时配置您的网络。您可以配置 /etc/sysctl.conf (请参阅:sysctl.conf(5)) 或引入在启用接口时调用的脚本。第一个选项将应用于所有接口,而第二个选项允许您在每个接口的基础上配置此选项。

下面显示了一个 /etc/sysctl.conf 配置示例,它将在内核级别保护某些网络选项。请注意其中的注释,当运行 /etc/init.d/networking 时,/etc/network/options 可能会覆盖某些值 (如果在启动序列中它们与此文件中的值冲突,则 /etc/init.d/networkingprocps 晚运行)。

     #
     # /etc/sysctl.conf - Configuration file for setting system variables
     # See sysctl.conf (5) for information. Also see the files under
     # Documentation/sysctl/, Documentation/filesystems/proc.txt, and
     # Documentation/networking/ip-sysctl.txt in the kernel sources 
     # (/usr/src/kernel-$version if you have a kernel-package installed)
     # for more information of the values that can be defined here.
     
     #
     # Be warned that /etc/init.d/procps is executed to set the following
     # variables.  However, after that, /etc/init.d/networking sets some
     # network options with builtin values.  These values may be overridden
     # using /etc/network/options.
     #
     #kernel.domainname = example.com
     
     # Additional settings - adapted from the script contributed
     # by Dariusz Puchala (see below)
     # Ignore ICMP broadcasts
     net/ipv4/icmp_echo_ignore_broadcasts = 1
     #
     # Ignore bogus ICMP errors
     net/ipv4/icmp_ignore_bogus_error_responses = 1
     # 
     # Do not accept ICMP redirects (prevent MITM attacks)
     net/ipv4/conf/all/accept_redirects = 0
     # _or_
     # Accept ICMP redirects only for gateways listed in our default
     # gateway list (enabled by default)
     # net/ipv4/conf/all/secure_redirects = 1
     #
     # Do not send ICMP redirects (we are not a router)
     net/ipv4/conf/all/send_redirects = 0
     #
     # Do not forward IP packets (we are not a router)
     # Note: Make sure that /etc/network/options has 'ip_forward=no'
     net/ipv4/conf/all/forwarding = 0
     #
     # Enable TCP Syn Cookies
     # Note: Make sure that /etc/network/options has 'syncookies=yes'
     net/ipv4/tcp_syncookies = 1
     #
     # Log Martian Packets
     net/ipv4/conf/all/log_martians = 1
     #
     # Turn on Source Address Verification in all interfaces to
     # prevent some spoofing attacks
     # Note: Make sure that /etc/network/options has 'spoofprotect=yes'
     net/ipv4/conf/all/rp_filter = 1
     #
     # Do not accept IP source route packets (we are not a router)
     net/ipv4/conf/all/accept_source_route = 0

要使用脚本,您需要首先创建脚本,例如,在 /etc/network/interface-secure 中 (名称只是一个示例),并像这样从 /etc/network/interfaces 中调用它

     auto eth0
     iface eth0 inet static
             address xxx.xxx.xxx.xxx
             netmask 255.255.255.xxx
             broadcast xxx.xxx.xxx.xxx
             gateway xxx.xxx.xxx.xxx
             pre-up /etc/network/interface-secure

在此示例中,在启用接口 eth0 之前,将调用该脚本以保护所有网络接口,如下所示。

     #!/bin/sh -e
     # Script-name: /etc/network/interface-secure
     #
     # Modifies some default behavior in order to secure against 
     # some TCP/IP spoofing & attacks for all interfaces.
     #
     # Contributed by Dariusz Puchalak.
     #
     echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts 
                                                # Broadcast echo protection enabled.
     echo 0 > /proc/sys/net/ipv4/conf/all/forwarding
                                                # IP forwarding disabled.
     echo 1 > /proc/sys/net/ipv4/tcp_syncookies # TCP syn cookies protection enabled.
     echo 1 >/proc/sys/net/ipv4/conf/all/log_martians # Log strange packets.
     # (this includes spoofed packets, source routed packets, redirect packets)
     # but be careful with this on heavy loaded web servers.
     echo 1 > /proc/sys/net/ipv4/icmp_ignore_bogus_error_responses 
                                                # Bad error message protection enabled.
     
     # IP spoofing protection.
     echo 1 > /proc/sys/net/ipv4/conf/all/rp_filter
     
     # Disable ICMP redirect acceptance.
     echo 0 > /proc/sys/net/ipv4/conf/all/accept_redirects
     echo 0 > /proc/sys/net/ipv4/conf/all/send_redirects
     
     # Disable source routed packets.
     echo 0 > /proc/sys/net/ipv4/conf/all/accept_source_route
     
     exit 0

请注意,您实际上可以拥有每个接口的脚本,这些脚本将为不同的接口启用不同的网络选项 (如果您有多个接口),只需将 pre-up 行更改为

     pre-up /etc/network/interface-secure $IFACE

并使用一个脚本,该脚本将仅将更改应用于特定接口,而不是应用于所有可用接口。但是请注意,某些网络选项只能全局启用。一个示例脚本如下

     #!/bin/sh -e
     # Script-name: /etc/network/interface-secure
     #
     # Modifies some default behavior in order to secure against 
     # some TCP/IP spoofing & attacks for a given interface.
     #
     # Contributed by Dariusz Puchalak.
     #
     
     IFACE=$1
     if [ -z "$IFACE" ] ; then
        echo "$0: Must give an interface name as argument!"
        echo "Usage: $0 <interface>"
        exit 1
     fi
     
     if [ ! -e /proc/sys/net/ipv4/conf/$IFACE/ ]; then
        echo "$0: Interface $IFACE does not exit (cannot find /proc/sys/net/ipv4/conf/)"
        exit 1
     fi
     
     echo 0 > /proc/sys/net/ipv4/conf/$IFACE/forwarding  # IP forwarding disabled.
     echo 1 >/proc/sys/net/ipv4/conf/$IFACE/log_martians # Log strange packets.
     # (this includes spoofed packets, source routed packets, redirect packets)
     # but be careful with this on heavy loaded web servers.
     
     # IP spoofing protection.
     echo 1 > /proc/sys/net/ipv4/conf/$IFACE/rp_filter
     
     # Disable ICMP redirect acceptance.
     echo 0 > /proc/sys/net/ipv4/conf/$IFACE/accept_redirects
     echo 0 > /proc/sys/net/ipv4/conf/$IFACE/send_redirects
     
     # Disable source routed packets.
     echo 0 > /proc/sys/net/ipv4/conf/$IFACE/accept_source_route
     
     exit 0

另一种解决方案是创建一个 init.d 脚本,并使其在启动时运行 (使用 update-rc.d 创建相应的 rc.d 链接)。


4.17.4 配置防火墙功能

为了具有防火墙功能,无论是为了保护本地系统还是其后的其他系统,内核都需要使用防火墙功能进行编译。标准的 Debian 2.2 内核 (Linux 2.2) 提供了数据包过滤器 ipchains 防火墙,Debian 3.0 标准内核 (Linux 2.4) 提供了有状态数据包过滤器 iptables (netfilter) 防火墙。

在任何情况下,使用与 Debian 提供的内核不同的内核都非常容易。您可以找到预编译的内核作为软件包,您可以轻松地在 Debian 系统中安装它们。您还可以使用 kernel-source-X 下载内核源代码,并使用 kernel-package 软件包中的 make-kpkg 构建自定义内核软件包。

在 Debian 中设置防火墙在 添加防火墙功能,第 5.14 节 中进行了更详细的讨论。


4.17.5 禁用弱端主机问题

在不同网络上具有多个接口的系统可以配置服务,以便它们仅绑定到给定的 IP 地址。这通常会阻止通过任何其他地址请求访问服务。然而,这并不意味着(尽管这是一个常见的误解)该服务绑定到给定的硬件地址(接口卡)。 [36]

这不是 ARP 问题,也不是违反 RFC(在 RFC1122 第 3.3.4.2 节中称为弱端主机)。请记住,IP 地址与物理接口无关。

在 2.2(和以前的)内核上,可以使用以下方法修复此问题

     # echo 1 > /proc/sys/net/ipv4/conf/all/hidden
     # echo 1 > /proc/sys/net/ipv4/conf/eth0/hidden
     # echo 1 > /proc/sys/net/ipv4/conf/eth1/hidden
     .....

在较新的内核上,可以使用以下方法之一修复此问题

在本文中,将有很多场合展示如何配置某些服务(sshd 服务器、apache、打印机服务...)以使其监听任何给定的地址,读者应考虑到,如果没有此处给出的修复,则该修复并不能阻止来自同一(本地)网络的访问。 [39]

FIXME:Bugtraq 上的评论表明有一种 Linux 特定的方法可以绑定到给定的接口。

FIXME:提交一个针对 netbase 的错误报告,以便路由修复成为 Debian 中的标准行为?


4.17.6 防御 ARP 攻击

当您不信任 LAN 上的其他主机时(应该始终如此,因为这是最安全的态度),您应该保护自己免受各种现有的 ARP 攻击。

如您所知,ARP 协议用于将 IP 地址链接到 MAC 地址(有关所有详细信息,请参阅 RFC826)。每次您向 IP 地址发送数据包时,都会执行 ARP 解析(首先查找本地 ARP 缓存,如果缓存中不存在该 IP,则广播 ARP 查询)以查找目标硬件地址。所有 ARP 攻击都旨在欺骗您的主机,使其认为主机 B 的 IP 地址与入侵者主机的 MAC 地址关联;然后,您要发送到与主机 B 关联的 IP 的每个数据包都将发送到入侵者主机...

这些攻击(ARP 缓存中毒、ARP 欺骗...)允许攻击者即使在交换网络上也能嗅探流量,轻松劫持连接,断开任何主机与网络的连接... ARP 攻击功能强大且易于实施,并且存在多种工具,例如 dsniff 包中的 arpspoofarpoison

但是,总有解决方案


4.18 获取系统快照

在将系统投入生产系统之前,您可以拍摄整个系统的快照。如果发生入侵事件,可以使用此快照(请参阅入侵后(事件响应),第 11 章)。每当系统升级时,您都应该重新制作此升级,尤其是在升级到新的 Debian 版本时。

为此,您可以使用可写可移动介质,可以将其设置为只读,这可以是软盘(使用后进行读保护)、CD-ROM 驱动器上的 CD(您可以使用可重写 CD-ROM,以便您可以甚至在不同的日期保留 md5sum 的备份),或 USB 磁盘或 MMC 卡(如果您的系统可以访问这些设备并且它们可以进行写保护)。

以下脚本创建一个这样的快照

     #!/bin/bash
     /bin/mount /dev/fd0 /mnt/floppy
     trap "/bin/umount /dev/fd0" 0 1 2 3 9 13 15
     if [ ! -f /usr/bin/md5sum ] ; then
     	echo "Cannot find md5sum. Aborting."
     	exit 1
     fi
     /bin/cp /usr/bin/md5sum /mnt/floppy
     echo "Calculating md5 database"
     >/mnt/floppy/md5checksums.txt
     for dir in /bin/ /sbin/ /usr/bin/ /usr/sbin/ /lib/ /usr/lib/
     do
        find $dir -type f | xargs /usr/bin/md5sum >>/mnt/floppy/md5checksums-lib.txt
     done
     echo "post installation md5 database calculated"
     if [ ! -f /usr/bin/sha1sum ] ; then
     	echo "Cannot find sha1sum"
             echo "WARNING: Only md5 database will be stored"
     else
     	/bin/cp /usr/bin/sha1sum /mnt/floppy
     	echo "Calculating SHA-1 database"
     	>/mnt/floppy/sha1checksums.txt
     	for dir in /bin/ /sbin/ /usr/bin/ /usr/sbin/ /lib/ /usr/lib/
     	do
     	   find $dir -type f | xargs /usr/bin/sha1sum >>/mnt/floppy/sha1checksums-lib.txt
     	done
     	echo "post installation sha1 database calculated"
     fi
     exit 0

请注意,md5sum 二进制文件(以及 sha1sum,如果可用)被放置在软盘驱动器上,以便稍后可以用于检查系统的二进制文件(以防它被木马化)。但是,如果您想确保您正在运行合法的二进制文件,您可能需要编译 md5sum 二进制文件的静态副本并使用该副本(以防止被木马化的 libc 库干扰该二进制文件),或者仅从干净的环境(例如救援 CD-ROM 或 Live-CD)使用 md5sum 的快照(以防止被木马化的内核干扰)。我再怎么强调也不为过:如果您在受感染的系统上,您不能信任其输出,请参阅入侵后(事件响应),第 11 章

快照不包括 /var/lib/dpkg/info 下的文件,该文件包含已安装软件包的 MD5 哈希值(在以 .md5sums 结尾的文件中)。您也可以一起复制此信息,但是您应该注意

快照完成后,您应确保将介质设置为只读。然后,您可以将其存储以进行备份,或将其放置在驱动器中,并使用它来驱动 cron 每晚检查,将原始 md5sum 与快照上的 md5sum 进行比较。

如果您不想设置手动检查,您可以随时使用任何可用的完整性系统,它们将执行此操作以及更多操作,有关更多信息,请阅读执行定期完整性检查,第 10.2 节


4.19 其他建议


4.19.1 不要使用依赖于 svgalib 的软件

SVGAlib 对于像我这样的控制台爱好者来说非常好,但在过去,它已被多次证明非常不安全。针对 zgv 的漏洞被发布,并且很容易获得 root 权限。尽可能尝试避免使用 SVGAlib 程序。


[ 上一页 ] [ 目录 ] [ 1 ] [ 2 ] [ 3 ] [ 4 ] [ 5 ] [ 6 ] [ 7 ] [ 8 ] [ 9 ] [ 10 ] [ 11 ] [ 12 ] [ A ] [ B ] [ C ] [ D ] [ E ] [ F ] [ G ] [ H ] [ 下一页 ]


Debian 手册安全加固

版本:3.13,星期日,2012 年 4 月 8 日 02:48:09 +0000

Javier Fernández-Sanguino Peña jfs@debian.org
作者,第 1.1 节