前言
互联网上有许多企业公司和组织采用Linux作为服务器平台。当这些服务器与互联网连接以提供应用服务时,不可避免地会成为攻击目标。本文讨论Linux系统安全配置的一些关键步骤,以帮助你保护Linux系统。虽然在这里以Red Hat 6.0为例子,但也应该适用于其它Linux发行版本。
安装
配置系统安全的头一步最好是在系统的开始——操作系统的安全。因为配置的是防火墙,所以你绝对不能信任任何以前的系统安装和配置,而应该从全新安装开始,才能真正保证系统安全的完整性。
使你的系统处于单独(或隔离)的网络中。决不要让未受保护的系统连接到其它网络或互联网中受到可能的攻击。按我个人的经验,一个连接到互联网的新安装系统可以在15分钟内被扫描和入侵取得完全控制权。你可能需要另一台机器从互联网获取重要工具和安全补丁等等,然后再从这些机器将其传送到单独的“配置网络”中。
当把将要作为未来防火墙的机器放置于隔离的网络中时,就可以开始下一步了。第一步是选择操作系统将要安装的软件包。对于Red Hat 6.0,提供了三种安装选择:Workstation(工作站)、Server(服务器)、Custom(定制,缺省选项)。我个人强烈推荐“定制”,因为这允许你选择添加哪些服务和硬盘如何分区。安装策略是在维持最大化效率时进行“最小化”安装。系统中的软件越少,潜在的安全漏洞就会越少。例如,如果你不需要News或Real Audio Server,就不要安装它。Linux系统有一个好处就是如果你后来改变了想法,也是很容易添加所需软件包的。不管选择了哪种安装方式,手册页和HOWTO文档都应该是必不可缺的。虽然可能会使系统增加一点点风险,但它们有时确实特别有用。
如果选择了“定制”安装,会被提示进行硬盘分区。我个人通常喜欢使根分区尽可能地大,并且把所有东西都放在那里。然后,我们确实需要创建几个分区以保护根分区。因为如果根分区被例如系统日志或电子邮件等数据塞满的话,就会出现拒绝服务,甚至有可能使系统崩溃。
因此,我总是推荐为/var设置一个单独的分区。/var是用于存放系统所有日志和电子邮件的地方,将/var分区独立出来,就能够有效地保护根分区被这些数据塞满。对于许多网络环境,为/var分区设置不少于400MB基本上就足够了。另外可以考虑为某些特定的服务或应用创建或保留单独的分区,特别是敏感的日志记录。如果系统中存在不可完全信任的用户,也许应该为/home创建单独的分区,这样可以避免恶意用户轻易攻击/根分区。对于一台独立服务器以下是一个分区实例:
/ - everything else /var - 400 MB swap - (I normally go with 256 MB)
当系统安装完成并重启后,务必要安装必需的安全补丁。对于Red Hat,可以到http://www.redhat.com/apps/support/updates.html找到它的所有安全补丁程序。安全补丁对于维持一个安全的防火墙是至关重要的,应该经常保持更新。[email protected]或[email protected]是获取最新安全漏洞信息的最佳资源。如果不安装这些补丁,你的系统可能会轻易入侵。记住,从上面提及的另一台机器获取这些补丁,防火墙机器应该仍处于隔离网络中。对于Red Hat系统,下载RPM包会使系统更新变得更简单。例如是对wu-ftpd进行安全升级的实例:
rpm -Uvh wu-ftpd-2.6.0-14.6x.i386.rpm
如果系统早已处于互联网上,可以直接从互联网上安装:
rpm -Uvh ftp://updates.redhat.com/6.1/i386/wu-ftpd-2.6.0-14.6x.i386.rpm
推荐使用autorpm工具保持对RPM软件包的补丁更新。这个命令行工具分析确定哪些。rpm包需要升级,并会自动(如果你愿意的话)从Red Hat的网站上下载并安装升级文件。这个工具的使用非常灵活简单,可以让其在cron中运行,这样你的系统就会定期自动检查升级更新,并可以向管理员发送提醒系统需要升级的电子邮件。
关闭服务
一旦安装完系统的安装包、补丁,重启后,我们现在就可以开始对操作系统进行安全增强配置了。安全增强配置主要包括关闭服务、增加日志、调整几个文件和配置TCP Wrappers.首先从关闭服务开始。
缺省情况下,Solaris是一个提供许多有用服务的高性能操作系统。然而,对于防火墙来说,其中的大多数服务是不需要,且可能是安全风险。首先需要修改/etc/inetd.conf文件。这个文件定义了由/usr/sbin/inetd超级守护进程需要监听的服务。缺省情况下,/etc/inetd.conf会启动35个服务,然而最多仅需要两项:ftp和telnet.其余服务都不是必需的,可以将它们注释(关闭)。这是很重要的,因为inetd监听的许多服务存在严重的安全威胁,例如popd、imapd和rsh.以下命令列出inetd守护进程会监听的服务,请确认将其中不必要的服务的所在行注释(行首加"#"号):
grep -v "^#" /etc/inetd.conf
下一步要修改的是/etc/rc2.d和/etc/rc3.d目录下的文件。在这里你能够找到被init进程执行的启动脚本。其中也有许多是不需要的。要取消在启动过程中执行一个脚本,只需将对应文件名的起始大写S改为小写s即可。此外,Red Hat系统中带有一个好工具用以关闭服务。只要在命令行输入"/usr/sbin/setup",然后选择"System Services",接着再选择在系统启动时需要执行的脚本。另外还有一种方法就是在大多数发行版本中都带有的chkconfig工具。以下启动脚本是系统缺省安装,但通常却不是必需的。如果确定不需要它们,应该将禁止其启动。注意其中的数字用于决定执行的顺序,在不同的发行版本中可能会有所变化。以大写K开始的脚本用于kill已经在运行中的服务。
S05apmd (仅有笔记本电脑才需要)S10xntpd (网络时间协议)S11portmap (如果运行RPC服务则必需打开)S15sound (保存声卡设置)S15netfs (NFS客户端,用于从NFS服务器安装文件系统)S20rstatd (向远程用户泄露过多信息)S20rusersd S20rwhod S20rwalld S20bootparamd (用于无盘客户端,通常都不需要)S25squid (代理服务器)S34yppasswdd (如果系统运行NIS服务器,则必需此服务)S35ypserv (如果系统运行NIS服务器,则必需此服务)S35dhcpd (启动DHCP服务器守护进程)S40atd (at服务,类似cron服务,但系统通常不需要)S45pcmcia (仅有笔记本电脑才需要)S50snmpd (SNMP守护进程,向远程用户泄露过多信息)S55named (DNS服务器。如果需要运行DNS,请升级到最新版本)S55routed (RIP,仅在必需时才应该启动)S60lpd (打印服务)S60mars-nwe (Netware文件和打印服务器)S60nfs (用于NFS服务器。除非必须,此服务不应运行)S72amd (AutoMount守护进程,用于自动安装远程文件系统)S75gated (用于运行其它路由协议,例如OSPF)S80sendmail (如果不需要接收或转发电子邮件应关闭。此时仍可发送电子邮件)S85httpd (Apache服务器,建议升级到最新版本)S87ypbind (仅有NIS客户端才需要)S90xfs (X Windows系统字体服务器S95innd (News服务器)S99linuxconf (通过浏览器远程配置Linux系统)
要想在修改启动脚本前了解有多少服务正在运行,输入:
ps aux | wc -l
然后修改启动脚本后,重启系统,再次输入上面的命令,就可计算出减少了多少项服务。越少服务在运行,安全性就越好。另外运行以下命令可以了解还有多少服务在运行:
netstat -na ——ip
日志和系统调整
在尽可能多地取消服务后,下一步就是配置系统日志了。所有的系统日志存放在/var/log目录下。缺省时,Linux有不错的日志设置,除了ftp.有两种方法记录ftp的日志,配置/etc/ftpaccess文件或编辑/etc/inetd.conf.建议采用相对简单的编辑/etc/inetd.conf文件的方法。通过编辑/etc/inetd.conf文件如下,可以记录所有FTP会话的所有日志。
ftp stream tcp nowait root /usr/sbin/tcpd in.ftpd -l -L -i -o
以下选自ftp手册页:
如果指定-l参数,syslog会记录每一个ftp会话。如果指定-L参数,缺省时一旦ftp服务器被调用,命令日志就会激活。这将使服务器记录下所有的USER命令。注意,此时如果一个用户偶然性地在用户名输入时输入了口令,该口令会被syslog记录下来!如果指定-i参数,ftpd服务器接收到的文件都会被记录到xferlog.如果指定-o参数,ftpd服务器发送的文件都会被记录到xferlog.
snip
下一步配置是系统调整。这包括了多个文件的管理。第一件事情是确保/etc/passwd文件的安全。首先要确认系统使用了/etc/shadow文件,此保存了所有用户口令密文的文件仅允许root根用户访问,这可以阻止用户口令轻易地被访问和破解。Red Hat 6.0缺省时使用了shadow口令系统,但务必要检查确定。只要运行以下命令,就会将口令系统自动转换到/etc/shadow口令系统:
pwconv
第二步是删除/etc/passwd文件中许多缺省的系统帐号。Linux提供这些帐号主要是用于许多其实极少需要的系统操作。如果不需要这些帐号,删除它们。帐号越多,系统被入侵的可能性就越大。例如"news"帐号,如果不运行nntp新闻组服务器,就不需要该帐号(注意要更新/etc/cron.hourly文件,因为脚本中涉及到了"news"用户)。另外,一定要删除"ftp"帐号,因为该帐号仅用于匿名FTP访问。
我们还要修改/etc/ftpusers文件。任何被列入该文件的帐号将不能ftp到本系统。通常用于限制系统帐号,例如root和bin等,禁止这些帐号的FTP会话。缺省时Linux已创建了该文件。一定要确保root根用户被包含在该文件中,以禁止root与系统的ftp会话。检查并确认需要FTP到该防火墙的所有帐号**不**在/etc/ftpusers文件中。
另外,确保根用户root不能telnet到系统。这强迫用户用其普通帐号登录到系统,然后再su成为root./etc/securetty文件列出了root所能连接的tty终端。将tty1、tty2等列入该文件中,使root用户只能从本地登录到系统中。ttyp1、ttyp2等是pseudo(虚拟)终端,它们允许root远程telnet到系统中。
最后,创建/etc/issue文件。该ASCII文本文件用于在所有telnet登录时显示的信息。当试图登录到系统中时,该文件中的警告信息将被显示。在Linux系统中要修改/etc/rc.d/init.d/S99local脚本文件,以生成固定的/etc/issue文件。因为缺省时Linux在每次启动时都生成新的/etc/issue文件。
连接到防火墙
通过安全可控的途径连接到防火墙也是非常重要的。通常,我们需要远程访问防火墙以进行管理或上载文件。这些通讯需要考虑安全性。在这里我们主要讨论两种方式:ssh和TCP Wrappers.
我个人推荐ssh,因为它使在我们和防火墙之间的通讯都是经过加密的。TCP Wrappers不能保证网络通讯不被窃听,使用户仍然有可能捕获通过网络传送的明文口令。如果你担心被其它用户窃听你和防火墙之间的通讯,推荐用ssh替代telnet/ftp.ssh会话对其所有网络通讯进行加密,使在防火墙上的管理和文件上载变得更安全。ssh和TCP Wrappers的相似之处是有自己的日志文件功能,并能限制哪些系统可以创建网络连接。要获取更多关于ssh的信息和下载ssh客户端和服务器端源代码,请访问http://www.ssh.org网站。建议使用1.2.x版本的ssh,因为2.x版本有版权限制。对于Windows 95/NT用户,推荐用SecureCRT作为ssh客户端。
TCP Wrappers,虽然不支持加密,但它提供日志功能和控制何人能访问系统。它通常用于为inetd中的服务,例如telnet或ftp,添加一层限制。当使用TCP Wrappers时,系统通过它来监视inetd进程创建的连接,记录所有连接请求,然后对照一个访问控制列表(ACL)检验该请求。如果该连接是允许的,TCP Wrappers将此连接请求传递给相应的真正守护进程,例如telnet.如果该连接是禁止的,则TCP Wrappers会丢弃此连接请求。对于Linux系统,TCP Wrappers缺省时就被安装到系统中,我们只需编辑/etc/hosts.allow和/etc/hosts.deny文件即可。这些文件用于确定什么人能和不能访问系统。TCP Wrappers的语法比较简单,将被允许网络连接的IP地址或网络添加到/etc/hosts.allow文件,将被禁止网络连接的IP地址或网络添加到/etc/hosts.deny文件。缺省时,Linux允许所有连接,所以需要对这两个文件进行修改。对于TCP Wrappers有以下两点建议:
* 使用IP地址而不是系统名字或域名。* 设置/etc/hosts.deny文件禁止所有连接(ALL),然后在/etc/hosts.allow文件中指定仅允许特定主机和网络。
更严格的安全配置
以上讨论的内容包括了所有的要点。通过执行以上操作,你就可以显著增强系统的安全性。然后不幸的是,你的系统并不是100%安全,而且永远也不会是。因此,这里提供几个更严格的安全配置方法和步骤。
首先是创建whell用户组。wheel用户组包含了允许执行一些功能强大命令(例如/usr/bin/su)的用户帐号列表。通过限制有权限访问这些命令的用户帐号,就能够增强系统的安全性。要创建wheel组,用vi编辑文件/etc/group,创建wheel组并为其增加系统管理员帐号。然后确定重要的系统程序,例如/usr/bin/su.把这些程序文件的组用户设置为wheel,并只允许程序的属主和组用户执行(注意要保留必需的suid或guid位)。例如对于/usr/bin/su,使用如下命令:
/usr/bin/chgrp wheel /usr/bin/su /usr/bin/chmod 4750 /usr/bin/su
然后,我们需要限制。rhosts、。netrc和/etc/hosts.equiv文件的使用。r系列命令使用这些文件来访问系统。要为这些文件加锁,先创建它们,然后修改其属性为零即可。这样除了root用户就没有其它用户能创建或修改它们了。例如:
/usr/bin/touch /.rhosts /.netrc /etc/hosts.equiv /usr/bin/chmod 0 /.rhosts /.netrc /etc/hosts.equiv
第三,配置/etc/shadow使用MD5哈希函数而不用crypt函数作为加密算法。这可以使被加密的口令文件更难以破解。这可以通过修改PAM模块配置完成。PAM(Pluggable Authentication Modules)是一个共享库套件,可用于选择应用程序如何对用户进行认证等。要了解PAM更多知识,请访问:ftp://ftp.us.kernel.org/pub/linu ... -PAM-html/pam.html.
在以前的旧版本中,必须手工修改PAM模块以使用MD5哈希函数。然而在Red Hat 6.0及更高版本中,可用setup工具选择MD5哈希。在命令行输入"setup"然后选择"authentication configuration",从那里就能够选择使用MD5哈希。然而,MD5哈希在用户再次输入其口令前并未真正生效。如果因为某些原因不使用setup工具,手工修改PAM模块也是可以的。
作为bash用户,我不大愿意使用。bash_history文件,因为不希望别人(包括root)知道我曾经运行了哪些命令。所以,在。bash_profile文件里,我添加了一行,这样命令就不会被记录到。bash_history文件。:HISTFILESIZE=0最后一件事情是保护系统不被攻击者物理访问。一是要为BIOS设置口令,二是通过在/etc/lilo.conf文件中配置口令保护(password=xxx)系统的启动过程。然而记住,一旦系统被入侵者能够完全物理接触,则没有任何方法能保证系统的绝对安全了。
IPChains
讨论Linux安全性,不可能不讨论IPChains.IPChains是集成到2.2.x内核中的包过滤防火墙软件。只要运行了Red Hat 6.0或更高版本,IPChains已在Linux的安装包中。IPChains与Cisco Access Control Lists(访问控制列表)相似,它能够控制什么数据包能够进出Linux系统。作为一个防火墙软件,IPChains能够用于保护Linux系统。要保护一台独立服务器系统,可以配置IPChains仅允许出站的TCP连接。如果外部主机试图发起任何TCP连接,都会被禁止创建连接。由于IPChains不是基于状态过滤的,因此通常允许所有的UDP和ICMP连接。最后,应该记录下所有的被禁止连接,这样可以发现可能的攻击企图。然而,对于广播和多播数据包,应该将其丢弃,因为这些数据包可能会很快地填满系统日志。以下是一个IPChains配置例子(保护独立服务器系统):
bash# ipchains -L Chain input (policy DENY): target prot opt source destination ports DENY all —— 0.0.0.0 anywhere n/a DENY all —— anywhere 255.255.255.255 n/a DENY all —— anywhere BASE-ADDRESS.MCAST.NET/8 n/a ACCEPT tcp ! y anywhere anywhere any -> any ACCEPT udp l- anywhere anywhere any -> any ACCEPT icmp l- anywhere anywhere any -> any DENY all l- anywhere anywhere n/a Chain forward (policy ACCEPT): Chain output (policy ACCEPT):
结论
我们在本文中讨论了如何安全配置一台Linux系统(Red Hat发行版本)的一些主要步骤。使一个系统安全的关键是最小化安装,使用TCP Wrappers、IPChains等软件、用shadow口令增加安全防护。此外还有一些附加步骤,例如tripwire(监视系统文件的改动)和swatch(日志监视和报警工具)。另外向Linux初学者推荐一个能够自动对新安装的Linux系统进行安全配置的PERL脚本:Bastille.记住,没有系统是真正100%安全的。然而,通过以上列出的操作步骤,可以较大幅度地减少安全风险。