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


Debian 手册安全指南
第 5 章 - 保护系统上运行的服务


可以通过两种方式保护正在运行的系统中的服务

限制服务,使其只能从给定的位置访问,可以通过在内核(即防火墙)级别限制对它们的访问来实现,将它们配置为仅监听给定的接口(某些服务可能不提供此功能),或使用其他一些方法,例如 Linux vserver 补丁(对于 2.4.16)可用于强制进程仅使用一个接口。

关于从 inetd 运行的服务(telnetftpfingerpop3...),值得注意的是,可以配置 inetd,以便服务仅监听给定的接口(使用 service@ip 语法),但这​​是一个未公开的功能。它的替代品之一,xinetd 元守护程序包含一个 bind 选项,专门用于此目的。请参阅 xinetd.conf(5)

     service nntp
     {
             socket_type     = stream
             protocol        = tcp
             wait            = no
             user            = news
             group           = news
             server          = /usr/bin/env
             server_args     = POSTING_OK=1 PATH=/usr/sbin/:/usr/bin:/sbin/:/bin
     +/usr/sbin/snntpd logger -p news.info
             bind            = 127.0.0.1
     }

以下部分详细介绍了如何根据特定服务的预期用途正确配置各个服务。


5.1 保护 ssh

如果您仍然运行 telnet 而不是 ssh,您应该从本手册中休息一下并更改它。所有远程登录都应使用 Ssh 而不是 telnet。在可以轻松嗅探 Internet 流量并获取明文密码的时代,您应该只使用使用加密的协议。因此,现在在您的系统上执行 apt-get install ssh

鼓励系统上的所有用户使用 ssh 而不是 telnet,或者更好的是,卸载 telnet/telnetd。此外,您应该避免以 root 身份使用 ssh 登录系统,而是使用替代方法成为 root,例如 susudo。最后,还应修改 /etc/ssh 中的 sshd_config 文件以提高安全性

您还可以使用 PAM 控制文件中的 pam_listfilepam_wheel 限制对 ssh 服务器的访问。例如,您可以通过将此行添加到 /etc/pam.d/ssh 来阻止任何未在 /etc/loginusers 中列出的人

     auth       required     pam_listfile.so sense=allow onerr=fail item=user file=/etc/loginusers

作为最后的说明,请注意这些指令来自 OpenSSH 配置文件。目前,有三种常用的 SSH 守护程序,ssh1、ssh2 和 OpenBSD 的 OpenSSH。Ssh1 是第一个可用的 ssh 守护程序,它仍然是最常用的(有传言说甚至有一个 Windows 端口)。Ssh2 比 ssh1 有许多优势,只是它是在闭源许可证下发布的。OpenSSH 是完全免费的 ssh 守护程序,它同时支持 ssh1 和 ssh2。OpenSSH 是在选择 ssh 包时安装在 Debian 上的版本。

您可以在 安全邮件列表存档 中阅读有关如何设置具有 PAM 支持的 SSH 的更多信息。


5.1.1 Chrooting ssh

目前,OpenSSH 不提供在连接时自动 chroot 用户的方法(商业版本确实提供此功能)。但是,有一个项目也为 OpenSSH 提供此功能,请参阅 http://chrootssh.sourceforge.net,但目前尚未针对 Debian 打包。但是,您可以按照 限制用户访问,第 4.10.8 节 中所述使用 pam_chroot 模块。

SSHChroot 环境,附录 G 中,您可以找到几种为 SSH 创建 chroot 环境的选项。


5.1.2 Ssh 客户端

如果您正在使用 SSH 客户端连接 SSH 服务器,则必须确保它支持服务器上强制执行的相同协议。例如,如果您使用 mindterm 软件包,它仅支持协议版本 1。但是,默认情况下,sshd 服务器配置为仅接受版本 2(出于安全原因)。


5.1.3 禁止文件传输

如果您希望用户将文件传输到 ssh 服务器和从 ssh 服务器传输文件,则需要限制对 sftp-server scp 访问的权限。您可以通过在 /etc/ssh/sshd_config 中配置正确的 Subsystem 来限制 sftp-server

您还可以 chroot 用户(使用 libpam-chroot),这样即使允许文件传输,他们也会被限制在一个不包含任何系统文件的环境中。


5.1.4 仅限制文件传输访问

您可能希望限制用户访问,以便他们只能进行文件传输,而不能拥有交互式 shell。为了做到这一点,您可以


5.2 保护 Squid

Squid 是最流行的代理/缓存服务器之一,并且存在一些应考虑的安全问题。Squid 的默认配置文件拒绝所有用户请求。但是,Debian 软件包允许从“localhost”访问,您只需要正确配置浏览器即可。您应该配置 Squid 以允许受信任的用户、主机或网络访问,方法是在 /etc/squid/squid.conf 上定义访问控制列表,有关定义 ACL 规则的更多信息,请参阅 Squid 用户指南。请注意,Debian 为 Squid 提供了最低限度的配置,这将阻止除 localhost 之外的任何事物连接到您的代理服务器(该服务器将在默认端口 3128 中运行)。您需要根据需要自定义您的 /etc/squid/squid.conf。软件包提供的推荐最低配置如下所示

     acl all src 0.0.0.0/0.0.0.0
     acl manager proto cache_object
     acl localhost src 127.0.0.1/255.255.255.255
     acl SSL_ports port 443 563
     acl Safe_ports port 80          # http
     acl Safe_ports port 21          # ftp
     acl Safe_ports port 443 563     # https, snews
     acl Safe_ports port 70          # gopher
     acl Safe_ports port 210         # wais
     acl Safe_ports port 1025-65535  # unregistered ports
     acl Safe_ports port 280         # http-mgmt
     acl Safe_ports port 488         # gss-http
     acl Safe_ports port 591         # filemaker
     acl Safe_ports port 777         # multiling http
     acl Safe_ports port 901         # SWAT
     acl purge method PURGE
     acl CONNECT method CONNECT
     (...)
     # Only allow cachemgr access from localhost
     http_access allow manager localhost
     http_access deny manager
     # Only allow purge requests from localhost
     http_access allow purge localhost
     http_access deny purge
     # Deny requests to unknown ports
     http_access deny !Safe_ports
     # Deny CONNECT to other than SSL ports
     http_access deny CONNECT !SSL_ports
     #
     # INSERT YOUR OWN RULE(S) HERE TO ALLOW ACCESS FROM YOUR CLIENTS
     #
     http_access allow localhost
     # And finally deny all other access to this proxy
     http_access deny all
     #Default:
     # icp_access deny all
     #
     #Allow ICP queries from everyone
     icp_access allow all

您还应根据您的系统资源配置 Squid,包括缓存内存(选项 cache_mem)、缓存文件的位置以及它们将占用的磁盘空间量(选项 cache_dir)。

请注意,如果配置不当,有人可能会通过 Squid 中继邮件消息,因为 HTTP 和 SMTP 协议的设计类似。Squid 的默认配置文件拒绝访问端口 25。如果您希望允许连接到端口 25,只需将其添加到 Safe_ports 列表中。但是, 建议这样做。

正确设置和配置代理/缓存服务器只是保持站点安全的一部分。另一项必要的任务是分析 Squid 的日志,以确保一切都按预期工作。Debian GNU/Linux 中有一些软件包可以帮助管理员执行此操作。以下软件包在 Debian 3.0 和 Debian 3.1 (sarge) 中可用

当在加速器模式下使用 Squid 时,它也充当 Web 服务器。启用此选项会增加代码复杂性,使其可靠性降低。默认情况下,Squid 未配置为充当 Web 服务器,因此您无需担心这一点。请注意,如果您想使用此功能,请确保它确实是必要的。要查找有关 Squid 上的加速器模式的更多信息,请参阅 Squid 用户指南 - 加速器模式


5.3 保护 FTP

如果您确实必须使用 FTP(不使用 sslwrap 包装或在 SSL 或 SSH 隧道内),则应将 ftp chroot 到 ftp 用户的主目录中,以便用户无法看到除他们自己的目录之外的任何内容。否则,他们可以像拥有 shell 一样遍历您的根文件系统。您可以在全局部分的 proftpd.conf 中添加以下行以启用此 chroot 功能

     DefaultRoot ~

通过 /etc/init.d/proftpd restart 重新启动 ProFTPd,并检查您现在是否可以从您的主目录中逃脱。

为防止 ProFTPd 使用 ../../.. 进行 DoS 攻击,请在 /etc/proftpd.conf 中添加以下行:DenyFilter \*.*/

始终记住,FTP 以明文形式发送登录名和身份验证密码(如果您提供匿名公共服务,则这不是问题),并且 Debian 中有更好的替代方案。例如,sftp(由 ssh 提供)。还有其他操作系统的 SSH 免费实现:例如 puttycygwin

但是,如果您在允许用户通过 SSH 访问的同时仍然维护 FTP 服务器,您可能会遇到一个典型的问题。访问 SSH 安全系统内部的匿名 FTP 服务器的用户可能会尝试登录FTP 服务器。虽然访问将被拒绝,但密码仍然会以明文形式通过网络发送。为避免这种情况,ProFTPd 开发人员 TJ Saunders 创建了一个补丁,该补丁阻止用户向匿名 FTP 服务器提供有效的 SSH 帐户。更多信息和补丁可在以下位置获得:ProFTPD 补丁。此补丁也已报告给 Debian,请参阅 Bug #145669


5.4 保护对 X Window 系统的访问

如今,X 终端被越来越多的公司使用,在这些公司中,许多工作站只需要一台服务器。这可能是危险的,因为您需要允许文件服务器连接到客户端(从 X 的角度来看是 X 服务器。X 切换了客户端和服务器的定义)。如果您遵循许多文档的(非常糟糕的)建议,您可以在您的机器上键入 xhost +。这允许任何 X 客户端连接到您的系统。为了稍微提高安全性,您可以使用命令 xhost +hostname 来代替,仅允许来自特定主机的访问。

但是,更安全的解决方案是使用 ssh 来隧道 X 并加密整个会话。当您 ssh 到另一台机器时,这将自动完成。为了使其工作,您必须配置 ssh 客户端和 ssh 服务器。在 ssh 客户端上,应在 /etc/ssh/ssh_config 中将 ForwardX11 设置为 yes。在 ssh 服务器上,应在 /etc/ssh/sshd_config 中将 X11Forwarding 设置为 yes,并且应安装软件包 xbase-clients,因为 ssh 服务器在设置伪 X 显示时使用 /usr/X11R6/bin/xauth(Debian unstable 上为 /usr/bin/xauth)。在 SSH 时代,您应该完全放弃基于 xhost 的访问控制。

为了获得最佳安全性,如果您不需要来自其他机器的 X 访问,只需键入以下内容即可关闭 TCP 端口 6000 上的绑定

     $ startx -- -nolisten tcp

这是 Xfree 4.1.0(Debian 3.0 和 3.1 中提供的 Xserver)中的默认行为。如果您运行的是 Xfree 3.3.6(即您安装了 Debian 2.2),您可以编辑 /etc/X11/xinit/xserverrc,使其类似于

     #!/bin/sh
     exec /usr/bin/X11/X -dpi 100 -nolisten tcp

如果您正在使用 XDM,请将 /etc/X11/xdm/Xservers 设置为::0 local /usr/bin/X11/X vt7 -dpi 100 -nolisten tcp。如果您正在使用 Gdm,请确保在 /etc/gdm/gdm.conf 中设置了 DisallowTCP=true 选项(这是 Debian 中的默认设置)。这基本上会将 -nolisten tcp 附加到每个 X 命令行 [40]。

您还可以设置 xscreensaver 锁定的系统默认超时。即使用户可以覆盖它,您也应该编辑 /etc/X11/app-defaults/XScreenSaver 配置文件并更改 lock 行

     *lock:                  False

(这是 Debian 中的默认设置)为

     *lock:                  True

FIXME:添加有关如何禁用显示用户桌面(可能包含敏感信息)的屏幕保护程序的信息。

XWindow-User-HOWTO (/usr/share/doc/HOWTO/en-txt/XWindow-User-HOWTO.txt.gz) 中阅读更多关于 X Window 安全性的信息。

FIXME:添加关于 debian-security 线程的信息,关于如何更改 XFree 3.3.6 的配置文件来做到这一点。


5.4.1 检查您的显示管理器

如果您只想为本地使用安装显示管理器(即,拥有漂亮的图形登录界面),请确保禁用 XDMCP(X 显示管理器控制协议)功能。在 XDM 中,您可以使用 /etc/X11/xdm/xdm-config 中的此行来完成此操作

     DisplayManager.requestPort:     0

对于 GDM,您的 gdm.conf 中应该有

     [xdmcp]
     Enable=false

通常,所有显示管理器都配置为默认情况下不在 Debian 中启动 XDMCP 服务。


5.5 保护打印访问(lpd 和 lprng 问题)

想象一下,您到达工作场所,打印机正在吐出无止境的纸张,因为有人正在对您的行式打印机守护程序进行 DoS 攻击。糟糕,不是吗?

在任何 UNIX 打印体系结构中,都必须有一种方法将客户端的数据传输到主机的打印服务器。在传统的 lprlp 中,客户端命令将数据复制或符号链接到假脱机目录(这就是为什么这些程序通常是 SUID 或 SGID)。

为了避免任何问题,您应该保持您的打印服务器特别安全。这意味着您需要配置您的打印服务,以便它仅允许来自一组受信任服务器的连接。为了做到这一点,请将您要允许打印的服务器添加到您的 /etc/hosts.lpd

但是,即使您这样做,lpr 守护程序也会接受来自任何接口的端口 515 的传入连接。您应该考虑防火墙来自不允许打印的网络/主机的连接(lpr 守护程序不能被限制为仅监听给定的 IP 地址)。

Lprng 应该优先于 lpr,因为它​​可以配置为执行 IP 访问控制。您可以指定要绑定到的接口(尽管有点奇怪)。

如果您在系统中使用打印机,但仅在本地使用,则您将不希望通过网络共享此服务。您可以考虑使用其他打印系统,例如 cupsPDQ 提供的系统,后者基于 /dev/lp0 设备的用户权限。

cups 中,打印数据通过 HTTP 协议传输到服务器。这意味着客户端程序不需要任何特殊权限,但确实需要服务器在某个端口上监听。

但是,如果您想仅在本地使用 cups,您可以将其配置为绑定到环回接口,方法是更改 /etc/cups/cupsd.conf

     Listen 127.0.0.1:631

此配置文件中还有许多其他安全选项,例如允许或拒绝网络和主机。但是,如果您不需要它们,您最好只限制监听端口。Cups 还通过 HTTP 端口提供文档,如果您不想向外部攻击者泄露潜在的有用信息(并且端口是打开的),请添加

     <Location />
      Order Deny,Allow
      Deny From All
      Allow From 127.0.0.1
     </Location>

可以修改此配置文件以添加更多功能,包括 SSL/TLS 证书和加密。手册可在 http://localhost:631/ 或 cups.org 获得。

FIXME:添加更多内容(关于 业余堡垒建造 的文章提供了一些非常有趣的观点)。

FIXME:检查 PDG 是否在 Debian 中可用,如果是,则建议将其作为首选打印系统。

FIXME:检查 Farmer/Wietse 是否有打印机守护程序的替代品,以及它是否在 Debian 中可用。


5.6 保护邮件服务

如果您的服务器不是邮件系统,您实际上不需要邮件守护程序监听传入连接,但您可能希望传递本地邮件,例如,为了接收来自您已安装的任何警报系统的 root 用户邮件。

如果您有 exim,您不需要守护程序工作才能执行此操作,因为标准 cron 作业会刷新邮件队列。请参阅 禁用守护程序服务,第 3.6.1 节,了解如何执行此操作。


5.6.1 配置 Nullmailer

您可能希望拥有一个本地邮件程序守护程序,以便它可以将本地发送的邮件中继到另一个系统。当您必须管理多个系统并且不想连接到每个系统以读取本地发送的邮件时,这很常见。正如每个单独系统的所有日志记录都可以通过使用中央 syslog 服务器集中化一样,邮件可以发送到中央邮件服务器。

这种仅中继系统应为此正确配置。守护程序也可以配置为仅监听环回地址。

以下配置步骤仅需要用于配置 Debian 3.0 版本中的 exim 软件包。如果您使用的是更高版本(例如使用 exim4 的 3.1),则安装系统已得到改进,因此如果邮件传输代理配置为仅传递本地邮件,它将自动仅允许来自本地主机的连接,并且不允许远程连接。

在使用 exim 的 Debian 3.0 系统中,您必须从 inetd 中删除 SMTP 守护程序

     $ update-inetd --disable smtp

并将邮件程序守护程序配置为仅监听环回接口。在 exim(默认 MTA)中,您可以通过编辑文件 /etc/exim.conf 并添加以下行来完成此操作

     local_interfaces = "127.0.0.1"

重新启动两个守护程序(inetd 和 exim),您将拥有 exim 仅在 127.0.0.1:25 套接字上监听。小心,首先禁用 inetd,否则,exim 将无法启动,因为 inetd 守护程序已经处理传入连接。

对于 postfix,请编辑 /etc/postfix/main.conf

     inet_interfaces = localhost

如果您只需要本地邮件,则此方法优于 tcp 包装邮件程序守护程序或添加防火墙规则以限制任何人访问它。但是,如果您确实需要它监听其他接口,您可以考虑从 inetd 启动它并添加 tcp 包装器,以便根据 /etc/hosts.allow/etc/hosts.deny 检查传入连接。此外,如果您为上述任何方法设置了正确的日志记录,您将意识到何时有人尝试未经授权访问您的邮件程序守护程序。

无论如何,要在 SMTP 级别拒绝邮件中继尝试,您可以更改 /etc/exim/exim.conf 以包含

     receiver_verify = true

即使您的邮件服务器不会中继邮件,也需要这种配置才能让 http://www.abuse.net/relay.html 上的中继测试器确定您的服务器 具备中继能力。

但是,如果您想要仅中继设置,您可以考虑将邮件程序守护程序更改为只能 配置为将邮件转发到远程邮件服务器的程序。Debian 目前为此目的提供了 ssmtpnullmailer。在任何情况下,您可以自行评估 Debian 提供的任何邮件传输代理 [41],并查看哪一个最适合系统的用途。


5.6.2 提供对邮箱的安全访问

如果您想提供对邮箱的远程访问,则有许多 POP3 和 IMAP 守护程序可用。[42] 但是,如果您提供 IMAP 访问,请注意它是一种通用的文件访问协议,它可能成为 shell 访问的等效协议,因为用户可能能够通过它检索他们可以访问的任何文件。

例如,尝试将您的收件箱路径配置为 {server.com}/etc/passwd,如果成功,则您的 IMAP 守护程序未正确配置以防止此类访问。

在 Debian 的 IMAP 服务器中,cyrus 服务器(在 cyrus-imapd 软件包中)通过限制对文件系统中受限部分的数据库的所有访问来解决此问题。此外,可以配置 uw-imapd(安装 uw-imapd 或更好的是,如果您的 IMAP 客户端支持,则安装 uw-imapd-ssl)以 chroot 用户邮件目录,但这默认情况下未启用。提供的文档提供了有关如何配置它的更多信息。

此外,您可能希望运行一个 IMAP 服务器,该服务器不需要在本地系统上创建有效用户(这也将授予 shell 访问权限),courier-imap(用于 IMAP)和 courier-popteapop(用于 POP3)以及 cyrus-imapd(用于 POP3 和 IMAP)提供了具有除本地用户帐户之外的身份验证方法的服务器。cyrus 可以使用可以通过 PAM 配置的任何身份验证方法,而 teapop 可以使用数据库(例如 postgresqlmysql)进行用户身份验证。

FIXME:检查:也可以通过 PAM 配置 uw-imapd 的用户身份验证。


5.6.3 安全地接收邮件

读取/接收邮件是最常见的明文协议。如果您使用 POP3 或 IMAP 获取邮件,您将在网络上发送您的明文密码,因此几乎任何人都可以从现在开始读取您的邮件。相反,请使用 SSL(安全套接字层)来接收您的邮件。另一种选择是 SSH,如果您在充当 POP 或 IMAP 服务器的框上拥有 shell 帐户。这是一个基本的 fetchmailrc 来演示这一点

     poll my-imap-mailserver.org via "localhost"
       with proto IMAP port 1236
           user "ref" there with password "hackme" is alex here warnings 3600
         folders
           .Mail/debian
         preconnect 'ssh -f -P -C -L 1236:my-imap-mailserver.org:143 -l ref
          my-imap-mailserver.org sleep 15 </dev/null > /dev/null'

preconnect 是重要的一行。它启动一个 ssh 会话并创建必要的隧道,该隧道自动将连接转发到 localhost 端口 1236 到 IMAP 邮件服务器,但已加密。另一种可能性是使用具有 SSL 功能的 fetchmail

如果您想提供加密的邮件服务,如 POP 和 IMAP,apt-get install stunnel 并通过这种方式启动您的守护程序

     stunnel -p /etc/ssl/certs/stunnel.pem -d pop3s -l /usr/sbin/popd

此命令将提供的守护程序 (-l) 包装到端口 (-d),并使用指定的 SSL 证书 (-p)。


5.7 保护 BIND

为了保护域名服务器守护程序,可以解决不同的问题,这些问题与保护任何给定服务时考虑的问题类似


5.7.1 避免滥用的 Bind 配置

您应该限制从 DNS 服务器提供给外部客户端的一些信息,以便它不能用于检索您不想泄露的来自您组织的有价值的信息。这包括添加以下选项:allow-transferallow-queryallow-recursionversion。您可以限制全局部分(因此它适用于所有服务的区域)或按区域限制。此信息记录在 bind-doc 软件包中,软件包安装后,请在 /usr/share/doc/bind/html/index.html 上阅读更多相关信息。

假设您的服务器连接到 Internet 和您的内部网络(您的内部 IP 为 192.168.1.2)(基本多宿主服务器),您不想向 Internet 提供任何服务,而只想启用来自您内部主机的 DNS 查找。您可以通过在 /etc/bind/named.conf 中包含以下内容来限制它

     options {
                 allow-query { 192.168.1/24; } ;
                 allow-transfer { none; } ; 
                 allow-recursion { 192.168.1/24; } ;
                 listen-on { 192.168.1.2; } ;
                 forward { only; } ;
                 forwarders { A.B.C.D; } ;
     };

listen-on 选项使 DNS 绑定到仅具有内部地址的接口,但是,即使此接口与连接到 Internet 的接口相同(例如,如果您正在使用 NAT),也仅当查询来自您的内部主机时才会被接受。如果系统具有多个接口并且listen-on 不存在,则只有内部用户可以查询,但是,由于端口可以被外部攻击者访问,他们可能会尝试在 DNS 服务器上崩溃(或利用缓冲区溢出攻击)。如果您不为除您自己之外的任何其他系统提供 DNS 服务,您甚至可以使其仅在 127.0.0.1 上监听。

chaos 类中的 version.bind 记录包含当前正在运行的 bind 进程的版本。此信息通常被自动化扫描程序和恶意个人使用,他们希望确定某人的 bind 是否容易受到特定攻击。通过在 version.bind 记录中提供虚假或不提供信息,可以限制服务器因其发布的版本而受到攻击的可能性。要提供您自己的版本,请按以下方式使用 version 指令

      options { ... various options here ...
     version "Not available."; };

更改 version.bind 记录不会提供针对攻击的实际保护,但它可能被认为是一种有用的保护措施。

示例 named.conf 配置文件可能如下所示

     acl internal {
             127.0.0.1/32;           // localhost
             10.0.0.0/8;             // internal
             aa.bb.cc.dd;            // eth0 IP
     };
     
     acl friendly {
             ee.ff.gg.hh;            // slave DNS
             aa.bb.cc.dd;            // eth0 IP
             127.0.0.1/32;           // localhost
             10.0.0.0/8;             // internal
     };
     
     options {
             directory "/var/cache/bind";
             allow-query { internal; };
             allow-recursion { internal; };
             allow-transfer { none; };
     };
     // From here to the mysite.bogus zone 
     // is basically unmodified from the debian default
     logging {
             category lame-servers { null; };
             category cname { null; };   
     };
     
     zone "." {
             type hint;
             file "/etc/bind/db.root";
     };
     
     zone "localhost" {
             type master;
             file "/etc/bind/db.local";
     };
     
     zone "127.in-addr.arpa" {
             type master;
             file "/etc/bind/db.127";
     };
     
     zone "0.in-addr.arpa" {
             type master;
             file "/etc/bind/db.0";
     };
     
     zone "255.in-addr.arpa" {
             type master;
             file "/etc/bind/db.255";
     };
     
     // zones I added myself
     zone "mysite.bogus" {
             type master;
             file "/etc/bind/named.mysite";
             allow-query { any; };
             allow-transfer { friendly; };
     };

请(再次)检查关于 Bind 的 Bug Tracking System,特别是 Bug #94760(关于区域传输上的 ACL)。如果您认为可以添加有用的信息,请随时为错误报告做出贡献。


5.7.2 更改 BIND 的用户

关于限制 BIND 的权限,您必须注意,如果非 root 用户运行 BIND,则 BIND 无法自动检测新接口,例如,当您将 PCMCIA 卡插入笔记本电脑时。查看您的命名文档(/usr/share/doc/bind/README.Debian)目录中的 README.Debian 文件,以获取有关此问题的更多信息。最近出现了许多与 BIND 相关的安全问题,因此在可能的情况下切换用户非常有用。我们将在此处详细介绍执行此操作所需的步骤,但是,如果您想以自动方式执行此操作,您可以尝试 更改默认 Bind 安装的示例脚本,附录 E 中提供的脚本。

请注意,在任何情况下,这仅适用于 BIND 版本 8。在 BIND 版本 9 的 Debian 软件包中(自 9.2.1-5 版本起,自 sarge 起可用),bind 用户是通过在 /etc/default/bind9 中设置 OPTIONS 变量来创建和使用的。如果您正在使用 BIND 版本 9,并且您的名称服务器守护程序未以 bind 用户身份运行,请验证该文件上的设置。

要以其他用户身份运行 BIND,首先为其创建一个单独的用户和组(对每个不以 root 身份运行的服务使用 nobody 或 nogroup 不是一个好主意)。在本示例中,将使用用户和组 named。您可以通过输入以下内容来执行此操作

     addgroup named
     adduser --system --home /home/named --no-create-home --ingroup named \
           --disabled-password --disabled-login named

请注意,用户 named 将受到相当大的限制。如果您出于某种原因想要更宽松的设置,请使用

     adduser --system --ingroup named named

现在,您可以使用您喜欢的编辑器编辑 /etc/init.d/bind,并将以

     start-stop-daemon --start

开头的行更改为[43]

     start-stop-daemon --start --quiet --exec /usr/sbin/named -- -g named -u named

或者您可以更改(如果不存在则创建)默认配置文件(BIND 版本 8 的 /etc/default/bind)并引入以下内容

     OPTIONS="-u named -g named"

更改 Bind 使用的文件(包括 /etc/bind/rndc.key)的权限

     -rw-r-----    1 root     named          77 Jan  4 01:02 rndc.key

以及 bind 创建其 pidfile 的位置,例如,使用 /var/run/named 而不是 /var/run

     $ mkdir /var/run/named
     $ chown named.named /var/run/named
     $ vi /etc/named.conf
     [ ... update the configuration file to use this new location ...]
     options { ...
             pid-file "/var/run/named/named.pid";
     };
     [ ... ]

此外,为了避免以 root 身份运行任何内容,请通过替换 init.d 脚本中的 reload 行来更改

     reload)
            /usr/sbin/ndc reload

     reload)
             $0 stop
             sleep 1
             $0 start

注意:根据您的 Debian 版本,您可能还需要更改 restart 行。此问题已在 Debian 的 bind 版本 1:8.3.1-2 中修复。

现在您只需通过 /etc/init.d/bind restart 重启 bind,然后检查您的 syslog,看是否有如下两条记录

     Sep  4 15:11:08 nexus named[13439]: group = named
     Sep  4 15:11:08 nexus named[13439]: user = named

瞧!您的 named 现在不再以 root 身份运行。如果您想了解更多关于为什么 BIND 在 Debian 系统上不以非 root 用户身份运行的信息,请查看关于 Bind 的 Bug 跟踪系统,特别是 Bug #50013: bind 应该不以 root 身份运行Bug #132582: 默认安装可能不安全, Bug #53550, Bug #52745, 以及 Bug #128129。如果您认为可以添加有用的信息,请随时为这些错误报告做出贡献。


5.7.3 Chroot 隔离命名服务器

为了实现 BIND 的最大安全性,现在请围绕您的守护进程构建一个 chroot jail(参见 第 5.10 节,通用的 chroot 和 suid 偏执)。有一种简单的方法可以做到这一点:-t 选项(参见 named(8) 手册页或 Bind 9 文档 (PDF) 的第 100 页)。这将使 Bind 将自身 chroot 到给定的目录中,而无需您设置 chroot jail 并担心动态库。chroot jail 中唯一需要的文件是

     dev/null
     etc/bind/       - should hold named.conf and all the server zones
     sbin/named-xfer - if you do name transfers
     var/run/named/  - should hold the PID and the name server cache (if
                       any) this directory needs to be writable by named user
     var/log/named   - if you set up logging to a file, needs to be writable
                       for the named user
     dev/log         - syslogd should be listening here if named is configured to
                       log through it

为了让您的 Bind 守护进程正常工作,它需要在命名文件中具有权限。这是一项简单的任务,因为配置文件始终位于 /etc/named/。请注意,它只需要对区域文件的只读访问权限,除非它是辅助或缓存名称服务器。如果是这种情况,您将必须为必要的区域提供读写权限(以便来自主服务器的区域传输能够工作)。

此外,您可以在 Chroot-BIND-HOWTO (关于 Bind 9)和 Chroot-BIND8-HOWTO (关于 Bind 8)中找到更多关于 Bind chroot 的信息。这些文档也应该可以通过安装 doc-linux-text(文本版本)或 doc-linux-html(HTML 版本)获得。另一个有用的文档是 http://web.archive.org/web/20011024064030/http://www.psionic.com/papers/dns/dns-linux

如果您正在为 Debian 中的 Bind 设置完整的 chroot jail(即不仅仅是 -t),请确保其中包含以下文件[44]

     dev/log - syslogd should be listening here
     dev/null
     etc/bind/named.conf 
     etc/localtime
     etc/group - with only a single line: "named:x:GID:"
     etc/ld.so.cache - generated with ldconfig 
     lib/ld-2.3.6.so
     lib/libc-2.3.6.so
     lib/ld-linux.so.2 - symlinked to ld-2.3.6.so
     lib/libc.so.6 - symlinked to libc-2.3.6.so
     sbin/ldconfig - may be deleted after setting up the chroot
     sbin/named-xfer - if you do name transfers
     var/run/

并修改 syslogd 以监听 $CHROOT/dev/log,以便 named 服务器可以将 syslog 条目写入本地系统日志。

如果您想避免动态库问题,您可以静态编译 bind。您可以使用 apt-getsource 选项来实现。它甚至可以下载您正确编译它所需的软件包。您需要执行类似于以下操作:

     $ apt-get source bind
     # apt-get build-dep bind
     $ cd bind-8.2.5-2
       (edit src/port/linux/Makefile so CFLAGS includes the '-static'
        option)
     $ dpkg-buildpackage -rfakeroot -uc -us
     $ cd ..
     # dpkg -i bind-8.2.5-2*deb

安装后,您需要将文件移动到 chroot jail 中[45],您可以将 init.d 脚本保留在 /etc/init.d 中,以便系统自动启动名称服务器,但编辑它们以在对这些脚本中的 start-stop-daemon 的调用中添加 --chroot /location_of_chroot,或者通过在 /etc/default/bind(对于版本 8)或 /etc/default/bind9(对于版本 9)配置文件中的 OPTIONS 参数中设置 -t 选项来使用 BIND 的 -t 选项。

有关如何设置 chroot 的更多信息,请参见 第 5.10 节,通用的 chroot 和 suid 偏执

待办事项:合并来自 http://people.debian.org/~pzn/howto/chroot-bind.sh.txt, http://www.cryptio.net/~ferlatte/config/ (Debian 特有), http://web.archive.org/web/20021216104548/http://www.psionic.com/papers/whitep01.htmlhttp://csrc.nist.gov/fasp/FASPDocs/NISTSecuringDNS.htm 的信息。


5.8 保护 Apache 安全

待办事项:添加内容:正常 Apache 安装提供的模块(在 /usr/lib/apache/X.X/mod_* 下)以及可以单独安装在 libapache-mod-XXX 包中的模块。

如果您只想在内部使用 Apache 服务器(用于测试目的,访问 doc-central 归档等),并且不希望外部人员访问它,您可以限制对 Apache 服务器的访问。为此,请在 /etc/apache/http.conf 中使用 ListenBindAddress 指令。

使用 Listen

     Listen 127.0.0.1:80

使用 BindAddress

     BindAddress 127.0.0.1

然后使用 /etc/init.d/apache restart 重启 apache,您将看到它只在环回接口上监听。

在任何情况下,如果您没有使用 Apache 提供的所有功能,您可能需要查看 Debian 中提供的其他 Web 服务器,如 dhttpd

Apache 文档 提供了关于在 Apache Web 服务器上采取安全措施的信息(Debian 的 apache-doc 软件包也提供了相同的信息)。

关于通过设置 chroot jail 进一步限制 Apache 的更多信息,请参见 附录 H,ApacheChroot 环境


5.8.1 禁止用户发布 Web 内容

Debian 中默认的 Apache 安装允许用户在 $HOME/public_html 下发布内容。可以使用类似 http://your_apache_server/~user 的 URL 远程检索此内容。

如果您不想允许这样做,您必须更改 /etc/apache/http.conf 配置文件,注释掉(在 Apache 1.3 中)以下模块

     LoadModule userdir_module /usr/lib/apache/1.3/mod_userdir.so

如果您使用的是 Apache 2.0,则必须删除文件 /etc/apache2/mods-enabled/userdir.load 或通过修改 /etc/apache2/mods-enabled/userdir.conf 来限制默认配置。

但是,如果该模块是静态链接的(您可以通过运行 apache -l 列出编译到其中的模块),您必须将以下内容添加到 Apache 配置文件中

     Userdir disabled

攻击者仍然可能进行用户枚举,因为 Web 服务器的响应将是 403 Permission Denied 而不是 404 Not available。如果您使用 Rewrite 模块,则可以避免这种情况。


5.8.2 日志文件权限

自 1.3.22-1 起,Apache 日志文件归用户 'root' 和组 'adm' 所有,权限为 640。这些权限在轮换后会更改。通过 Web 服务器访问系统的入侵者将无法(在不进行权限提升的情况下)删除旧的日志文件条目。


5.8.3 已发布的 Web 文件

Apache 文件位于 /var/www 下。安装后,默认文件提供一些关于系统的信息(主要是它是一个运行 Apache 的 Debian 系统)。默认网页默认由用户 root 和组 root 拥有,而 Apache 进程以用户 www-data 和组 www-data 运行。这应该使通过 Web 服务器入侵系统的攻击者更难篡改网站。当然,您应该用您自己的网页替换默认网页(默认网页可能会提供您不想向外部人员显示的信息)。


5.9 保护 finger 安全

如果您想运行 finger 服务,首先问问自己是否需要这样做。如果您确实需要,您会发现 Debian 提供了许多 finger 守护进程(来自 apt-cache search fingerd 的输出)

如果您要将其用于公共服务,建议使用 ffingerd 作为 finger 守护进程。在任何情况下,当通过 inetd、xinetd 或 tcpserver 设置它时,我们都鼓励您:限制将同时运行的进程数量,限制从给定数量的主机对 finger 守护进程的访问(使用 tcp wrappers),并使其仅监听您需要的接口。


5.10 通用的 chroot 和 suid 偏执

chroot 是限制守护进程、用户或其他服务的最强大的可能性之一。想象一下您的目标周围的 jail,目标无法从中逃脱(通常情况下,但仍然有很多条件允许人们从这样的 jail 中逃脱)。如果您不信任用户或服务,您可以为他创建一个修改后的 root 环境。这可能会占用相当多的磁盘空间,因为您需要将所有必需的可执行文件以及库复制到 jail 中。但是这样一来,即使用户做了恶意的事情,损害范围也仅限于 jail。

许多作为守护进程运行的服务都可以从这种安排中受益。但是,您使用 Debian 发行版安装的守护进程默认情况下不会进行 chroot[46]。

这包括:名称服务器(如 bind)、Web 服务器(如 apache)、邮件服务器(如 sendmail)和 ftp 服务器(如 wu-ftpd)。可以公平地说,BIND 的复杂性是近年来它遭受大量攻击的原因(参见 第 5.7 节,保护 BIND 安全)。

但是,Debian 确实提供了一些可以帮助设置 chroot 环境的软件。参见 第 5.10.1 节,自动创建 chroot 环境

无论如何,如果您在系统上运行任何服务,您都应该考虑尽可能安全地运行它们。这包括:撤销 root 权限、在受限环境(如 chroot jail)中运行或将其替换为更安全的等效服务。

但是,请预先警告,如果用户在其中以超级用户身份运行,则 chroot jail 可能会被破坏。因此,您需要使该服务以非特权用户身份运行。通过限制其环境,您正在限制服务可以访问的世界可读/可执行文件,因此,您限制了通过使用本地系统安全漏洞进行权限提升的可能性。即使在这种情况下,您也不能完全确定聪明的攻击者无法以某种方式突破 jail。仅使用以安全著称的服务器程序是一个很好的额外安全措施。即使是像打开的文件句柄这样微小的漏洞也可能被熟练的攻击者用来入侵系统。毕竟,chroot 的设计目的不是作为安全工具,而是作为测试工具。


5.10.1 自动创建 chroot 环境

有几个程序可以自动 chroot 服务器和服务。Debian 目前(2002 年 5 月接受)在 chrootuid 软件包中提供了 Wietse Venema 的 chrootuid,以及 compartmentmakejail。这些程序可用于为执行任何程序设置受限环境(chrootuid 甚至允许您以受限用户身份运行它)。

其中一些工具可以用来轻松设置 chroot 环境。例如,makejail 程序可以使用简短的配置文件创建和更新 chroot jail(它为 bindapachepostgresqlmysql 提供了示例配置文件)。它尝试猜测并使用 stracestat 和 Debian 的软件包依赖关系将守护进程所需的所有文件安装到 jail 中。更多信息请访问 http://www.floc.net/makejail/Jailer 是一个类似的工具,可以从 http://www.balabit.hu/downloads/jailer/ 获取,也可以作为 Debian 软件包使用。


5.11 通用的明文密码偏执

您应该尽量避免任何通过网络以明文形式发送和接收密码的网络服务,如 FTP/Telnet/NIS/RPC。作者建议所有人使用 ssh 而不是 telnet 和 ftp。

请记住,从 telnet 迁移到 ssh,但使用其他明文协议并不会以任何方式提高您的安全性!最好的做法是删除 ftp、telnet、pop、imap、http,并用它们各自的加密服务取代它们。您应该考虑从这些服务迁移到它们的 SSL 版本,ftp-ssl、telnet-ssl、pop-ssl、https ...

以上列出的这些提示大多数适用于每个 Unix 系统(如果您阅读任何其他与 Linux 和其他 Unix 相关的安全加固文档,您会发现它们)。


5.12 禁用 NIS

如果可能,您不应该使用 NIS,即网络信息服务,因为它允许密码共享。如果您的设置被破坏,这可能是非常不安全的。

如果您需要在机器之间共享密码,您可能需要考虑使用其他替代方案。例如,您可以设置 LDAP 服务器并在您的系统上配置 PAM,以便联系 LDAP 服务器进行用户身份验证。您可以在 LDAP-HOWTO (/usr/share/doc/HOWTO/en-txt/LDAP-HOWTO.txt.gz) 中找到详细的设置。

您可以在 NIS-HOWTO (/usr/share/doc/HOWTO/en-txt/NIS-HOWTO.txt.gz) 中阅读更多关于 NIS 安全性的信息。

待办事项 (jfs):添加关于如何在 Debian 中设置此项的信息。


5.13 保护 RPC 服务安全

如果您不需要 RPC,则应禁用它。

远程过程调用 (RPC) 是一种协议,程序可以使用它来请求位于不同计算机上的其他程序的服务。portmap 服务通过将 RPC 程序号映射到 DARPA 协议端口号来控制 RPC 服务;它必须运行才能进行 RPC 调用。

基于 RPC 的服务在安全漏洞方面有着不良记录,尽管 portmapper 本身没有(但仍然向远程攻击者提供信息)。请注意,一些 DDoS(分布式拒绝服务)攻击使用 RPC 漏洞进入系统并充当所谓的代理/处理程序。

只有当您使用基于 RPC 的服务时才需要 RPC。最常见的基于 RPC 的服务是 NFS(网络文件系统)和 NIS(网络信息系统)。有关 NIS 的更多信息,请参见上一节。软件包 fam 提供的文件更改监视器 (FAM) 也是一项 RPC 服务,因此依赖于 portmap

NFS 服务在某些网络中非常重要。如果您的网络是这种情况,那么您将需要为您的网络找到安全性和可用性之间的平衡(您可以在 NFS-HOWTO (/usr/share/doc/HOWTO/en-txt/NFS-HOWTO.txt.gz) 中阅读更多关于 NFS 安全性的信息)。


5.13.1 完全禁用 RPC 服务

禁用 portmap 非常简单。有几种不同的方法。在 Debian 3.0 系统及更高版本中最简单的方法是卸载 portmap 软件包。如果您运行的是较旧的 Debian 版本,您将必须按照 第 3.6.1 节,禁用守护进程服务 中所述禁用该服务,因为该程序是 netbase 软件包的一部分(不破坏系统就无法卸载)。

请注意,一些桌面环境(特别是 GNOME)使用 RPC 服务,并且某些文件管理功能需要 portmapper。如果是这种情况,您可以限制对 RPC 服务的访问,如下所述。


5.13.2 限制对 RPC 服务的访问

不幸的是,在某些情况下,从系统中删除 RPC 服务不是一个选项。一些本地桌面服务(特别是 SGI 的 fam)是基于 RPC 的,因此需要本地 portmapper。这意味着在某些情况下,安装桌面环境(如 GNOME)的用户也将安装 portmapper。

有几种方法可以限制对 portmapper 和 RPC 服务的访问


5.14 添加防火墙功能

Debian GNU/Linux 操作系统具有 Linux 内核提供的内置功能。如果您安装了最新的 Debian 发行版(默认安装的内核是 2.6),您将可以使用 iptables (netfilter) 防火墙[47]。


5.14.1 防火墙保护本地系统

您可以使用防火墙规则作为保护对本地系统的访问的一种方式,甚至可以限制其发出的出站通信。防火墙规则还可以用于保护无法正确配置向某些网络、IP 地址等提供服务的进程。

但是,本手册最后介绍此步骤主要是因为它远好于不完全依赖防火墙功能来保护给定系统。系统中的安全性由多层组成,防火墙应该是最后一个包含的,一旦所有服务都已加固。您可以很容易地想象这样一种设置,其中系统仅受内置防火墙保护,而管理员却高兴地出于任何原因(设置问题、烦恼、人为错误...)删除了防火墙规则,如果系统中没有其他加固措施来保护它,则该系统将完全暴露于攻击之下。

另一方面,在本地系统上设置防火墙规则也可以防止一些糟糕的事情发生。即使提供的服务配置安全,防火墙也可以防止错误配置或尚未正确配置的新安装的服务。此外,除非删除防火墙代码,否则严格的配置将阻止木马呼叫家工作。请注意,入侵者不需要超级用户访问权限即可在本地安装可以远程控制的木马(因为如果端口不是特权端口且未删除功能,则允许绑定到端口)。

因此,正确的防火墙设置将是具有默认拒绝策略的设置,即


5.14.2 使用防火墙保护其他系统

也可以安装 Debian 防火墙,以便通过过滤规则来保护对其后系统的访问,从而限制它们暴露于 Internet 的程度。可以将防火墙配置为阻止从本地网络外部的系统访问非公共的内部服务(端口)。例如,在邮件服务器上,只有端口 25(邮件服务提供的位置)需要从外部访问。即使邮件服务器中运行着公共服务以外的其他网络服务,也可以将防火墙配置为丢弃(这称为过滤) направленные к ним 的数据包。

您甚至可以将 Debian GNU/Linux box 设置为桥接防火墙,即完全透明于网络的过滤防火墙,它缺少 IP 地址,因此无法直接受到攻击。根据您安装的内核,您可能需要安装桥接防火墙补丁,然后在配置内核时转到802.1d Ethernet Bridging 和新选项 netfilter ( firewalling ) support。有关如何在 Debian GNU/Linux 系统中设置此项的更多信息,请参见 附录 D,设置桥接防火墙


5.14.3 设置防火墙

与其他 Linux 发行版不同,默认的 Debian 安装尚未提供管理员在默认安装过程中设置防火墙配置的方法,但是您可以安装许多防火墙配置软件包(请参见 第 5.14.3.1 节,使用防火墙软件包)。

当然,防火墙的配置始终取决于系统和网络。管理员必须预先知道网络布局和他们想要保护的系统、需要访问的服务以及是否需要考虑其他网络因素(如 NAT 或路由)。配置防火墙时请小心,正如 Laurence J. Lane 在 iptables 软件包中所说

这些工具很容易被误用,通过完全瘫痪对系统的网络访问,造成大量的麻烦。远程系统管理员意外地将自己锁定在数百或数千英里之外的系统之外的情况并不少见。一个人甚至可以设法将自己锁定在一台键盘就在他手指下的计算机之外。请务必谨慎使用。

记住这一点:仅仅安装 iptables(或较旧的防火墙代码)不会给您任何保护,只是提供了软件。为了拥有防火墙,您需要配置它!

如果您不了解如何手动设置防火墙规则,请查阅 Packet Filtering HOWTONAT HOWTOiptables 软件包在 /usr/share/doc/iptables/html/ 中提供了这些文档以供离线阅读。

如果您对防火墙知之甚少,您应该从阅读 防火墙和代理服务器 HOWTO 开始,如果您想离线阅读,请安装 doc-linux-text 软件包。如果您想提问或需要帮助设置防火墙,您可以使用 debian-firewall 邮件列表,请参见 http://lists.debian.org/debian-firewall。另请参见 第 2.2 节,注意一般的安全问题,以获取更多关于防火墙的(一般)指针。另一个好的 iptables 教程是 http://iptables-tutorial.frozentux.net/iptables-tutorial.html


5.14.3.1 使用防火墙软件包

对于新手(有时甚至是专家)管理员来说,手动设置防火墙可能很复杂。但是,自由软件社区创建了许多工具,可以用来轻松配置本地防火墙。请预先警告,其中一些工具更侧重于仅本地保护(也称为个人防火墙),而另一些工具则更通用,可用于配置复杂的规则以保护整个网络。

可以在 Debian 系统中用于设置防火墙规则的一些软件是

Debian 附带了许多其他 iptables 前端;Debian wiki 上的 Firewalls 页面 上维护了一个比较 Debian 中不同软件包的广泛列表。

请注意,前面概述的某些软件包将引入在系统启动时运行的防火墙脚本。在重新启动之前对其进行广泛测试,否则您可能会发现自己被锁定在系统之外。如果您混合使用不同的防火墙软件包,则可能会产生不良影响,通常,最后运行的防火墙脚本将是配置系统的脚本(这可能不是您的本意)。请查阅软件包文档,并使用这些设置之一。

如前所述,某些程序(如 firestarterguarddogknetfilter)是使用 GNOME 或 KDE(后两个)的管理 GUI。这些应用程序比列表中其他一些可能更面向管理员的软件包更面向用户(即,面向家庭用户)。前面提到的一些程序(如 bastille)侧重于设置防火墙规则以保护它们运行的主机,但不一定旨在为保护网络的防火墙主机设置防火墙规则(如 shorewallfwbuilder)。

还有另一种类型的防火墙应用程序:应用程序代理。如果您正在考虑设置企业级防火墙,该防火墙执行数据包过滤并提供许多可以进行细粒度流量分析的透明代理,则应考虑使用 zorp,它在一个程序中提供了这些功能。您还可以使用 Debian 中可用于不同服务的代理手动设置这种类型的防火墙主机,例如,对于 DNS,使用 bind(正确配置)、dnsmasqpdnsdtotd;对于 FTP,使用 froxftp-proxy;对于 X11,使用 xfwp;对于 IMAP,使用 imapproxy;对于邮件,使用 smtpd;或对于 POP3,使用 p3scan。对于其他协议,您可以使用通用 TCP 代理(如 simpleproxy)或通用 SOCKS 代理(如 dante-servertsockssocks4-server)。通常,您还将使用 Web 缓存系统(如 squid)和 Web 过滤系统(如 squidguarddansguardian)。


5.14.3.2 手动 init.d 配置

另一种可能性是通过 init.d 脚本手动配置您的防火墙规则,该脚本将运行所有 iptables 命令。采取以下步骤

这是示例防火墙脚本

     #!/bin/sh
     # Simple example firewall configuration.
     #
     # Caveats:
     # - This configuration applies to all network interfaces
     #   if you want to restrict this to only a given interface use
     #   '-i INTERFACE' in the iptables calls.
     # - Remote access for TCP/UDP services is granted to any host, 
     #   you probably will want to restrict this using '--source'.
     #
     # chkconfig: 2345 9 91
     # description: Activates/Deactivates the firewall at boot time
     #
     # You can test this script before applying with the following shell
     # snippet, if you do not type anything in 10 seconds the firewall
     # rules will be cleared.
     #---------------------------------------------------------------
     #  while true; do test=""; read  -t 20 -p "OK? " test ; \
     #  [ -z "$test" ] && /etc/init.d/myfirewall clear ; done
     #---------------------------------------------------------------
     
     PATH=/bin:/sbin:/usr/bin:/usr/sbin
     
     # Services that the system will offer to the network
     TCP_SERVICES="22" # SSH only
     UDP_SERVICES=""
     # Services the system will use from the network
     REMOTE_TCP_SERVICES="80" # web browsing
     REMOTE_UDP_SERVICES="53" # DNS
     # Network that will be used for remote mgmt
     # (if undefined, no rules will be setup)
     # NETWORK_MGMT=192.168.0.0/24
     # Port used for the SSH service, define this is you have setup a
     # management network but remove it from TCP_SERVICES
     # SSH_PORT="22"
     
     if ! [ -x /sbin/iptables ]; then  
         exit 0
     fi
     
     fw_start () {
     
       # Input traffic:
       /sbin/iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
       # Services
       if [ -n "$TCP_SERVICES" ] ; then
       for PORT in $TCP_SERVICES; do
         /sbin/iptables -A INPUT -p tcp --dport ${PORT} -j ACCEPT
       done
       fi
       if [ -n "$UDP_SERVICES" ] ; then
       for PORT in $UDP_SERVICES; do
         /sbin/iptables -A INPUT -p udp --dport ${PORT} -j ACCEPT
       done
       fi
       # Remote management
       if [ -n "$NETWORK_MGMT" ] ; then
         /sbin/iptables -A INPUT -p tcp --src ${NETWORK_MGMT} --dport ${SSH_PORT} -j ACCEPT
       else 
         /sbin/iptables -A INPUT -p tcp --dport ${SSH_PORT}  -j ACCEPT
       fi
       # Remote testing
       /sbin/iptables -A INPUT -p icmp -j ACCEPT
       /sbin/iptables -A INPUT -i lo -j ACCEPT
       /sbin/iptables -P INPUT DROP
       /sbin/iptables -A INPUT -j LOG
     
       # Output:
       /sbin/iptables -A OUTPUT -j ACCEPT -o lo 
       /sbin/iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
       # ICMP is permitted:
       /sbin/iptables -A OUTPUT -p icmp -j ACCEPT
       # So are security package updates:
       # Note: You can hardcode the IP address here to prevent DNS spoofing
       # and to setup the rules even if DNS does not work but then you 
       # will not "see" IP changes for this service:
       /sbin/iptables -A OUTPUT -p tcp -d security.debian.org --dport 80 -j ACCEPT 
       # As well as the services we have defined:
       if [ -n "$REMOTE_TCP_SERVICES" ] ; then
       for PORT in $REMOTE_TCP_SERVICES; do
         /sbin/iptables -A OUTPUT -p tcp --dport ${PORT} -j ACCEPT
       done
       fi
       if [ -n "$REMOTE_UDP_SERVICES" ] ; then
       for PORT in $REMOTE_UDP_SERVICES; do
         /sbin/iptables -A OUTPUT -p udp --dport ${PORT} -j ACCEPT
       done
       fi
       # All other connections are registered in syslog
       /sbin/iptables -A OUTPUT -j LOG
       /sbin/iptables -A OUTPUT -j REJECT 
       /sbin/iptables -P OUTPUT DROP
       # Other network protections
       # (some will only work with some kernel versions)
       echo 1 > /proc/sys/net/ipv4/tcp_syncookies
       echo 0 > /proc/sys/net/ipv4/ip_forward 
       echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts 
       echo 1 > /proc/sys/net/ipv4/conf/all/log_martians 
       echo 1 > /proc/sys/net/ipv4/ip_always_defrag
       echo 1 > /proc/sys/net/ipv4/icmp_ignore_bogus_error_responses
       echo 1 > /proc/sys/net/ipv4/conf/all/rp_filter
       echo 0 > /proc/sys/net/ipv4/conf/all/send_redirects
       echo 0 > /proc/sys/net/ipv4/conf/all/accept_source_route
     
     }
     
     fw_stop () {
       /sbin/iptables -F
       /sbin/iptables -t nat -F
       /sbin/iptables -t mangle -F
       /sbin/iptables -P INPUT DROP
       /sbin/iptables -P FORWARD DROP
       /sbin/iptables -P OUTPUT ACCEPT
     }
     
     fw_clear () {
       /sbin/iptables -F
       /sbin/iptables -t nat -F
       /sbin/iptables -t mangle -F
       /sbin/iptables -P INPUT ACCEPT
       /sbin/iptables -P FORWARD ACCEPT
       /sbin/iptables -P OUTPUT ACCEPT
     }
     
     
     case "$1" in
       start|restart)
         echo -n "Starting firewall.."
         fw_stop 
         fw_start
         echo "done."
         ;;
       stop)
         echo -n "Stopping firewall.."
         fw_stop
         echo "done."
         ;;
       clear)
         echo -n "Clearing firewall rules.."
         fw_clear
         echo "done."
         ;;
       *)
         echo "Usage: $0 {start|stop|restart|clear}"
         exit 1
         ;;
       esac
     exit 0

您可以不将所有 iptables 规则都包含在 init.d 脚本中,而是使用 iptables-restore 程序来恢复使用 iptables-save 保存的规则。为此,您需要设置您的规则,将规则集保存在静态位置(例如 /etc/default/firewall


5.14.3.3 通过 ifup 配置防火墙规则

您还可以使用 /etc/network/interfaces 中的网络配置来设置您的防火墙规则。为此,您需要

您可以选择性地设置一组规则,以便在网络接口关闭时应用,创建一组规则,将其保存在 /etc/iptables.down.rules 中,并将此指令添加到接口配置中

         post-down iptables-restore < /etc/iptables.down.rules

对于通过 ifupdown 的更高级的防火墙配置脚本,您可以使用每个接口可用的钩子,如使用 run-parts 调用的 *.d/ 目录中所示(请参见 run-parts(8))。


5.14.3.4 测试您的防火墙配置

测试您的防火墙配置就像运行您的防火墙脚本(或启用您在防火墙配置应用程序中定义的配置)一样容易,但也一样危险。但是,如果您不够小心并且您正在远程配置防火墙(例如通过 SSH 连接),您可能会将自己锁定在外面。

有几种方法可以防止这种情况发生。一种是在单独的终端中运行一个脚本,如果您不向其输入任何内容,它将删除防火墙配置。一个例子是

     $  while true; do test=""; read  -t 20 -p "OK? " test ; \
       [ -z "$test" ] && /etc/init.d/firewall clear ; done

另一种方法是通过替代机制在您的系统中引入后门,该机制允许您清除防火墙系统或在其中打孔,以防出现问题。为此,您可以使用 knockd 并对其进行配置,以便特定的端口连接尝试序列将清除防火墙(或添加临时规则)。即使数据包将被防火墙丢弃,由于 knockd 绑定到接口并看到您,您也将能够解决该问题。

测试保护内部网络的防火墙是一个不同的问题,您将需要查看一些用于远程漏洞评估的工具(请参见 第 8.1 节,远程漏洞评估工具),以从外部(或从任何其他方向)探测网络,以测试防火墙配置的有效性。


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


Debian 手册安全指南

版本:3.13,Sun, 08 Apr 2012 02:48:09 +0000

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