4.3. 安全服务

虽然用户访问管理控制对机构管理员来说是个重要问题,但监控哪些网络处于活跃状态对任何一位管理员以及 Linux 系统操作者来说都更为重要。
Red Hat Enterprise Linux 7中的很多服务都类似网络服务器。如果在一个机器上运行网络服务,那么服务器应用程序(亦称为 daemon),就会侦听一个或者多个网络端口的连接。这些服务器被视为潜在的攻击手段。

4.3.1. 服务的风险

网络服务可为 Linux 系统造成很多危险。以下是一些主要问题列表:
  • 拒绝服务攻击(DoS) — 通过向服务发出大量请求,拒绝服务攻击可让系统无法使用,因为它会尝试记录并回应每个请求。
  • 分布的拒绝服务攻击(DDoS) — 一种 DoS 攻击类型,可使用多台被入侵的机器(经常是几千台或者更多)对某个服务执行联合攻击,向其发送海量请求并使其无法使用。
  • 脚本漏洞攻击 — 如果某台服务器使用脚本执行服务器端动作,网页服务器通常这样做,那么破解者就可以攻击那些没有正确编写的脚本。这些脚本漏洞攻击导致缓存溢出,或者允许攻击者更改系统中的文件。
  • 缓存溢出攻击 — 连接到特权端口为1023 的服务器必须作为管理用户来运行。如果应用程序有可利用的缓存溢出,那么攻击者就可作为运行该应用程序的用户访问系统。因为有可利用的缓存溢出存在,破解者可使用自动工具来识别有漏洞的系统,并在获得访问后,使用自动工具套件保持其对该系统的访问。

注意

在 Red Hat Enterprise Linux 7 中可使用 ExecShield 缓和缓冲溢出漏洞的威胁,这是可执行内存片段和保护技术,由 x86 兼容的唯一或者多处理器内核支持。ExecShield 可通过将虚拟内存分成可执行片段以及不可执行片段降低缓冲溢出的风险。所有尝试执行可执行片段之外程序代码(比如缓存溢出漏洞注入的恶意代码)可触发片段失败并终止。
Execshield 还支持 禁止执行 (NX) 在 AMD64 平台的技术 eXecute Disable (XD) 在 Itanium 上的技术以及 Intel® 64 系统。这些技术与 Execshield 合作可防止恶意代码在有 4KB 可执行代码单位的虚拟内存的可执行部分运行,降低来自隐藏缓存溢出漏洞的攻击风险。

重要

要限制通过网络进行攻击,应该将所有不使用的服务关闭。

4.3.2. 识别并配置服务

要提高安全性,默认关闭在 Red Hat Enterprise Linux 7 中安装的大多数服务。但有些是例外:
  • cups — Red Hat Enterprise Linux 7 的默认打印服务器。
  • cups-lpd — 备用打印服务器。
  • xinetd — 控制与一系列下级服务器连接的超级服务器,比如 gssftptelnet 超级服务器。
  • sshd — OpenSSH 服务器,是 Telnet 的安全替代产品。
在决定是否要让服务保持运行时,最好根据常识,并避免冒任何风险。例如:如果无法使用打印机时,那就不要让 cups 继续运行。同样也适用于 portreserv。如果您没有挂载 NFSv3 卷或者使用 NIS(ypbind 服务),则应该禁用 rpcbind。检查哪些可用的网络服务可以在开机时启动是不够的。我们推荐还应该检查哪些端口已打开并在侦听。详情请参阅<第 4.4.2 节 “验证使用侦听的端口”> 。

4.3.3. 不安全的服务

无疑,任何网络服务都是不安全的。这就是为什么要关闭不使用的服务是如此的重要。我们会常规发现并修补服务漏洞,这些工作对常规更新与网络服务有关的软件包非常重要。详情请参阅<第 3 章 及时更新系统>。
某些网络协议本身就比其它协议更不安全。这些协议包含一些服务:
  • 以不加密的方式在网络中传输用户名和密码 — 很多老的协议,比如 Telnet 和 FTP,它们对认证会话都不加密,应尽量避免使用。
  • 以不加密方式传输敏感数据 — 很多协议在网络间传输数据时不加密。这些协议包括 Telent、FTP、HTTP 和 SMTP。很多网络文件系统,比如 NFS 和 SMB 也以不加密的方式在网络间传输信息。用户在使用这些协议时有责任限制要传输的数据类型。
本身就不安全的服务示例包括 rloginrshtelnet、以及vsftpd
所有远程登录和 shell 程序 (rloginrsh、 以及 telnet) 应避免使用以支持 SSH。详情请参阅〈 第 4.3.10 节 “保障 SSH” 〉有关 sshd
FTP 并不象远程 shell 那样天生对系统安全有威胁,但需要小心配置并监控 FTP 服务器以免出问题。有关保证 FTP 服务器安全的详情请参阅〈第 4.3.8 节 “保证 FTP 安全”〉。
应小心使用并在防火墙后使用的服务包括:
  • auth
  • nfs-server
  • smb 以及 nbm (Samba)
  • yppasswdd
  • ypserv
  • ypxfrd
有关保证网络服务安全的更多信息,请参阅〈第 4.4 节 “安全访问网络”〉。

4.3.4. 保障 rpcbind

rpcbind 服务是为 NIS 和 NFS 等 RPC 服务进行动态端口分配的守护进程。它的认证机制比较薄弱,并可以为其控制的服务分配大范围的端口。因此很难保证其安全。

注意

因为 NFSv4 不再需要 rpcbind ,所以保障 rpcbind 安全只影响 NFSv2 和 NFSv3 的执行。如果您要运行 NFSv2 或者 NFSv3 服务器,就需要rpcbind,且在以下章节会运用到 rpcbind 。
如果运行 RPC 服务,请遵守以下基本规则。

4.3.4.1. 使用 TCP Wrapper 保护 rpcbind

因为 TCP Wrapper 没有内嵌的认证形式,所以使用 TCP Wrapper 限制哪些网络或者主机可以访问 rpcbind 服务很重要。
另外,限制对服务的访问时,“”使用 IP 地址。由于通过使 DNS 中毒和其它方法可以伪造主机名,所以请避免使用主机名。

4.3.4.2. 使用防火墙保护 rpcbind

要进一步限制访问 rpcbind 服务,最好是为该服务器添加 firewalld 规则,并限制对具体网络的访问。
以下是 firewalld Rich Text 命令的两个示例。第一个是实现从网络 192.168.0.0/24 到 111 端口(rpcbind 服务使用的端口)的 TCP 连接的示例。第二个是实现从本地主机到同一端口的 TCP 连接的示例。丢弃所有其它数据包。
~]# firewall-cmd --add-rich-rule='rule family="ipv4" port port="111" protocol="tcp" source address="192.168.0.0/24" invert="True" drop'
~]# firewall-cmd --add-rich-rule='rule family="ipv4" port port="111" protocol="tcp" source address="127.0.0.1" accept'
同样地,要限制 UDP 流量,则须使用以下命令:
~]# firewall-cmd --add-rich-rule='rule family="ipv4" port port="111" protocol="udp" source address="192.168.0.0/24" invert="True" drop'

注意

--permanent 添加到 firewalld Rich Text 命令中,以实现永久设置。有关执行防火墙的更多信息,请参阅〈 第 4.5 节 “使用防火墙” 〉。

4.3.5. 保证 NIS 安全

网络信息服务” (NIS) 是一个 RPC 服务,亦称之为 ypserv, 可与 rpcbind 及其它相关服务一同使用,向自称在其域中的所有计算机发布用户名、密码以及其它敏感信息映射。
NIS 服务器由许多应用程序组成。它包括以下的应用程序:
  • /usr/sbin/rpc.yppasswdd — 也称为 yppasswdd 服务,这个守护进程允许用户更改其 NIS 密码。
  • /usr/sbin/rpc.ypxfrd — 也称为 ypxfrd 服务,这个守护进程负责通过网络的 NIS 映射传输。
  • /usr/sbin/ypserv — 这是 NIS 服务器守护进程。
就当今的标准而言, NIS 在某种程度上并不安全。它没有主机认证机制,且所有通过网络的传输都是不加密的,包括哈希密码。因此设置使用 NIS 的网络时,要特别小心。事实上, NIS 的默认配置本身就不安全,这也让情况变得更为复杂。
建议任何想要运行 NIS 服务器的人先要保障 rpcbind 服务的安全,正如在〈第 4.3.4 节 “保障 rpcbind”〉中概括的那样,然后解决以下的问题,比如网络计划。

4.3.5.1. 谨慎规划网络

由于 NIS 通过网络传输敏感信息时未经加密,所以在防火墙后,且在隔离和安全的网络中运行就非常重要。使用不安全的网络传输 NIS 信息,无论何时都有被截获的风险。谨慎规划网络有助于防止严重的安全漏洞。

4.3.5.2. 使用类似密码的 NIS 域名和主机名

只要用户知道 NIS 服务器的 DNS 主机名和 NIS 域名,那么在 NIS 域中的任何计算机都可以在未经认证的情况下使用命令从服务器中提取信息。
例如:如果有人是从笔记本电脑连接到网络或者从外部侵入(并要嗅探内部 IP 地址),那么以下命令就可揭示 /etc/passwd 映射:
ypcat -d <NIS_domain> -h <DNS_hostname> passwd
如果这个攻击者是 root 用户,那么他们就可通过以下命令获取 /etc/shadow 文件:
ypcat -d <NIS_domain> -h <DNS_hostname> shadow

注意

如果使用 Kerberos ,那么 /etc/shadow 文件就不会储存在 NIS 映射中。
要让攻击者更难访问 NIS 映射,则须让 DNS 主机名生成一个随机字符串 ,比如 o7hfawtgmhwg.domain.com。同样地,也可创建一个“不同的”随机 NIS 域名。这就让攻击者访问该 NIS 服务器变得更加困难。

4.3.5.3. 编辑 /var/yp/securenets 文件

如果 /var/yp/securenets 文件是空白文件,或是根本不存在(默认安装后就是这种情况),那么 NIS 就会侦听所有网络。首先要做的就是在该文件中添加子网掩码/网络对,这样一来 ypserv 只会响应来自对应网络的请求。
以下是 /var/yp/securenets 文件的条目示例:
255.255.255.0     192.168.0.0

警告

首次启动 NIS 服务器时,一定要有已生成的 /var/yp/securenets 文件。
这个技术并不提供对 IP 嗅探式攻击的保护,但至少可以限制 NIS 服务器提供服务的网络。

4.3.5.4. 分配静态端口并使用 Rich Text 规则

所有与 NIS 关联的服务器都可以分配到指定的端口,rpc.yppasswdd 除外 — 该守护进程允许用户更改其登录密码。其它两个 NIS 服务器守护进程 rpc.ypxfrdypserv 分配端口,这就可允许创建防火墙规则,以便进一步防止入侵者破坏 NIS 服务器守护进程。
要做到这一点,怎行在 /etc/sysconfig/network 中添加以下命令行:
YPSERV_ARGS="-p 834"
YPXFRD_ARGS="-p 835"
以下 rich text firewalld 规则可用于强制设定服务器用这些端口进行侦听的网络:
~]# firewall-cmd --add-rich-rule='rule family="ipv4" source address="192.168.0.0/24" invert="True" port port="834-835" protocol="tcp" drop'
~]# firewall-cmd --add-rich-rule='rule family="ipv4" source address="192.168.0.0/24" invert="True" port port="834-835" protocol="udp" drop'
这就是说,如果请求来自 192.168.0.0/24网络,那么服务器就只可连接到 834 和 835 端口。第一规则用于 TCP ,第二规则用于 UDP

注意

有关用 iptables 命令运行防火墙的更多信息,情参阅〈 第 4.5 节 “使用防火墙”〉。

4.3.5.5. 使用 Kerberos 认证

NIS 用于认证操作时,其中要考虑的问题是,无论用户何时登录机器,/etc/shadow 映射上的哈希密码都是通过网络进行传送。如果入侵者可以访问 NIS 域或者探查网络流量,那么他们就可以收集用户名以及哈希密码。在拥有充足时间的情况下,密码破译程序可以猜对较弱的密码,那么攻击者就可以访问网络上的有效账户。
因为 Kerberos 使用密钥加密,那么就不用通过网络发送哈希密码,所以系统就更加安全。关于 Kerberos 的更多信息,请参阅〈 Linux域身份,认证,策略指导 〉。

4.3.6. 保证 NFS 安全

重要

NFS 流量可通过使用不同版本的 TCP 进行传送,但它应在 NFSv3 下使用,而不是 UDP ;在使用 NFSv4 时,NFS 流量是必要的。所有版本的 NFS 都支持 Kerberos 用户和分组认证,作为 RPCSEC_GSS 内核模块的一部分。因为 Red Hat Enterprise Linux 7 支持 NFSv3 使用 rpcbind,所以有关 rpcbind 信息也包括在内。

4.3.6.1. 谨慎规划网络

NFSv2 和 NFSv3 传统上来说,不能安全地传输数据。现在所有版本的 NFS 都有能力对使用Kerberos 的普通文件系统进行认证(且进行选择性加密)。 在 NFSv4 下,可以使用Kerberos;在 V2 或 V3 下,锁定文件和挂载文件仍无法使用 Kerberos 。当使用 NFSv4 时,如果客户处于 NAT 或者防火墙的保护下,那么可能会关闭授权。关于如何使用 NFSv4.1 通过 NAT 和防火墙来运行授权的具体信息,请参阅《红帽企业版Linux7储存管理手册》。

4.3.6.2. 保障 NFS 挂载选项

红帽企业版 Linux 7 储存管理手册》详细解释了 /etc/fstab 文件中 mount 命令的使用。从安全管理的角度来说,值得注意的是, /etc/nfsmount.conf 也详细讲解了 NFS 挂载选项,这可用于设定客户默认选项。
4.3.6.2.1. 审查 NFS 服务器

警告

只能导出整个文件系统。导出文件系统的子目录成为一个安全问题。因为某些情况,客户可能会“跳出”文件系统的导出的子目录,获取文件系统中未导出的目录(请参阅 exports(5) 手册页中的子树检查)。
使用 ro 选项可使文件系统导出的属性为“只读取”,这在任何时候都会减少可对挂载文件系统进行写入操作的用户数量。只有在明确要求的情况下,才能使用rw 选项。更多信息,请参阅 exports(5) 的手册页。例如,允许写入访问,则会加大符号链接攻击的风险。这包括临时目录,如/tmp/usr/tmp
rw 选项挂载目录时,要避免全域可写,这在任何时候都可降低风险。就像某些应用程序以明文储存密码或是储存加密强度较弱的密码,导出主目录也被视为有风险的操作。审查和改进应用代码可以减少这种风险。一些用户没有在他们的 SSH 密钥上设定密码,因此这也意味着主目录存在风险。强制使用密码或者使用 Kerberos 可以减少风险。
限定只有需要访问权限的客户才能导出目录。 在 NFS 服务器上使用 showmount -e 命令来审查该服务器导出的内容。请勿导出没有明确需求的任何内容。
请勿使用 no_root_squash 选项,并且审查现有的安装程序,以确保并未使用该选项。更多信息,请参阅〈第 4.3.6.4 节 “请勿使用 no_root_squash 选项”〉。
secure 选项是服务器端导出选项,用于限定只能从 保留 端口进行导出。默认情况下,服务器只允许客户通过 保留 端口(端口编号不超过 1024)进行通讯,因为传统上来说,客户只允许通过“可信” 代码(例如内核 NFS 客户)来使用这些端口。然而,因为在许多网络上,任何人要成为某些客户端的 root 并不难。因此,假定保留端口所进行的通讯拥有特权,对于服务器而言,通常都是不安全的。因此,限制保留端口具有有限的价值;最好还是依靠 kerneros ,防火墙,以及限定只有特定客户才能进行导出。
如果可能的话,大多数的客户仍使用保留端口。然而,保留端口是有限的资源,因此客户(尤其是那些拥有大量 NFS 装载的客户)可以选择编号更高的端口。Linux 客户可以通过使用 noresvport 挂载选项来完成。如果您希望在导出目录中允许此运作,那么您可以通过 insecure 导出选项来完成。
禁止用户登录服务器是一个很好的做法。在审查 NFS 服务器的上述设置时,也审查能访问和进入服务器的人和内容。
4.3.6.2.2. 审查 NFS 客户
使用 nosuid 选项来禁止使用 setuid 程序。nosuid 选项可禁用 set-user-identifierset-group-identifier 位。这可阻止远程用户通过运行 setuid 程序获取更高的特权。在客户端和服务器端使用该选项。
noexec 选项可禁止客户端上的所有可执行文件。使用此选项可防止用户无意中执行了文件系统中所共享的的文件。对于大多数的(即使不是全部的)文件系统而言,nosuidnoexec 选项都是标准选项。
使用 nodev 选项可防止客户端将 device-files 作为硬件设备进行处理。
resvport 选项是客户端挂载选项,secure 是相应的服务器端导出选项(请参阅上述说明)。它限定只有使用“保留端口”才能进行通讯。保留端口或是“知名”端口会保留给特权用户或程序,比如 root 用户。设置这个选项会促使客户使用保留的源端口与服务器进行通讯。
现在,所有版本的 NFS 都支持挂载 Kerberos 认证。启用这个挂载选项: sec=krb5
NFSv4 支持用 Kerberos 进行挂载,通过使用 krb5i 来确保完整性,使用 krb5p 来确保隐私保护。在使用 sec=krb5 进行挂载时,上述这些都会使用到,但需要在 NFS 服务器上配置。有关导出目录(man 5 exports)的更多信息,请参阅手册页。
NFS 手册页(man 5 nfs)中, 安全注意事项 部分解释了在 NFSv4 中增强安全的问题,以及包含了所有 NFS 详细的挂载信息。

4.3.6.3. 注意语法错误

NFS 服务器通过查阅 /etc/exports 文件,决定导出哪些文件系统以及将这些目录导出到哪些主机中。编辑此文件时,请小心,不要添加多余的空格。
例如,/etc/exports 文件中的以下命令行可实现与主机 bob.example.com 共享 /tmp/nfs/ 目录的读/写权限。
/tmp/nfs/     bob.example.com(rw)
另一方面,由于主机名的一个空格,这使 /etc/exports 中的以下命令行可实现与主机 bob.example.com 共享同一目录的只读权限,同时实现与“所有人”共享它的读/写权限。
/tmp/nfs/     bob.example.com (rw)
最好使用 showmount 命令检查所有已配置的 NFS 共享,以确定共享的内容:
showmount -e <hostname>

4.3.6.4. 请勿使用 no_root_squash 选项

默认情况下,NFS 共享会将 root 用户更改为一个非特权用户帐户,即 nfsnobody 用户。这会将所有 root 创建的文件的所有者更改为 nfsnobody,这可防止用 setuid 位组来设置程序的上传。
如果使用 no_root_squash,那么远程 root 用户就可以更改共享文件系统中的任何文件,并留下感染木马的应用程序给其它用户去执行。

4.3.6.5. NFS 防火墙配置

NFSv4 是红帽企业版 Linux 7 默认的 NFS 版本,且它要求只对TCP 开放 2049 端口。如果使用 NFSv3 ,那么就需要四个额外的端口,如下述说明。
为NFSv3配置端口
NFS 使用的端口是由 rpcbind 进行动态分配,在创建防火墙规则时,可能会造成问题。要简化这个步骤,则须使用 /etc/sysconfig/nfs 文件指定要使用的端口:
  • MOUNTD_PORT — 用于挂载的 TCP 和 UDP 端口(rpc.mountd)
  • STATD_PORT — 用于显示 TCP 和 UDP 状态的端口(rpc.statd)
  • LOCKD_TCPPORT — 用于 nlockmgr 的 TCP 端口(rpc.lockd)
  • LOCKD_UDPPORT — 用于 nlockmgr 的 UDP 端口(rpc.lockd)
指定的端口号绝对不能用于其它服务。对您的防火墙进行配置,可指定端口号以及 TCP 和 UDP 的 2049 端口(NFS)。
在 NFS 服务器上运行 rpcinfo -p 命令,可查看所使用的端口和 RPC 程序。

4.3.7. 保证 Apache HTTP 服务器安全

Apache HTTP 服务器是 Red Hat Enterprise Linux 7 中最稳定、最安全的服务之一。有很多可用的选项和技术可用于保证 Apache HTTP 服务器安全 — 由于数量过多,在此就不进行深入探讨。以下小节简要介绍了在运行 Apache HTTP 服务器时可采用的操作。
在投入生产“之前”,一定要核实所有脚本都可如预期在系统中运行。另外,请确保只有 root 用户才有权限写入含脚本或者 CGI 的任何目录。要做到这一点,则须作为 root 用户运行以下命令:
chown root <directory_name>
chmod 755 <directory_name>
系统管理员应谨慎使用以下配置选项(在 /etc/httpd/conf/httpd.conf 进行配置):
FollowSymLinks
此指令为默认启用,因此在创建符号链接到网页服务器的文档 root 目录时,请慎重行事。例如,请勿为“/”提供符号链接。
Indexes
虽然此指令为默认启用,但并非必要。要防止访问者浏览在服务器上的文件,则须删除这个指令。
UserDir
因为此指令可确认系统中用户帐户是否存在,所以要默认禁用 UserDir 指令。要在服务器上启用用户名目录浏览,则须使用以下指令:
UserDir enabled
        UserDir disabled root
这些指令用于 /root/ 之外的所有用户目录,可激活其用户目录浏览这一功能。要在禁用帐户列表中添加用户,则须在 UserDir disabled 命令行添加以空格分隔的用户列表。
ServerTokens
ServerTokens 指令控制着服务器响应标题头信息,这信息会传送回给客户。它包括不同的信息,通过使用下列参数,可以对其进行自定义操作:
  • ServerTokens Full(默认选项)— 提供所有可用信息(OS类型以及所使用的模块),例如:
    Apache/2.0.41 (Unix) PHP/4.2.2 MyMod/1.2
    
  • ServerTokens Prod 或者 ServerTokens ProductOnly — 提供以下信息:
    Apache
    
  • ServerTokens Major — 提供以下信息:
    Apache/2
    
  • ServerTokens Minor — 提供以下信息:
    Apache/2.0
    
  • ServerTokens Min 或者 ServerTokens Minimal — 提供以下信息:
    Apache/2.0.41
    
  • ServerTokens OS — 提供以下信息:
    Apache/2.0.41 (Unix)
    
建议使用 ServerTokens Prod 选项,这样一来,潜在攻击者就无法获取关于您系统的任何有用信息。

重要

请勿删除 IncludesNoExec 指令。默认情况下,“服务器端嵌入”(SSI)模块无法执行命令。除非绝对必要,建议您不要更改这个设置,因为它可能会允许攻击者在系统中执行命令。

删除 httpd 模式

在某些情况下,最好删除特定的 httpd 模式,以限制 HTTP 服务器的功能。要实现这一目的,只须为整个命令行添加注释,该命令行用于加载在 /etc/httpd/conf/httpd.conf 文件中您想要删除的模块。例如,要删除代理模块,则须通过给下列命令行新增“#”字符,为下列命令行添加注释:
#LoadModule proxy_module modules/mod_proxy.so
请注意, /etc/httpd/conf.d/ 目录包含了可用于加载模块的配置文件。

httpd 以及 SELinux

4.3.8. 保证 FTP 安全

文件传输协议”(FTP)是一个比较旧的 TCP 协议,用来通过网络传输文件。因为服务器所处理的所有传输,包括用户认证,都是未经加密,所以它被认为是一个不安全的协议,且应该谨慎地进行配置。
Red Hat Enterprise Linux 7 提供两个FTP 服务器:
  • Red Hat Content Acceleratortux) — 具有 FTP 功能的内核空间网页服务器。
  • vsftpd — 重视安全的单机 FTP 服务执行工具。
下列安全指南可用于设置 vsftpd FTP 服务。

4.3.8.1. FTP 登录信息

提交用户名和密码前,所有用户都会看到登录信息。默认情况下,这个信息包含了版本信息,这对于尝试识别系统弱点的破解者十分有用。
要为 vsftpd 更改登录信息,则须在 /etc/vsftpd/vsftpd.conf 文件中添加以下指令:
ftpd_banner=<insert_greeting_here>
用登录信息文本替换上述指令中的 <insert_greeting_here>
对于多行信息而言,最好使用信息文件。要简化多提示信息管理,则须将所有提示信息放入名为 /etc/banners/ 的新目录。在本示例中,用于 FTP 连接的提示信息文件为 /etc/banners/ftp.msg。以下为此类文件的示例:
######### Hello, all activity on ftp.example.com is logged. #########

注意

正如〈第 4.4.1 节 “使用 TCP Wrappers 以及 xinetd 保证服务安全”〉所述,没有必要在文件的每一行中都使用 220
要在 vsftpd 中引用这个登录信息,则须在 /etc/vsftpd/vsftpd.conf 文件中添加以下指令:
banner_file=/etc/banners/ftp.msg
还可以发送附加信息提示给使用 TCP Wrapper 的连入连接,如〈第 4.4.1.1 节 “TCP Wrapper 和连接提示” 〉所述。

4.3.8.2. 匿名访问

/var/ftp/ 目录的存在可激活匿名帐户。
创建这个目录的最简单的方法是安装 vsftpd 软件包。这个软件包可为匿名用户建立目录树,并为匿名用户配置目录的只读权限。
默认情况下,匿名用户不能写入任何目录。

警告

如果启用对 FTP 服务器的匿名访问,那么就要注意保存敏感数据的位置。
4.3.8.2.1. 匿名上传
要允许匿名用户上传文件,那么建议在 /var/ftp/pub/ 中生成只写目录。要完成此操作,则须作为 root 用户运行以下命令:
~]# mkdir /var/ftp/pub/upload
下一步,更改权限以防止匿名用户查看该目录中的内容:
~]# chmod 730 /var/ftp/pub/upload
该目录的详细格式列表应如下所示:
~]# ls -ld /var/ftp/pub/upload
drwx-wx---. 2 root ftp 4096 Nov 14 22:57 /var/ftp/pub/upload
允许匿名用户在目录中读取和写入的管理员经常会发现他们的服务器成为盗窃软件的窩脏之处。
另外,在 vsftpd 下,在 /etc/vsftpd/vsftpd.conf 文件中添加以下行:
anon_upload_enable=YES

4.3.8.3. 用户帐户

因为 FTP 用不安全的网络传输未经加密的用户名和密码进行认证,所以最好拒绝系统用户从其用户帐户访问服务器。
要禁用 vsftpd 中的所有用户帐户,则须在 /etc/vsftpd/vsftpd.conf 中添加以下指令:
local_enable=NO
4.3.8.3.1. 限制用户帐户
要禁止 FTP 访问特殊账户或者特殊群组账户,例如 root 用户以及那些拥有 sudo 特权的用户,最简单的方法就是使用 PAM 列表文件,如〈 第 4.2.1 节 “不允许 root 访问”〉所述。用于 vsftpd 的 PAM 配置文件是 /etc/pam.d/vsftpd
还可以在每个服务中直接禁用用户帐户。
要在 vsftpd 中禁用特定帐户,则须在 /etc/vsftpd/ftpusers 中添加用户名。

4.3.8.4. 使用 TCP Wrapper 控制访问

使用 TCP Wrapper 控制对 FTP 守护进程的访问,如〈第 4.4.1 节 “使用 TCP Wrappers 以及 xinetd 保证服务安全”〉所述。

4.3.9. 保障 Postfix 的安全

Postfix 是邮件传输代理(MTA),它使用简单邮件传输协议(SMTP)在其它 MTA 和电子邮件客户端或者传递代理之间传递电子信息。虽然很多 MTA 都可以在彼此之间加密流量,但大多数并不这样做,因此使用任何公共网络发送电子邮件都被视为不安全的沟通形式。Postfix 替代 Sendmail 成为 Red Hat Enterprise Linux 7 默认的 MTA。
建议使用 Postfix 服务器的用户解决以下问题。

4.3.9.1. 限制拒绝服务攻击

因为电子邮件的本质,坚定的攻击者可以极其容易地使用邮件对服务器进行洪水攻击,导致拒绝服务。通过对 /etc/postfix/main.cf 文件中的指令进行限制设定,可以阻止有效的此类攻击。您可以更改已经存在的指令赋值,或是以下列格式,将所要的值添加到所需的指令中:
<directive> = <value>
以下一系列指令可用于限制拒绝服务攻击:
  • smtpd_client_connection_rate_limit — 单位时间内,任何客户被允许与这个服务进行的最大连接尝试次数(如下所述)。如果默认值是0,这就意味着在单位时间内,客户可进行的连接次数与 Postfix 能接收的连接次数一样多。默认情况下,可排除在信任网络中的客户。
  • anvil_rate_time_unit — 该单位时间可用于进行速率限制计算。默认值是 60 秒。
  • smtpd_client_event_limit_exceptions — 从连接和速率限制命令中所排除的客户。默认情况下,也可排除在信任网络中的客户。
  • smtpd_client_message_rate_limit — 单位时间内,客户被允许进行请求传递信息的最大次数(不管 Postfix是否真的接收这些信息)。
  • default_process_limit — 提供特定服务的 Postfix 子进程默认的最大值。这种限制可能因为在 master.cf 文件中的特定服务而取消。默认情况下,赋值为 100。
  • queue_minfree — 在队列文件系统中,接收邮件所需的最小可用空间(以字节为单位)。Postfix SMTP 服务器当前使用此指令来决定是否可以接收任何邮件。默认情况下,当可用空间的最小值小于 message_size_limit 的 1.5 倍时, Postfix SMTP 服务器则会拒绝 MAIL FROM 指令。要具体制定一个更高的可用空间最小值限定,则须具体制定一个 queue_minfree 值,其大小至少是 message_size_limit 的 1.5 倍。默认情况下,queue_minfree 值是 0。
  • header_size_limit — 用于储存信息标题的最大内存(以字节为单位)。如果标题太大,那么超出的部分就会被舍弃。默认情况下,赋值为 102400。
  • message_size_limit — 信息的最大值(以字节为单位),包括信封信息。默认情况下,赋值为 10240000。

4.3.9.2. NFS 以及 Postfix

请勿将邮件 spool 目录,/var/spool/postfix/,放到 NFS 共享卷上。因为 NFSv2 和 NFSv3 不会保持对用户 ID 和组群 ID 的控制,所以两个或者更多用户可以有相同的 UID,并接收和读取彼此的邮件。

注意

在 NFSv4 中使用 Kerberos,就不会出现这种情况。因为 SECRPC_GSS 内核模块不会根据 UID 进行认证。但是,最好还是“不要”将邮件池目录放到 NFS 共享卷中。

4.3.9.3. 只使用邮件的用户

要防止本地用户利用 Postfix 服务器上的漏洞,那么最好是让邮件用户只能使用电子邮件程序访问 Postfix 服务器。应该禁止邮件服务器上的 shell 帐户访问,并且/etc/passwd 文件中的所有 shell 用户都应设定到 /sbin/nologin 中(可能除了 root 用户之外)。

4.3.9.4. 禁用 Postfix 网络侦听

默认情况下,Postfix 被设定为只侦听本地回路地址。您可以通过查看 /etc/postfix/main.cf 文件来核实这一点。
查看 /etc/postfix/main.cf 文件,以确保只出现下列 inet_interfaces 命令行:
inet_interfaces = localhost
这确保 Postfix 只接收来自本地系统而非来自网络的邮件信息(比如定时任务报告)。这是默认设置,并且保护 Postfix 免受网络攻击。
inet_interfaces = all 设置可用于删除本地主机限制,并且允许Postfix 侦听所有接口。

4.3.10. 保障 SSH

Secure ShellSSH)是一个强大的网络协议,可通过安全的渠道与其他系统进行通讯。通过 SSH 的传输都经过加密,可避免被拦截。关于 SSH 协议,以及在 Red Hat Enterprise Linux 7 中如何使用SSH 服务的常用信息,请参阅《红帽企业版 Linux 7 系统管理员指南》。

重要

此章节特别关注于保障 SSH 安全设置的最常用方法。这张列表中所推荐方法绝不可认为是详尽的,或是最权威的方法。关于可用于修改 sshd 守护进程的所有配置指令,请参阅 sshd_config(5) ;关于 SSH 基本概念的详细介绍,请参阅 ssh(1)

4.3.10.1. 加密登录

SSH 支持使用加密密钥登录电脑。这比只使用密码要更安全。如果您可以把这种方法与其他受到认证的方法相结合,那么这就被认为是多因素认证。有关如何使用多种认证方法的更多信息,请参阅〈第 4.3.10.2 节 “多种认证方法”〉。
为了启用加密密钥进行认证, 在 /etc/ssh/sshd_config 文件中的PubkeyAuthentication 配置指令需要设定为 yes。请注意,这是默认设置。把 PasswordAuthentication 指令设定为 no ,则会消除使用密码登录的可能性。
使用 ssh-keygen 命令可以生成SSH 密钥。如果在没有其它参数的情况下,调用 SSH 密钥,则会生成 2048 位RSA 密钥集。在默认情况下,密钥储存在 ~/.ssh 目录中。您可以使用 -b 切换更改密钥强度。正常情况下,使用 2048 位密钥就足够了。《红帽企业版 Linux 7 系统管理手册》包含了有关生成密钥对的详细信息。
~/.ssh目录中,您应该会看到两个密钥。当运行ssh-keygen 命令时,如果您接受这种默认情况,那么所生成文件就会命名为 id_rsaid_rsa.pub ,并且分别含有公钥和私钥。您应当随时保护私钥,将其设置为除文件所有者外其他任何人都不可读取,使其免于暴露。然而,公钥则需要传送到您将要登录的系统。您可以使用ssh-copy-id 命令来传送密钥至服务器:
~]$ ssh-copy-id -i [user@]server
这个命令会自动把公钥添加到服务器上的 ~/.ssh/authorized_key 文件中。当您试图登录服务器时, sshd 守护进程就会检查此文件。
同样地,对于密码以及其他认证机制,您也应该时常更改 SSH 密钥。当您这样做的时候,请确保从authorized_key 文件中移除所有不用的密钥。

4.3.10.2. 多种认证方法

使用多种认证方法或者多因素认证,会提升保护水平以防止未经授权的访问;强化系统以防止被入侵,也可起到同样的效果。尝试使用多因素认证登录系统的用户,必须成功通过所有指定的认证方法,才能得到授权进行访问。
使用 /etc/ssh/sshd_config 文件中的 AuthenticationMethods 配置指令,可指定要使用的认证方法。请注意,使用此指令可以定义多份所需的认证方法列表。如果是那样的话,用户必须在完成至少一份列表上的每种方法。列表需用空格进行分隔,且列表中,每个认证方法的名称必须用逗号分隔。例如:
AuthenticationMethods publickey,gssapi-with-mic publickey,keyboard-interactive
如果尝试登录成功的用户是通过 publickey 认证和 gssapi-with-mic 认证,或是 publickey 认证和 keyboard-interactive 认证,那么只有使用上述的 AuthenticationMethods 指令进行配置的 sshd 守护进程才能得到授权进行访问。请注意,每个所要求的认证方法都要使用对应的配置指令(例如, /etc/ssh/sshd_config 文件中的PubkeyAuthentication),方可准确地启用。关于可用认证方法的常用列表,请参阅 ssh(1) 的〈AUTHENTICATION〉章节。

4.3.10.3. 其他方法保障 SSH 安全

协议版本
由 Red Hat Enterprise Linux 7 所提供的 SSH 协议,即使此协议的运行支持 SSH-1 以及 SSH-2 版本的协议,但是可能的情况下,只使用后者。 SSH-2 版本比起旧版 SSH-1 作了一些的改进,并且大多数高级配置选项只在使用 SSH-2 时才可用。
建议用户使用 SSH-2,这可使 SSH 协议对所使用的认证和通讯的保护范围达到最大化。通过使用 /etc/ssh/sshd_config 文件中的 Protocol 配置指令,可指定 sshd 守护进程所支持的协议版本或是其他版本的协议。默认设置是  2
密钥类型
默认情况下,ssh-keygen 命令会生成一对 SSH-2RSA 默认密钥;使用 -t 选项,通过指令它也可生成 DSAECDSA 密钥。ECDSA(Elliptic Curve Digital Signature Algorithm,椭圆曲线数字签名算法)在同等的密钥长度下可提供更好的操作。它也可生成较短的密钥。
非默认端口
默认情况下, sshd 守护进程会侦听 22 网络端口。更改端口会减少系统受到基于自动网络扫描而造成的攻击,从而增加其安全性。通过使用 /etc/ssh/sshd_config 配置文件中 Port 指令,可指定端口。请注意,要允许使用非默认端口,必须更改 SELinux 默认设置。通过作为 root 输入以下指令,修改 ssh_port_t SELinux 类型,您可以完成此操作:
~]# semanage -a -t ssh_port_t -p tcp port_number
在上述命令中,用 Port 指令指定的新端口号代替port_number
非 root 登录
如果特殊使用情况下,无需作为 root 用户登录,那么您应该考虑在 /etc/ssh/sshd_config 文件中把 PermitRootLogin 配置指令设置成 no。通过禁止作为 root 用户登录,管理者可以审核哪个用户作为常规用户登录后运行了什么特权命令,且之后可获取root 权限。