博威---云架构决胜云计算

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 7188|回复: 18

LINUX系统与安全加固专题

[复制链接]
发表于 2007-5-13 22:13:16 | 显示全部楼层 |阅读模式
实用 Linux 安全性通过明智的帐户管理来降低风险和排忧解难
级别: 初级
Cameron Laird ([email=claird@phaseit.net?subject=实用 Linux 安全性&cc=]claird@phaseit.net[/email]), 副总裁, Phaseit, Inc

2002 年 8 月 09 日
安全性是一个庞大和具有挑战性的主题,但每个负责服务器端工作的人都应当知道基本步骤。Cameron 概括了一些使您的用户帐户清洁和安全的方法。
安全性是一大难题。它不会一成不变,而且很难知道它需要扩展到多大程度:如果您不小心的话,当您的老板真正想要的是不让看门人看到他的年度预算时,您才会最终相信他需要理解安全性的好处。
不管在计算安全性的所有方面跟上潮流是多么的具有挑战性,毕竟有几个领域已经足够成熟,值得进行系统地学习。对于任何使用 Linux 服务器的人,我建议他学习的第一个领域是帐户管理。
注意您的用户
在第一批专门介绍 Linux 管理和编程的书籍中,许多都包括关于“用户管理”或“帐户管理”的一章。它们的意思非常明确:如何为使用您主机的人设置和维护计算帐户和组关系。
在那时,“使用”必然意味着“登录”。帐户管理的全部工作就是:使用诸如 useraddchsh 等命令来配置 Linux 帐户,以便于由同部门开发人员占多数的用户群使用。/etc/passwd 及其 API 是 Linux 专家的关注重点。
那个时代早已成为过去,我对大多数服务器提出的第一个建议就是清除 /etc/passwd 的大部分内容。我的意思是:由于历史原因,大多数电子邮件服务器、Web 服务器、文件服务器等,都用 /etc/passwd 管理它们的用户访问。我认为这通常都是一个错误。在早些时候,当可能有十几个或二十几个工程师共享一台高端工作站时,这是一种明智方式。但是,当一台电子邮件服务器可能要处理几万名用户(他们中的大多数只是把计算当成和饮水器或电话系统一样的公用设施)的邮箱时,传统的 /etc/passwd 方式就是一个错误。
依靠 /etc/passwd 当然是可能的。它经历了足够的修补和调整,足以应付令人惊讶的工作量。但不是必须如此。如果您将用户帐户移到专门的数据存储,如 LDAP(轻量级目录访问协议)甚至 RDBMS(关系数据库管理系统)数据存储,您可以在可伸缩性、安全性和维护方面受益。将 /etc/passwd 限制为只供少数真正需要登录的开发人员和管理员使用。
这一实践在安全性方面有很大好处,因为服务(电子邮件和 Web 等)用户的忙闲度与开发人员的完全不同。一旦您已设置好了一台新的服务器,它的 /etc/passwd 就不应经常更改。监控它是否被更新 — 特别是篡改 — 是一项简单的任务。但是,如果您正在运行一个较大的服务器,那么每天都会有几个新的和过期的电子邮件帐户更改。需要将这些帐户从 /etc/passwd 赋予的更大的访问权隔离开来。
构建一个替代性帐户数据存储是一个认真而严肃的建议吗?的确如此,这确实令人惊讶。为了使由无需登录的用户占多数的非常庞大的 /etc/passwds 正常工作,过去几年已经投入了大量的工作。如果您确实决定编写自己的帐户认证,并且依靠象 sendmail 这样的传统电子邮件程序,那么您很可能发现自己正在为 SMTP、POP3 和 IMAP4 服务器编写更改。
那些障碍常常使开发人员倾向于使用现成的软件。我的习惯是使用别人已编写好而我可以重用的解决方案。但是,与这些业界使用的服务器不同的一点在于:我还是常常需要定制它们 — 例如,设置特殊消息目录、日志记录信息或使用记帐。对我来说最重要的一点是使安全性考虑事项模块化。我希望能够将开发人员和管理员帐户与最终用户服务完全分开地加以管理。通过将后者从 /etc/passwd 清除,我可以很容易地锁定一方而不会影响另一方。




回页首


使策略自动化
和将开发人员帐户与用户服务分开几乎同样重要的是使策略自动化。为创建和删除帐户 — 既包括开发人员(/etc/passwd)的也包括最终用户(电子邮件、Web 和数据库等)的 — 建立明确而详细的过程。尽管将这些纳入可执行文件是很好的规定,但并不完全有必要。重要的是过程是可理解的和明确的。不小心的帐户创建和删除 总是会留下安全性漏洞。应当与人力资源、客户支持或其它相关部门一起检查您的过程。如果不亲身体验替代方案,那么您很难认识到这是多么关键。
当您没有为添加和除去用户帐号编写过程时,则总会出现这样的结果:假定新员工周一报到,那么他或她可能到周五仍不能访问其公司文件。或者,某人辞职,在假日聚会做了道别,可在二月份开始时仍在检索特殊用途的公司资产。
帐户自动化一个附带的好处是它鼓励更加彻底的验证。如果开发人员没有用不同特性配置帐户的方便办法,他们很可能不会执行那些预计将使配置发生变化的应用程序。
我最近亲身经历了这样的情况。我因某个紧急事件而被召来,当时实现小组实际上在“正确地”允许经理查看雇员业绩评审 — 甚至包括那些不属于他们管理的雇员!尽管听起来可笑,但这是典型的安全性问题。它甚至在分析和设计评审期间被指出过几次。虽然每次都向决策者反映了这个问题,但由于它是巨大而混乱的问题集合的一部分,所以它每次都在没有明确决议的情况下被忽略。
只有当一位支持专家最终建立起一个一般实例的具体示例(在该示例中有几位经理,每位经理有多份雇员报告)时,错误才得到应有的注意。不要临阵磨枪;要定期对所有种类的用户帐户的配置进行彻底的测试。




回页首


保持警觉
安全性最困难的部分,至少对我们中的许多人而言,是如何避免犯错。安全性是属于“最弱环节”事件之一,一个漏洞就可以使您目前的所有投资(不管多么庞大、计划多么周详)一钱不值。要做好安全性工作,您必须对原本不会考虑的事情保持警觉。
美国政府网站常常是证明那种挑战的严重程度的最好例子。常在有关“反恐”的安全问题新闻中出现的某联邦机构维护一个网站,在那里用户密码在用于更改用户首选项的页面上公开地显示。相当多的组织解决频繁发生的丢失密码问题的方法是:根据或多或少的公共信息 指定密码(例如,“您的密码是您出生地的头四个字母,加上您出生年份的后两位数字”)。
如何能避免这样的灾难性错误?遗憾的是,几乎没有系统的方法能“聪明地”成功实现这样的抽象目标。但是,在需要采取的有用步骤中,对 RISKS 文摘的研究和严格的工程检查是有用的步骤之一。
RISKS 是 Peter G. Neumann 自 1985 年就一直在编辑的在线时事通讯(请参阅下面的 参考资料)。在思考事情(特别是 Linux 服务器上的安全性)的出错原因方面,阅读它是个很好的习惯。Neumann 使该文摘易读而且有趣,当然偶尔会令人恐怖。
您还应该养成让其他人试验您的想法的习惯。您可能认为“软件检查”不过是找出开发人员的源代码中放错地方的标点符号的一种方法,但它实际上是非常有趣和高效的实践。特别是,检查是对需求文档、网站和所有其它产品的同行评审进行组织的极佳方法。请进行检查。通过别人的眼睛查看您的工作。您将有可能了解许多关于您服务器的安全或不安全性的信息。




回页首


结束语
参考资料指向更多读物,它们涉及关于加固服务器、Linux 安全性和检查方面的主题。尽管服务器安全性是一个庞大的主题,但您可以快速且少花代价地学习本专栏所描述的方方面面。如果您还没有研究这些方法,那么您应该一试;它们将极大地提高您操作的安全性。
您觉得什么样的服务器安全性问题最难?“服务器诊所”在来年将至少有几次回到这一安全性问题。如果您 给我发邮件在论坛公布您的想法,我将尽力解决您的问题。


参考资料
 楼主| 发表于 2007-5-13 22:16:10 | 显示全部楼层

linux系统安全(一): 安装与设置

我们把主要精力放在用Linux搭建安全的服务器上面。我们通过系统设置和一些共享的安全软件固化我们的系统,使其能做到真正的安全。第一部分主要从安装和设置方面阐述 Linux 作为服务器应注意的方面。
目前随着网络的逐渐普及,安全问题越来越引起了人们的注意。Linux作为免费的开放源代码操作系统,正在被越来越多地用作服务器平台,而且随着Linux下应用软件的多样化,很多人(包括笔者)也喜欢使用Linux作为桌面。在这一系列文章中我们把主要精力放在用Linux搭建安全的服务器上面。我们通过系统设置和一些共享的安全软件固化我们的系统,使其能做到真正的安全。由于篇幅原因,不可能论述的很详细,我在这里只是把我们要注意和关心的地方举出来,至于一些其他的常识性的细节不再赘述。
第一部分主要从安装和设置方面阐述 Linux 作为服务器应注意的方面。
1 Linux服务器的安装
大家一定都安装过Linux系统,也许您可能已经很熟练了,但是在这里我们提出一些在安装过程中应该注意的问题:
首先在分区的时候不要只图简单把所有的空间都留给根分区,应该把不同的部分放在不同的分区。强烈的建议您把"/var"和"/tmp"放在不同的分区,如果您的服务器有较多的用户访问,这几乎是您所必须做的。另外最好把"/var"和"/usr"放在不同的分区,这样可以避免由于日志或用户的原因是您的硬盘被占满或直接导致您的服务器性能降低。对分区的最后一点警告就是如果您要提供一种或多种服务,一定要把这个服务有关的东西放在单独一个分区,例如:您如果要建一台WWW服务器,您在分区时候一定要留一个单独的分区(例如:"/www"),将来您可以用chroot提高这种服务的安全性。
另外一个重要的问题是安装时软件包的选择。我们用Redhat作为例子,出于安全和性能的考虑,您必须选择"Select individual package"单选框,这样您就可以进行软件包的选择。有些软件是您不必安装的,有些软件是安装后必须卸载的,有些是安装后必须安装的。我们下面给出清单:
不必安装的软件包:
Applications/Archiving: dumpApplications/File: gitApplications/Internet: finger, ftp, fwhois, ncftp, rsh, rsync, talk, telnetApplications/Publishing: ghostscript, ghostscript-fonts, mpage, rhs-printfiltersApplications/System: arpwatch, bind-utils, knfsd-clients, procinfo, rdate, rdist, screen, ucd-snmp-utilsDocumentation/indexhtmlSystem Environment/Base: chkfontpath, yp-toolsSystem Environment/Daemons: XFree86-xfs, lpr, pidentd, portmap, routed, rusers, rwho, tftp, ucd-snmp, ypbindSystem Environment/Libraries: XFree86-libs, libpngUser Interface/X: XFree86-75dpi-fonts, urw-fonts

安装后必须卸载的软件包:
pump  apmd  isapnptools  redhat-logos  mt-st  kernel-pcmcia-cs  setserialredhat-release  eject  linuxconf  kudzu  gd  bc  getty_ps  raidtools     pciutils  mailcap  setconsole  gnupg

安装后必须安装的软件包(有了这些软件包我们才可以编译程序):
autoconf-2.13-5.noarch.rpm  m4-1.4-12.i386.rpm  automake-1.4-5.noarch.rpmdev86-0.14.9-1.i386.rpm  bison-1.28-1.i386.rpm  byacc-1.9-11.i386.rpmcdecl-2.5-9.i386.rpm  cpp-1.1.2-24.i386.rpm  cproto-4.6-2.i386.rpmctags-3.2-1.i386.rpm  egcs-1.1.2-24.i386.rpm  ElectricFence-2.1-1.i386.rpmflex-2.5.4a-7.i386.rpm  gdb-4.18-4.i386.rpm  kernel-headers-2.2.12-20.i386.rpmglibc-devel-2.1.2-11.i386.rpm  make-3.77-6.i386.rpm  patch-2.5-9.i386.rpm

在您对您的服务器的所有工作做完以后(以后不再有编译的需要了),把上面这些软件包从您的系统中删除。这样即使有人侵入了您的系统,他也不能在上面编译程序,而且这样还可以使您以后进行完整性检查的速度加快。您可以把上面这些软件包保存在活动介质上以便以后使用,可能上面这些不是最新的版本,您可以去下载目前最新最稳定的版本。




回页首



2 系统设置
2.1 口令和帐号
首先你必须设置BIOS的口令,现在的个人计算机系统大都支持这种设置。
其次你必须为你的lilo的单用户模式设置口令限制,在/etc/lilo.conf中第一个引导的image前面加入下面的信息:
restrictedpasswd="your password"

"your passwd"是您所所要设定的单用户模式引导的密码。设置完成用lilo -u使lilo重新读取/etc/lilo.conf中的信息。
另外就是用户的密码包括根用户的密码,系统默认的用户密码是5位。您可以编辑"/etc/login.defs"文件,把最小口令长度由5改成8。找到 PASS_MIN_LEN 5 这一行,改为:PASS_MIN_LEN 8 。"login.defs"是很重要的配置文件。可以在这个文件中设定一些其它的安全策略,比如:口令的有效期。
口令的选择不应包括字典中有的词汇,这样是十分危险的。正确的口令应该足够长,比且使用一些特殊字符。
系统中有许多预置帐号,如果你没有使用,一定要将这些帐号删掉。这些没有安全的口令对系统的安全性是一个巨大的挑战。
一个值得注意的命令是chage.您可以使用它设置帐号的时间限制。(具体见man chage).
对于根用户而言,您可以设置/etc/securetty.这个文件可以限制根用户登陆的控制台。您可以用"#"符号注释掉不许可根用户登陆的控制台号。
可以通过下面的脚本禁止对控制台的访问:
# !/bin/shcd /etc/pam.dfor i in * ; dosed '/[^#].*pam_console.so/s/^/#/' < $i > foo && mv foo $Idone

然后禁止使用所有的控制台程序,如:shutdown和halt。可以运行下面的命令来实现:
[root@sound]# rm -f /etc/security/console.apps/servicename

截短您的"~/.bash_history"文件,这个文件中保存着以前使用的命令列表。截短这个文件可以使您以前执行过的命令暴露在别人眼光下的机会减小.(在您的命令中很可能包括象密码信息这样的保密信息)。通过编辑/etc/profile的下面两项可以做到这一点:
HISTFILESIZE=20HISTSIZE=20

__ 通过下面的措施可以防止任何人都可以su为root:
1编辑su文件(vi /etc/pam.d/su)在文件的头部加入下面两行:
auth sufficient /lib/security/pam_rootok.so debugauth required /lib/security/pam_wheel.so group=wheel

2 然后把您想要执行su成为root的用户放入wheel组
[root@sound]# usermod -G10 admin

2.2 权限与文件系统
linux的ext2文件系统有属性功能这个特点。我们可以用lsattr命令列出文件的属性,用chattr命令改变文件的属性。文件系统的属性有很多种,我们在这里要注意的是两个属性:
a   只可添加属性i   不可改变属性

对于系统种的配置文件,最好设置不可改变属性,而对于一些日志文件最好设置只可添加属性。下面是两个具体例子:
chattr  +i  /etc/inetd.confchattr  +a  /var/log/secure

如果要去掉这些属性,将上面命令中的"+"号变为"-"号。
另外我们要对mount的文件系统做限制,这个配置在/etc/fstab中。通过设置mount选项我们可以使我们mount上来的文件系统更安全。常用的mount选项有default,nodev,noexec,nosuid,noatime,ro,user等。
我们还可以对系统资源做限制使我们的系统更加安全,看下面的方法:
编辑limits.conf文件(vi /etc/security/limits.conf),加入或改变下面这些行:
* hard core 0* hard rss 5000* hard nproc 20

这些行的的意思是:"core 0"表示禁止创建core文件;"nproc 20"把最多进程数限制到20;"rss 5000"表示除了root之外,其他用户都最多只能用5M内存。上面这些都只对登录到系统中的用户有效。通过上面这些限制,就能更好地控制系统中的用户对进程、core文件和内存的使用情况。星号"*"表示的是所有登录到系统中的用户。
然后必须编辑"/etc/pam.d/login"文件,在文件末尾加入下面这一行:
session required /lib/security/pam_limits.so

2.3 其他一些设置
1 在/etc/inetd.conf中注释掉不需要的服务
2 在/etc/host.allow和/etc/host.deny中设置可以访问您的系统的计算机。
3 通过下面的方法使系统对ping没有反应 echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all
4_用下面的命令在你的服务器上禁止IP原路径路由:
for f in /proc/sys/net/ipv4/conf/*/accept_source_route; doecho 0 > $fdone

__把上面的命令加到"/etc/rc.d/rc.local"文件中去.
5 用下面的方法提高系统防止SYN攻击的能力:
[root@sound]# echo 1 > /proc/sys/net/ipv4/tcp_syncookies

把这个命令加入"/etc/rc.d/rc.local"文件中
6 使Control-Alt-Delete软关机无效
编辑inittab文件(vi /etc/inittab)把这一行:
ca::ctrlaltdel:/sbin/shutdown -t3 -r now

改为:
#ca::ctrlaltdel:/sbin/shutdown -t3 -r now

用下面的命令使改变生效:
[root@sound]# /sbin/init q

7 去掉用户提示信息
编辑"/ect/rc.d/rc.local"文件,在下面这些行的前面加上"#":
--# This will overwrite /etc/issue at every boot. So, make any changes you# want to make to /etc/issue here or you will lose them when you reboot.#echo "" > /etc/issue#echo "$R" >> /etc/issue#echo "Kernel $(uname -r) on $a $(uname -m)" >> /etc/issue##cp -f /etc/issue /etc/issue.net#echo >> /etc/issue--

然后删除"/etc"目录下的"issue.net"和"issue"文件: "/etc/issue.net"文件是用户从网络登录计算机时(例如:telnet、SSH),看到的登录提示。同样在"/etc"目录下还有一个"issue"文件,是用户从本地登录时看到的提示。这两个文件都是文本文件,可以根据需要改变。但是,如果想删掉这两个文件,必须向上面介绍的那样把"/etc/rc.d/rc.local"脚本中的那些行注释掉,否则每次重新启动的时候,系统又会重新创建这两个文件。

参考资料
 楼主| 发表于 2007-5-13 22:17:53 | 显示全部楼层
linux系统安全(二): 日志
我们主要讲一下Linux环境中的系统记帐和系统日志管理以及怎么用一些工具更加方便有效的管理日志信息。
当我们用上面的方法进行了 Linux 服务器的安装和一些基本的设置后,我们的服务器应该说来是比较安全的。但是总是还会有黑客可以通过各种方法利用系统管理员的疏忽侵入我们的系统。他们的一举一动都会记录到系统的日志之中,尽管他们可能可以改变这些日志信息,甚至用自己的程序替换掉我们系统本身的命令程序,但是通过日志我们总还是能找到一些蛛丝马迹。下面我们主要讲一下 Linux 环境中的系统记帐和系统日志管理以及怎么用一些工具更加方便有效的管理日志信息。
1 系统记帐
最初开发的系统记帐用于跟踪用户资源消费情况,从用户帐号中提取费用为目地的。现在我们可以把它用于安全目的,给我们提供有关在系统中发生的各种活动的有价值信息。
系统记帐主要非为两类:
1) 连接记帐
连接记帐是跟踪当前用户当前对话、用户登录和退出的活动。在 Linux 系统中使用 utmp (动态用户对话)和 wtmp (登录/退出日志记录)工具来完成这一记帐过程。Wtmp 工具同时维护重新引导和系统状态变化信息。各种程序对这些工具进行刷新和维护,因此无须进行特殊的后台进程或程序。然而,utmp 和 wtmp 输出结果文件必须存在,如果这些文件不存在会关闭连接记帐。与 utmp 和 wtmp 有关的所有数据将分别保存在 /var/run/utmp 和 /var/log/wtmp 中。这些文件归根用户所有。这些文件中的数据是用户不可读的,但也有工具可以转换成可读的形式。
dump-utmp 可以转换连接记帐数据为可读的 ASCII 格式数据。
ac 命令提供了有关用户连接的大概统计,我们可以使用带有标志 d 和 p 的 ac 命令。标志 d 显示了一天的总连接统计,标志 p 显示了每一个用户的连接时间。这种统计信息的方式对了解与探测入侵有关的用户情况及其他活动很有帮助。Last 和 who 是出于安全角度定期使用的最常用命令。
last 命令提供每一个用户的登录时间,退出登录时间,登录位置,重新引导系统及运行级别变化的信息。last -10 表示 last 的最多输出结果为最近的 10 条信息。缺省时 last 将列出在 /var/log/wtmp 中记录的每一连接和运行级别的变化。从安全角度考虑,last 命令提供了迅速查看特定系统连接活动的一种方式。观察每天的输出结果是个好习惯,从中可以捕获异常输入项。Last 命令的 -x 选项可以通知系统运行级别的变化。
who 命令主要作用是报告目前正在登录的用户、登录设备、远程登录主机名或使用的 Xwindows 的 X 显示值、会话闲置时间以及会话是否接受 write 或 talk 信息。
例如: who -iwH 的输出结果:
USER     MESG    LINE   LOGIN-TIME      IDLE    FROMDenny      -     tty1   Feb 18 08:42    old这就表示用户 Denny 不能接受 write 或 talk 信息,2月18日8:42 从 tty1 登录。该命令的安全值提供了用户连接的大致情况,这也为监视可疑活动提供了条件。 其他的有关命令有 lastlog 命令,该命令报告了有关 /var/log/lastlog 中记录的最后一次登录的数据信息。
2) 进程记帐
进程记帐是对进程活动的记录。原数据保存在 /var/log/pacct 文件中,其许可权限为 600。该文件的存在是进程记帐有效的保障。与连接记帐不同,进程记帐必须处于打开状态,使用下面的命令设置打开状态.
#    accton  /var/log/pacct可以使用自选文件代替 /var/log/pacct,但必须记住这一文件并且设置适当的许可权限。必须在每次引导的时候执行该命令,可以在 /etc/rc.d/rc.local 中输入以下脚本:
#  initiate  process accountif  [ -x  /sbin/accton  ]then/sbin/accton   /var/log/pacctecho  "process  accounting  initiated"fi一旦在系统中配置进程记帐后,将使用 3 个命令解释在 /var/log/pacct 中的非用户可读的原数据。这些命令分别为 dump-acct,该命令与 dump-utmp 完全相似,sa 命令用于统计系统进程记帐的大致情况,最后一个是 lastcomm 命令列出了系统执行的命令。
1 sa 命令
与 ac 命令一样,sa 是一个统计命令。该命令可以获得每个用户或每个命令的进程使用的大致情况,并且提供了系统资源的消费信息。在很大程度上,sa 又是一个记帐命令,对于识别特殊用户,特别是已知特殊用户使用的可疑命令十分有用。另外,由于信息量很大,需要处理脚本或程序筛选这些信息。
可以用这样的命令单独限制用户:
#    sa -u |grep joejoe     0.00   cpu   bashjoe     0.00   cpu   lsjoe     0.01   cpu   lsjoe     0.01   cpu   lastcommjoe     0.01   cpu   tcpdumpjoe     0.01   cpu   reboot输出结果从左到右依次为:用户名、CPU 使用时间秒数、命令(最多为 16 个字符)。
2 lastcomm 命令
与 sa 命令不同,lastcomm 命令提供每一个命令的输出结果,同时打印出与执行每个命令有关的时间印戳。就这一点而说,lastcomm 比 sa 更有安全性。
lastcomm 命令使用命令名,用户名或终端名作为变量。该命令可以查询进程记帐数据库。下面显示 lastcomm joe 的输出结果,每行表示命令的执行情况,从左到右为:用户、设备、使用的 cpu 时间秒数、执行命令的日期和时间。
#   lastcomm joereboot     joe    ttyp1    0.01    secs  Fri  Feb 26  18:40tcpdump   joe    ttyp1    0.01    secs  Fri  Feb 26  18:39lastcomm  joe    ttyp1    0.01    secs  Fri  Feb 26  18:32ls        joe    ttyp1    0.01    secs   Fri  Feb 26  18:30ls        joe    ttyp1    0.00    secs   Fri  Feb 26  18:28bash      joe    ttyp1    0.00    secs   Fri  Feb 26  18:25如果系统被入侵,请不要相信在 lastlog、utmp、wtmp、pacct 中记录的信息,但也不要忽略,因为这些信息可能被修改过了。另外有可能有人替换了who程序来掩人耳目。
通常,在已经识别某些可疑活动后,进程记帐可以有效的发挥作用。使用 lastcomm 可以隔绝用户活动或在特定时间执行命令。但是使用该命令必须设置为打开状态。
基本上,/var/log/pacct,/var/run/utmp, /var/log/pacct是动态数据库文件。其中/var/log/pacct和/var/log/wtmp文件随着输入项的增加和修改而增加。问题在于这些文件处于动态增加状态,因此到一定程度就会变的很大。
我们可以通过一个叫 logrotate 的程序来解决上面这个问题,该程序读 /etc/logrotate.conf 配置文件,该配置文件告诉 logrotate 所要读 /etc/logrotate.d 目录中的文件。可以通过它来设定日志文件的循环时间。




回页首



2 系统日志
在 Linux 下使用各种日志文件,有些用于某些特殊用途,例如:/var/log/xferlog 用于记录文件传输协议 FTP 的信息。其他日志文件,例如 /var/log/messages 文件通常包含许多系统和内核工具的输入项。这些日志文件为系统的安全状态提供了信息。
我们主要讲解两个日志守护程序---syslog和klogd------并且简要叙述了由Linux操作系统生成的其他其他日志文件。目的是提供基本的配置情况。
2.1 syslog系统日志工具
大部分的 Linux 系统中都要使用 syslog 工具,它是相当灵活的,能使系统根据不同的日志输入项采取不同的活动。下面将详细讨论syslog 的工作机制以及在配置文件 /etc/syslog.conf 中的配置,还将论述利用 syslog 灵活性和功能性进行工作的各种方法。
1) 概述
非常简单,syslog 工具由一个守护程序组成。它能接受访问系统的日志信息并且根据 /etc/syslog.conf 配置文件中的指令处理这些信息。程序,守护进程和内核提供了访问系统的日志信息。因此,任何希望生成日志信息的程序都可以向 syslog 接口呼叫生成该信息。
通常,syslog 接受来自系统的各种功能的信息,每个信息都包括重要级。/etc/syslog.conf 文件通知 syslogd 如何根据设备和信息重要级别来报告信息。
2) etc/syslog.conf
/etc/syslog.conf 文件使用下面的形式
facility.level    action空白行和以#开头的行可以忽略。Facility.level 字段也被称做 seletor。应该使用一次或多次 tab 键分隔 facility 和 action。大部分 Linux 使用这些空格为分隔符。现在分析一下 /etc/syslog.conf 中的三个要素。
facility 指定 syslog 功能,主要包括以下这些:
auth  由 pam_pwdb 报告的认证活动。authpriv 包括特权信息如用户名在内的认证活动cron  与 cron 和 at 有关的信息。daemon 与 inetd 守护进程有关的信息。kern  内核信息,首先通过 klogd 传递。lpr   与打印服务有关的信息。mail  与电子邮件有关的信息mark  syslog 内部功能用于生成时间戳news  来自新闻服务器的信息syslog  由 syslog 生成的信息user   由用户程序生成的信息uucp   由 uucp 生成的信息local0----local7   与自定义程序使用,例如使用 local5 做为 ssh 功能*   通配符代表除了 mark 以外的所有功能与每个功能对应的优先级是按一定顺序排列的,emerg 是最高级,其次是 alert,依次类推。缺省时,在 /etc/syslog.conf 记录中指定的级别为该级别和更高级别。如果希望使用确定的级别可以使用两个运算符号!(不等)和=。
user.=info
表示告知 syslog 接受所有在 info 级别上的 user 功能信息。
syslog 级别如下:
emerg 或 panic   该系统不可用alert            需要立即被修改的条件crit             阻止某些工具或子系统功能实现的错误条件err             阻止工具或某些子系统部分功能实现的错误条件warning         预警信息notice           具有重要性的普通条件info             提供信息的消息debug           不包含函数条件或问题的其他信息none            没有重要级,通常用于排错*               所有级别,除了noneaction字段所表示的活动具有许多灵活性,特别是,可以使用名称管道的作用是可以使 syslogd 生成后处理信息。
syslog 主要支持以下活动
file     指定文件的绝对路径terminal 或 print    完全的串行或并行设备标志符@host   远程的日志服务器username  发送信息到使用 write 的指定用户中named pipe  指定使用 mkfifo 命令来创建的 FIFO 文件的绝对路径。



3) 调用 syslogd 守护程序
syslog 守护程序是由 /etc/rc.d/init.d/syslog 脚本在运行级2下被调用的,缺省不使用选项。但有两个选项 -r 和 -h 很有用。
如果将要使用一个日志服务器,必须调用 syslogd -r。缺省情况下 syslog 不接受来自远程系统的信息。当指定 -r 选项,syslogd 将会监听从 514 端口上进来的 UDP 包。
如果还希望日志服务器能传送日志信息,可以使用 -h 标志。缺省时,syslogd 将忽略使其从一个远程系统传送日志信息到另一个系统的/etc/syslog.conf 输入项。
4) klogd 守护进程
klogd 守护进程获得并记录 Linux 内核信息。通常,syslogd 会记录 klogd 传来的所有信息,然而,如果调用带有 -f filename 变量的 klogd 时,klogd 就在 filename 中记录所有信息,而不是传给 syslogd。当指定另外一个文件进行日志记录时,klogd 就向该文件中写入所有级别或优先权。Klogd 中没有和 /etc/syslog.conf 类似的配置文件。使用 klogd 而避免使用 syslogd 的好处在于可以查找大量错误。如果有人入侵了内核,使用 klogd 可以修改错误。
5) 其他日志
在 /var/log 和不同版本的系统中以及自己配置的应用程序中都可以找到其他日志文件。当然,/etc/syslog.conf 列出了由 syslogd 管理的所有日志文件名和位置。其他日志由其他应用程序管理。例如在 Redhat6.2 中,apache server 生成 /var/log/htmlaccess.log 文件记录客户访问,生成 /var/log/httpd/error.log 文件在 syslog 以外查找错误。
cron 工具维护的信息日志文件 /var/log/cron。当 Linuxconf 工具记录系统重新配置信息时,将生成日志文件如 /var/log/nerconf.log。samba 在 /var/log/samba 中维护其日志信息。
另外由于 syslogd 在系统非常繁忙时,可能会丢失信息,所以,可以用 cyclog 替换 syslog。
 楼主| 发表于 2007-5-13 22:18:33 | 显示全部楼层
我们把主要精力放在用Linux搭建安全的服务器上面。我们通过系统设置和一些共享的安全软件固化我们的系统,使其能做到真正的安全。第一部分主要从安装和设置方面阐述 Linux 作为服务器应注意的方面。
下面介绍一些可以用于 Linux 的安全工具,这些工具对于固化您的服务器将起到一定的作用,可以解决各方面的问题。我们的重点只是想让您了解这些工具,对安装配置以及使用不会给出很详细的介绍。
介绍这些工具的目的只是给您一个提示的方向,并不是让您拘泥于这些工具。毕竟安全是一个过程,不是一个产品。
1 Sxid
sxid 是一个系统监控程序。它可以监视系统中 suid,sgid 文件以及没有属主的变化。并且以可选的形式报告这些改变,你可以在配置文件中设置用 email 的形式通知这些改变,也可以不使用 email 而直接在标准输出上显示这些变化。Suid,sgid 文件以及没有属主的文件很有可能是别人放置的后门程序,这些都是您所要特别注意的。
如果您安装过其他工具,那么您一定也会安装这个工具,它在安装上没有什么特别的地方。
缺省安装的时候,配置文件为 /usr/local/etc/sxid.conf,这个文件中有很明显的注释很容易看懂。在这个文件中定义了 sxid 的工作方式。日志文件缺省为 /var/log/sxid.log,日志文件的循环次数在 sxid.conf 文件中定义。您可以在配置固定后把 sxid.conf 设置为不可改变,把 sxid.log 设置为只可添加(使用 chattr 命令)。
您可以用 sxid -k 加上 -k 选项来进行检查,这时检查很灵活,既不记入日志,也不会发出 email。这样您就可以随时做检查。但是我还是建议您把检查放入 crontab 中,使用 crontab -e 编辑加入下面的条目:
        0 4 * * * /usr/bin/sxid   

表示每天上午 4 点执行这个程序。
如果您还想了解更详细的信息,可以参考:
man  sxidman  5  sxid.conf





回页首


2 Skey
您认为您的密码安全吗?即使您的密码很长,有很多特殊字符,解密工具很难破解,但您的密码在网络中传送时是以明文形式的,在以太网中随便一个嗅探器就可以截取您的密码。现在在交换环境中也能实现这种技术。在这种情况下,skey 对您来说是一个选择。
Skey 是一次性口令的一个工具。它是一个基于客户\服务器的应用程序。首先在服务器端可以用 keyinit 命令为每个用户建立一个 skey 客户,这个命令需要指定一个秘密口令,然后就可以为客户端的用户产生一次性口令列表。当用户通过 telnet,ftp 等与服务器进行连接时就可以按照一次性口令列表中的口令顺序输入自己的密码,下次再连接时候密码就换成了列表中的下一个。
skey 的服务器端使用有下面的步骤:
1 使用下面的命令初始化用户 mary:
keyinit mary
keyinit 每次为用户生成 99 个一次性口令,这时就会在 /etc/skeykeys 文件
建立这个用户,该文件中保存了服务器端计算下一个一次性口令的一些信息。用上面的 keyinit 命令时就会在 /etc/skeykeys 中有下面的记录:
mary  0099  to25065  be9406d891ac86fb  Mar  11, 2001 04:23:12

上面的记录中从左到右依次是用户名,要使用的一次性口令序号,口令的种类,16 进制表示的口令,日期和时间。
2 将一次性口令列表提供给 mary
您可以打印出口令列表然后送给 mary。这样比较安全,密码不会在网络中传递。
3 为 mary 修改缺省的登陆 shell 为 /usr/local/bin/keysh
由于 PAM 的作用,mary 登陆时要输入密码,她输入这个一次性口令后服务器端要对这个口令进行校验,校验通过连接就被许可了。
可能有些用户不喜欢书面的口令列表,用户可以使用 key 命令在自己的客户端得到一次性口令。您可以通过开两个窗口,一个对服务器进行连接获得一次性口令的种类和序号,然后在另一个窗口用 key 命令根据口令的种类和序号获得所要的密码。但是必须提醒您,您这样的方便是以一定的危险性为代价的。
如果您的缺省的 99 个口令用完了,您可以使用 keyinit -s 刷新口令列表。
在 /usr/src/skey/misc 目录中有许多其他的替换 keysh 的提供其他服务的程序,例如:su,login,ftp 等等。这样您可以应付不同的服务的连接请求了。
为了安全,您最好设置一下/etc/skeykeys 文件的属性和权限。




回页首


3 三个日志管理工具
3.1 logrotate
一般的 Linux 发行版中都自带这个工具。日志文件过大如何处理是一个问题。它可以自动使日志循环,删除保存最久的日志。你可以把它放在 crontab 中,每天定期运行。这在很多 linux 发行版中都是缺省设置的。
您可以从下面的网址获得新版本的 logrotate:
ftp://ftp.redhat.com/pub/redhat
它的配置文件是 /etc/logrotate.conf 我们可以在这个文件中设置日志的循环周期,日志的备份数目,以及如何备份日志等等。
在 /etc/logrotate.d 目录下包括一些工具的日志循环设置文件。例如:syslog,samba,cron 等等,在这些文件中指定如何根据 /etc/logrotate.conf 做日志循环,您也可以在这里面添加其他的文件以循环其他服务的日志。
关于配置文件的详细信息您可以参阅 man logrotate。
最后还是提醒您使用 cron 运行 logrotate。
3.2 swatch
swatch 是一个实时的日志监控工具。您可以设置您所感兴趣的事件,它可以在事件发生的时候告诉您。Swatch 有两种运行方式:一种可以在检查日志完毕退出,另一种可以连续监视日志中的新信息。
Swatch 提供了许多通知方式,例如:email,振铃,终端输出,多种颜色等等。
您可以从下面的站点下载:
ftp://ftp.stanford.edu/general/security-tools/swatch/
swatch 的安装需要一些 perl 库的支持,安装前确信您的系统已经可以支持 perl。
Swatch 可以在命令行中进行一些简单的设置,例如日志循环时告诉 swatch 在循环完毕后重新启动等等。
配置文件 swatchmessage 是 swatch 软件的重点。这个文本文件告诉 swatch 需要监视什么日志,需要寻找什么触发器,和当触发时所要执行的动作。当 swatch 发现到与 swatchmessage 中定义的触发器正则表达式相符时,它将执行在 swatchrc 中定义的通知程序。Swatch 通过使用/usr/bin/tail -f 实时监视日志文件。
在这里我们不想过多的将如何配置,配置 swatch 非常简单,您可以参考 swatch 自带的配置文件。针对每个服务例如:ftp,sendmail 等等,你必须为每个您所关心的服务配置一个 swatchmessage 文件。
Swatch 启动时可以带很多参数,但使用通常如下格式启动它就可以了:
/usr/local/bin/swatch -c /var/log/syslogmessage -t /var/log/syslog  -r 06:00&-c 参数用于指定配置文件,-t 参数指定实时监视的日志文件,-r 指定重起的时间,"&" 使 swatch 在后台运行。启动后,swatch 产生子进程,因此 swatch 是以两个进程运行的,在停止 swatch 时必须杀掉两个进程。
也可以通过 logrotate 配置在日志循环后重起 swatch,可以在 /etc/logrotate.d 建立一个您所要关心的日志的循环文件,其中最关键的是要加入下面这行:
/usr/local/bin/swatch -c /var/log/syslogmessage -t /var/log/syslog  -r + 0

其他的地方可以仿造别的同目录下的文件。
3.3 logcheck
审核和记录系统的事件是非常重要的。特别是当你的计算机连接到 Internet 上之后,系统管理员如果对"异常"的事件保持警觉,就能防止系统被入侵。在 Unix 系统中如果仅仅把系统事件作为日志记录下来,而不去查看,还是无济于事。logchek 可以自动地检查日志文件,先把正常的日志信息剔除掉,把一些有问题的日志保留下来,然后把这些信息 email 给系统管理员。Logcheck 被设计成自动运行,定期检查日志文件以发现违反安全规则以及异常的活动。logcheck 用 logtail 程序记住上次已经读过的日志文件的位置,然后从这个位置开始处理新的日志信息。
可以在下面的站点获得 logcheck:
http://www.psionic.com/abacus/logcheck/
logcheck 主要由下面几个主要的文件:
1 logcheck.sh
这个是一个可执行的脚本文件,里面记录 logcheck 检查那些日志文件等 logcheck 运作所必须的信息。您可以把它加入 crontab 中定时运行。
2 logcheck.hacking
它和下面的三个文件一样,是 logcheck 检查的模式文件。他们四个文件按从上到下的顺序执行。这个文件表明了入侵活动的模式。
3 logcheck.violations
这个文件表示有问题,违背常理的活动的模式。优先级小于上面的那个模式文件。
4 logcheck.violations.ignore
这个文件和上面的 logcheck.violations 是相对的,是您所不关心的问题的模式文件。
5 logcheck.ignore
这是检查的最后一个模式文件。如果没有和前三个模式文件匹配,也没有匹配这个模式文件的话,则输出到报告中。
6 logtail
这个文件记录日志文件信息。
Logcheck首次运行时读入相关的日志文件的所有内容。Logtail 在日志文件的目录下为每个关心的日志文件建立一个 logfile.offset 的偏移量文件,以便于下次检查时从这个偏移量开始检查。Logcheck 执行时未被忽略的内容通过邮件的形式发送给 logcheck.sh 中 SYSADMIN 指定的用户。
Logcheck 的通知没有那么实时,但是相对于 swatch 它更适合于分布式日志文件系统。因为它不必为每个日志文件建立一个进程。在 Turbolinux 中就集成了 logcheck 工具。




回页首


4 ssh
   传统的网络服务程序,如:ftp、pop 和 telnet 在本质上都是不安全的,因为它们在网络上用明文传送口令和数据,别有用心的人非常容易就可以截获这些口令和数据。而且,这些服务程序的安全验证方式也是有其弱点的,就是很容易受到"中间人"(man-in-the-middle)这种方式的攻击。所谓"中间人"的攻击方式,就是"中间人"冒充真正的服务器接收你的传给服务器的数据,然后再冒充你把数据传给真正的服务器。
通过使用 SSH,你可以把所有传输的数据进行加密,这样"中间人"这种攻击方式就不可能实现了,而且也能够防止 DNS 和 IP 欺骗。还有一个额外的好处就是传输的数据是经过压缩的,所以可以加快传输的速度。SSH有很多功能,它既可以代替 telnet,又可以为 ftp、pop、甚至 ppp 提供一个安全的"通道"。
最初 SSH 是由芬兰的一家公司开发的。但是因为受版权和加密算法的限制,现在很多人都转而使用 OpenSSH。OpenSSH 是 SSH 的替代软件,而且是免费的,可以预计将来会有越来越多的人使用它而不是 SSH。
   从客户端来看,SSH 提供两种级别的安全验证。
第一种级别是基于口令的安全验证,这种机制就相当于普通的 telnet 等服务的口令认证机制。
第二种级别是基于密匙的安全验证。你必须为自己创建一对密匙,并把公用密匙放在需要访问的服务器上。如果你要连接到 SSH 服务器上,客户端软件就会向服务器发出请求,请求用你的密匙进行安全验证。服务器收到请求之后,先在你在该服务器的家目录下寻找你的公用密匙,然后把它和你发送过来的公用密匙进行比较。如果两个密匙一致,服务器就用公用密匙加密"质询"(challenge)并把它发送给客户端软件。客户端软件收到"质询"之后就可以用你的私人密匙解密再把它发送给服务器。
可以在下面的站点下载:
http://violet.ibs.com.au/openssh/
"/etc/ssh/ssh_config" 文件是 OpenSSH 客户端的配置文件,允许你通过设置不同的选项来改变客户端程序的运行方式。这个文件的每一行包含"关键词-值"的匹配,其中"关键词"是忽略大小写的。用 man 命令查看帮助页(ssh (1))可以得到详细的说明。
"/etc/ssh/sshd_config" 是 OpenSSH 的服务器端配置文件,允许设置选项改变这个 daemon 的运行。这个文件的每一行包含"关键词-值"的匹配,其中"关键词"是忽略大小写的。用 man 命令查看帮助页(sshd (8))可以得到详细的说明。
配置 OpenSSH 使其使用 TCP-Wrappers inetd 超级服务器,编辑 "inetd.conf" 文件(vi /etc/inetd.conf)并加入这一行:
ssh stream tcp nowait root /usr/sbin/tcpd sshd -i

注意:"-i"参数很重要,它说明 sshd 是被 inetd 运行的。
现在我们为本地服务器创建私有和公用密匙,执行下面的命令:
[root@sound]# su username [username@sound]$ ssh-keygen1

产生密钥后把本机的公用密匙(identity.pub)拷贝到远程主机的"/home/username/.ssh"目录下,例如,使用"authorized_keys"这个名字。
用加上"-p"参数的"ssh-keygen"命令,在任何时候都可以改变初始的密码。
下面列出的是一些我们经常要用到的命令,当然还有很多其它的命令,更详细的信息可以查看 man 帮助页或其它文档。
1 ssh
ssh(Secure Shell)是用来登录远程计算机和在远程计算机上执行命令的程序。它是用来替代 rlogin 和 rsh,以及在不安全的网络环境下在两台计算机之间提供安全和加密的信息交流。
使用下面的命令可以从客户端连接到远程主机 server:
[root@sound /]# su admin [admin@sound /]$ssh server

2 scp
可以用这个命令把文件从本地计算机拷贝到远程计算机,或者反之,甚至可以在两台远程计算机之间用 "scp" 命令拷贝文件。
用下面的命令把文件从远程主机拷贝到本地主机上:
[root@sound /]# su admin [admin@sound /]$ scp -p :/dir/for/file localdir/to/filelocation

用下面的命令把文件从本地主机拷贝到远程主机上:
[root@sound/]# su admin [admin@sound /]$ scp -p localdir/to/filelocation :/dir/for/file

注意:"-p" 选项表示文件的改变和访问时间属性以及权限,在拷贝过程中被保留。通常是需要这样的。




回页首


5 tripwire
如果有人侵入了您的系统,在您的系统中放置了木马和后门,您怎么才能知道呢?tripwire 就是这样一个对系统做完整性检查的工具。它是目前最为著名的 unix 下文件系统完整性检查的软件工具,这一软件采用的技术核心就是对每个要监控的文件产生一个数字签名,保留下来。当文件现在的数字签名与保留的数字签名不一致时,那么现在这个文件必定被改动过了。
当Tripwire 运行在数据库生成模式时,会根据管理员设置的一个配置文件对指定要监控的文件进行读取,对每个文件生成相应数字签名,并将这些结果保存在自己的数据库中,在缺省状态下,MD5 和 SNCFRN(Xerox 的安全哈希函数)加密手段被结合用来生成文件的数字签名。除此以外,管理员还可使用 MD4,CRC32,SHA 等哈希函数,但实际上,使用上述两种哈希函数的可靠性已相当高了,而且结合 MD5 和 sncfrn 两种算法(尤其是 sncfrn)对系统资源的耗费已较大,所以在使用时可根据文件的重要性做取舍。当怀疑系统被入侵时,可由 Tripwire 根据先前生成的,数据库文件来做一次数字签名的对照,如果文件被替换,则与 Tripwire 数据库内相应数字签名不匹配, 这时 Tripwire 会报告相应文件被更动,管理员就明白系统不"干净"了。
可以从下面站点获得 tripwire:
http://www.tripwiresecurity.com
"/usr/TSS/policy/twpol.txt" 文件是纯文本的策略文件,设置 Tripwire 需要检测哪些文件和目录(也叫系统对象)。其中有一个规则设定如何检测需要监控的对象,还有一个特性(property)设置如何检测。特性掩码(property mask)设定进行一致性检验的时候单独文件的特性(property)。属性(Attributes)帮助规定成组的策略如何运作。
您可以根据您的需要修改 twpol.txt 这个策略文件,然后当第一次准备使用策略文件的时候,用下面的安装它:
[root@sound]# twadmin --create-polfile /usr/TSS/policy/twpol.txt

第一次创建基准数据库:用下面的命令
[root@sound]# tripwire { --init }

一致性检查把当前文件系统中的对象及其属性和 Tripwire 数据库中的进行比较。一旦发现异常情况,就会在标准输出上显示出来,报表文件也会被保存下来,以后可以用 "twprint" 命令查看:
[root@sound]# tripwire { --check }

用下面的命令进行交互式的检查:
[root@sound]# tripwire --check --interactive

用下面的命令进行一致性检查并用email发送报表:
[root@sound]# tripwire --check --email-report

用下面的命令更新数据库:
[root@sound]# tripwire --update -r /usr/TSS/report/sound.openarch.com-200001-021854.twr

"-r"参数读取指定的报表文件(deep.openarch.com-200001-021854.twr)。因为当前的配置文件的 REPORTFILE 变量使用$(DATE),所以"-r"这个参数是必须的。
用下面的命令更新策略文件:
[root@deep]# tripwire --update-policy /usr/TSS/policy/newtwpol.txt

在默认情况下,策略更新模式使用"--secure-mode high"。如果文件系统在最近的一次数据库更新之后发生了变化,而且这个变化会违反策略文件中定义的规则,那么在高安全级别的模式下运行你可能会遇到一些问题。例如这种情况:其他的管理员在策略更新的过程中,改变了一些文件。为了解决这个问题,确信在高安全级别的模式下所有的变化都是正常的之后,可以采用低级别的安全模式更新策略文件:
用下面的命令在低级别的安全模式下更新策略文件:
[root@sound]# tripwire --update-policy --secure-mode low /usr/TSS/policy/newtwpol.txt

如果想查找详细的资料可以用man命令查帮助页,读取相关信息。




回页首


6 portsentry
我们可以通过防火墙限制自己系统中什么端口开放,什么端口不开放。对于外部的人们来说,这些信息都是保密的。黑客为了得到您机器中开放的端口,往往会进行各种方式的扫描,这样的扫描软件在互联网上也随处都是。一般的扫描活动都是进行入侵的前奏,对安全是极大的危险。
Portsentry 就是一个反扫描工具。它可以实时发现并分析记录对本机的扫描, 它主要做以下工作:
  • 通过 syslog 做记录
  • 将扫描的主机加入 /etc/hosts.deny
  • 马上禁止所有通向扫描主机的网络流量
  • 过滤掉所有来自扫描主机的网络流量
您可以从下面的网站获得portsentry:
http://www.psionic.com/abacus/portsentry/
"/usr/psionic/portsentry/portsentry.conf"是 portsentry 的主配置文件。您可以在这个文件中设置您所要监听的端口,以及哪些 ip 地址被拒绝,哪些被忽略等等信息。如果您了解详细的信息,可以查看 "README.install" 文件。
"/usr/psionic/portsentry/portsentry.ignore" 文件定义了在执行端口扫描分析时必须要忽略的主机,也就是说即使这些主机进行了扫描活动,portsentry 也不会采取任何行动。
Portsentry 有以下6种启动方式:
    portsentry -tcp (basic port-bound TCP mode)  portsentry -udp (basic port-bound UDP mode)  portsentry -stcp (Stealth TCP scan detection)  portsentry -atcp (Advanced TCP stealth scan detection)  portsentry -sudp ("Stealth" UDP scan detection)  portsentry -audp (Advanced "Stealth" UDP scan detection)  

建议您可以使用下面两种方式启动 portsentry:
   portsentry -atcp (Advanced TCP stealth scan detection)  portsentry -sudp ("Stealth" UDP scan detection)  

一种 tcp 启动方式和一种 udp 启动方式可以同时进行。
您可以把下面的两个命令加入 "/etc/rc.d/rc.local" 中,当系统重起时自动启动:
[root@sound /]# /usr/psionic/portsentry/portsentry -atcp[root@sound /]# /usr/psionic/portsentry/portsentry -sudp

对于更详细的信息您可以查阅 man 手册和 portsentry 自带的帮助文件。




回页首


7 openssl
一些服务器端的软件例如:IMAP & POP, Samba, OpenLDAP, FTP, Apache 等等在给用户提供服务的时候要对用户进行认证,只有在认证通过后服务才会被许可。而 client/server 方式的服务客户端和服务端之间通讯都是以明文方式进行的,openssl 正是提供了对传输的数据的一种加密方式。Openssl 可以安装在 Linux 服务器上,它需要一些第三方提供的应用程序来为服务提供加密。
下面看一些使用 openssl 加密能为我们提供的好处:
1 数据的保密性
openssl 实际在真正的数据加密上使用的是对称算法,一个密钥既用来加密也用来解密。我们在公开的网络介质上传输的再不是明文,即使有人能截获这些数据,没有密钥也是很难进行解密的。
2 数据的完整性
openssl 对数据用 hash 算法一个消息文摘,然后用对方的公钥对消息文载做数字签名,消息文摘的加密使用的是非对称算法。然后消息文摘和数据一起传给接收方,接收方用自己的密钥先对数字签名进行解密,这样就保证了数据的完整性。
从下面的站点可以获得 openssl:
http://www.openssl.org/
编译安装以后还要执行下面几个命令:
[root@sound openssl-0.9.5a]# mv /etc/ssl/misc/* /usr/bin/[root@sound openssl-0.9.5a]# install -m 644 libRSAglue.a /usr/lib/[root@so. openssl-0.9.5a]# install -m 644 rsaref/rsaref.h /usr/include/openssl/"/etc/ssl/openssl.cnf"是 openssl 的主配置文件,里面要改动的主要是[CA_default ] 和[ req_distinguished_name ] 两个部分。
如果你想要使用 "openssl ca" 这个命令做 CA 证书时时,你需要建立一个 "sign.sh" 的脚本,这个脚本实际是存在的,在"/usr/bin/sign.sh", 您所要做的是在这个文件中加入一些东西。在 mod_ssl 的发行版中您也可以找到这个脚本。
下面我们举个例子讲述 openssl 的应用,我们用自己的 CA 为自己的 apache web server 做一个证书来签名我们自己的证书签名请求(CSR)。
1 为 apache web server 建立一个有密码保护的RSA私钥
[root@sound ssl]# openssl genrsa -des3 -out server.key 10242 用上面的 RSA 私钥产生一个证书签名请求(CSR)
[root@sound ssl]# openssl req -new -key server.key -out server.csr3 为我们自己的 CA 创建一个 RSA 私钥
[root@sound ssl]# openssl genrsa -des3 -out ca.key 10244 用 CA 的 RSA 密钥做一个自签名的 X509 格式的证书
[root@sound ssl]# openssl req -new -x509 -days 365 -key ca.key -out ca.crt5 将上面产生的私钥和证书移动到合适的目录下
    [root@deep ssl]# mv server.key private/   [root@deep ssl]# mv ca.key private/[root@deep ssl]# mv ca.crt certs/   

6 最后用我们自己的 CA 对证书签名
[root@sound ssl]# /usr/bin/sign.sh server.csr

更详细的信息请参考 man 帮助和程序自带的帮助。




回页首


8 Linux FreeS/WAN VPN
对于客户端与服务器之间的通讯用SSL进行加密是一个很好的选择,但是很多情况下需要建立一种企业级的通讯通道。在两个网关之间的 Internet上点到点的传递极其私密的数据,出于这种加密和认证的需要,IPSEC 应运而生。
IPSEC 是 Intenet 协议安全,它使用很强的密码系统提供认证和加密服务。IPSEC 在 IP 层进行加密,所以它对链路层的依赖型不大。它可以工作在各种底层网络上。IPSEC 可以为 IP 层以上的协议提供保护。对于用户来说,这种保护看起来是透明的。
IPSEC 可以提供在两个网关之间的不安全的互联网上的安全通道的这种能力。在这种通道中传送的数据都是要求保密性非常高的数据,数据在发送者的网关处加密,在接收者的网关处解密。这就是 VPN(Virtual Private Network)。Freeswan 就是在 Linux 下实现 IPSEC 的工具。
您可以到下面的站点下载 freeswan:
http://www.freeswan.org/
由于 freeswan 是以内核补丁形式提供的,所以您必须先下载 Linux 内核,再下载对应于内核的 freeswan。我们先要根据自己的系统情况修改 freeswan 的 Makefile 文件,然后用下面的命令进行编译,并且把 freeswan 加入到 Linux 内核的源代码中:
[root@sound freeswan-1.3]# make insert[root@sound freeswan-1.3]# make programs[root@sound freeswan-1.3]# make install

然后我们就需要编译内核,这里不想再介绍如何编译内核,只提示要改变的内核选项,下面这些选项您都要确定选"Y":
IPSec options (FreeS/WAN)IP Security Protocol (FreeS/WAN IPSEC) (CONFIG_IPSEC) [Y/n/?]IPSEC: IP-in-IP encapsulation (CONFIG_IPSEC_IPIP) [Y/n/?]IPSEC: PF_KEYv2 kernel/user interface (CONFIG_IPSEC_PFKEYv2) [Y/n/?]IPSEC: Enable ICMP PMTU messages (CONFIG_IPSEC_ICMP) [Y/n/?]IPSEC: Authentication Header (CONFIG_IPSEC_AH) [Y/n/?]HMAC-MD5 authentication algorithm (CONFIG_IPSEC_AUTH_HMAC_MD5) [Y/n/?]HMAC-SHA1 authentication algorithm (CONFIG_IPSEC_AUTH_HMAC_SHA1) [Y/n/?]IPSEC: Encapsulating Security Payload (CONFIG_IPSEC_ESP) [Y/n/?]3DES encryption algorithm (CONFIG_IPSEC_ENC_3DES) [Y/n/?]IPSEC Debugging Option (DEBUG_IPSEC) [Y/n/?]

一些内核选项会被 freeswan 自动打开,即使这些选项原来是关闭的。尽管这样还是建议您不要关闭下面的选项:
Kernel/User netlink socket (CONFIG_NETLINK) [Y/n/?]Netlink device emulation (CONFIG_NETLINK_DEV) [Y/n/?]

Freeswan 的配置文件 "/etc/ipsec.conf" 许可您设定您的 IPSEC 设置,连接类型以及控制信息等。IPSEC 目前支持两种类型的连接:手工连接和自动连接。手工连接需要的密钥保存在 "/etc/ipsec.conf" 文件中,这种连接没有自动连接安全。对于一个商业应用来说,使用手工(固定)密钥是不安全和不可靠的。在自动密钥连接模式下产生一个 256 位共享密钥,将其复制到连接通道的各个节点上后,那些企图截取数据包的网络攻击者将很难攻破这种安全连接。在自动密钥连接模式下,一个密钥的有效期是 8 个小时,这种配置有效地阻止了那些企图用暴力法猜出密钥的攻击者。自动连接的密钥由一个叫 Pluto 的密钥协商守候进程产生,缺省使用叫 IKE 的密钥协商协议。这个协议根据 "/etc/ipsec.secrets" 文件中的信息确定不同的系统。
我们下面举一个例子论述配置和使用的整个过程。假如我们有下面的 VPN 通道:
SubnetDeep===Deep------Deepgate..………....Mailgate-------Mail===SubnetMail                           Untrusted net左边子网= SubnetDeep (192.168.1.0/24)左边的主机 = Deep (deep.openna.com)(202.164.186.1)左边的网关 = Deepgate (205.151.222.250)Internet = Untrusted net右边的网关 = Mailgate (205.151.222.251)右边的主机 = Mail (mail.openna.com)( 208.164.186.2)右边的子网= SubnetMail (192.168.1.0/24)

我们要编辑 ipsec.conf 文件来来满足我们的需要。在这个文件中有两大个段落。第一个 "config" 是关于 IPSEC 的一些普通配置信息的,后一个 "conn" 指定特定的 IPSEC 连接通道。具体的配置信息可以参看 man 帮助页。
"ipsec.secrets" 包含 pluto 守候进程认证网关之间通讯的密钥。有两种类型的密钥,一种是共享的密钥,一种是RSA的私人密钥。下面的命令产生 256 位的共享密钥:
[root@deep /]# ipsec ranbits 256 > temp

现在这个共享密钥在 temp 文件中,我们要把它复制到 "ipsec.secrets" 文件中。"ipsec.conf" 和 "ipsec.secrets" 都要拷贝到 VPN 通道另一端的网关上。"ipsec.conf" 文件中的 "config setup" 字段可能要根据接口的不同有所改变。
接下来我们要创建 RSA 的密钥对了:
我们在两个网关上都建立密钥对:
[root@deep /]# ipsec rsasigkey --verbose 1024 > deep-keys[root@mail /]# ipsec rsasigkey --verbose 1024 > mail-keys

然后我们将前面产生的 temp 文件中的共享密钥放在每个网关的 "ipsec.conf" 文件中,在文件中的 "conn" 字段加入下面几行:
    authby=rsasig   leftrsasigkey=<Public key of deep>rightrsasigkey=<Public key of mail>

然后在两个网关上处理 deep-keys 和 mail-keys 这两个 RSA 公钥,我们把这个个文件中的 "#pubkey=" 部分拷贝到各自的 "ipsec.conf"中去,如下:
authby=rsasigleftrsasigkey=0x010395daee1be05f3038ae529ef2668afd79f5ff1b16203c9ceaef801cea9cb74bcfb51a6ecc08890d3eb4b5470c0fc35465c8ba2ce9d1145ff07b5427e04cf4a38ef98a7f29edcb4d7689f2da7a69199e4318b4c8d0ea25d33e4f084186a2a54f4b4cec12cca1a5deac3b19d561c16a76bab772888f1fd71aa08f08502a141b611frightrsasigkey=0x01037631b81f00d5e6f888c542d44dbb784cd3646f084ed96f942d341c7c4686cbd405b805dc728f8697475f11e8b1dd797550153a3f0d4ff0f2b274b70a2ebc88f073748d1c1c8821dc6be6a2f0064f3be7f8e4549f8ab9af64944f829b014788dd202cf7d2e320cab666f5e7a197e64efe0bfee94e92ce4dad82d5230c57b89edf

最后把deep-keys和mail-keys这两个文件中的剩余部分包括(包括私钥)放进"ipsec.secrets"中去。
然后重新启动带有IPSec支持的内核的系统。系统重启时会出现几个错误,这主要是IPSec在缺省情况下使用了实际并不存在的eth999接口。建议你将ipsec程序的路径加入到用户环境变量中。
IPSec的网络设置首先,需要允许网关服务器的TCP-IP转发。在Red Hat Linux系统中的实现方法:
将 FORWARD_IPV4="false" 改为 FORWARD_IPV4="yes" 即可。
另一个方法是直接修改/proc文件系统,执行以下命令即可:
    cat 1 > /proc/sys/net/ipv4/ip_forward   

然后我们要重新启动网络:
[root@deep /]# /etc/rc.d/init.d/network restart

这时pluto守候进程要启动,它尝试去连接另一边的网关上的pluto守候进程,这样一个连接就可以建立了。所以我们要在ipchains的配置文件中加入一些包过滤规则许可以下的协议通过网关通往另一边的网关:
    UDP port 500 for IKE implemented by the Pluto daemon  Protocol 50 for ESP encryption and/or authentication  Protocol 51 for AH packet-level authentication  

必须保证IP欺骗选项没有被打开,可以将下面的命令添加到/etc/rc.d/rc.local文件中:
[root@deep /]# echo 0 > /proc/sys/net/ipv4/conf/ipsec0/rp_filter[root@deep /]# echo 0 > /proc/sys/net/ipv4/conf/eth0/rp_filter

最后要注意的是, 任何使用了 IPSec 的内部网络的所有伪装(masquerade),规则都必须在允许 IPSec 的规则之后进行,否则主机将试图伪装 (masquerade) 数据包,而不是将它们传递给 IPSec。所以我们还要在两边网关的 ipchains 配置文件中加入下面的设定来保证能够正常的转发 IPSEC 的数据包:
# Masquerade internal traffic.# All internal traffic is masqueraded externally.ipchains -A forward -i $EXTERNAL_INTERFACE -s $LOCALNET_1 -j MASQWhere EXTERNAL_INTERFACE="eth0" # You external interface to the Internet.Where LOCALNET_1=" 192.168.1.0/24" # whatever private range you use.

现在可以重启机器了,我们所要做的设置都完成了,一个 VPN 已经构建好了。
详细的信息请参阅 man 帮助和工具自带的帮助文件。




回页首


小结
我们所讨论的以上内容都是为了更好的固化我们的 linux 系统,我们讨论了 linux 服务器的安装和安全设置中要注意的问题,我们还谈到了 linux 的日志系统,概要的举出了一些安全工具。由于篇幅所限不可能讲的非常详细彻底,也有很多其他好的安全工具并没有给大家列出。下面给出一个安全工具的列表供大家参考,详细的说明可详见说明文档和 man 文档。
工具名称工具作用
Sxid检查系统中的 suid,sgid 以及没有主人的文件
skey一次性口令工具
logrotate日志循环工具
logcheck日志管理工具
swatch日志管理工具,比 logcheck 实时
Ssh(openssh)提供安全的连接认证
openssl提供加密的数据传送和认证
Portsentry反扫描工具,监视自己的udp和tcp端口
tripwire提供系统完整性检查
gnupg对单个文件进行加密以及创建数字签名
hostsentry基于主机的入侵检测,将连接记入日志
ipchainsLinux发行版自带的包过滤形防火墙
CFS 和 TCFS密码文件系统和透明的密码文件系统实现目录下所有文件加密,基于 NFS
Anti-sniff反嗅探工具,检查网络中是否有嗅探器
Freeswan在 linux 实现 VPN 的工具
Syslog-ng替代 syslog 的日志文件系统
Scandns进行 dns 检查追踪的工具
WhiskerCgi 扫描器
Snoopy通过跟踪 execve 系统调用记录执行的命令
Linux kernel patch内核的安全补丁,防止缓冲溢出等
krnsniff一个基于内核的监听模块
iptable用来替代ipchains的包过滤防火墙
Imsafe通过跟踪系统调用来检测缓冲溢出等问题
Iplog对来往的包进行日志记录
Solaris designer内核补丁,防止缓冲溢出等
Stackguard作为补丁修补gcc,防止缓冲溢出
DTKHoney port欺骗式防御
Antiroute阻止和记录基于路由的跟踪
安全工具介绍
希望您能经常关心最新的安全漏洞和安全新闻,没有任何系统是完全安全的。这篇文章的目的不过是使大家对安全有一个明确的认识,使安全真正能够得到您的重视,做到深入人心。
 楼主| 发表于 2007-5-13 22:20:16 | 显示全部楼层
Linux下防范缓冲区溢出攻击的系统安全策略



缓冲区溢出攻击是目前黑客最常用的攻击手段之一,为了应对不断涌现的缓冲区溢出攻击,我们研究了在Linux系统下防范缓冲区溢出的方法,通过研究,总结了在Linux平台下防范缓冲区溢出攻击的安全策略,这些安全策略可以应用于一般企业内部服务器,包括web服务器、mail服务器、samba服务器、ftp服务器以及proxy服务器等。在实际使用中,我们发现通过这些安全策略的配置能够对缓冲区溢出攻击起到很好的防范措施。
在对计算机系统安全的研究中,有一种系统安全漏洞引起了我们的关注。一方面是由于这种安全漏洞的广泛性--几乎使所有的操作系统平台都受到影响。另一方面,我们为黑客基于此类安全漏洞所编写的攻击程序的隐蔽性和强大威力所吸引。这就是缓冲区溢出技术。它可以使看似安全的,正在运行常规服务(如 DNS、ftpd等)的主机在几秒钟内失去控制权。缓冲区溢出攻击是目前黑客最常用的攻击手段。在当前CERT和CIAC等发布的Internet安全事件报告中, 缓冲区溢出已成为常见的用语。缓冲区溢出攻击的目的在于扰乱具有某些特权运行的程序的功能。这样可以让攻击者取得程序的控制权,如果该程序具有足够的权限,那么整个主机就被控制了。
为了应对不断涌现的缓冲区溢出攻击,我们研究了在Linux系统下防范缓冲区溢出的方法,之所以选择Linux平台,主要有两方面的原因:(1)Linux是一个开放源码的平台,有利于我们在研究的过程中深入技术细节,由于Linux及其上面的大量应用都是基于开放源码,有很多黑客在其上进行了大量的工作,可以说Linux上的网络攻击水平代表了整个网络攻击的最高水平。(2)Linux是一个类Unix系统,同时也是在Internet中大量使用的操作系统平台,选择Linux作为研究缓冲区溢出技术的平台是非常具有代表性的,在Linux平台上取得的经验可以非常容易地移植到其他Unix或者类Unix平台上。
通过研究,我们总结了在Linux平台下防范缓冲区溢出的安全策略,这些安全策略可以应用于一般企业内部服务器,包括web服务器、mail服务器、samba服务器、ftp服务器以及proxy服务器等。我们所总结的这些安全策略如下所示:
不显示系统提示信息
如果不想让远程登录的用户看到系统的提示信息,可以改变"/etc/inetd.conf"文件中的telnet设置:
telnet stream tcp nowait root /usr/sbin/tcpd in.telnetd -h

在末尾加上"-h"参数可以让daemon不显示任何系统信息,只显示登录提示。当然,只有在服务器上装了telnet服务器才有这样做的必要。




回页首



处理"rc.local"文件
在默认情况下,当登录装有Linux系统的计算机时,系统会告诉你Linux发行版的名字、版本号、内核版本和服务器名称。这泄露了太多的系统信息。出于安全的考虑,最好只显示一个"Login:"的提示信息。处理方法如下:
(1)编辑"/etc/rc.d/rc.local"文件,在下面这些行的前面加上"#":
……# This will overwrite /etc/issue at every boot. So, make any changes you# want to make to /etc/issue here or you will lose them when you reboot.#echo "" > /etc/issue#echo "$R" >> /etc/issue#echo "Kernel $(uname -r) on $a $(uname -m)" >> /etc/issue##cp -f /etc/issue /etc/issue.net#echo >> /etc/issue……

(2)删除"/etc"目录下的"issue.net"和"issue"文件:
[root@snow]# rm -f /etc/issue[root@snow]# rm -f /etc/issue.net

"/etc/issue.net"文件是用户从网络登录计算机时(例如:telnet、SSH)看到的登录提示。同样在"/etc"目录下还有一个"issue"文件,是用户从本地登录时看到的提示。这两个文件都是文本文件,可以根据需要改变。但是,如果想删掉这两个文件,必须向上面介绍的那样把"/etc/rc.d/rc.local"脚本中的那些行注释掉,否则每次重新启动的时候,系统又会重新创建这两个文件。




回页首



禁止提供finger 服务
在Linux系统下,使用finger命令可以显示本地或远程系统中目前已登录用户的详细信息,黑客可以利用这些信息,增大侵入系统的机会。为了系统的安全,最好禁止提供finger服务,即从/usr/bin下删除finger 命令。如果要保留 finger服务,应将finger文件换名,或修改其权限,使得只允许root用户执行finger命令。




回页首



处理"inetd.conf"文件
inetd也叫作"超级服务器",其作用是根据网络请求装入网络程序。"/etc/inetd.conf"文件告诉inetd监听哪些网络端口,为每个端口启动哪个服务。把Linux系统放在任何网络环境中,第一件要做的事就是了解一下服务器到底要提供哪些服务。不需要的那些服务应该被禁止掉,最好卸载掉,这样黑客就少了一些攻击系统的机会。查看"/etc/inetd.conf"文件,了解一下inetd提供哪些服务。用加上注释的方法(在一行的开头加上#号)禁止任何不需要的服务,再给inetd进程发一个SIGHUP信号。具体操作步骤如下:
(1)把文件"/etc/inetd.conf"的许可权限改成600,只允许root来读写该文件。
[root@snow]# chmod 600 /etc/inetd.conf

(2)确定"/etc/inetd.conf"文件所有者为root。
[root@snow]# stat /etc/inetd.conf

这个命令显示出来的信息应该是:
File: "/etc/inetd.conf"Size: 2869 Filetype: Regular FileMode: (0600/-rw-------) Uid: ( 0/ root) Gid: ( 0/ root)Device: 8,6 Inode: 18219 Links: 1Access: Fri Apr 12 14:28:11 2002(00000.00:10:44)Modify: Wed Apr 10 11:20:22 2002(00002.06:12:16)Change: Wed Apr 10 11:20:22 2002(00002.06:12:16)

(3)编辑 /etc/inetd.conf文件(vi /etc/inetd.conf),禁止所有不需要的服务,如:ftp、telnet、 shell、login、exec、talk、ntalk、imap、pop-2、pop-3、finger、auth等。把不需要的服务关闭可以使系统的危险性降低很多。
(4)改变了"inetd.conf"文件之后,要给inetd进程发送一个SIGHUP信号(killall -HUP inetd)。
[root@snow /root]# killall -HUP inetd

(5)为了保证"inetd.conf"文件的安全,可以用chattr命令把它设成不可改变的。如下:
[root@snow]# chattr +i /etc/inetd.conf

这样可以防止对"inetd.conf"文件的任何修改。一个有"i"属性的文件是不能被改动的(不能删除或重命名,不能创建这个文件的链接,不能向这个文件里写数据)。唯一可以取消这个属性的人只有root。如果要修改"inetd.conf"文件,首先要取消不可修改的属性,如下:
[root@snow]# chattr -i /etc/inetd.conf


再改变了"inetd.conf"文件后,需要再把它的属性改为不可改变的。




回页首



启动系统的"rc"脚本
/etc/rc.d目录下"rc"开头的文件是用来启动系统的初始化文件的。rc系列文件与Ms- Dos系统下的autoexec.bat很类似。rc的意思是"runtime commands"。它们决定了init进程要启动哪些服务。redhat系统下,这些脚本在/etc/rc.d/rc3.d(如果系统以x为默认启动的话,就是/etc/rc.d/rc5.d)。要在启动时禁止某个服务,只需要把大写的S替换为小写的s,同时,redhat也提供一个工具来帮助你关闭服务,输入/usr/sbin/setup,然后选择"system services",就可以定制系统启动时运行哪些服务。另外一个选择是chkconfig命令,很多linux版本的系统都自带这个工具。脚本名字中的数字是启动的顺序,以大写的K开头的是用来杀死进程的。 如将S50snmpd(SNMP简单网络管理协议,远程用户能从中获得许多系统信息)改为s50snmpd,则系统启动时将不会启动这项服务。
用下列命令察看在关闭启动脚本之前有多少服务在运行:
suneagle# ps -eaf|wc -l


有两个非常有用的工具:ps -xau(输出大量的有关系统运行的信息)和netstat -vat(列出所有和网络相关的信息)。运行他们就可以知道系统在提供、运行哪些服务。




回页首



处理"services"文件
端口号和标准服务之间的对应关系在RFC1700"Assigned Numbers"中有详细的定义。"/etc/services"文件使得服务器和客户端的程序能够把服务的名字转成端口号,这张表在每一台主机上都存在,其文件名是"/etc/services"。只有"root"用户才有权限修改这个文件,而且在通常情况下这个文件是没有必要修改的,因为这个文件中已经包含了常用的服务所对应的端口号。为了提高安全性,我们可以给这个文件加上保护以避免没有经过授权的删除和改变。为了保护这个文件可以用下面的命令:
[root@snow]# chattr +i /etc/services






回页首


改变"/etc/rc.d/init.d/"目录下脚本文件的访问许可
通过以下方式改变启动和停止daemon的脚本文件的权限。
[root@snow]# chmod -R 700 /etc/rc.d/init.d/*


这样只有root可以读、写和执行这一脚本,因为一般用户不需要知道脚本文件的内容。




回页首



使系统对ping没有反应
防止系统对ping请求做出反应,对于网络安全是很有好处的,因为没人能够ping你的服务器并得到任何反应。TCP/IP协议本身有很多的弱点,黑客可以利用一些技术,把传输正常数据包的通道用来偷偷地传送数据。使你的系统对ping请求没有反应,可以把这个危险减到最小。使用下面的命令:
echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all


运行完这个命令后,系统对ping就没有反应了。可以把这一行加到"/etc/rc.d/rc.local"文件中去,这样当系统重新启动时,该命令就会自动运行。对ping命令没有反应,至少可以把绝大多数的黑客排除到系统之外,因为黑客不可能知道你的服务器在哪里。重新恢复对ping的响应,可以使用下面的命令:
echo 0 > /proc/sys/net/ipv4/icmp_echo_ignore_all"






回页首


用ssh代替telnet
SSH协议在开始设计时的目的就是提供尽可能安全的远程存取方式。它可以用来进行任何基于网络的信息传递,而且适应性很强。Linux、Unix、NT等系统都可以使用。由于在和远程交互时,传递的密钥、认证信息等都是加密的,所以安全性能很好。用ssh完全取代telnet/ftp,它能够确保数据在网络中的安全传输。




回页首



取消普通用户的控制台访问权限
应该取消普通用户的控制台访问权限,比如shutdown、reboot、halt等命令。
[root@kapil /]# rm -f /etc/security/console.apps/<servicename>


其中<servicename>是要注销的程序名。




回页首



Shell logging
Bash shell在"~/.bash_history"("~/"表示用户目录)文件中保存了500条使用过的命令,这样可以使你输入使用过的长命令变得容易。每个在系统中拥有账号的用户在他的目录下都有一个".bash_history"文件。bash shell应该保存少量的命令,并且在每次用户注销时都把这些历史命令删除。具体操作步骤如下:
(1)"/etc/profile"文件中的"HISTFILESIZE"和"HISTSIZE"行确定所有用户的".bash_history"文件中可以保存的旧命令条数。建议把"/etc/profile"文件中的"HISTFILESIZE"和"HISTSIZE"行的值设为一个较小的数,比如30。编辑profile文件(vi /etc/profile),把下面这行改为:
HISTFILESIZE=30HISTSIZE=30

这表示每个用户的".bash_history"文件只可以保存30条旧命令。
(2)网络管理员还应该在"/etc/skel/.bash_logout" 文件中添加一行"rm -f $HOME/.bash_history"。这样,当用户每次注销时,".bash_history"文件都会被删除。
编辑.bash_logout文件(vi /etc/skel/.bash_logout),添加下面这行:
rm -f $HOME/.bash_history






回页首


禁止Control-Alt-Delete键盘关闭命令
在"/etc/inittab" 文件中注释掉下面这行(使用#):
ca::ctrlaltdel:/sbin/shutdown -t3 -r now


改为:
#ca::ctrlaltdel:/sbin/shutdown -t3 -r now


为了使这项改动起作用,输入下面这个命令:
[root@kapil /]# /sbin/init q






回页首


带"s"位的程序
缓冲区溢出漏洞和suid/sgid程序的关系紧密,带"s"位的程序往往是系统不安全的根源。应该尽量将不必要的带"s"位的程序删除。
用ls -l命令列出来的文件,如果文件的权限位中出现"s",则这些文件的SUID(-rwsr-xr-x)或SGID(-r-xr-sr-x)位被设定了。因为这些程序给执行它的用户一些特权,所以如果不需要用到这些特权,最好把这些程序的"s"位移去。可以用下面的这个命令"chmod a -s <文件名>"移去相应文件的"s"位。
可以清除"s"位的程序包括:从来不用的程序;不希望非root用户运行的程序;偶尔用用,但是不介意先用su命令变为root后再运行的程序。
下面加了星号(*)的程序有必要移去"s"位。注意,系统可能需要一些SUID的程序才能正常运行,所以要小心。
用下面的命令查找所有带"s"位的程序:
[root@snow]# find / -type f \( -perm -04000 -o -perm -02000 \) \-exec ls -lg {}\;*-rwsr-xr-x 1 root root 35168 Sep 22 23:35 /usr/bin/chage*-rwsr-xr-x 1 root root 36756 Sep 22 23:35 /usr/bin/gpasswd*-r-xr-sr-x 1 root tty 6788 Sep 6 18:17 /usr/bin/wall-rwsr-xr-x 1 root root 33152 Aug 16 16:35 /usr/bin/at-rwxr-sr-x 1 root man 34656 Sep 13 20:26 /usr/bin/man-r-s--x--x 1 root root 22312 Sep 25 11:52 /usr/bin/passwd-rws--x--x 2 root root 518140 Aug 30 23:12 /usr/bin/suidperl-rws--x--x 2 root root 518140 Aug 30 23:12 /usr/bin/sperl5.00503-rwxr-sr-x 1 root slocate 24744 Sep 20 10:29 /usr/bin/slocate*-rws--x--x 1 root root 14024 Sep 9 01:01 /usr/bin/chfn*-rws--x--x 1 root root 13768 Sep 9 01:01 /usr/bin/chsh*-rws--x--x 1 root root 5576 Sep 9 01:01 /usr/bin/newgrp*-rwxr-sr-x 1 root tty 8328 Sep 9 01:01 /usr/bin/write-rwsr-xr-x 1 root root 21816 Sep 10 16:03 /usr/bin/crontab*-rwsr-xr-x 1 root root 5896 Nov 23 21:59 /usr/sbin/usernetctl*-rwsr-xr-x 1 root bin 16488 Jul 2 10:21 /usr/sbin/traceroute-rwxr-sr-x 1 root utmp 6096 Sep 13 20:11 /usr/sbin/utempter-rwsr-xr-x 1 root root 14124 Aug 17 22:31 /bin/su*-rwsr-xr-x 1 root root 53620 Sep 13 20:26 /bin/mount*-rwsr-xr-x 1 root root 26700 Sep 13 20:26 /bin/umount*-rwsr-xr-x 1 root root 18228 Sep 10 16:04 /bin/ping*-rwxr-sr-x 1 root root 3860 Nov 23 21:59 /sbin/netreport-r-sr-xr-x 1 root root 26309 Oct 11 20:48 /sbin/pwdb_chkpwd


用下面的命令禁止上面选出来的SUID的程序:
[root@snow]# chmod a-s /usr/bin/chage[root@snow]# chmod a-s /usr/bin/gpasswd[root@snow]# chmod a-s /usr/bin/wall[root@snow]# chmod a-s /usr/bin/chfn[root@snow]# chmod a-s /usr/bin/chsh[root@snow]# chmod a-s /usr/bin/newgrp[root@snow]# chmod a-s /usr/bin/write[root@snow]# chmod a-s /usr/sbin/usernetctl[root@snow]# chmod a-s /usr/sbin/traceroute[root@snow]# chmod a-s /bin/mount[root@snow]# chmod a-s /bin/umount[root@snow]# chmod a-s /bin/ping[root@snow]# chmod a-s /sbin/netreport






回页首


创建FTP日志
对于FTP服务器,可以通过修改/etc/ftpaccess或者/etc/inetd.conf,来保证每一个ftp连接日志都能够记录下来。下面是一个修改inetd.conf的例子:
ftp  stream  tcp  nowait  root  /usr/sbin/tcpd  in.ftpd -l -L -i -o-l:每一个ftp连接都写到syslog-L:记录用户的每一个命令-I:文件received,记录到xferlog-o:文件transmitted,记录到xferlog


以上就是我们通过研究总结出来的在Linux平台下防范缓冲区溢出攻击的一些安全策略,在实际使用中,我们发现通过这些安全策略的配置能够对缓冲区溢出攻击起到一定的防范措施。当然,这些安全措施还不够完善,还需要进一步的改进。

关于作者

薛静锋,北京理工大学计算机科学工程系博士研究生,主要研究方向为网络安全技术。曾参与过的研究课题有:“分布式协同专家系统开发工具、计算机网络隐患扫描技术,目前在研的课题为“异常入侵检测技术研究”。近三年来出版计算机书籍6本,译著2本;在各种学术刊物上发表论文7篇。可以通过 E_mail: [email=xuebook@xinhuanet.com?cc=xuebook@xinhuanet.com]xuebook@xinhuanet.com[/email]与他联系!
 楼主| 发表于 2007-5-13 22:25:16 | 显示全部楼层
如何增强 Linux 系统的安全性,第一部分: Linux 安全模块(LSM)简介未来的标准:Linux内核的通用安全支持框架

Linux安全模块(LSM)是Linux内核的一个轻量级通用访问控制框架。本文介绍Linux安全模块(LSM)的相关背景,设计思想,实现方法;并说明如何使用Linux安全模块(LSM)来增强Linux系统的安全性:一方面是供内核开发人员和安全研究人员使用的接口,另一方面是供普通用户使用的模块,以及具体的使用方法。如果读者具有Linux内核和安全的相关背景知识,可以有助于对本文的理解;如果不具有,可以先阅读本文最后参考资料中列出的IBM dW上的三篇文章。
1.相关背景介绍:为什么和是什么
近年来Linux系统由于其出色的性能和稳定性,开放源代码特性带来的灵活性和可扩展性,以及较低廉的成本,而受到计算机工业界的广泛关注和应用。但在安全性方面,Linux内核只提供了经典的UNIX自主访问控制(root用户,用户ID,模式位安全机制),以及部分的支持了POSIX.1e标准草案中的capabilities安全机制,这对于Linux系统的安全性是不足够的,影响了Linux系统的进一步发展和更广泛的应用。
有很多安全访问控制模型和框架已经被研究和开发出来,用以增强Linux系统的安全性,比较知名的有安全增强Linux(SELinux),域和类型增强(DTE),以及Linux入侵检测系统(LIDS)等等。但是由于没有一个系统能够获得统治性的地位而进入Linux内核成为标准;并且这些系统都大多以各种不同的内核补丁的形式提供,使用这些系统需要有编译和定制内核的能力,对于没有内核开发经验的普通用户,获得并使用这些系统是有难度的。在2001年的Linux内核峰会上,美国国家安全局(NSA)介绍了他们关于安全增强Linux(SELinux)的工作,这是一个灵活的访问控制体系Flask在Linux中的实现,当时Linux内核的创始人Linus Torvalds同意Linux内核确实需要一个通用的安全访问控制框架,但他指出最好是通过可加载内核模块的方法,这样可以支持现存的各种不同的安全访问控制系统。因此,Linux安全模块(LSM)应运而生。
Linux安全模块(LSM)是Linux内核的一个轻量级通用访问控制框架。它使得各种不同的安全访问控制模型能够以Linux可加载内核模块的形式实现出来,用户可以根据其需求选择适合的安全模块加载到Linux内核中,从而大大提高了Linux安全访问控制机制的灵活性和易用性。目前已经有很多著名的增强访问控制系统移植到Linux安全模块(LSM)上实现,包括POSIX.1e capabilities,安全增强Linux(SELinux),域和类型增强(DTE),以及Linux入侵检测系统(LIDS)等等。虽然目前Linux安全模块(LSM)仍然是作为一个Linux内核补丁的形式提供,但是其同时提供Linux 2.4稳定版本的系列和Linux 2.5开发版本的系列,并且很有希望进入Linux 2.6稳定版本,进而实现其目标:被Linux内核接受成为Linux内核安全机制的标准,在各个Linux发行版中提供给用户使用。




回页首



2.设计思想介绍:得让两方面都满意
Linux安全模块(LSM)的设计必须尽量满足两方面人的要求:让不需要它的人尽可能少的因此得到麻烦;同时让需要它的人因此得到有用和高效的功能。
以Linus Torvalds为代表的内核开发人员对Linux安全模块(LSM)提出了三点要求:
  • 真正的通用,当使用一个不同的安全模型的时候,只需要加载一个不同的内核模块
  • 概念上简单,对Linux内核影响最小,高效,并且
  • 能够支持现存的POSIX.1e capabilities逻辑,作为一个可选的安全模块
另一方面,各种不同的Linux安全增强系统对Linux安全模块(LSM)提出的要求是:能够允许他们以可加载内核模块的形式重新实现其安全功能,并且不会在安全性方面带来明显的损失,也不会带来额外的系统开销。
为了满足这些设计目标,Linux安全模块(LSM)采用了通过在内核源代码中放置钩子的方法,来仲裁对内核内部对象进行的访问,这些对象有:任务,inode结点,打开的文件等等。用户进程执行系统调用,首先游历Linux内核原有的逻辑找到并分配资源,进行错误检查,并经过经典的UNIX自主访问控制,恰好就在Linux内核试图对内部对象进行访问之前,一个Linux安全模块(LSM)的钩子对安全模块所必须提供的函数进行一个调用,从而对安全模块提出这样的问题"是否允许访问执行?",安全模块根据其安全策略进行决策,作出回答:允许,或者拒绝进而返回一个错误。
另一方面,为了满足大多数现存Linux安全增强系统的需要,Linux安全模块(LSM)采取了简化设计的决策。Linux安全模块(LSM)现在主要支持大多数现存安全增强系统的核心功能:访问控制;而对一些安全增强系统要求的其他安全功能,比如安全审计,只提供了的少量的支持。Linux安全模块(LSM)现在主要支持"限制型"的访问控制决策:当Linux内核给予访问权限时,Linux安全模块(LSM)可能会拒绝,而当Linux内核拒绝访问时,就直接跳过Linux安全模块(LSM);而对于相反的"允许型"的访问控制决策只提供了少量的支持。对于模块功能合成,Linux安全模块(LSM)允许模块堆栈,但是把主要的工作留给了模块自身:由第一个加载的模块进行模块功能合成的最终决策。所有这些设计决策可能暂时影响了Linux安全模块(LSM)的功能和灵活性,但是大大降低了Linux安全模块(LSM)实现的复杂性,减少了对Linux内核的修改和影响,使得其进入Linux内核成为安全机制标准的可能性大大提高;等成为标准后,可以改变决策,增加功能和灵活性。




回页首



3.实现方法介绍:对Linux内核的修改
Linux安全模块(LSM)目前作为一个Linux内核补丁的形式实现。其本身不提供任何具体的安全策略,而是提供了一个通用的基础体系给安全模块,由安全模块来实现具体的安全策略。其主要在五个方面对Linux内核进行了修改:
  • 在特定的内核数据结构中加入了安全域
  • 在内核源代码中不同的关键点插入了对安全钩子函数的调用
  • 加入了一个通用的安全系统调用
  • 提供了函数允许内核模块注册为安全模块或者注销
  • 将capabilities逻辑的大部分移植为一个可选的安全模块
下面对这五个方面的修改逐个做简要的介绍。
安全域是一个void*类型的指针,它使得安全模块把安全信息和内核内部对象联系起来。下面列出被修改加入了安全域的内核数据结构,以及各自所代表的内核内部对象:
  • task_struct结构:代表任务(进程)
  • linux_binprm结构:代表程序
  • super_block结构:代表文件系统
  • inode结构:代表管道,文件,或者Socket套接字
  • file结构:代表打开的文件
  • sk_buff结构:代表网络缓冲区(包)
  • net_device结构:代表网络设备
  • kern_ipc_perm结构:代表Semaphore信号,共享内存段,或者消息队列
  • msg_msg:代表单个的消息
另外,msg_msg结构,msg_queue结构,shmid_kernel结构被移到include/linux/msg.h和include/linux/shm.h这两个头文件中,使得安全模块可以使用这些定义。
Linux安全模块(LSM)提供了两类对安全钩子函数的调用:一类管理内核对象的安全域,另一类仲裁对这些内核对象的访问。对安全钩子函数的调用通过钩子来实现,钩子是全局表security_ops中的函数指针,这个全局表的类型是security_operations结构,这个结构定义在include/linux/security.h这个头文件中,这个结构中包含了按照内核对象或内核子系统分组的钩子组成的子结构,以及一些用于系统操作的顶层钩子。在内核源代码中很容易找到对钩子函数的调用:其前缀是security_ops->。对钩子函数的详细说明留到后面。
Linux安全模块(LSM)提供了一个通用的安全系统调用,允许安全模块为安全相关的应用编写新的系统调用,其风格类似于原有的Linux系统调用socketcall(),是一个多路的系统调用。这个系统调用为security(),其参数为(unsigned int id, unsigned int call, unsigned long *args),其中id代表模块描述符,call代表调用描述符,args代表参数列表。这个系统调用缺省的提供了一个sys_security()入口函数:其简单的以参数调用sys_security()钩子函数。如果安全模块不提供新的系统调用,就可以定义返回-ENOSYS的sys_security()钩子函数,但是大多数安全模块都可以自己定义这个系统调用的实现。
在内核引导的过程中,Linux安全模块(LSM)框架被初始化为一系列的虚拟钩子函数,以实现传统的UNIX超级用户机制。当加载一个安全模块时,必须使用register_security()函数向Linux安全模块(LSM)框架注册这个安全模块:这个函数将设置全局表security_ops,使其指向这个安全模块的钩子函数指针,从而使内核向这个安全模块询问访问控制决策。一旦一个安全模块被加载,就成为系统的安全策略决策中心,而不会被后面的register_security()函数覆盖,直到这个安全模块被使用unregister_security()函数向框架注销:这简单的将钩子函数替换为缺省值,系统回到UNIX超级用户机制。另外,Linux安全模块(LSM)框架还提供了函数mod_reg_security()和函数mod_unreg_security(),使其后的安全模块可以向已经第一个注册的主模块注册和注销,但其策略实现由主模块决定:是提供某种策略来实现模块堆栈从而支持模块功能合成,还是简单的返回错误值以忽略其后的安全模块。这些函数都提供在内核源代码文件security/security.c中。
Linux内核现在对POSIX.1e capabilities的一个子集提供支持。Linux安全模块(LSM)设计的一个需求就是把这个功能移植为一个可选的安全模块。POSIX.1e capabilities提供了划分传统超级用户特权并赋给特定的进程的功能。Linux安全模块(LSM)保留了用来在内核中执行capability检查的现存的capable()接口,但把capable()函数简化为一个Linux安全模块(LSM)钩子函数的包装,从而允许在安全模块中实现任何需要的逻辑。Linux安全模块(LSM)还保留了task_struck结构中的进程capability集(一个简单的位向量),而并没有把它移到安全域中去。Linux内核对capabilities的支持还包括两个系统调用:capset()和capget()。Linux安全模块(LSM)同样保留了这些系统调用但将其替换为对钩子函数的调用,使其基本上可以通过security()系统调用来重新实现。Linux安全模块(LSM)已经开发并且移植了相当部分的capabilities逻辑到一个capabilities安全模块中,但内核中仍然保留了很多原有capabilities的残余。这些实现方法都最大程度的减少了对Linux内核的修改影响,并且最大程度保留了对原有使用capabilities的应用程序的支持,同时满足了设计的功能需求。以后要使capabilities模块完全独立,剩下要做的主要步骤是:把位向量移到task_struct结构中合适的安全域中,以及重新定位系统调用接口。




回页首



4.接口说明:给内核开发人员和安全研究人员使用的钩子
Linux安全模块(LSM)对于内核开发人员和安全研究人员的价值就在于:可以使用其提供的接口将现存的安全增强系统移植到这一框架上,从而能够以可加载内核模块的形式提供给用户使用;或者甚至可以直接编写适合自己需要的安全模块。Linux安全模块(LSM)提供的接口就是钩子,其初始化时所指向的虚拟函数实现了缺省的传统UNIX超级用户机制,模块编写者必须重新实现这些钩子函数来满足自己的安全策略。下面简要介绍Linux安全模块(LSM)提供的钩子,详细情况请参考源代码,特别是include/linux/security.h头文件中security_operations结构的定义。至于具体如何根据自己需要的安全策略编写安全模块,可以参考SELinux,DTE,LIDS等系统的安全模块实现。
首先是任务钩子,Linux安全模块(LSM)提供了一系列的任务钩子使得安全模块可以管理进程的安全信息并且控制进程的操作。模块可以使用task_struct结构中的安全域来维护进程安全信息;任务钩子提供了控制进程间通信的钩子,例如kill();还提供了控制对当前进程进行特权操作的钩子,例如setuid();还提供了对资源管理操作进行细粒度控制的钩子,例如setrlimit()和nice()。
其次是程序装载钩子。很多安全模块,包括Linux capabilities,SELinux,DTE都需要有在一个新程序执行时改变特权的能力。因此Linux安全模块(LSM)提供了一系列程序装载钩子,用在一个execve()操作执行过程的关键点上。linux_binprm结构中的安全域允许安全模块维护程序装载过程中的安全信息;提供了钩子用于允许安全模块在装载程序前初始化安全信息和执行访问控制;还提供了钩子允许模块在新程序成功装载后更新任务的安全信息;还提供了钩子用来控制程序执行过程中的状态继承,例如确认打开的文件描述符。
再次是进程间通信IPC钩子。安全模块可以使用进程间通信IPC钩子来对System V IPC的安全信息进行管理,以及执行访问控制。IPC对象数据结构共享一个子结构kern_ipc_perm,并且这个子结构中只有一个指针传给现存的ipcperms()函数进行权限检查,因此Linux安全模块(LSM)在这个共享子结构中加入了一个安全域。为了支持单个消息的安全信息,Linux安全模块(LSM)还在msg_msg结构中加入了一个安全域。Linux安全模块(LSM)在现存的ipcperms()函数中插入了一个钩子,使得安全模块可以对每个现存的Linux IPC权限执行检查。由于对于某些安全模块,这样的检查是不足够的,Linux安全模块(LSM)也在单个的IPC操作中插入了钩子。另外还有钩子支持对通过System V消息队列发送的单个消息进行细粒度的访问控制。
下面是文件系统钩子。对于文件操作,定义了三种钩子:文件系统钩子,inode结点钩子,以及文件钩子。Linux安全模块(LSM)在对应的三个内核数据结构中加入了安全域,分别是:super_block结构,inode结构,file结构。超级块文件系统钩子使得安全模块能够控制对整个文件系统进行的操作,例如挂载,卸载,还有statfs()。Linux安全模块(LSM)在permission()函数中插入了钩子,从而保留了这个函数,但是也提供了很多其他inode结点钩子来对单个inode结点操作进行细粒度访问控制。文件钩子中的一些允许安全模块对read()和write()这样的文件操作进行额外的检查;还有文件钩子允许安全模块控制通过socket IPC接收打开文件描述符;其他的文件钩子对像fcntl()和ioctl()这样的操作提供细粒度访问控制。
接下来是网络钩子。对网络的应用层访问使用一系列的socket套接字钩子来进行仲裁,这些钩子基本覆盖了所有基于socket套接字的协议。由于每个激活的用户socket套接字有伴随有一个inode结构,所以在socket结构或是更底层的sock结构中都没有加入安全域。socket套接字钩子对有关进程的网络访问提供了一个通用的仲裁,从而显著扩展了内核的网络访问控制框架(这在网络层是已经由Linux内核防火墙netfilter进行处理的)。例如sock_rcv_skb钩子允许在进入内核的包排队到相应的用户空间socket套接字之前,按照其目的应用来对其进行仲裁。另外Linux安全模块(LSM)也为IPv4,UNIX域,以及Netlink协议实现了细粒度的钩子,以后还可能实现其他协议的钩子。网络数据以包的形式被封装在sk_buff结构(socket套接字缓冲区)中游历协议栈,Linux安全模块(LSM)在sk_buff结构中加入了一个安全域,使得能够在包的层次上对通过网络层的数据的安全信息进行管理,并提供了一系列的sk_buff钩子用于维护这个安全域的整个生命周期。硬件和软件网络设备被封装在一个net_device结构中,一个安全域被加到这个结构中,使得能够在设备的层次上维护安全信息。
最后是其他的钩子。Linux安全模块(LSM)提供了两种其他系列的钩子:模块钩子和顶层的系统钩子。模块钩子用来控制创建,初始化,清除内核模块的内核操作。系统钩子用来控制系统操作,例如设置主机名,访问I/O端口,以及配置进程记帐。虽然现在的Linux内核通过使用capability检查对这些系统操作提供了一些支持,但是这些检查对于不同操作差别很大并且没有提供任何参数信息。




回页首



5.模块说明:给普通用户使用的现成的安全功能
Linux安全模块(LSM)对于普通用户的价值就在于:可以提供各种安全模块,由用户选择适合自己需要加载到内核,满足特定的安全功能。Linux安全模块(LSM)本身只提供增强访问控制策略的机制,而由各个安全模块实现具体特定的安全策略。下面简要介绍一些已经实现的安全模块。
SELinux。这是一个Flask灵活访问控制体系在Linux上的实现,并且提供了类型增强,基于角色的访问控制,以及可选的多级安全策略。SELinux原来是作为一个内核补丁实现的,现在已经使用Linux安全模块(LSM)重新实现为一个安全模块。SELinux可以被用来限制进程为最小特权,保护进程和数据的完整性和机密性,并且支持应用安全需求。
DTE Linux。这是一个域和类型增强在Linux上的实现。就像SELinux一样,DTE Linux原来是作为一个内核补丁实现的,现在已经使用Linux安全模块(LSM)重新实现为一个安全模块。当这个安全模块被加载到内核上时,类型被赋给对象,域被赋给进程。DTE策略限制域之间和从域到类型的访问。
Openwall 内核补丁的LSM移植。Openwall内核补丁提供了一系列的安全特性集合来保护系统免受例如缓冲区溢出和临时文件竞争这样的攻击。有安全模块正在被开发出来以支持Openwall补丁的一个子集。
POSIX.1e capabilities。Linux内核中已经存在有POSIX.1e capabilities逻辑,但是Linux安全模块(LSM)把这个逻辑划分到了一个安全模块中。这样的修改使得不需要的用户可以从他们的内核中把这个功能略去;也使得capabilities逻辑的开发可以脱离内核开发获得更大的独立性。
LIDS。这是中国人谢华刚发起的项目。开始时作为一个入侵检测系统开发,后来逐渐演变为使用访问控制系统的形式来进行入侵预防,它通过描述一个给定的程序可以访问哪些文件来进行访问控制。同样的,LIDS原来是作为一个内核补丁实现的并附带了一些管理工具,现在已经使用Linux安全模块(LSM)重新实现为一个安全模块。
当然还有缺省的传统超级用户机制。这个安全模块是Linux安全模块(LSM)缺省的,实现了传统的UNIX超级用户特权机制。




回页首



6.具体使用方法说明:step by step
Linux安全模块(LSM)目前作为一个Linux内核补丁的形式实现,在GPL许可证下发布供用户自由使用。
首先用户可以在http://lsm.immunix.org/lsm_download.html下载到对应于Linux 2.4稳定版本和Linux 2.5开发版本的LSM补丁,放在某个目录下,例如是目录/path/to/linux-2.4.x,通过执行下面的命令来使LSM补丁作用在Linux内核上:


# cd /path/to/linux-2.4.x# zcat /path/to/patch-2.4.x-lsm.gz | patch -p1

然后用户可以在http://lsm.immunix.org/lsm_modules.html连接到已经实现安全模块的站点,下载到所需要的安全模块,将安全模块加载到Linux内核中,这样用户需要的安全策略就可以起作用了,从而增强了系统的安全性。具体安全模块的安装方法这里就略过了,各个安全模块都会提供详细的安装说明文件,用户可以参考这些文件,例如SELinux的安全模块安装说明文件在:http://www.nsa.gov/selinux/doc/readme.html,又如LIDS的安全模块安装说明文件在:http://www.lids.org/install.html
如果用户有Linux内核和安全的相关背景知识和开发经验,想根据自己需要的安全策略编写安全模块。可以在http://lsm.immunix.org/lsm_bk.html跟踪查看Linux安全模块(LSM)的源代码和现有安全模块的源代码,参考其实现方法编写自己的安全模块。这样在满足自己安全需求的同时,也可以为Linux安全模块(LSM)的发展作出一些贡献,使其早日被Linux内核接受成为Linux内核安全机制的标准,使更多的用户得益。




回页首



7.结束语:未来的标准
Linux安全模块(LSM)的起因是:一方面Linux内核现有的安全机制是不足够的;另一方面现存的安全增强系统又各自为战并且难以使用。Linux安全模块(LSM)比较好的解决了这个问题:一方面补丁比较小,对内核源代码的修改影响不多,所带来的负载也不大;另一方面对现存的安全增强系统提供了比较好的接口支持,并已经有不少很好的安全模块可以使用。Linux安全模块(LSM)目前仍然是作为一个Linux内核补丁的形式提供,但是其同时提供Linux 2.4稳定版本的系列和Linux 2.5开发版本的系列,并且很有希望进入Linux 2.6稳定版本。我们期待着那一天:Linux安全模块(LSM)被Linux内核接受成为Linux内核安全机制的标准,在各个Linux发行版中提供给越来越多的用户使用。

参考资料

关于作者

赵亮,南京大学计算机系硕士研究生,研究方向:安全操作系统。电子邮箱: [email=zhao_liang@myway.com?cc=]zhao_liang@myway.com[/email],欢迎讨论Linux内核和安全的相关问题。
 楼主| 发表于 2007-5-13 22:26:47 | 显示全部楼层
使用 ssh 进行安全的连接
距离和防火墙都无法阻止您访问自己的服务器



您肯定希望用 ssh 从远程站点使用您的服务器,但是要让这个过程进展顺利还得用到一些技巧。
MindTerm、socat 还有 VNC,哦,天哪!虽然能够远程工作一直都是系统程序员和管理员最喜欢的 Linux 优点之一,但设置远程访问却不是一件简单的事情。
选择合适的远程服务
每个月, 服务器诊所都要描述如何最大程度地使用服务器室中的硬件。本专栏经常涉及使用 Linux 的方法,这些方法并不象理所应当的那样众所周知:将 Linux 用于 Fortran 程序、将 Linux 用于专为旧操作系统设计的应用程序等等。
紧接着的第二个话题便是本篇专栏文章的主题:安全性。
您的服务器在物理上应当是被隔离的,应当禁用所有不必要的联网访问,并且只能通过 ssh 或更好的方式访问服务器。特别值得一提的是,尽可能少使用实时的 telnetftprloginrsh 以及相关服务;它们实在是太危险了。
假设您已经做了所有这些事。现在您出门在外 - 可能在演示产品,或者在与新客户协商讨论需求,或者在结束一个会议(这已归入您的培训预算之中)。您需要调出公司中的某些材料。那么该怎么办呢?
首先,您当然应该尝试一番。程序员和管理员本可以在正常的上班时间里在自己比较安静的工作场所工作,但是他们却喜欢强迫自己突击完成这些工作,这可是出了名的。您可别让自己成为这种行为的牺牲品!确信您进行的连接具有合法的业务目的,并非违规行为。
但是,如果您过去有这些组织问题,那么连接问题的答案便是“使用 ssh”。即使您原则上更依赖于虚拟专用网(VPN)而非 ssh,我还是认为出现紧急情况时,如若不能使用常规方法,那么设置 ssh 访问会比较谨慎些。VPN 仍然有些难以处理,并且需要依靠特别的硬件配置。如果您是通过客户机的网络(多半是使用普通桌面机器)“呼叫主机”的,则您可以进行的选择是极其有限的。




回页首



ssh 满足需要
好消息是 ssh 在这些限制的夹缝之中通常还能满足需要。即使您外出办事,但在公共接入点(比如“网吧”),您还是可能有足够的资源使 ssh 工作。
您或许不能依赖于自己的设备。说得严重些,带着任何比手持设备大的设备到处走,是另一个安全性风险;更糟的是,许多地方不准插入外来的硬件。您通常必须使用提供给您的硬件。
但是下载 puTTY、ssh 或 MindTerm 客户机一般都很快。而且我也喜欢那样做。任何具有足够的网络栈、可以连接到您的服务器室的主机,都可能有准许进行下载的 Web 浏览器。使用已经安装好的客户机要小心;对于某些人而言,将客户机替换成经过修改的、能捕获击键信息(或更糟的情况)的客户机实在是太容易了。
另一种方式是构造嵌入了 MindTerm 客户机作为 applet 的 Web 页面,这表面上看起来挺吸引人的。而我的经验告诉自己这种方法没什么用处。大多数地方都禁用 Java、或提供只具有旧的 Java 运行时引擎(JRE)的浏览器,或者采用别的方式来降低 applet 的便利性。如果我要使用 MindTerm,则只想下载和安装该客户机以及兼容的 JRE。对于构造针对最终用户的应用程序,applet 通常是一种好技术。applet 还适合进行只读配置。但是,我发现这种用法非常少。因此,为使自己的工作具有效率,不值得花时间去解决 applet 环境中可能存在的难题。我一直觉得,找到一个兆字节的空闲大容量存储器并在上面安装 ssh 客户机会更加方便。
您坐下一会后就应当安装新的 ssh 客户机并启动它。但是,这可能还不够。某些地方防火墙关闭了大多数端口,或者至少关闭了包括 ssh 的标准端口 22 在内的许多端口。
这里有另一种准备提供帮助的方法。在我的至少一台主机上,我希望让 sshd(ssh 守护程序)在通常被指派给常见因特网服务(比如 ftp、http、smtp 或 pop3)的端口上运行。即使是最严密的防火墙也要打开端口 21、8080、25 和 110 中的一个。将您的一台机器设置为“捕获”这样的通信,您就可以使它穿过大多数的防火墙。
这听起来是否象是“非法闯入者”在说话呀?我 赞成滥用网络。经常有其它公司的雇员 邀请我使用他们的网络,虽然他们也知道,用敏感的方式(比如临时打开端口 22)更改他们的防火墙就公司制度而言是不可行的。我逐渐接受了这种认识:准备采用“旁门左道”也是当前专业实践的一部分,但我需要确保自己只以一种负责任的方式完成这个工作。
当然,随着 ssh 通道的打开,我就拥有像坐在服务器室中控制台前的几乎所有功能。如果需要有图形显示,我可以通过通道使用 X 或 VNC,也可以从命令行访问其它所有常见活动。
这样就启动了我的工作会话,然后:我下载引用 ssh 客户机,快速安装并启动它们,然后用 SSL 保护的密码往回验证我留在服务器室中运行的某个 sshd。
请注意,我仍然容易受到篡改过的主机的攻击。一个经过充分修改的桌面机器或一个警惕的“窥视狂”可以在击键信息到达 SSL 库之前将其记入日志。 这种情况的解决方案就是使用一次性密码(OTP)系统。到目前为止,在我看来 OTP 带来的麻烦多于安全性。OTP 给您自己带来的代价和收益肯定至少会略微有所不同。无论如何,回到日常的工作场所可能是更新密码的好时机。




回页首



使用标准部件
我希望 服务器诊所每个月都显示工作代码。在本文中,很难添加任何代码。我推荐的配置很简单,在标准的参考资料中都作了充分的记录。例如,要在第二个端口上添加 ssh 服务,只要将如下行:
Port 8080

添加到现有的 /etc/ssh/sshd_config,然后重新启动 sshd。另一个方法是使用“网络代理程序”或“端口转发器”(比如 netcat 或 socat),将它指回本地主机(localhost)的标准 ssh 端口,这个方法在运行试验和调优日志记录或额外安全性方面很有用。
代理程序
这里的上下文中的“代理程序”是一个小型“转换程序”,它只是让网络流量通过。如果我在端口 22 上设置了 sshd 服务器,并且希望在端口 110 上设置另一台 sshd 服务器,那么实现这个想法的一个方法是安装网络代理程序。这样的代理程序在端口 110 上用作服务器,接收来自外界的流量。它通过在端口 22 上充当客户机来处理这些分组。基本 sshd 服务器完成所有的实际工作;代理程序的作用只是从一个端口转换到另一个端口(可能在另一台主机上)。

这篇特别的专栏文章的真正价值并不在于深奥的代码,而只是在于传达了一个清晰的概念,您应该以此为目标来启用自己的远程服务。我已经尝试过许多方法。利用这些经验,尤其要了解 不要做什么,至少要了解在您首次设置服务器室时不要做什么:禁止 Telnet,不要让不用的服务一直开着,不用担心 applet(尤其不要担心 applet 签名),以及如若感到不对劲就不要进行远程登录。
另一方面,一定要使用标准部件。我已经尝试过许多聪明的想法,用于调整 ssh 协议或自己的防火墙,以阻止“黑帽”黑客(指专门利用网络技巧入侵网络进行破坏的人,译者注)。与这些想法所提供的安全性方面的小小增强相比,它们的维护比较困难,因此有些得不偿失。除非我编制一个明确的安全性项目的预算,并具有明确的长期目标,否则最好将时间花在使用 ssh 上,而不是花时间设法改进它。
采用以上步骤,您将拥有一个服务器室,它的安全性要比您只使用标准的 Linux 服务器安装时要好得多。您还能够从全球可以找到几乎所有的同步连接上远程管理它。对于您自己的安全性计划,这是一个不错的起点。

参考资料
  • 您可以参阅本文在 developerWorks 全球站点上的 英文原文.
  • 请参加关于本文的 论坛。(您也可以单击文章顶部或底部的 讨论访问该论坛。)
  • 请查阅 服务器诊所(Server clinic)其它专栏文章
  • 在 Linux(或异构)网络上共享计算机,第 1 部分”( developerWorks,2001 年 12 月)对 ssh 和 VNC 进行了比较。“ 在 Linux(或异构)网络上共享计算机,第 2 部分”( developerWorks,2002 年 3 月)比较详细地讨论了 VNC,并且还讨论了远程 X 和安全性。
  • Secure shell and file sharing”( developerWorks,2002 年 5 月)是一个认证准备教程,其中说明了 ssh 的基础知识。
  • PuTTY: a free Win32 telnet/ssh client”是 Cameron 喜欢从标准 PC 桌面机器使用的 ssh 客户机的主页。
  • MindTerm 产品页面描述了 MindTerm 用 Java 编码的 ssh 客户机,并提供了最新免费版本的快速下载。
  • 如果您确实决定要构建依赖于 MindTerm applet 签名版的 Web 页面,务必要研读 applet 签名
  • One-Time Password”是一种 IETF标准。尽管它可以与 ssh 相结合,但是 Cameron 坚信他的安全性工作更值得集中在其它回报更高的技术上,包括入侵检测。
  • socat不仅能完成前几代网络代理程序或端口转发器的工作,还能完成其它许多功能,因此它的作者 Gerhard Rieger 就给它取了个术语:“多用途中继(multipurpose relay)”。
  • netcat是使用了多年的端口转发器。
  • sockspy是可编制脚本的网络代理程序,它在调试网络连接或给网络连接添加可编程能力方面很有用。
  • 请在 developerWorksLinux 专区查找更多 针对 Linux 开发人员和管理员的参考资料

关于作者

Cameron 是 Phaseit, Inc. 的一名全职顾问。他经常就开放源码及其它技术主题撰写文章并发表演说。可以通过 [email=claird@phaseit.net?cc=dwlinux@us.ibm.com&Subject=Server clinic: Connect securely with ssh]claird-at-phaseit.net[/email]与 Cameron 联系。
 楼主| 发表于 2007-5-13 22:27:38 | 显示全部楼层
让 Linux 更安全,第 1 部分:介绍
对安全的含义的思考


惟有谨小慎微者方可幸存,与其他领域一样,在确保 Linux&reg; 系统的安全时,这句话也同样适用。幸运的是,有很多安全部件,或者已经编译到内核中,或者已经加入到很多 Linux 发行版本中,或者可以以开放源代码应用程序的形式单独获得。作为本系列的第 1 部分,本文将使您开始理解安全的概念及潜在的危险,并为您真正需要知道的内容做好准备:如何保护和加固基于 Linux 的安装。
在这三篇系列文章中,您将看到如何以一种安全的方法来计划、设计、安装、配置和维护运行 Linux 的系统。除了安全概念的理论概述、安装问题、潜在的危险及其作用以外,您还将得到关于如何保护和加固基于 Linux 的系统的实用建议。我们将讨论最小化安装、加固 Linux 安装、授权/认证、本地和网络安全、攻击和如何防御攻击,以及数据安全、病毒和恶意程序。

在第一篇文章中,我们将首先回顾保护数据及保护数据的系统的考虑。我们的目标是对安全的实际含义的更深入理解。

安全的定义

安全是当今 IT 相关头条新闻的一个重要话题。经常出现的系统漏洞和安全补丁以及病毒和蠕虫是每个使用计算机的人都耳熟能详的名词。因为几乎每台计算机系统都连接到另外的计算机或者连接到 Internet,因此确保这些计算机的安全,对于减少入侵、数据窃取或丢失、误用甚至对第三方的责任而言是至关重要的。

确保安全即使对于没有连接到网络的独立的计算机也是很重要的。必须自可信赖的来源安装应用程序,比如经过验证的并检查过病毒的光盘。对应用程序数据也必须同样小心。例如,对于可以执行强大的宏语言或者引入非法数据的软件程序包(office 套件等等),其软件缺陷可能会被利用来执行任意的代码。因此,应用程序数据在拷贝到计算机之前必须经过完整性检查。可以通过将数据放置在一个安全的地方来控制对系统的访问(当然,不考虑来自已授权人员的攻击)。

当系统连接到网络并向其他计算机提供服务(有意地或无意地)时,事情会变得更为棘手。在那种情况下,数据可能不只是来自系统管理员,因为客户机程序要使用所提供的服务,而系统漏洞可能会让入侵者控制计算机。

这就是为什么安全是从开始计划直到拆除系统的整个系统生命周期中最基本的问题。但是,安全的确切含义是什么?

通常,数据安全和系统安全可以分开来考虑。 数据安全通常被认为是确保以下方面的所有努力:


机密性(Confidentiality)。
完整性(Integrity)。
可用性(Availability)。

综合起来,这些被称作是存储在计算机上的数据的“CIA”。对 /etc/passwd 等配置数据的保护可以归类为数据安全。 系统安全 指的是计算机平台本身。美国 National Information Systems Security Glossary(参阅 参考资料 以获得链接)对系统安全的定义如下:

系统安全。对信息系统的保护,防止未授权的访问及对信息(不论是存储中的、正在处理的还是正在传输的)的修改,并防止对授权用户服务的拒绝或对未授权用户服务的允许,包括那些检测、记录和反击此类威胁的措施。

重要的是要认识到系统安全强调的是一个反复的过程,这个过程包括应用安全补丁、经常审计、控制,同时最起码要有一个安全的系统配置。就此而言,不可能保证绝对的安全,也不可能提供百分之百安全的服务。目标更应该是在安全性、系统可用性和维护这个安全层级所需要的努力这三者之间找到一个折衷点。这个折衷取决于安全对于存储在计算机中的数据来说的重要性以及这些数据预期的使用情形(阅读 Bruce Schneier 的 Secrets and Lies,John Wiley & Sons,2000;参阅 参考资料以获得链接)。






回页首




完整性

具备 完整性 的数据是指合法的而且没有经过偶然的或恶意的修改。当进行数据存储或交换时应该考虑其完整性。目标接收到的数据必须是源数据的原样拷贝。这就是说,一方面,物理传输和存储媒介必须是可靠的,以使得数据可以正确地传输而不发生位错误。另一方面,数据必须不能被未经授权的实体不加检测地访问而修改。完整性的范围是从用户 —— 最终的权威 —— 将数据委托给系统后开始的。因此用户错误不在完整性范围之内。

对网络连接而言,要尤其注意确保完整性,不管网络是否安全(例如,通过加密传输)。在传输过程中,可以访问传输媒介的第三方可能会重新路由或者修改数据。涉及网络的物理环境和互联的计算机的完整性的方面并不特定于 Linux,而是对所有计算机安装来说都是如此;因而这也超出了本文的范围。无论如何,除了其他方法之外,在物理层上采取的保护数据的措施包括,限制对计算机的访问、保持对传输媒介(比如电缆和连接器)的保护,以及避免停电和静电释放(阅读“Building the Ideal Web Hosting Facility: A Physical Security Perspective”,参阅 参考资料以获得链接)。

本系列文章将集中关注加密和签名等在操作系统和应用程序环境中采取的措施,以积极地确保完整性。本文还将关注审计机制,以识别完整性的缺失并确定应对此负责的当事人。






回页首




机密性

当受保护的数据只能被授权的人或系统读取或者修改时,要保持其 机密性。这是一个与完整性截然不同的概念:当数据在网络上传输时,它可能是被毫无修改地正确传输,因此确保了其完整性,但是如果被第三方中途截取的话就再也不是机密的了。当未被授权的人可以访问数据传输并从中获取有价值的信息时,只有完整性是不够的。数据的机密性引出了三个更深入的问题:


谁希望访问数据?(认证)
哪些数据可以被访问?(授权)
如何保护数据不受未授权的访问?

Linux 有若干方法可以确保试图访问数据的实体是其所宣称的那一个。通过 Pluggable Authentication Modules(PAM),您可以实现一些认证策略,从存储在本地机器上一个集中目录(NIS、Kerberos、LDAP 等等)中简单的用户名/口令组合,到硬件标识或生物特征扫描不等。文件访问的授权可以使用传统的(粗糙的)UNIX 文件权限来解决:用户、组或全体级别的读、写和执行权限。较新的细粒度的(fine-grained)方法 —— 访问控制列表(Access Control Lists)—— 让您可以为具体的用户授予或拒绝具体的权限。

标准 Linux 安全概念是在软件中实现的,依赖于内核不接受没有被授权的用户对资源的使用。不过,内核缺陷(特权提升/自动调整、未经检查的参数,等等)可能会使用户可以访问先前不能访问的内存区域、磁盘空间、网络或者其他资源。通过安装击键记录器(keyloggers)、取走硬盘驱动器并在其他机器中读取、嗅探网络传输等等,对硬件物理上的访问可以让用户绕过软件检查。这样,必须采取更进一步的努力来保护机密的数据,比如文件系统、单个文件、网络传输的加密,和/或应用程序级别的加密。此外,物理上的措施也需要考虑,比如安全区域、数据的安全删除,以及机密信息的会计程序,不过本文并不涉及这些。






回页首




可用性

即使完整性和机密性都得到了保证,如果数据不能被访问,那么它是没有用处的,即不可用的。 可用性 措施确保数据永远不会丢失,而且当被请求时,可以以预定义的性能级别被访问。可用性可能会受到不同方式的威胁:


破坏性攻击 —— 称为拒绝服务(Denial-of-Service,DoS)攻击 —— 这类攻击的目标是可用性。它们通过消耗所有可用的网络、CPU、存储或操作系统资源(比如文件句柄),使得一台计算机或一个服务不可用或不能用。
目标是数据本身的攻击,试图删除或覆盖数据。
数据的意外破坏。在大部分情况下,不可能避免对数据的意外破坏,因为拥有适当权限的用户被认为是最终的权威。您只能通过在适当的位置使用一个备份/转储基础设施来预先做好准备。
最后,但不是最不重要的,缺陷、配置错误、物理环境、硬件失败、停电、不必要的系统重新引导等等,也都可能影响可用性。这个列表中的软件相关话题更应该归入 系统安全,稍后将更深入讨论。如上所述,硬件相关的话题在本文中不做讨论,但是,如果您对这些话题感兴趣,请参阅 参考资料部分以获得更多读物的链接。

解决上面列表中的前两个问题的特定 Linux 措施包括,网络数据包的防御(firewalling)/过滤(filtering ),对文件系统完整性的保护,以及计划可根据需要进行添加的额外的资源(例如,使用 Tivoli&reg; Intelligent Orchestrator;参阅 参考资料以获得链接)。






回页首




Linux 系统安全

Linux 是一个现代的、开放源代码的操作系统,可以自由地发行和拷贝。每个用户都有权限修改它的源代码,易于为您自己的环境定制 Linux、向操作系统添加新部件、发现缺陷和提供补丁,以及检查源代码中的安全漏洞。

尽管数据安全和系统安全是分开来考虑的,但是系统安全会对数据安全产生主要的影响。这就是为什么 Linux 具有很多解决机密性、完整性、可用性以及系统安全本身的问题的集成部件的原因。其中有 IP 防御、认证机制、系统日志和审计、加密协议和 API、内核级 VPN 支持,等等。另外,系统安全可以由(开放源代码)软件应用程序来支持,这些应用程序提供安全服务、加固和/或控制 Linux 系统、防止并检测入侵、检查系统和数据的完整性,并提供防止不同攻击的屏障。

安全的一个值得关注的主要因素是,Linux 与不开放源代码的操作系统之间的区别在于开放源代码开发过程本身。由于软件的每个用户和开发都可以访问其源代码,因而有很多人都在控制和审视源代码中可能的安全漏洞。软件缺陷很快会被发现。一方面,这会导致这些缺陷更早被利用;另一方面,很快就会有可用的安全补丁。






回页首




结束语

考虑其可靠性、稳定性、可扩展性、可管理性、性能,以及最后但不是最不重要的一点,它的安全部件, Linux 已经证明适合专业的企业应用程序。由于它的开放源代码哲学让用户可以为满足具体的需要而定制和扩展系统,Linux 变得越来越流行。因此,Linux 系统管理员需要理解加固 Linux 并保护它不受可能攻击的安全机制。本系列的下一篇文章将讨论获得安全的 Linux 系统的第一个步骤:计划和执行安装。待续!




参考资料

您可以参阅本文在 developerWorks 全球站点上的 英文原文.


Bruce Schneier 的 Secrets and Lies: Digital Security in a Networked World (John Wiley & Sons,2004)研究了计算机系统威胁、黑客理念体系、预防、安全系统实现等内容。


要获得关于那些提供安全的 Linux 环境的工作的全面概述和资源指南,请阅读 解决 Linux 中的安全问题 ( developerWorks,2001 年 6 月)。


实用 Linux 安全性 ( developerWorks,2002 年 10 月)强调指出合理的用户管理是良好安全的开始。


developerWorks 的 Linux 安全编程 专栏是一个即将推出的系列,旨在帮助您为 Linux 编写安全的程序。


完整性:更多读物
Seth Friedman 的 Building the Ideal Web Hosting Facility: A Physical Security Perspective (SANS Institute,2003 年 2 月)介绍了构建 Web 主机工具时的物理安全。
Wikipedia 阐述了 中间攻击中的人,在这种类型的攻击中,第三方可以读取并修改两个未知的受害者之间发送的消息。
阅读 Wikipedia 的关于 数字签名 的阐述。
验证数据完整性的一个常见方法是校验和。 Enhancing File System Integrity Through Checksums 给出了一个全面的概述。


机密性:更多读物
Pluggable Authentication Modules 允许在 Linux 操作系统中配置并权衡使用多个认证机制。
NIS-Howto 描述了如何将 Linux 配置为一个 NIS(YP)或 NIS+ 客户机,以及如何安装 NIS 服务器。
Kerberos Infrastructure HOWTO 描述了用于在 Linux 中处理认证的 Kerberos 基础设施的设计与配置。
LDAP 白皮书 描述了如何设置 Linux 工作站,以使用一个 LDAP 服务器来存储用户信息和进行认证。
Access Control Lists 补丁/用户代码组合 可以支持用于 Linux 内核的完全访问控制列表(ACL)。
GNU Privacy Guard 是一个开放源代码的加密软件栈。


可用性:更多读物
Tivoli Intelligent Orchestrator 通过自动触发服务器到产品的准备、配置以及部署来帮助提高服务器利用率。
当计划一个高可用配置时,要紧记 IBM 红皮书 Technote Patterns for the Edge of Network 中的指导方针。
红皮书 Continuous Availability -- Systems Design Guide 会引导您完成分析、设计和实现持续可用系统的整个过程。
American Power Conversion 的 Effect of UPS on System Availability 阐述了系统的可用性和运行时间会如何受到交流电断电的影响。
IT availability Check List( availability.com,2004)提供了关于可用性需要考虑的问题的一个速查清单。
Computerworld阐述了 如何防御 DDoS 攻击。


Linux 安全项目
Security Enhanced Linux:这个 Linux 版本将强大、灵活的强制访问控制体系结构融入内核之中。
Openwall GNU/Linux:以 Linux 和 GNU 软件为核心的增强安全的服务器操作系统。
Bastille Linux:Bastille Hardening System 努力去“加强”或“加固”UNIX 操作系统。
IPCop Firewall 是主要的 Linux 防火墙发行版本之一。
Knoppix 安全工具发行版 关注的是一张可引导 CD 上的信息安全和网络管理工具。
要了解更多 Linux 安全项目,请访问 LinuxLinks.com 的 Distributions: Secure。


在 developerWorks Linux 专区 可以找到更多为 Linux 开发者准备的参考资料。


购买 Developer Bookstore Linux 区 打折出售的 Linux 书籍。


自 developerWorks 的 为您的 Linux 应用开发加油提速 专区下载可以运行于 Linux 之上的经过挑选的 developerWorks Subscription 产品免费测试版本,包括 WebSphere Studio Site Developer、WebSphere SDK for Web services、WebSphere Application Server、DB2 Universal Database Personal Developers Edition、Tivoli Access Manager 和 Lotus Domino Server。要更快速地开始上手,请参阅针对各个产品的 how-to 文章和技术支持。




作者简介



  Mario Eberlein 是一名致力于随需应变商务应用程序的 IT 架构师。他于 1998 年 10 月加入 IBM,当前在 IBM Global Services 从事客户项目的工作。Mario 拥有科学学士学位,当前正在攻读 Business Administration 硕士学位的,并且具有 7 年的 Linux 经验。他是 EMEA Central Region 的 IBM Linux Security Workgroup 的领导。您可以通过 m_eberlein@de.ibm.com与 Mario 联系。




  Rene Auberger 是 IBM Software Group 的一名软件 IT 架构师。他主要与来自德国公共部门的客户(对 Linux 有浓厚兴趣的客户)的一起工作。1996 年 Rene 开始从事 Linux 方面的工作,从那时起就以各种形式为了不同的目的而使用 Linux。他是德国、奥地利和瑞典的 Software Group 的 Linux 技术领导。您可以通过 rene.auberger@de.ibm.com与他联系。




  Wolfram Andreas Richter 是 IBM Software Group 的一名商务集成顾问和 IT 专家。自 1995 年加入 IBM 起,Wolfram 已经涉足了很多学科领域,范围从应用程序开发到管理教育。他有 8 年的 Linux 经验,拥有德国斯图加特 University of Cooperative Education 的科学学士学位,以及英国 Henley Management College 的 Business Administration 硕士学位。在业余时间,Wolfram 喜欢进行运动、骑摩托车和外出。您可以通过 wrichter@de.ibm.com与他联系。
 楼主| 发表于 2007-5-13 22:29:01 | 显示全部楼层
惟有谨小慎微者方可幸存,与其他领域一样,在确保 Linux&reg; 系统的安全时,这句话也同样适用。幸运的是,有很多安全特性,或者已经编译到内核中,或者已经加入到很多 Linux 发行版本中,或者可以以开放源代码应用程序的形式单独获得。第 2 部分涵盖了清单评估、风险分析、确定用户类别和访问特权,以及安全获得 Linux 发行版本的更详细行动计划和步骤。
在此系列文章中,您将看到如何以一种安全的方法来计划、设计、安装、配置和维护运行 Linux 的系统。除了安全概念的理论概述、安装问题、潜在的威胁及其作用以外,您还将得到关于如何保护和加固基于 Linux 的系统的实用建议。我们将讨论最小化安装、加固 Linux 安装、授权/认证、本地和网络安全、攻击和如何防御攻击,以及数据安全、病毒和恶意程序。

本系列的 第 1 部分 通过给出关于安全概念和潜在威胁的一般理解让您开始上手。本文引导您进行到下一个阶段,列出当计划一个安全安装时需要谨记的事情。

安全计划

第一步 —— 在插入发行版本 CD 并启动安装程序之前 —— 是制定一个安全计划:确定系统将要提供什么服务,要使用什么硬件,需要什么软件,如何组织安装。通过在实际安装前认真地制定这样一个计划,在非常早的阶段就可以确定并排除很多可能的安全问题。这样做是有益处的,因为它有助于最小化系统入侵或者断电的风险。而且,它为发生攻击或者发布软件漏洞和补丁时进行快速反应提供了一个坚实的基础。

当考虑安全策略时,重要的是要注意计算机系统的安全性与可用性之间总是会有一个折衷。如果因为复杂的设置和维护以及可用性的缺乏而无法使用,那么最完善的安全特性也没有意义。另外,极度复杂的、极其耗费处理能力的加密算法实际上会锁住系统,几乎不留下任何计算能力给真正的任务使用,那么它又有什么用呢?

要制定安全计划,您应该执行下面的步骤,收集所有相关信息:

进行清单评估时要回答的问题

使用什么硬件?

指定硬件,它的位置,以及任何可能的特定安全特性(比如加锁的而且防火的房间)。列出网络接口、协议、地址以及相关的名称。

应该安装什么软件和操作系统?

指定应用程序及它们的数量,检查每个软件的许可证。

存储什么类型的数据,它的危险程度如何?

确定数据的种类。对于每一个确定的种类,根据其机密性和稳私考虑数据的危险程度。

谁对系统负责?

为系统指定负责人(例如,一个单独的系统管理员,一个专门的 IT 服务部门,或者一个支持提供商)。


完成清单评估

获得安全计划的第一个步骤是,评估清单以了解哪些是必须要保证安全的(参见右面的侧栏)。这样的清单集中关注计算机的物理硬件、网络连接、接口,并定义其职责。所有从清单评估得到的信息都应记入文档。记录文档的一个合适的方法可以是一个包含有每台计算机所有相关信息的电子数据表。

定义网络服务和软件

对于每一台计算机,重要的是要定义它使用或者提供哪些网络服务,以及使用或提供服务的软件应用程序。网络服务(除了其他内容以外,可能包括 DNS、文件传输、打印机和文件共享、Web/Internet、电子邮件和数据库)应该记录在部署计划之中,这个计划还包括所使用的软件程序包以及此计算机是配置为客户机、服务器还是同时具备两个角色。稍后,基于软件和服务的列表,您应该安装一个只包含必需软件的绝对最小化的系统,这样可以使得具有隐藏安全漏洞的可能性最低。

除了定义软件服务以外,您还需要确定用于通信的协议,这也会带来一些安全问题。网络传输是否需要通过基于 SSL 的 HTTP(https)进行加密,还是普通的 HTTP 就足够了?文件传输协议是否强制用户进行认证(比如使用 sftp),或者对必需的安全层级来说匿名的、不加密的访问是否合适?

通常,客户机工作站被配置为使用多个网络服务。不过,服务器应该专门提供一种单一的服务,因为这样会简化配置并降低发生配置错误的可能性。应该由有限数目用户使用的服务应该通过防火墙保护起来以防止不必要的访问。防火墙可以有效地实现管理两个或多个网络之间网络传输的安全策略。

完成风险分析

要在系统的安全性与可用性之间找到适当的折衷,重要的是要针对存储在计算上的数据的类型进行风险分析。要弄清楚需要采取哪种类型的安全措施来保护资源的机密性、完整性和可用性,第一个步骤就是进行风险分析。

风险分析基于清单评估 —— 它声明了存储的是什么类型的数据 —— 集中关注系统受到安全威胁的可能性以及相继而来的后果。换句话说,对于清单评估中定义的每一类数据,您都需要对此数据受到非授权访问的可能性以及这种事件的影响进行评估。这种评估量化为三个级别:高、中、低。所必需的安全级别是事件的概率及其影响的平均水平。

确定用户种类和访问特权

您应该根据其特权和访问权限列出计算机系统的主要用户,或者用户的种类。对于桌面计算机而言,这可能是相当简单的,因为用户的数目通常较少。不过,基于类似的工作分工或对数据资源和应用程序的类似需要来定义用户分类是有意义的。

对服务器来说,确定用户种类通常非常复杂。管理员通常可以访问服务和操作系统工具的配置。除此以外,还有根据需要使用相应服务的不同用户(本地的和远程的用户)。连接到因特网上的公共服务器基本上是任何人都可以访问的,而内部服务器的用户可能会根据工作角色、部门或者办公室位置进行分类。所以,如果需要,您应该区分本地和远程用户以及临时和来宾用户。对于已经确认的用户种类,定义他们需要访问和操作(例如,读、创建、修改或删除数据)哪些数据资源。






回页首




详细行动计划

既然安装的总体环境和目标都已经完善地记入文档,您现在可以深入细节了 —— 使用什么软件,如何安装和配置它,等等。您编写的计划应该详细到能回答出在安装过程中出现的任何问题的程度。

检查源代码

Ken Thompson 是 UNIX 的创始人之一,他在 Relections on trusting trust 中讨论了为了设法使源代码不能揭示安全问题而采取的很多步骤。

首先,他为 login 命令打上补丁,使其包含一个后门,这样使他可以使用一个特定的密码登录进入任何 UNIX 系统。

然后,他给 C 编译器打上补丁,使其当编译 login 命令时进行检测。C 编译器将自动把后门插入到 login 程序中,所以,不需要在 login 命令的源代码中保留后门。

然后,他对 C 编译器进行修改,使其在通过源代码编译 C 编译器本身时进行检测,并自动添加 login-detection-and-patching 代码和 C-compiler-detection-and-patching 代码。

结果得到一个源代码中不包含任何后门痕迹的系统。


选择 Linux 发行版本和服务器软件程序包

这实际上是两个单独的步骤,不过先做什么要取决于您的情况。在很多情况下,由于组织的政策、企业许可证协议或者可用的技术,要使用的发行版本已经确定。有时,您会先关注可以满足安装用途的软件程序包的选择;然后,根据程序包的先决条件、哪个发行版本包含立即可用的程序包、或者发行版本的价格,来选择发行版本。不过,通常两者是结合在一起的,您必须反复缩小选择范围。不过,您永远不应该仅仅因为您手边有某个安装媒体而选择安装那个发行版本。

对于每一种使用情形(邮件服务器、文件服务器、Web 服务器、字处理等等)都有多种软件程序包可以满足其用途。尤其当用户不直接与软件程序包打交道时(比如由专门团队管理的服务器软件),您选择更为安全的软件程序包时所受的限制就会更少。要对各种 Web 服务器、邮件传输代理、数据库管理系统等,或者甚至是整个发行版本的安全方面进行评价,最好首先搜索 BugTraq 或 Full Disclosure 等邮件列表(参见 参考资料 中关于这些的链接)。

基于软件程序包的历史问题来判断其安全性,这实际上相当于看着后窗玻璃驾驶汽车 —— 您不知道将要遇到的是什么,但是您可以得知您是在直路上还是在弯路上。另一个应该谨记的问题是,相对于很少用到的,经常用的软件程序包受到的检查更多。仅仅因为“Tom's HyperWeb Server v0.0.2”在这些邮件列表上没有任何已知的 bug,并不意味着它就没有 bug。

能在源代码层次上对任何软件程序包进行审计,经常被列举为开放源代码软件的优势之一。不过,可用时间、技术和预算等现实的约束使得这种方法在几乎所有情形下都是不切实际的,所以您不得不依赖于程序员 和/或 程序包维护者和发行者的诚实。

您还应该将打算如何运行一个服务记入文档。需要考虑的一些事情:

使用 xinetd 让您可以调整哪个服务可以提供给谁,可以强制限制防止拒绝服务(denial-of-service)攻击,可以将服务调用日志记录到一个集中的位置。
TCP 包装器 提供了一种方法,以将服务限制在特定范围的请求地址内,并将请求记录到日志。
chroot jails 创建一个环境,这个环境是您实际安装的一个子集。即使服务受到攻击,被影响的也只是这个子集环境。由于它基于目录树的隐藏部分,所以它最适用于那些操作在可以方便地包括到那个树中的小的而且独立的文件集上的服务器。

附加的软件程序包

除了计划的使用情形所需要的软件之外,安装过程很可能还会安装其他软件。您需要的软件(实际的操作系统:Linux 内核、共享库、基本的实用程序等等),您想要的软件(增强安全性的软件,比如配额、防火墙和审计),以及您不想要的软件(不必需的程序包)。

为了方便,发行版本通常向默认安装添加保持系统运行和满足其用途所不必要的软件程序包。在运行期没有用户交互的系统中,图形用户界面、多媒体软件和游戏都属于这种不必要的软件。

任何安装到机器上的软件都必然会占用资源并降低机器的安全性,引入可能被利用的潜在的 bug:

外部攻击者可以利用不必要的服务在服务器上执行代码,比如通过缓存溢出(参见 参考资料 中关于此漏洞讨论的链接)。
管理员也是人,所以容易犯错误。没有安装的软件不可能被错误地配置,这样就封住了另外的潜在安全漏洞。
即使软件不是一直在运行,也没有暴露在网络上,也会增加管理员的负担,因为在发现 bug 时管理员要进行安全修订。假定某个服务中的一个瑕疵被发现,而且发生了入侵。攻击者现在可以在用户的安全上下文中在服务器上执行程序。现在,机器上任何可用的程序都可能被攻击者利用,或者是提升他/她的特权,获取安全相关的信息,或者攻击可能深藏在组织的防火墙之后的其他系统。
社交工程技巧(social engineering techniques)经常欺骗合法用户(乃至管理员)去运行最终影响安全的程序,这是为什么要尽可能少地安装程序的另一个原因。

关于增强安全性的程序包,您应该考虑安装下面这些:

配额: 应该使用配额来限制用户(包括 ftpd 或 httpd 等后台进程的用户)可用的资源。这样可以挫败本地拒绝服务(DoS)攻击,那种攻击可能通过“fork bomb”用光所有可用的进程 ID,启动很多极其消耗内存的程序,或者消耗分区的全部空闲空间。大部分当前发行版本都包含配额,在大部分情况下其程序包称为“quota”。通过 PAM 可以实现除了磁盘配额以外的其他限制,它默认也会安装。在本系列的下一篇文章中将描述那些限制的配制。
防火墙: 通常,防火墙会根据定义的规则集合制止网络通信。所以,它的基本任务是通过阻塞不必要的传输来避免网络入侵。网络防火墙工作于 TCP/IP 栈层次之上,决定数据包是否可以通过(取决于规则集合)。
入侵检测: 入侵检测系统(intrusion detection system,IDS)的主要任务是,通过识别到来的 shellcode、病毒、恶意软件(malware)或者特洛伊木马等安全缺口,检测进入网络或者计算机的攻击或入侵。
审计: 审计指的是通过建立数据处于其期望状态的基线来检测敏感数据或配置文件的改变。当发生意外改变时,对基线的改变会被报告,使得管理员可以快速反应并进行恢复。

常见工具的安全代替者

任务/使用情形  老的不安全的应用程序  推荐的安全代替者  
远程访问命令行 telnet
rsh(远程 shell)
ssh(安全 Shell)

图形方式访问远程系统 X Window
VNC
基于 ssh 的 X Window
基于 ssh 的 VNC
rdesktop

文件传输 ftp
rcp(远程拷贝)
sftp
scp(安全拷贝)

镜像/备份 rsync
基于 ssh 的隧道 rsync




使用安全的工具程序版本

当前仍然有很多早期 Internet 应用程序存在,并且在使用中。开发它们时,安全还不是个大问题,因为那时 Internet 参与者很少。近些年,随着因特网的发展和迅速成长,安全性的缺乏使得那些应用程序不适于当前的应用。这就是开发它们的代替者的原因,这些代替者可以以安全的方式执行相同的任务 —— 现在的任务还是像在早期时一样重要。在这里,“安全的方式”的基本意思是:

对传输的数据(包括用户凭证和其他用户相关数据)加密,防止第三方可以理解传输的信息。
使用用户名和密码或者数字签名等凭证来识别用户和系统。

尽管这些代替者通常被称为“安全的标准的应用程序”,但是它们并不是绝对不会受攻击。这表示,虽然您经过深入考虑使用了安全的版本而不是不安全的版本,您仍需要建立另外的观念和步骤来保护您的系统。侧栏 常见工具的安全代替者 中列出了适用于所选常见任务的应用程序。这个列表不是(也不可能是)完全的,所以,即使是要完成那些没有在侧栏中列出的任务,您也应该始终考虑使用安全的应用程序。

分区

选择的应用程序以及安装所使用的源代码并不是安全性的惟一因素。要减少那种试图填满可用磁盘空间的 DoS 攻击带来的影响,请确保您至少为下面这些目录计划专门的分区:

/home: 使用户数据与系统无关。当您执行备份和恢复操作、升级或切换操作系统、或者在系统中迁移用户时,这非常有用。
/var: 保存服务器的日志和运行时数据。通过将其安放于一个单独的文件系统,如果您成为某个 DoS 攻击的目标,则数据不会填满您全部的空闲空间。
/tmp: 类似于 /var,这个目录对用户进程来说是可写的,使得它成为 DoS 攻击的一个目标。比使用单独的文件系统更好的办法是使用 tmpfs,它加速了文件的访问速度,并在重新引导时自动清空文件系统的内容。
/boot: 容纳有 Linux 内核、初始驱动程序以及引导加载器数据。不必为了引导过程而挂载这个分区,因为引导加载器将内核加载为一系列扇区,以从硬盘读取数据。如果在正常的操作中没有挂载它,那么您就不会意外地覆盖这些文件。






回页首




获取发行版本

可以通过很多不同的途径获得 Linux 发行版本:热缩塑料包包装的 CD/DVD 发行版本、从其他人那里拷贝、下载,等等。如果系统在安装的时候就已经被破坏,那么它根本是没有价值的,因此您必须确保基于“干净”的来源进行安装 —— 确认代码没有后门。实际上,这一负担转嫁给了那些编制包含安装文件的 CD/DVD 组的发行者。虽然您可以信任发行者,不过,根据发行者公布的校验和来校验安装媒体的校验和以确定媒体是正品,仍不失为一个良好的习惯做法。

如何校验安装媒体

要校验 MD5 校验和,您可以使用

$ md5sum /path/to/iso/image.iso



$ md5sum /dev/cdrom

来分别校验 ISO 映象或者 CD。计算出的校验和必须与发行者公开的相匹配。如果您通过 Web 得到发布的校验和,那么要确保使用 https,并查看连接中使用的凭证,以确保校验和的发布者是真实的。


不推荐通过网络或者因特网进行安装 —— 尽管技术上可行。一个站点可能(比如,通过欺骗)将自己伪装为一个可信任的安装源,并提供加入了后门的修改过的软件程序包,使得在安装后入侵者可以不费力地接管系统。当然,可**以通过内部网络服务器进行安装,例如当来源已知而且合法时。

刚刚安装的操作系统通常不能马上使用,可能没有安装最新安全补丁。此时是最容易受到攻击的(参见 参考资料 中一篇关于未打补丁的系统预期生存期的文章的链接),在从安装过程直到完成配置步骤期间,应该从 Internet 上隔离出来,或者至少是在一个安全的网段。在本系列的下一篇文章中将讨论这些步骤。

安装后,应该通过第二台(有适当保护的)计算机从 Internet 上下载最新的安全补丁和更新。同样,必须选择可信任的安装来源来下载补丁。可以通过严肃的提供者所给出的校验和或者散列来检验下载的安装文件的完整性。




参考资料

您可以参阅本文在 developerWorks 全球站点上的 英文原文。


要获得安全性相关参考资料的详尽列表,请阅读本系列的第一篇 让 Linux 更安全,第 1 部分:介绍 (developerWorks,2004 年 7 月)。


您应该阅读的另一个 CERT 模块是 Deploying Firewalls。


BugTraq archive 给出了关于多种安全风险的不断发展的更新。


Smashing the stack for fun and profit 给出了关于缓存溢出以及如何利用它们的讨论。


Securing Debian HOWTO 给出了一个完善的配置清单,也可用于其他发行版本。


LinuxLinks 的 安全发行版本列表 是关于得到加强的 Linux 发行版本的列表。


在 SourceForge.net 上的 Linux DiskQuota project page 中可以找到管理配额的工具。


Quota mini-HOWTO Chapter "installation and configuration" 给出了 quotas 的安装和构建说明。


如果您想大致了解攻击有多频繁,以及在 Internet 中没有打补丁的服务器可以期望生存多长时间,请阅读 Honeynet Project 的 Know Your Enemy: Statistics。


SANS Institute 有一篇短文,展示了收集的 生存时间数据,即某个 IP 地址成为某个蠕虫的目标之前所经历的平均时间。


Best Practices for UNIX chroot() Operations 讨论了 chroot() 并介绍了如何最大限度地利用它。


要获得关于那些提供安全的 Linux 环境的工作的全面概述和资源指南,请阅读 解决 Linux 中的安全问题(developerWorks,2001 年 6 月)。


服务器诊所:实用 Linux 安全性( developerWorks,2002 年 10 月)强调指出合理的用户管理是良好安全的开始。


developerWorks 的 Linux 安全编程 专栏是一个即将推出的系列,旨在帮助您为 Linux 编写安全的程序。


在 developerWorks Linux 专区 可以找到更多为 Linux 开发者准备的参考资料。


自 developerWorks 的 Speed-start your Linux app 专区下载可以运行于 Linux 之上的 IBM 中间件产品的免费测试版本,包括 WebSphere&reg; Studio Application Developer、WebSphere Application Server、DB2&reg; Universal Database、Tivoli&reg; Access Manager 和 Tivoli Directory Server,查找 how-to 文章和技术支持。


通过参与 developerWorks blogs 加入到 developerWorks 社区。


在 Developer Bookstore Linux 专栏中定购 打折出售的 Linux 书籍。




作者简介



  Mario Eberlein 是一名致力于随需应变商务应用程序的 IT 架构师。他于 1998 年 10 月加入 IBM,当前在 IBM Global Services 从事客户项目的工作。Mario 拥有科学学士学位,当前正在攻读 Business Administration 的硕士学位,并且具有 7 年的 Linux 经验。他是位于 EMEA Central Region 的 IBM Linux Security Workgroup 的领导。您可以通过 m_eberlein@de.ibm.com 与 Mario 联系。




  Rene Auberger 是 IBM Software Group 的一名软件 IT 架构师。他主要与来自德国的公共部门(一个对 Linux 有浓厚兴趣的客户)的客户一起工作。1996 年 Rene 开始从事 Linux 方面的工作,从那时起就以各种形式为了不同的目的而使用 Linux。他是德国、奥地利和瑞典的 Software Group 的 Linux 专业领导,可以通过 rene.auberger@de.ibm.com 与他联系。




  Wolfram Andreas Richter 是 IBM Software Group 的一名商务集成顾问和 IT 专家。自 1995 年加入 IBM 起,Wolfram 已经涉足了很多学科领域,范围从应用程序开发到管理教育。他有八年的 Linux 经验,拥有位于德国斯图加特的 University of Cooperative Education 的科学学士学位,以及英国 Henley Management College 的 Business Administration 硕士学位。在业余时间,Wolfram 喜欢体育运动、骑摩托车和外出。您可以通过 wrichter@de.ibm.com 与他联系。
 楼主| 发表于 2007-5-13 22:29:30 | 显示全部楼层
学习能够使您的 Linux&#8482; 系统更能抵御攻击的技术,包括保护引导过程和本地文件、为服务和后台进程加锁、强制实行配额和限制、启用强制访问控制(mandatory access control),以及识别那些在使用新软件更新安全设施时可能会引入的安全漏洞。本系列的 第 1 部分 介绍了安全性的概念以及潜在的威胁。第 2 部分 列出了计划安全安装时需要谨记的事情。
在此系列文章中,您将看到如何以一种安全的方法来计划、设计、安装、配置和维护运行 Linux 的系统。除了安全概念的理论概述、安装问题、潜在的危险及其作用以外,您还将得到关于如何保护和加固基于 Linux 的系统的实用建议。我们将讨论最小化安装、加固 Linux 安装、授权/认证、本地和网络安全、攻击和如何防御攻击,以及数据安全、病毒和恶意程序。

本系列的 第 1 部分 通过给出关于安全概念和潜在危险的一般理解让您开始上手。 第 2 部分 引导您进行到下一个阶段,列出当计划一个安全安装时需要紧记的事情,其中包括制定一个详细的安全行动计划。

在本部分,我们将讨论加固(hardening)Linux 的步骤。

关于加固

要让加固行动更为成功,您应该:

在系统连接到网络之前进行加固,以避免攻击。
基于 最小权限原则(least-privilege model) 进行配置:系统应该为特定的功能只赋予其所需要的权限。类似地,用户应该只拥有他们所需要的最小限度的权限。
在完成初步计划并准备和执行了最小化安装后(见第 2 部分),您需要进行一些配置步骤。这些步骤通常被称作是加固 Linux。

保护引导过程
保护服务和后台进程
保护本地文件
强制实行配额和限制
启用强制访问控制
更新和添加安全补丁





回页首




保护引导过程

配置引导加载器(LILO 或者 Grub),以令其在引导时不被任何用户干涉;这样就防止了用户在引导提示时向内核传递参数。除非您需要远程引导(比如在远程的数据中心),不然就配置它让它要求输入密码。这是对有可能物理上接触机器的人的进一步防范;它可以防止某些事件的偶然攻击,比如使用参数 single 或者 init=/bin/sh 来获得 root shell,等等。不过,要注意,稍加努力就可以避开此防范机制(比如拆下硬盘驱动器并将其挂载到另一个系统上),除非您对文件系统也进行了加密。

对 LILO 而言,在 lilo.conf 配置文件(通常在 /etc 下)中使用参数 password 替换 prompt。对于 Grub,相应的参数是 Grub 配置文件(通常在 /boot/grub/grub/conf 下)中的 hiddenmenu、default 0 和 password。

在 /etc/inittab 中添加 sp:S:respawn:/sbin/sulogin,以确保当切换到单用户模式时运行级的配置要求输入 root 密码。

防止用户使用 Ctrl-Alt-Del 进行重新引导:在 /etc/inittab 中注释掉 ctrlaltdel 行,禁用 ctrlaltdel。通过向类似这样一行( #ca::ctrlaltdel:/sbin/shutdown -t5 -rf now)添加一个井号(#),您就可以防止那个组合键触发重新引导。






回页首




保护服务和后台进程

服务的安全配置的第一个步骤是,禁用所有不需要的服务。不提供的服务不会为潜在的入侵者所利用,有效地降低了风险。

为了找出所有启用的服务,需要检查若干个位置。另外,要禁用不安全的服务,并使用更为安全的选择来取代它们。例如,telnet 不是加密的,所以,使用加密的 ssh 服务来取代 telnet(见第 2 部分)。

当保护服务时,考虑这些方面:

/etc/inittab
/etc/init.d 中的引导脚本
inetd/xinetd 后台进程
TCP 封装器(wrappers)
防火墙
/etc/inittab

在引导过程中,init 进程会去读取 /etc/inittab 文件中的条目。每一个条目 —— 每一行 —— 都定义了在特定的条件下运行哪个程序。这些程序或者本身是服务,或者是用于启动和停止服务。

init 进程能识别若干个称为 运行级(run levels) (由一个字母标识)的状态。当输入了运行级或者发生特定的事件(比如电源故障)时,就会考察那些条目,并执行适当的命令。

/etc/inittab 中条目的格式是,前面是条目的标签,随后是在哪些运行级下此条目要执行,然后是动作关键字以及包括命令行参数的需要执行的命令。所有这些域都由冒号隔开,典型的条目应该类似这样:

my_service:35nce:/usr/local/bin/my_service someparameter

(在 inittab 手册中可以找到动作关键字的完全列表。)

在这个示例中,条目的标签是 my_service。当输入的运行级为 3 或 5 时,它将使用参数 someparameter 来运行程序 /usr/local/bin/my_service。一旦这个程序被终止,它将不会再重新启动(动作关键字“once”)。

为了保护 Linux 系统,您应该理解 /etc/inittab 中所有条目的功能,并禁用潜在不必要的服务,方法是删除那个条目,或者在那一行的开头使用井号注释掉它。

在所有 Linux 系统中,都会有以下两类条目。第一类用来启动名为 /sbin/getty (或者类似的)的程序,这些通常是用来允许通过 Linux 虚拟控制台或者串行线登录。第二类会运行 /etc/rc.d 目录中通常名为 rc 的脚本,并将当前运行级作为参数给出。这个脚本控制服务的启动和停止(接下来会介绍)。

/etc/init.d 中的引导脚本

/etc/init.d 中的引导脚本用来启动或者停止系统服务。对于每一个运行级,都有一个 /etc/rcN.d 目录(“N”是运行级的标识),其中包含了指向那些在运行级改变时需要调用的脚本的软链接。

如果链接名以“S”开头,则脚本在进入那个运行级时执行,启动相应的服务;如果以“K”开头,则脚本在退出那个运行级时执行,停止那个服务。

大部分情况下,引导脚本的名称会暗示它所控制的服务。要防止在特定的运行级中会启动某个服务,则删除运行级目录中指向相应引导脚本的链接,或者使用一个不做任何事情的虚脚本取代 /etc/init.d 中原来的引导脚本。

inetd/xinetd 后台进程

也可以在客户机请求时根据需要调用服务。这些请求被转交给超级后台进程 inetd 或者 xinetd。然后超级后台进程确定要启动哪个服务,并将请求传递到相应的后台进程。通常,telnet、ftp、rlogin 等服务使用 inetd 或者 xinetd 启动。

inetd 后台进程在 /etc/inetd.conf 配置,那个文件中包含了关于每一个超级后台进程需要提供的服务的条目。配置 FTP 服务器的条目应该类似这样 —— ftp stream tcp nowait root /usr/bin/ftpd in.ftpd -el —— 使用井号注释掉它,就可以禁用它。

为了安全起见,建议使用 xinetd。与 inetd 相比, xinetd 能够启动基于 rpc 的服务,并支持访问控制。xinetd 可以限制进入连接的速度、来自特定主机的进入连接的数目,或者某个服务的总连接数。

通过用于每个从属后台进程的独立配置文件来配置 xinetd 。这些文件位于 /etc/xinetd.d/ 目录中。前面 FTP 服务器的示例配置文件应该称为 called /etc/xinetd.d/ftp,类似这样:



清单 1. 配置文件,/etc/xinetd.d/ftp
                               
service ftp
        {
                socket_type       = stream
                   protocol          = tcp
                   wait              = no
                   user              = root
                   server            = /usr/bin/ftpd
                   server_args       = -el
                   disable           = yes
        }



为了禁用这个服务,参数 disable 被设置为 yes,如上面示例所示。

为了更详细的访问控制,xinetd 支持以下三个另外的参数:

only_from
no_access
access_time
为了限制访问,但不完全禁用 ftp 后台进程,您可以如下修改配置文件 /etc/xinetd.d/ftp:



清单 2. 为限制访问而修改过的配置文件,/etc/xinetd.d/ftp
                               
service ftp
        {
                socket_type       = stream
                   protocol          = tcp
                   wait              = no
                   user              = root
                   server            = /usr/bin/ftpd
                   server_args       = -el
                   disable           = no
                   only-from         = 192.168.200.3 192.168.200.7 192.168.200.9
                   only-from        += 192.168.200.10 192.168.200.12 172.16.0.0
                   no_access         = 172.16.{1,2,3,10}
                   access_times      = 07:00-21:00
        }



only-from 和 no_access 可以接受数字 IP 地址(最右边的零作为任意数值处理)、IP 地址/网络掩码 范围、主机名以及 /etc/networks 中的网络名。如果组合使用 only-from 和 no_access, xinetd 会为每个主机连接寻找最接近的匹配。

在前面的代码示例中,表示 IP 地址为 172.16.x.x 的主机可以连接到此主机,但地址属于 172.16.1.x、 172.16.2.x、172.16.3.x 和 172.16.10.x 的则不能连接。可见,当使用 no_access 所用的因数符号时,不需要指定地址的所有四个部分。因数部分必须是地址最右边的部分。参阅下面的 参考资料 部分,以获得关于 xinetd 及其配置的文章。

TCP 封装器

如果您决定不使用 xinetd,而是使用 inted,那么您可以使用 TCP 封装器来记录请求和具体的对特定网络的 允许/拒绝。TCP 封装器会为了认证和记录日志而去检查 /etc/hosts.allow 和 /etc/hosts.deny,并将客户机请求封装起来,不直接回应它们。一旦认证成功,请求就会被转发到原来请求的服务。

相对于使用普通的 inetd,使用 TCP 封装器有两个主要的好处:

发出请求的客户机不会察觉到 TCP 封装器;因此,没有异心的人不会发现任何区别,而心怀不轨的人也得不到关于他们的请求失败的任何信息。
TCP 封装器的工作不会理会任何已经被封装的服务,让应用程序能够共享它们的配置文件,从而简化管理。
要获得关于 TCP 封装器配置文件的详细文档,请参阅 参考资料 中列出的 Red Hat Linux Reference Guide。

如何找到所有人都可写的(world-writable)文件

要找出所有人都可写的文件,使用此命令:

find / -perm -002 \( -type f -o -type d \) -ls

其中:

/ 是搜索的起始位置。
-perm 检查权限。
002 表示(八进制符号)“other”设置了写位。
模式 002 之前的 - 表示设置了所有权限位(没有考虑模式中的 zero-bits)。
-type f 或者 -type d 搜索常规的文件和目录。
-ls 以 ls 格式列出找到的文件。


防火墙

为了防范与不应该运行的服务或者不应该被 Internet 等特定网络所访问的服务的通信,建议安装一个防火墙。防火墙提供网络间基于信任级别的受控通信,并权衡使用基于角色的安全策略和最小权限原则允许或者拒绝对特定服务的访问。

防火墙的安装与配置是一个非常复杂的话题,不在本系列文章的讨论范围之内。






回页首




保护本地文件系统

保护本地文件系统涉及的是文件和目录的所有者及访问它们的权限。要保护文件系统,文件和目录的保护位必须设置为只授予最小限度的权限。

要特别注意关于所有人可写的文件和系统目录的不适当权限,以及所谓的 setuid 或者 setgid 命令。这些命令运行时的用户权限比运行此命令的用户实际拥有的权限更高。对访问只有 root 才可以访问的文件来说这可能是必需的(比如 /bin/passwd 需要访问 /etc/passwd)。对于这些命令,要确保它们每一个都确实需要设置 setuid/setgid 位。如果不是这样,那么禁用它。

当某个分区上的所有文件确实都不需要 setuid/setgid 位时, /etc/fstab 中的 nosuid 选项可以为相应文件系统中的每个文件都禁用它(下面的示例中的 /dev/hdc1):

#device                mountpoint        filesystemtype        options                dump        fsckorder
/dev/hda1        /                ext2                defaults        1        1
...
/dev/hdc1        /mnt/cdrom        iso9660            nosuid,user        1        2



此外,对于所有敏感的数据,都有必要对其进行加密并使用密码保护它。为此,GnuPG 提供了一个合适的软件包。






回页首




强制实行配额和限制

Linux PAM(插入式认证模块,Pluggable Authentication Modules)可以强制实行一些实用的限制,在 /etc/security/limits.conf 文件中对此进行配置。谨记,这些限制适用于单个对话。您可以使用 maxlogins 来控制总额限制。limits.conf 中的条目有如下结构: username|@groupname type resource limit。

为了与 username 区别,groupname 之前必须加 @。类型必须是 soft 或者 hard。软限制(soft-limit)可以被超出,通常只是警戒线,而硬限制(hard-limit)不能被超出。resource 可以是下面的关键字之一:

core - 限制内核文件的大小(KB)。
data - 最大数据大小(KB)。
fsize - 最大文件大小(KB)。
memlock - 最大锁定内存地址空间(KB)。
nofile - 打开文件的最大数目。
rss - 最大持久设置大小(KB)。
stack - 最大栈大小(KB)。
cpu - 以分钟为单位的最多 CPU 时间。
nproc - 进程的最大数目。
as - 地址空间限制。
maxlogins - 此用户允许登录的最大数目。
在下面的代码示例中,所有用户每个会话都限制在 10 MB,并允许同时有四个登录。第三行禁用了每个人的内核转储。第四行除去了用户 bin 的所有限制。ftp 允许有 10 个并发会话(对匿名 ftp 帐号尤其实用);managers 组的成员的进程数目限制为 40 个。developers 有 64 MB 的 memlock 限制,wwwusers 的成员不能创建大于 50 MB 的文件。



清单 3. 设置配额和限制
                               
*           hard  rss        10000
*           hard  maxlogins      4
*           hard  core           0
bin         -
ftp         hard  maxlogins     10
@managers   hard  nproc         40
@developers hard  memlock    64000
@wwwusers   hard  fsize      50000


最佳的配额经验

您应该为允许用户写入的每一个分区启用配额。也要考虑到您的系统中有一些属于应用程序的用户 ID,而不是个人用户。那些 ID 可能会拥有对某些目录的写权限,而人没有这种权限。

向 cronjobs 添加 /sbin/quotacheck -avug,以自动更新内核当前所使用的配额文件和表。


要激活这些限制,您需要在 /etc/pam.d/login 底部添加下面一行: session required /lib/security/pam_limits.so。

配额让您能够限制用户和组的 inode 数目和可用空间。注意,配额是在每个加载点上定义的,所以,如果用户在若干个分区上有写权限,那么要确保为它们每个都定义配额。

配额是管理员最小化 DoS 攻击的一种方式,这类攻击以填满硬盘驱动器上所有可用空间为手段(这会使其他进程不能创建临时文件而使它们失败)。根据您正在使用的发行版本,您可以安装自带的配额工具,也可以自己下载、编译并安装它们(参见 参考资料)。

必须在内核中启用配额。当前大部分发行版本都支持配额。如果您的发行版本没有启用配额,那么参考 参考资料 中的 mini-howto 来获得启用它们的说明。

要为文件系统启用配额,您必须在 /etc/fstab 中为相应的那行添加一个选项。使用 usrquota 和 grpquota 来启用用户配额和组配额,如清单 4 所示:



清单 4. 启用用户配额和组配额
                               
/dev/hda1    /           ext3    defaults                     1 1
/dev/hda2    /home       ext3    defaults,usrquota            1 1
/dev/hda3    /tmp        ext3    defaults,usrquota,grpquota   1 1
/dev/hda4    /shared     ext3    defaults,grpquota            1 1
/dev/hdc1    /mnt/cdrom  iso9660 nosuid,user                  1 2



然后,使用 mount -a -o remount 重新挂载相应的文件系统,来激活刚才添加的选项;然后使用 quotacheck -cugvm 创建一个二进制配额文件,其中包含了机器可读格式的配额配置。这是配额子系统要操作的文件。

使用工具 edquota 完成配额的指派。要为用户 alice 定义限制,则使用 edquota -u alice 来调用它。环境变量 EDITOR 中定义的编辑器(默认是 vi)会打开,其中有类似如下的内容:

Quotas for user alice:
/dev/hda2: blocks in use: 3567, limits (soft = 5500, hard = 6500)
         inodes in use: 412, limits (soft = 1000, hard = 1500)



“in use”值只是为您提供信息,不能被修改 —— 您能修改的只是软限制和硬限制。保存并退出编辑器后, edquota 会读取您刚才编辑的临时文件,并将那些值传递到二进制配额文件,以使您的修改生效。对组配额的编辑与此相同,只是必须使用 -g 选项而不是 -u。

软限制是警告级别,可以被超出,而硬限制是严格强制的。软限制有一个 宽限期(grace period) (有时也称为 软性时间限制(soft time limits));这是允许用户超出软限制直到被系统强制执行之前的时间间隔。

您可以使用 edquota -t 来设置宽限期。可以使用的单位是秒、分、小时、天、周和月。其他管理配额的实用工具包括 repquota(总结某个文件系统的配额)、 quotaon 和 quotaoff(打开和关闭配额)。






回页首




启用强制访问控制

通过 SELinux 所实现的强制访问控制(或者说是 MAC),您可以获得进一步的安全性。使用 MAC,操作系统中的许可由进程所属的 用户/组 ID 以及正要被访问的对象(文件)所属的 用户/组 ID 来管理。另外,使用 MAC,Linux 会强制为每个单独的进程执行这些策略,它们会控制进程可以做什么事情。

那样,在使用 MAC 进行适当配置的系统中,被外来控制或攻击的服务不能够接管系统。就算是进程运行所属的用户或组 ID(最坏的情形:root)可能会与 /etc/passwd 等关键系统文件权限相匹配,那个策略也会及时地禁止对它们的访问。

Internet 上的测试系统可以展现出 SELinux 的有效性,它允许任何人登录;控制机制防止了所有的恶意行为,即使用户能够以 root 身份登录!

添加提供商 GnuPG 密钥

发行版本提供商 GnuPG 密钥应该已经是基本配置的一部分。您可以使用这个命令添加您所信任的第三方提供商的密钥: $ rpm -import <keyfile>。

您应该确保是以安全的方式获得密钥文件,例如,通过 HTTPS 从提供商的 Web 站点上下载,这样您可以校验连接的证书。


不过,使用 SELinux 也有一些问题。首先,如果发行版本提供商不支持 MAC,那么其配置是相当困难的。可能需要打补丁和重新编译内核,并替换特定的系统管理工具(所有这些都可能影响发行版本提供商的支持策略)。第二,定义一个适当的策略是非常复杂的任务。如果没有可用的策略定义供您的应用程序选择,那么在 MAC 环境中制定并实施这个策略会非常艰难。这就使得对某些使用情形来说这样做比较困难,比如需要支持种类很多的软件包的桌面工作站。






回页首




更新和添加安全补丁

为了让系统尽可能保持安全,您需要及时了解用于您的软件的新修订和补丁。这些信息可以通过若干个渠道得到,不过,通常软件提供商和 Linux 发行商应该为您及时地提供这些信息。您也可以使用(几乎永远免费)CERT(Computer Emergency Response Team)的服务。他们通常会维持传达关于最新的建议、漏洞等信息的邮件列表。

当有新的更新可用时,您应该去查看它是否适用于您的系统以及您的安全需要。安装更新本身可能会导致安全问题。另外,要考虑到每个更新都可能会引入新的漏洞,或者如果更新失败,您的系统可能会停留在不可用的状态。

当在大范围的系统中安装某个更新时,您通常不能同时对它们全部进行更新 —— 这可能会导致您的多个系统在更新期间互相不兼容。

可见,更新系统会涉及到很多风险。这里是降低这些风险的一些建议:

初始安装后,不要将您的系统立即连接到网络。将所有相关的更新下载到一台单独的机器,然后手工地传输它们,以确保系统在暴露在网络上之前已经处于当前状态(current state)。


始终拥有可用的近期系统备份。


对于业务中每一个关键的系统,您都应该有一个与产品环境的硬件和软件相同的独立测试环境。首先在测试环境中获得关于更新的经验,以防止在管理产品系统时出现意外。


理想情况下,您应该已经准备好一套回归测试,在更新包括系统在内的所有程序之前和之后对适当的功能和性能进行对比。至少,要确保拥有可重复的而且文档化的质量控制检查,以保证在修改产品环境之前测试环境中的主要功能和服务不会受到影响。


对于小型网络来说,手工安装更新或许可行,但规模较大时很快就难以处理了。这经常会导致更新不能被安装。使用商业的或者开放源代码的系统管理或者软件分发工作来简化更新的部署。


我们是不是提醒过您最好在手边准备一个备份?我们还要再提醒一次。


制定一个安装更新的计划,并考虑:
更新系统的次序
对您的业务来说关键的系统
系统如何互相依赖
哪个系统包含机密数据


当使用完整性检查工具时(强烈建议至少对服务器使用),为了能识别出意外的更改,要记得更新系统在已知安全状态下占用内存的基线。


在安装任何修订之前,要使用密码检验和工具检查软件的完全性和真实性(尤其是从 Web 站点或者 ftp 服务器上下载时)。在 Linux 领域中,通常使用 MD5 和/或 SHA-1 检验和。如果软件以 RPM 包的形式提供,那么提供商应该已经提供了一个 GnuPG 签名。您可以运行 $ rpm -v --checksig <name>.rpm 命令来检查它。成功的响应应该是 "<name>.rpm: md5 gpg OK";不成功的会是 "<name>.rpm: md5 GPG NOT OK"。
您可以使用 $ md5sum <name>.rpm 或 $ sha1sum <name>.rpm 来确认 MD5 或 SHA-1 检验和。如果您下载的某个文件中包含的检验和可用于多个文件(大部分情况下称为 md5sum.asc 或 <name>.md5),那么您可以使用 $ md5sum -c md5sum.asc。



最后,但不是最不重要的是,要备份您的系统。(我们是不是已经说过了?)





回页首




将您的安全计划付诸实行

如本系列 第 2 部分 中所讨论的,现在来将文档化的安全计划应用到已经安装的系统。弄清楚哪些进程正在您的系统中实际地运行,并禁用不需要的那些。要定期地检查不正常的行为;未知的进程可能会提供不必要的服务,预示着系统的受损。

本节向您介绍如何找出并禁用那些不必要的(潜在危险)进程,以及如何为系统准备定期审计。

找出并禁用不必要的进程

理想情况下,您应该明白在您的系统中运行的每一个进程。要获得所有进程的列表,可以执行命令 ps -ef(POSIX 风格)或 ps ax(BSD 风格)。进程名有方括号的是内核级的进程,执行辅助功能(比如将缓存写入到磁盘);所有其他进程都是使用者进程。您会注意到,就算是在您新安装的(最小化的)系统中,也会有很多进程在运行。熟悉它们,并把它们记录到文档中。

网络监控工具

这些工具可以帮助进行网络监控:

Nmap(Network Mapper)是一个免费的开源工具,可用于网络探察和安全审计。完成安装和设置后使用它来检查您的系统。
IPTraf 是一个用于 Linux 的基于控制台的网络统计工具。它收集各种数据,比如 TCP 连接数据包和字节计数、接口统计和活动指示器、TCP/UDP 传输衰减、局域网工作台数据包和字节计数。
Multi Router Traffic Grapher(MRTG)是一个用于监控网络链路上传输负载的工具。MRTG 会生成包含图形的 HTML 页面,为此传输提供生动的可视化描述。参见 MRTG 索引页 上的示例。


现在让我们来看那些开放网络连接的进程;它们受到攻击的潜在可能最大。要获得所有 TCP 或 UDP 连接的列表,执行命令 netstat -atu(附带名字解析,易读)或者 netstat -atun (没有名字解析,更快)。在这个列表中,特别要注意状态为 LISTEN 的 TCP 连接和所有的 UDP 连接,因为服务器通过这些连接来接收到来的连接。

如果服务器侦听 127.0.0.1/localhost,那么它只能由系统本身(环回接口)访问到。因此它的暴露程度要远低于侦听外部可达接口甚至 0.0.0.0(= *,如果打开名字解析)的服务器,后者可以由任意网络接口所访问。

如果您使用过 netstat -atun,那么您需要自己翻译端口号。可以在 /etc/services 中去查找它们。使用附加的参数 -p 来显示相应的进程,如 清单 5 所示。

在这个示例中,您可以推断出 portmapper 和 graphical user interface(X)是特定的服务器所不需要的。portmapper 为 NFS 等各种基于 RPC 的服务提供标准端点(endpoint);系统并不提供 NFS 共享。当系统用作工作站时 X 窗口是有用的,但在服务器上的使用受限。

确定这些进程是如何被启动的(通过 /etc/inittab,通过引导脚本,等等)并如前所述的那样禁用它们。如果程序是由另一个程序启动的,那么这项任务可能会更具挑战性:X 服务器很有可能是由显示管理器启动的,比如 xdm、kdm 或 gdm,其本身并不会出现在 inittab 或引导脚本目录中。

netstat 所列出的连接并不是自动都可以由网络上的所有计算机来使用。在任何数据包到达开放的连接之前,基于 Linux 内置功能的防火墙可以进一步控制访问。

审计准备

安装了基本的系统并安全地配置后,您的最终目标是保持系统的安全。为了识别出对系统的不必要修改,使用审计工具来记录处于希望是已知且安全的状态的系统的内存占用,并检测对它的修改。






回页首




结束语

本期文章向您展示了如何加固您的 Linux 系统,即通过保护引导过程和本地文件系统、锁定服务和后台进程、强制实行配额和限制、启用强制访问控制、找出在使用新软件版本更新安全性时可能会引入的安全漏洞。当配置安全性参数时,请遵循最小权限原则的概念。另外,要了解在您的系统中运行的 所有 进程,以使得您可以禁用不需要的那些,防止它们成为进入到您的 Linux 环境安全心脏的途径。

下一期将深入研究 SELinux,为您给出关于如何使用它的概念资料和实践资料。




参考资料

您可以参阅本文在 developerWorks 全球站点上的 英文原文。


阅读 developerWorks 上此 让 Linux 更安全 系列的其他各期文章。


“解决 Linux 中的安全问题”(developerWorks,2001 年 6 月)为您给出了一个关于提供安全的 Linux 环境的全面概述和资源指南。


“服务器诊所: 实用 Linux 安全性 ”(developerWorks,2002 年 10 月)强调指出有效的安全首先要有有效的用户管理。


developerWorks 上的 安全编程 专栏是一个正在发展中的系列,致力于帮助您为 Linux 编写安全的程序。


LinuxLinks 的 安全发行版本列表 是一个已经加固的 Linux 发行版本的列表。


&AElig;leen Frisch 撰写了一个关于 加固 Linux 系统 的专栏 —— 也在这个 hardening checklist 中。


Linux Security HOWTO 是对 Linux 系统管理员所面临的安全问题的全面概述。


Jerry Peek 的 Sharing Files (Carefully) 提供了对 Linux 文件系统权限的全面理解。


comptechdoc.org 提供了两篇关于 inetd 的极好的文章: Inetd Services 和 Inetd and Network Services。


LinuxPlanet 教程 Controlling Access to Your Services with xinetd 介绍了 xinetd,它是 inetd 的“安全”替代者。


Red Hat Linux Reference Manual on TCP Wrappers 是关于 TCP 封装器和 xinetd 的极好资源。


IBM study tests Linux security (z+xSeries) 是一项计划部署并比较各种开源安全工具的为期三个月的研究,基于研究过程中的经验提供解决方案建议。


Quota mini-HOWTO 描述了如何在 Linux 主机上启用文件系统配额。


下面的资源可以帮助您了解 SELinux:
SELinux History and Project FAQ
SELinux unofficial technical FAQ
SELinux play machines
Writing a SELinux policy


在 developerWorks Linux 专区 可以找到更多为 Linux 开发者准备的参考资料。


通过参与 developerWorks blogs 加入 developerWorks 社区。


购买 Developer Bookstore Linux 区 打折出售的 Linux 书籍。


定购免费的 SEK for Linux,这套 DVD (两张),包含了来自 DB2&reg;、Lotus&reg;、Rational&reg;、 Tivoli&reg; 和 WebSphere&reg; 的用于 Linux 的最新 IBM 试用软件。


使用可以直接从 developerWorks 下载的 IBM 试用软件 来改革您的下一个 Linux 开发项目。




作者简介



  Mario Eberlein 是一名致力于商务应用程序的 IT 架构师。他于 1998 年 10 月加入 IBM,当前在 IBM Global Services 从事客户项目的工作。Mario 拥有科学学士学位,当前正在攻读 Business Administration 硕士学位,并且具有 7 年的 Linux 经验。他是 EMEA Central Region 的 IBM Linux Security Workgroup 的领导。您可以通过 m_eberlein@de.ibm.com 与 Mario 联系。




  Rene Auberger 是 IBM Software Group 的一名软件 IT 设计师。他主要与来自德国的公共部门(一个对 Linux 有浓厚兴趣的客户)的客户一起工作。1996 年 Rene 开始从事 Linux 方面的工作,从那里起就以各种形式为了不同的目的而使用 Linux。他是德国、奥地利和瑞典的 Software Group 的 Linux 专业领导,您可以通过 rene.auberger@de.ibm.com 与 Rene 联系。




  Wolfram Andreas Richter 是 IBM Software Group 的一名商务集成顾问和 IT 专家。自 1995 年加入 IBM 起,Wolfram 已经涉足了很多学科领域,范围从应用程序开发到管理教育。他有 8 年的 Linux 经验,拥有德国斯图加特 University of Cooperative Education 的科学学士学位,以及英国 Henley Management College 的 Business Administration 硕士学位。在业余时间,Wolfram 喜欢进行运动、骑摩托车和外出。您可以通过 wrichter@de.ibm.com 与 Wolfram 联系。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|boway Inc. ( 冀ICP备10011147号 )

GMT+8, 2024-4-20 18:04 , Processed in 0.139250 second(s), 16 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表