[ 上一页 ] [ 目录 ] [ 1 ] [ 2 ] [ 3 ] [ 4 ] [ 5 ] [ 6 ] [ 7 ] [ 8 ] [ 9 ] [ 10 ] [ 11 ] [ 12 ] [ A ] [ B ] [ C ] [ D ] [ E ] [ F ] [ G ] [ H ] [ 下一页 ]
可以通过两种方式保护正在运行的系统中的服务
使它们仅在需要访问的接入点(接口)上可访问。
正确配置它们,以便它们只能被授权的合法用户以授权的方式使用。
限制服务,使其只能从给定的位置访问,可以通过在内核(即防火墙)级别限制对它们的访问来实现,将它们配置为仅监听给定的接口(某些服务可能不提供此功能),或使用其他一些方法,例如 Linux vserver 补丁(对于 2.4.16)可用于强制进程仅使用一个接口。
关于从 inetd
运行的服务(telnet
、ftp
、finger
、pop3
...),值得注意的是,可以配置 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 }
以下部分详细介绍了如何根据特定服务的预期用途正确配置各个服务。
如果您仍然运行 telnet 而不是 ssh,您应该从本手册中休息一下并更改它。所有远程登录都应使用 Ssh 而不是 telnet。在可以轻松嗅探 Internet 流量并获取明文密码的时代,您应该只使用使用加密的协议。因此,现在在您的系统上执行 apt-get install ssh。
鼓励系统上的所有用户使用 ssh 而不是 telnet,或者更好的是,卸载 telnet/telnetd。此外,您应该避免以 root 身份使用 ssh 登录系统,而是使用替代方法成为 root,例如 su
或 sudo
。最后,还应修改 /etc/ssh
中的 sshd_config
文件以提高安全性
ListenAddress 192.168.0.1
让 ssh 仅监听给定的接口,以防您有多个接口(并且不希望 ssh 在其上可用)或者将来添加新的网卡(并且不希望来自它的 ssh 连接)。
PermitRootLogin no
尽可能尝试不允许 Root 登录。如果有人想通过 ssh 成为 root,现在需要两次登录,并且无法通过 SSH 暴力破解 root 密码。
Port 666 或 ListenAddress 192.168.0.1:666
更改监听端口,以便入侵者不能完全确定 sshd 守护程序是否正在运行(请注意,这是通过混淆实现安全性)。
PermitEmptyPasswords no
空密码是对系统安全的嘲弄。
AllowUsers alex ref me@somewhere
仅允许某些用户通过 ssh 访问此机器。user@host 也可用于限制给定用户仅从给定主机访问。
AllowGroups wheel admin
仅允许某些组成员通过 ssh 访问此机器。AllowGroups 和 AllowUsers 具有用于拒绝访问机器的等效指令。不出所料,它们被称为“DenyUsers”和“DenyGroups”。
PasswordAuthentication yes
您想做什么完全是您的选择。仅允许具有放置在 ~/.ssh/authorized_keys
文件中的 ssh 密钥的用户访问机器更安全。如果您想这样做,请将此项设置为“no”。
禁用您不需要的任何形式的身份验证,如果您不使用,例如 RhostsRSAAuthentication、HostbasedAuthentication、KerberosAuthentication 或 RhostsAuthentication,您应该禁用它们,即使它们已经是默认设置(请参阅手册页 sshd_config(5)
)。
Protocol 2
禁用协议版本 1,因为它存在一些设计缺陷,使其更容易破解密码。有关更多信息,请阅读 关于 ssh 协议问题的论文
或 Xforce 咨询
。
Banner /etc/some_file
向连接到 ssh 服务器的用户添加横幅(它将从文件中检索)。在某些国家/地区,在访问给定系统之前发送关于未经授权的访问或用户监控的警告应添加法律保护。
您还可以使用 PAM 控制文件中的 pam_listfile 或 pam_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 的更多信息。
目前,OpenSSH 不提供在连接时自动 chroot 用户的方法(商业版本确实提供此功能)。但是,有一个项目也为 OpenSSH 提供此功能,请参阅 http://chrootssh.sourceforge.net
,但目前尚未针对 Debian 打包。但是,您可以按照 限制用户访问,第 4.10.8 节 中所述使用 pam_chroot
模块。
在 SSH
的 Chroot
环境,附录 G 中,您可以找到几种为 SSH 创建 chroot 环境的选项。
如果您正在使用 SSH 客户端连接 SSH 服务器,则必须确保它支持服务器上强制执行的相同协议。例如,如果您使用 mindterm
软件包,它仅支持协议版本 1。但是,默认情况下,sshd 服务器配置为仅接受版本 2(出于安全原因)。
如果您不希望用户将文件传输到 ssh 服务器和从 ssh 服务器传输文件,则需要限制对 sftp-server
和 scp
访问的权限。您可以通过在 /etc/ssh/sshd_config
中配置正确的 Subsystem 来限制 sftp-server
。
您还可以 chroot 用户(使用 libpam-chroot
),这样即使允许文件传输,他们也会被限制在一个不包含任何系统文件的环境中。
您可能希望限制用户访问,以便他们只能进行文件传输,而不能拥有交互式 shell。为了做到这一点,您可以
禁止用户登录 ssh 服务器(如上所述,通过配置文件或 PAM 配置)。
为用户提供受限 shell,例如 scponly
或 rssh
。这些 shell 限制了用户可用的命令,因此它们不会被提供任何远程执行权限。
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) 中可用
calamaris
- Squid 或 Oops 代理日志文件的日志分析器。
modlogan
- 模块化日志文件分析器。
sarg
- Squid 分析报告生成器。
squidtaild
- Squid 日志监控程序。
当在加速器模式下使用 Squid 时,它也充当 Web 服务器。启用此选项会增加代码复杂性,使其可靠性降低。默认情况下,Squid 未配置为充当 Web 服务器,因此您无需担心这一点。请注意,如果您想使用此功能,请确保它确实是必要的。要查找有关 Squid 上的加速器模式的更多信息,请参阅 Squid 用户指南 - 加速器模式
如果您确实必须使用 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 免费实现:例如 putty
和 cygwin
。
但是,如果您在允许用户通过 SSH 访问的同时仍然维护 FTP 服务器,您可能会遇到一个典型的问题。访问 SSH 安全系统内部的匿名 FTP 服务器的用户可能会尝试登录FTP 服务器。虽然访问将被拒绝,但密码仍然会以明文形式通过网络发送。为避免这种情况,ProFTPd 开发人员 TJ Saunders 创建了一个补丁,该补丁阻止用户向匿名 FTP 服务器提供有效的 SSH 帐户。更多信息和补丁可在以下位置获得:ProFTPD 补丁
。此补丁也已报告给 Debian,请参阅 Bug #145669
。
如今,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 的配置文件来做到这一点。
如果您只想为本地使用安装显示管理器(即,拥有漂亮的图形登录界面),请确保禁用 XDMCP(X 显示管理器控制协议)功能。在 XDM 中,您可以使用 /etc/X11/xdm/xdm-config
中的此行来完成此操作
DisplayManager.requestPort: 0
对于 GDM,您的 gdm.conf 中应该有
[xdmcp] Enable=false
通常,所有显示管理器都配置为默认情况下不在 Debian 中启动 XDMCP 服务。
想象一下,您到达工作场所,打印机正在吐出无止境的纸张,因为有人正在对您的行式打印机守护程序进行 DoS 攻击。糟糕,不是吗?
在任何 UNIX 打印体系结构中,都必须有一种方法将客户端的数据传输到主机的打印服务器。在传统的 lpr
和 lp
中,客户端命令将数据复制或符号链接到假脱机目录(这就是为什么这些程序通常是 SUID 或 SGID)。
为了避免任何问题,您应该保持您的打印服务器特别安全。这意味着您需要配置您的打印服务,以便它仅允许来自一组受信任服务器的连接。为了做到这一点,请将您要允许打印的服务器添加到您的 /etc/hosts.lpd
。
但是,即使您这样做,lpr
守护程序也会接受来自任何接口的端口 515 的传入连接。您应该考虑防火墙来自不允许打印的网络/主机的连接(lpr
守护程序不能被限制为仅监听给定的 IP 地址)。
Lprng
应该优先于 lpr
,因为它可以配置为执行 IP 访问控制。您可以指定要绑定到的接口(尽管有点奇怪)。
如果您在系统中使用打印机,但仅在本地使用,则您将不希望通过网络共享此服务。您可以考虑使用其他打印系统,例如 cups
或 PDQ
提供的系统,后者基于 /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 中可用。
如果您的服务器不是邮件系统,您实际上不需要邮件守护程序监听传入连接,但您可能希望传递本地邮件,例如,为了接收来自您已安装的任何警报系统的 root 用户邮件。
如果您有 exim
,您不需要守护程序工作才能执行此操作,因为标准 cron
作业会刷新邮件队列。请参阅 禁用守护程序服务,第 3.6.1 节,了解如何执行此操作。
您可能希望拥有一个本地邮件程序守护程序,以便它可以将本地发送的邮件中继到另一个系统。当您必须管理多个系统并且不想连接到每个系统以读取本地发送的邮件时,这很常见。正如每个单独系统的所有日志记录都可以通过使用中央 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 目前为此目的提供了 ssmtp
和 nullmailer
。在任何情况下,您可以自行评估 Debian 提供的任何邮件传输代理 [41],并查看哪一个最适合系统的用途。
如果您想提供对邮箱的远程访问,则有许多 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-pop
、teapop
(用于 POP3)以及 cyrus-imapd
(用于 POP3 和 IMAP)提供了具有除本地用户帐户之外的身份验证方法的服务器。cyrus
可以使用可以通过 PAM 配置的任何身份验证方法,而 teapop
可以使用数据库(例如 postgresql
和 mysql
)进行用户身份验证。
FIXME:检查:也可以通过 PAM 配置 uw-imapd
的用户身份验证。
读取/接收邮件是最常见的明文协议。如果您使用 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)。
为了保护域名服务器守护程序,可以解决不同的问题,这些问题与保护任何给定服务时考虑的问题类似
正确配置守护程序本身,使其不会被外部滥用(请参阅 避免滥用的 Bind 配置,第 5.7.1 节)。这包括限制来自客户端的可能查询:区域传输和递归查询。
限制守护程序对服务器本身的访问,以便如果它被用于闯入,则对系统的损害是有限的。这包括以非特权用户身份运行守护程序(请参阅 更改 BIND 的用户,第 5.7.2 节)并 chroot 它(请参阅 Chroot 名称服务器,第 5.7.3 节)。
您应该限制从 DNS 服务器提供给外部客户端的一些信息,以便它不能用于检索您不想泄露的来自您组织的有价值的信息。这包括添加以下选项:allow-transfer、allow-query、allow-recursion 和 version。您可以限制全局部分(因此它适用于所有服务的区域)或按区域限制。此信息记录在 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)
。如果您认为可以添加有用的信息,请随时为错误报告做出贡献。
关于限制 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
。如果您认为可以添加有用的信息,请随时为这些错误报告做出贡献。
为了实现 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-get
和 source 选项来实现。它甚至可以下载您正确编译它所需的软件包。您需要执行类似于以下操作:
$ 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.html
和 http://csrc.nist.gov/fasp/FASPDocs/NISTSecuringDNS.htm
的信息。
待办事项:添加内容:正常 Apache 安装提供的模块(在 /usr/lib/apache/X.X/mod_* 下)以及可以单独安装在 libapache-mod-XXX 包中的模块。
如果您只想在内部使用 Apache 服务器(用于测试目的,访问 doc-central
归档等),并且不希望外部人员访问它,您可以限制对 Apache 服务器的访问。为此,请在 /etc/apache/http.conf
中使用 Listen 或 BindAddress 指令。
使用 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,Apache
的 Chroot
环境。
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 模块,则可以避免这种情况。
自 1.3.22-1 起,Apache 日志文件归用户 'root' 和组 'adm' 所有,权限为 640。这些权限在轮换后会更改。通过 Web 服务器访问系统的入侵者将无法(在不进行权限提升的情况下)删除旧的日志文件条目。
Apache 文件位于 /var/www
下。安装后,默认文件提供一些关于系统的信息(主要是它是一个运行 Apache 的 Debian 系统)。默认网页默认由用户 root 和组 root 拥有,而 Apache 进程以用户 www-data 和组 www-data 运行。这应该使通过 Web 服务器入侵系统的攻击者更难篡改网站。当然,您应该用您自己的网页替换默认网页(默认网页可能会提供您不想向外部人员显示的信息)。
如果您想运行 finger 服务,首先问问自己是否需要这样做。如果您确实需要,您会发现 Debian 提供了许多 finger 守护进程(来自 apt-cache search fingerd
的输出)
cfingerd - 可配置的 finger 守护进程
efingerd - 另一个用于 unix 的 finger 守护进程,能够微调您的输出。
ffingerd - 安全的 finger 守护进程
fingerd - 远程用户信息服务器。
xfingerd - 带有 qmail 支持的类 BSD finger 守护进程。
如果您要将其用于公共服务,建议使用 ffingerd
作为 finger 守护进程。在任何情况下,当通过 inetd、xinetd 或 tcpserver 设置它时,我们都鼓励您:限制将同时运行的进程数量,限制从给定数量的主机对 finger 守护进程的访问(使用 tcp wrappers),并使其仅监听您需要的接口。
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
的设计目的不是作为安全工具,而是作为测试工具。
有几个程序可以自动 chroot 服务器和服务。Debian 目前(2002 年 5 月接受)在 chrootuid
软件包中提供了 Wietse Venema 的 chrootuid
,以及 compartment
和 makejail
。这些程序可用于为执行任何程序设置受限环境(chrootuid
甚至允许您以受限用户身份运行它)。
其中一些工具可以用来轻松设置 chroot 环境。例如,makejail
程序可以使用简短的配置文件创建和更新 chroot jail(它为 bind
、apache
、postgresql
和 mysql
提供了示例配置文件)。它尝试猜测并使用 strace
、stat
和 Debian 的软件包依赖关系将守护进程所需的所有文件安装到 jail 中。更多信息请访问 http://www.floc.net/makejail/
。Jailer
是一个类似的工具,可以从 http://www.balabit.hu/downloads/jailer/
获取,也可以作为 Debian 软件包使用。
您应该尽量避免任何通过网络以明文形式发送和接收密码的网络服务,如 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 相关的安全加固文档,您会发现它们)。
如果可能,您不应该使用 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 中设置此项的信息。
如果您不需要 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 安全性的信息)。
禁用 portmap 非常简单。有几种不同的方法。在 Debian 3.0 系统及更高版本中最简单的方法是卸载 portmap
软件包。如果您运行的是较旧的 Debian 版本,您将必须按照 第 3.6.1 节,禁用守护进程服务 中所述禁用该服务,因为该程序是 netbase
软件包的一部分(不破坏系统就无法卸载)。
请注意,一些桌面环境(特别是 GNOME)使用 RPC 服务,并且某些文件管理功能需要 portmapper。如果是这种情况,您可以限制对 RPC 服务的访问,如下所述。
不幸的是,在某些情况下,从系统中删除 RPC 服务不是一个选项。一些本地桌面服务(特别是 SGI 的 fam
)是基于 RPC 的,因此需要本地 portmapper。这意味着在某些情况下,安装桌面环境(如 GNOME)的用户也将安装 portmapper。
有几种方法可以限制对 portmapper 和 RPC 服务的访问
使用本地防火墙阻止对这些服务使用的端口的访问(参见 第 5.14 节,添加防火墙功能)。
使用 tcp wrappers 阻止对这些服务的访问,因为 portmapper(和一些 RPC 服务)是使用 libwrap
编译的(参见 第 4.11 节,使用 tcpwrappers)。这意味着您可以通过 hosts.allow
和 hosts.deny
tcp wrappers 配置文件阻止对它们的访问。
自 5-5 版本起,可以将 portmap
软件包配置为仅监听环回接口。为此,请修改 /etc/default/portmap
,取消注释以下行:#OPTIONS="-i 127.0.0.1" 并重启 portmapper。这足以允许本地 RPC 服务工作,同时防止远程系统访问它们(但是,请参见 第 4.17.5 节,禁用弱端主机问题)。
Debian GNU/Linux 操作系统具有 Linux 内核提供的内置功能。如果您安装了最新的 Debian 发行版(默认安装的内核是 2.6),您将可以使用 iptables
(netfilter) 防火墙[47]。
您可以使用防火墙规则作为保护对本地系统的访问的一种方式,甚至可以限制其发出的出站通信。防火墙规则还可以用于保护无法正确配置不向某些网络、IP 地址等提供服务的进程。
但是,本手册最后介绍此步骤主要是因为它远远好于不完全依赖防火墙功能来保护给定系统。系统中的安全性由多层组成,防火墙应该是最后一个包含的,一旦所有服务都已加固。您可以很容易地想象这样一种设置,其中系统仅受内置防火墙保护,而管理员却高兴地出于任何原因(设置问题、烦恼、人为错误...)删除了防火墙规则,如果系统中没有其他加固措施来保护它,则该系统将完全暴露于攻击之下。
另一方面,在本地系统上设置防火墙规则也可以防止一些糟糕的事情发生。即使提供的服务配置安全,防火墙也可以防止错误配置或尚未正确配置的新安装的服务。此外,除非删除防火墙代码,否则严格的配置将阻止木马呼叫家工作。请注意,入侵者不需要超级用户访问权限即可在本地安装可以远程控制的木马(因为如果端口不是特权端口且未删除功能,则允许绑定到端口)。
因此,正确的防火墙设置将是具有默认拒绝策略的设置,即
只有允许的机器才能连接到本地服务。
仅允许出站连接到您的系统使用的服务(DNS、Web 浏览、POP、电子邮件...)。[48]
转发规则拒绝所有内容(除非您正在保护其他系统,请参见下文)。
所有其他入站或出站连接均被拒绝。
也可以安装 Debian 防火墙,以便通过过滤规则来保护对其后系统的访问,从而限制它们暴露于 Internet 的程度。可以将防火墙配置为阻止从本地网络外部的系统访问非公共的内部服务(端口)。例如,在邮件服务器上,只有端口 25(邮件服务提供的位置)需要从外部访问。即使邮件服务器中运行着公共服务以外的其他网络服务,也可以将防火墙配置为丢弃(这称为过滤) направленные к ним 的数据包。
您甚至可以将 Debian GNU/Linux box 设置为桥接防火墙,即完全透明于网络的过滤防火墙,它缺少 IP 地址,因此无法直接受到攻击。根据您安装的内核,您可能需要安装桥接防火墙补丁,然后在配置内核时转到802.1d Ethernet Bridging 和新选项 netfilter ( firewalling ) support。有关如何在 Debian GNU/Linux 系统中设置此项的更多信息,请参见 附录 D,设置桥接防火墙。
与其他 Linux 发行版不同,默认的 Debian 安装尚未提供管理员在默认安装过程中设置防火墙配置的方法,但是您可以安装许多防火墙配置软件包(请参见 第 5.14.3.1 节,使用防火墙软件包)。
当然,防火墙的配置始终取决于系统和网络。管理员必须预先知道网络布局和他们想要保护的系统、需要访问的服务以及是否需要考虑其他网络因素(如 NAT 或路由)。配置防火墙时请小心,正如 Laurence J. Lane 在 iptables
软件包中所说
这些工具很容易被误用,通过完全瘫痪对系统的网络访问,造成大量的麻烦。远程系统管理员意外地将自己锁定在数百或数千英里之外的系统之外的情况并不少见。一个人甚至可以设法将自己锁定在一台键盘就在他手指下的计算机之外。请务必谨慎使用。
记住这一点:仅仅安装 iptables
(或较旧的防火墙代码)不会给您任何保护,只是提供了软件。为了拥有防火墙,您需要配置它!
如果您不了解如何手动设置防火墙规则,请查阅 Packet Filtering HOWTO 和 NAT HOWTO,iptables
软件包在 /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
。
对于新手(有时甚至是专家)管理员来说,手动设置防火墙可能很复杂。但是,自由软件社区创建了许多工具,可以用来轻松配置本地防火墙。请预先警告,其中一些工具更侧重于仅本地保护(也称为个人防火墙),而另一些工具则更通用,可用于配置复杂的规则以保护整个网络。
可以在 Debian 系统中用于设置防火墙规则的一些软件是
对于桌面系统
firestarter
,一个面向最终用户的 GNOME 应用程序,其中包含一个向导,可用于快速设置防火墙规则。该应用程序包含一个 GUI,以便能够监视防火墙规则阻止流量时的情况。
guarddog
,一个基于 KDE 的防火墙配置软件包,面向新手和高级用户。
knetfilter
,一个 KDE GUI,用于管理 iptables 的防火墙和 NAT 规则(guarddog 工具的替代品/竞争对手,尽管略微面向高级用户)。
fireflier,一个交互式工具,用于根据系统上看到的流量和应用程序创建 iptables 规则。它具有服务器-客户端模型,因此您必须同时安装服务器 (fireflier-server
) 和可用的客户端之一,其中一个客户端可用于不同的桌面环境:fireflier-client-gtk
(Gtk+ 客户端)、fireflier-client-kde
(KDE 客户端) 和 fireflier-client-qt
(QT 客户端)。
对于服务器(无头)系统
fwbuilder
,一个面向对象的 GUI,其中包括各种防火墙平台(包括 Linux 的 netfilter、BSD 的 pf(在 OpenBSD、NetBSD、FreeBSD 和 MacOS X 中使用)以及路由器的访问列表)的策略编译器。它类似于企业级防火墙管理软件。完整的 fwbuilder 功能也可以从命令行获得。
shorewall
,一个防火墙配置工具,它提供对 IPsec 的支持,以及对流量整形和防火墙规则定义的有限支持。配置是通过一组简单的文件完成的,这些文件用于生成 iptables 规则。
bastille
,此加固应用程序在 第 6 章,Debian 系统的自动加固 中描述。管理员可以配置的加固步骤之一是定义允许和禁止的网络流量,该定义用于生成系统启动时将执行的一组防火墙规则。
Debian 附带了许多其他 iptables 前端;Debian wiki 上的 Firewalls 页面
上维护了一个比较 Debian 中不同软件包的广泛列表。
请注意,前面概述的某些软件包将引入在系统启动时运行的防火墙脚本。在重新启动之前对其进行广泛测试,否则您可能会发现自己被锁定在系统之外。如果您混合使用不同的防火墙软件包,则可能会产生不良影响,通常,最后运行的防火墙脚本将是配置系统的脚本(这可能不是您的本意)。请查阅软件包文档,并使用这些设置之一。
如前所述,某些程序(如 firestarter
、guarddog
和 knetfilter
)是使用 GNOME 或 KDE(后两个)的管理 GUI。这些应用程序比列表中其他一些可能更面向管理员的软件包更面向用户(即,面向家庭用户)。前面提到的一些程序(如 bastille
)侧重于设置防火墙规则以保护它们运行的主机,但不一定旨在为保护网络的防火墙主机设置防火墙规则(如 shorewall
或 fwbuilder
)。
还有另一种类型的防火墙应用程序:应用程序代理。如果您正在考虑设置企业级防火墙,该防火墙执行数据包过滤并提供许多可以进行细粒度流量分析的透明代理,则应考虑使用 zorp
,它在一个程序中提供了这些功能。您还可以使用 Debian 中可用于不同服务的代理手动设置这种类型的防火墙主机,例如,对于 DNS,使用 bind
(正确配置)、dnsmasq
、pdnsd
或 totd
;对于 FTP,使用 frox
或 ftp-proxy
;对于 X11,使用 xfwp
;对于 IMAP,使用 imapproxy
;对于邮件,使用 smtpd
;或对于 POP3,使用 p3scan
。对于其他协议,您可以使用通用 TCP 代理(如 simpleproxy
)或通用 SOCKS 代理(如 dante-server
、tsocks
或 socks4-server
)。通常,您还将使用 Web 缓存系统(如 squid
)和 Web 过滤系统(如 squidguard
或 dansguardian
)。
另一种可能性是通过 init.d 脚本手动配置您的防火墙规则,该脚本将运行所有 iptables
命令。采取以下步骤
查看下面的脚本并使其适应您的需求。
测试脚本并查看 syslog 消息,以查看哪些流量被丢弃。如果您正在从网络进行测试,您将希望运行示例 shell 代码片段以删除防火墙(如果您在 20 秒内未键入任何内容),或者您可能希望注释掉默认拒绝策略定义(-P INPUT DROP 和 -P OUTPUT DROP),并检查系统是否不会丢弃任何合法的流量。
将脚本移动到 /etc/init.d/myfirewall
配置系统以在配置任何网络之前运行脚本
#update-rc.d myfirewall start 40 S . stop 89 0 6 .
这是示例防火墙脚本
#!/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
)
ifup
配置防火墙规则您还可以使用 /etc/network/interfaces
中的网络配置来设置您的防火墙规则。为此,您需要
为接口处于活动状态时创建您的防火墙规则集。
使用 iptables-save
将您的规则集保存到 /etc
中的文件中,例如 /etc/iptables.up.rules
配置 /etc/network/interfaces
以使用配置的规则集
iface eth0 inet static address x.x.x.x [.. interface configuration ..] pre-up iptables-restore < /etc/iptables.up.rules
您可以选择性地设置一组规则,以便在网络接口关闭时应用,创建一组规则,将其保存在 /etc/iptables.down.rules
中,并将此指令添加到接口配置中
post-down iptables-restore < /etc/iptables.down.rules
对于通过 ifupdown
的更高级的防火墙配置脚本,您可以使用每个接口可用的钩子,如使用 run-parts
调用的 *.d/
目录中所示(请参见 run-parts(8)
)。
测试您的防火墙配置就像运行您的防火墙脚本(或启用您在防火墙配置应用程序中定义的配置)一样容易,但也一样危险。但是,如果您不够小心并且您正在远程配置防火墙(例如通过 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 +0000jfs@debian.org