扫一扫
分享文章到微信
扫一扫
关注官方公众号
至顶头条
道,意味着途径或方法,是一个对实现想要的结果而设置的指南或规则,与其它道类似,安全需要一个结构化的、系统化的方法,同时,它也应该是整体的、涵盖系统生命周期(从计划到退休)的每一个部分。在本文中的道由五个步骤组成,每个Linux系统要建立一个基线都应该通过这些步骤。这些步骤不是开始也不是最终的安全方案。
我详细讨论每个步骤时,我将部署两个样例系统(一个Fedora桌面系统和一个Debian服务器系统)来展示安全是如何实施的,我选择Fedora是因为它是现在最流行的发行版,它可以为任何目标工作得很好,它有许多桌面增强特色,并且是用户推荐的无命令行的最容易使用的Linux发行版,我选择Debian作为我们的服务器平台是因为它是轻量级的、有非常悠久的历史而且很稳定、有一个强大的支持社区和大量的文档。这两个都是非常优秀的平台并且都有它们自己的内置安全标准。如果你喜欢其它的发行版,这里指出的步骤可以应用到任何的系统。
第一步:计划
第一步也是最重要的一步,因为你在这里做出的决策将影响到全盘的安全,第一步定义系统将部署成什么样的目标,它将是一个小的邮件服务器吗?或者是一个桌面系统吗?又或是一个入侵检测系统?一旦你有一个目标后,你就可以用它来指导整个过程,然后将精力集中在如何尽可能地提供更安全的环境上,安全永远都不应该妨碍功能的完整,毕竟部署一个无人能用的系统有什么用呢?!
接着,你需要为你的系统决定一个安全目标,主要目标应建立在最小访问或最小权限原则之上,这就意味着仅仅为用户和程序提供系统操作必要的最小权限,你应该还有其他安全目标,如用杀毒软件扫描每个文件或用LDAP对每个用户进行认证,但是最小权限应是不变的原则。
实现这些目标,在你动手前,你应该思考如何实现它们,回答一些简单的问题将有助于你在步骤2和4里作出正确的决策。系统将作为一个服务器还是一个桌面系统?这个问题决定了你新系统上的大部分配置;用户将在本地访问还是远程访问这个系统?这是另外一个重要的与安全有关的配置问题;系统需要一个桌面环境吗?
如果你对命令行非常熟悉,将系统部署成无头的或者说无GUI接口的,将X window系统从你的安装中删除,你将很意外地减少系统的攻击面(你暴露在外的区域),另一方面,如果你或你的同事需要一个GUI,只安装一个GUI并弄清楚如何将系统正确地锁定,安装服务器时不安装X,安装桌面系统时才安装X是一个值得竖大拇指的方法。
最后,计划应用程序将会在系统上做什么,判断它依赖什么库以及比不可少的操作,常见的有:系统运行一个远程命令后不必须的库也被使用了,掩饰住了入侵者的姿态或探测网络,如果你不需要某个包请不要安装它。
当你弄清楚了这些问题和答案后,写到你的安装日志或笔记簿并保持更新。
步骤二:安装
写下这些计划后,进入建造步骤,从你在计划步骤中设定的安全目标的应用程序开始,由于空间限制,下面的章节不会给样例安装列出一个详细的检查列表,我仅将与安全有关的选项做了记号,在第一步中,在安装日志中写下你在安装过程中的选项,在重新安装系统时就可以派上用场了。
Fedora Core 7
从一个Fedora 7 ISO文件(可以在发行镜像站点找到)启动到一个干净的系统,在确定你的键盘和语言设置好后,来到磁盘分区部分,对于大多数桌面发行版,安装程序直接就把分区配置好了,但是,如果这个系统是供某些工作敏感的人准备的,请将/home文件夹放在一个独立的分区上。
分区完成后进入启动管理器选项,选择GRUB并为其设置一个密码,给启动管理器设置一个密码是最佳实践,它可以帮助你在磁盘或系统被盗的情况保护你的数据不会丢失。一个好的密码应该比较复杂,避免使用字典中的单词、纯数字、纯字母和非字母数字混合的符号。
下一个屏幕,选择DHCP,因为客户端机器通常不需要静态的ip地址,如果你需要使用静态ip地址,在你网络的某个地方务必使用网络地址转换(NAT),接下来,设置一个主机名和域,并为root用户设置一个复杂的密码,在软件包选择屏幕,如果选择自定义安装,请仔细检查你选择的软件包,在自定义选择屏幕,只选择一个桌面环境[译者注:GNOME/KDE等],多安装一个桌面环境就多一分危险,保留默认的选择GNOME,检查其他每一个选项,你会发现有许多软件包将被安装(图1),在我的安装中有843个软件包,你的数字可能不同,排除你不需要的软件包,每个包前面都一个可选框,当你选择完软件包后,系统将重新启动。
图1 在Fedora 7下选择要安装的软件包
在重新启动后,提示你启用防火墙,请启用它,然后添加你在这个系统上需要用到的端口/程序(图2),在SELinux设置屏幕,如果你要启用它,请将策略设置为强制模式(图3),给不熟悉SELinux的人解释一下,它是一个基于策略的保护架够,开始是由美国国家安全局(NSA)开发,它在操作系统以及大多数流行的应用程序如Apache上增加了一层安全保障,使用SELinux一个不好的方面是它可能引起受保护的程序(也有可能是其他程序)崩溃,如果你遇到问题,你可以通过setenforce命令或用文本编辑器来修改策略,然后会提示你创建一个用户帐号,在经过几个其他选择后,来到第一次登陆屏幕。
图2 Fedora防火墙配置
图3 SELinux显著地增强了你系统的安全
Debian
用Debian ISO(这里使用的4.0r1版本)开始一个空白的服务器安装,因为在这个例子中我使用这个系统作为一个服务器,让我们用一个更简单的方法来安装,相对桌面系统而言,服务器通常是恶意攻击者的美味目标,因此你需要额外防备,特别是当它被放在公共网络或互连网上的时候。
在设置好时区、国家等内容后,需要为你的服务器设置一个主机名和域,接下来开始分区,将系统目录设置到它们各自的分区,继续将/home目录设置为一个独立的分区,并将加密你的分区,听起来好象很困难,但对Debian下分区工具而言,这很容易办到,从选项中选择分区向导,然后选择向导 – 使用全部磁盘,并设置为加密的LVM,使用全部磁盘并选择使用一个独立的home分区选项,Debian强烈建议你隔离你的目录,将根、程序、用户数据独立进行分区,但这样分区会很难管理。当提示时(图4),将改变写入磁盘,输入一个复杂的密码来加密卷,接着,设置你的时区和root密码,然后基础安装开始了。
完成基础安装后,接下来的几个屏幕都不是很重要了,直到选择软件包的屏幕,在我们的方案里,只安装一个Apache Web服务器,最后,安装GRUB启动管理器,你的新系统就准备好了,重新启动后,立即用密码锁定GRUB,在/boot/grub/menu.lst文件中增加下面的几行:
timeout 30
password yourpasswordhere
图4 Debian使复杂的分区方案变得简单
步骤三:打补丁
接下来就该为系统打补丁了,虽然有时很乏味,但打补丁还是必需的,毕竟843个包需要许多保护的,同时,你需要将系统设置为实时更新,以便出现新的威胁时可以及时处理,庆幸的是,本文中的样例发行版做升级都很容易,在Fedora客户端,你一样可以很容易地进行升级,在第一次登陆后,系统自动检查更新(图5),Fedora使用Yellow Dog升级管理器,它比yum更有名,它有一个新的GUI界面 - 小狗- 来自动执行升级过程,但是,这个弹出式提示好象只能在GNOME环境下工作,如果你想手动升级你的系统,还可以使用命令yum list updates或yum info updates来查看哪个软件包需要升级,你也可以不加任何参数运行yum来升级所有安装了软件包的可用升级。
图5 在安装完毕后Fedora立即检查更新
继续样例服务器,Debian使用一个叫做aptitude(apt)的工具来升级软件包,apt传统上是作为一个软件包管理器使用,如RedHat的RPM一样,但是它也可以象yum一样进行更新检查了,它使用预先定义好的和自定义的源列表来检查你安装的软件包的更新,如果在你的/etc/apt/sources.list文件中没有下面这行,请将其添加进去,它让你可以在主干稳定的US归档服务器上检查更新。
deb http://http.us.debian.org/debian stable main contrib non-free
然后运行apt-get升级命令,要为你系统升级所有的包,在命令提示符后输入apt-get upgrade(图6),系统将开始检查,得到你的同意后,开始下载并应用更新,在运行apt-get前如果你想看看你安装了哪些软件包,使用命令dpkg –l,要设置为每周检查一次更新,使用下面的命令或你自己编写脚本并用crontab来安排执行时间。
echo /usr/bin/apt-get update > /etc/check4updates
echo /usr/bin/apt-get upgrade >> /etc/check4updates
chmod 750 /etc/check4updates
crontab –e
图6 使用apt-get查找Debian安全更新
将下面这行代码添加到你的crontab文件,让脚本在每周三上午3:30执行:
30 3 * * 3 /etc/check4updates
注意:如果你是编译的你自己的包或从另一个源下载的包,使用yum或apt-get可能不能进行自动升级。
步骤四:加固
在给你的新系统打好补丁后,你可能需要额外的步骤来加固它,在你的计划中应该有一个安全目标,参照这些目标确定要做哪些事情,你的目标越多,事情就越多,尽量保持简化,实际上复杂的设置会让系统更不安全,因为它们常常导致配置失效,同时,在你的安装日志中记录这些步骤。
Fedora实例已经准备好展示两个重要的步骤来增强安全性:启用SELinux和安装一个防火墙。在大多数典型的使用桌面的情况下,安装一个杀毒软件就足够了,对于Debian盒子而言,我选择了三个可以在任何服务器上使用的步骤:使用sudo、锁住ssh和使用一个限制性的iptables防火墙,这些项目应该在任何服务器上考虑部署,如果需要,它们也可以在桌面系统上应用。
sudo
sudo对于限制root访问而言是一个伟大的程序,它应该在任何服务器上接受严格的监视,将用户添加到/etc/sudoers文件中,限制它们使用su来执行特殊的命令,访问特殊的目录或访问网络主机,在sudoers文件中的任何用户只要在它运行命令前输入sudo来进入root环境即可执行想执行的程序,这比起将root密码告诉每个人来将更容易,而且更安全了。
ssh
ssh是目前linux系统上标准的远程访问协议,在它的默认配置下,它有一些设置明确地需要你进行锁定,将下面两行添加到/etc/ssh/sshd.config文件中:
PermitRootLogin no
X11DisplayForwarding no
第一行阻止root用户通过ssh登陆到服务器,永远都不要用root用户登陆ssh,第二行禁用了X转发(它允许用户快速地从你的服务器启动一个X会话),在本例中,X并没有安装,因此这不是问题,你应该通过chroot技术或使用TCP Wrappers进一步锁定ssh,由于空间限制,我忽略了这些配置步骤。
iptables防火墙
与其长时间讨论如何正确配置一个防火墙,还不如使用我编写的现成脚本,我编写了下面的脚本并配有注释来加固Debian系统,它限制了新发起的ssh、http、ssl连接通信,将本例中的ip地址修改为你服务器的ip地址,想了解更多关于iptables可用选项的细节,请参考帮助文档,当安装你自己的防火墙时,不要忘了只在iptables中开放必须的端口以减小攻击面的目标。
#!/bin/sh
PATH=/usr/sbin:/sbin:/bin:/usr/bin
#FLUSH PREVIOUS TABLE ENTRIES
iptables --flush
#CHANGE DEFAULT POLICIES FROM
#ACCEPT TO DROP
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT DROP
#ALLOW LOCAL LOOPBACK TRAFFIC
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
#ALLOW ESTABLISHED CONNECTIONS
iptables -A INPUT -m state --state
ESTABLISHED,RELATED -j ACCEPT
iptables -A OUTPUT -m state --state
ESTABLISHED,RELATED -j ACCEPT
#ALLOW DEFINED TRAFFIC
#
#SSH - 22
iptables -A INPUT -d 192.168.1.2 -p tcp
--dport 22 --sport 1024:65535 -m state
--state NEW -j ACCEPT
#HTTP - APACHE -80
iptables -A INPUT -d 192.168.1.2 -p tcp
--dport 80 --sport 1024:65535 -m state
--state NEW -j ACCEPT
#SSL - 443
iptables -A INPUT -d 192.168.1.2 -p tcp
--dport 443 --sport 1024:65535 -m state
--state NEW -j ACCEPT
将这些脚本保存到本地,然后拷贝或移动到/etc/network/if-up.d目录,当系统启动网络开启后它将被执行,如果你西藏应用这个配置到一个基于Redhat的系统上,你只需简单地运行上面的脚本并用iptables-save命令来重设规则,可以不用重新启动系统。
尽管你可以手动一步一步执行这些步骤,但有一款工具可以使得做这些事情更容易,他就是Bastille(图7、图8),它通过问题/答案的形式将你的安全设置信息保存到脚本中,然后将其应用到真实的系统上,在互联网上也可以找到许多对于大部分发行版和应用程序都是可用的手工安全检查列表,最好的检查列表就是由互联网安全中心完成的检查标准,这些标准包括了详细的设置和对特定操作系统及流行的应用程序有关的最佳实践描述,它们是Bastille最好的伙伴。
图7 Debian中的Bastille
图8在一个有X环境的Fedora下的Bastille
步骤五:监视/审核
最好一步是一个不断进行的过程,持续监视你的系统将验证实现你的安全目标是否超时了,最有用的工具是从/var/log/messages文件提取系统日志,你可以看到许多与系统和应用程序安全有关的信息,许多应用程序有它自己的日志文件,也请仔细审核它们,如果你有许多系统,你应该使用一个中心日志文件服务器来收集日志,在syslog.conf文件可以很容易地进行配置。
一个新的代替叫做Splunk(图9),它有免费的版本(每天限制大小是500M)和企业版本,最让人高兴的是它安装超级容易,并且你可以通过一个革新的基于web的界面象使用google命令似的搜索日志。
图9 Splunk是一个最好且非常有用的开源项目
与日志用途一样,它们也不提供一个完整的关于你的安全设置是否工作良好的图形,仅仅经常审核能实现目的,因此我要告诉你如果你的安全措施仍然适当并在运行,我不建议你为每个系统做渗透测试,但是有效性测试你的设置是一个很好的保险措施,创建检查列表或脚本来测试那些维护你系统安全目标的设置是很重要的,代替检查列表,你可以使用—assess开关运行Bastille来得到一个你目前配置的安全报告,你也可以使用CIS检查标准(它依赖于Bastille)作为一个基准检查列表,如果你有能力购买它,你能得到一个顾问服务并用他/她自己的测试校验你的安全,你会更加镇静,特别是你在一家厉害的管理企业工作时。
图10 Bastille评估报表给你显示了当前安全配置的详细信息
上路
在你的安装中使用这些步骤是第一步,这个简单、有序的战略将给你的系统带来更多的安全保障,但是,每个系统都不一样,确定你的安全目标匹配你的系统需要,安全并不困难,使用简单可重复的步骤,保留最佳实践和常见弱点,在任何可能的地方实行最小权限,经常查看你的日志,你将发现你已经上路了。
如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。