频道栏目
首页 > 安全 > 系统安全 > 正文

使用cfengine安全加固Solaris服务器(下)

2011-09-25 16:44:22      个评论      
收藏   我要投稿

 

上一篇文章中我们介绍了Cfengine的功能、组成部分、以及Cfengine安装和所需进程,本文将来详细介绍Cfengine配置和客户机系统准备,通过Cfengine加固Solaris服务器。

       四、Cfengine 配置介绍

  cfengine配置

                                                Cfengine 配置

  这个简单的配置文件被分为四个小节,每一小节又以一个冒号为结尾的关键字引入,分别是控制:(control:),文件:(files:),复制:(copy:),以及清理:(tidy:)。

  控制(control)小节定义了一系列目录,我们将其命名为tmpdirs,这个我们将在以后中用到(在清理(tidy:)小节)。

  文件(files)小节指定了所有在/usr/local/bin 目录里的文件都应被根用户root 和bin 组所有,并且定义了文件的模式为0755(所有权者拥有所有权限,其他用户拥有读操作及执行操作)。当Cfengine 运行时,它将修改所有与该配置文件描述不相符的属性以及权限。因此,该小节用于定义在本地二进制目录中适合可执行文件的所有权以及许可。

  复制(copy)小节中描述了对Linux 和Solaris 系统的不同配置方法。在Solaris 系统中,当位于主服务器上/config/pam/solaris 目录中的文件更新后,位于/etc/pam.d 目录中的文件也会随之更新。而在Linux 系统中,只有文件/etc/pam.d/common-auth 会随着PAM 的主配置文件的更新而更新。需要注意的是:这两个规范执行着相同的底层系统配置以及维护策略:当需要的时候,相关的PAM 配置文件将从主服务器中被更新。

  清洁(tidy)小节举例说明了隐式循环的利用。例子中单一的指示应用于tmpdirs列表中的每一个目录文件。对于每一个目录,Cfengine 会删除在目录中所有的项,或者子目录中任意一个七天内没有被使用过的项目(包括那些以点号开始的文件名)。如同在这个示例配置文件中的其他方针,这一节执行的策略是:删除一周内未被使用的临时目录中的项目。所有的Cfengine 配置文件在以上所介绍的方面以及其他相似元素方面的描述都有所不同,有些元素的描述更加细致具体。

  1.创建基本的配置文件

  这些配置文件需要放置在配置服务器上的主配置目录中。这些文件都是公共文件并以最初形式在网络中的每台服务器上使用。

  (1) cfservd.conf示例

  下面是cfservd守护进程的配置文件。它允许客户机传送主配置文件集合,还允许通过cfrun远程执行cfagent。显然,只有一个系统允许访问中心配置文件(服务器),但是,允许cfservd访问这些文件不会损害其他系统上的任何文件(因为它们不复制这些文件)。但是,所有系统都可以从远程执行cfagent中获益,因为它允许从远程系统中按需执行cfagent。因此,可以在所有系统中使用下列cfservd.conf,这正是我们所需要的功能:

 

      control:
  domain=(mydomain.com)
  AllowUsers=(root)
  cfrunCommand=("/var/cfagent/bin/cfagent")
  admit:
  /usr/local/var/cfengine/inputs*.mydomain.com
  /var/cfagent/bin/cfagent*.mydomain.com

 

  Cfrun Command设置指定在接收到来自cfrun的连接时,要执行的cfagent二进制文件的位置。admit段非常重要,因为它指定哪个主机访问哪个文件。您必须授予对中心配置目录和cfagent二进制文件的访问权。您还需要对客户机需要从此服务器传送的任何其他文件授予访问权。

  2.创建配置服务器

  配置服务器包含cfengine配置文件的主副本。它还像所有客户机系统一样,定期处理此配置文件。服务器必须运行经过正确配置的cfservd,以便客户机系统可以从系统中检索主配置文件。配置服务器需要特殊位置来保存cfengine主配置文件。在本例中,此位置是/usr/local/var/cfengine/inputs/。此位置可以是除/var/cfengine/inputs/之外的任何目录,因为重要主机在执行时与其他主机一样,将文件复制到此目录中。

  与所有系统相似,此服务器也应作为守护进程或从cron(最好是两者)运行cfexecd。

  下面生成服务器密钥,需要在服务器系统上运行cfkey来创建公钥和私钥文件。这些文件位于/var/cfengine/ppkeys/目录中并将被命名为localhost.priv和localhost.pub。然后需要将localhost.pub复制到同一目录中的新文件中。此文件应称为root-10.1.1.1.pub,假定您的IP地址为10.1.1.1。只需让cfrun命令连接到本身即可,但无论如何执行此操作会很有用。根据下节描述的客户机的IP地址,服务器还需要在适当文件中保存的每个客户机的公钥。

 

3.准备客户机系统

  客户机系统的配置相对简单。一旦安装了实际的cfengine二进制文件,则需要生成和复制适当的公钥(如本节所述)。还需要从主服务器手动复制update.conf文件,并放在/var/cfengine/inputs/中。在正确的位置保存此文件后,则应手动运行cfagent以下载其余的配置文件并完成系统配置。每个客户机都应以守护进程的方式或从cron运行cfexecd。可能要在每个客户机上运行cfservd并允许使用cfrun远程执行cfagent。假定已经在服务器上的cfagent.conf文件中完成了配置,则这些守护进程将在第一次手动执行cfagent时启动。

  下面生成客户机密钥,需要在每个客户机系统上运行cfkey。此操作将在/var/cfengine/ppkeys/中创建localhost.priv和localhost.pub。然后,需要将中心服务器的公钥复制到客户机。如果服务器的IP地址是10.1.1.1,则应将其公钥复制到客户机上/var/cfengine/ppkeys/目录中的root-10.1.1.1.pub。最后,需要将客户机的公钥(localhost.pub)复制到服务器的/var/cfengine/ppkeys/目录中。此外,此文件应按照客户机的IP地址进行命名(如果其IP地址是10.2.2.2,则此文件应在服务器上被命名为root-10.2.2.2.pub)。这可以手动完成,也可以在初始系统配置脚本中自动完成。

  4使用cfrun

  cfrun命令允许在网络上任何数量的系统中执行cfagent。它需要在当前目录中包含名为cfrun.hosts的配置文件(或通过-f选项指定的文件)。文件的内容应如下所示:

 

      domain=mydomain.com
  server.mydomain.com
  client1.mydomain.com
  client2.mydomain.com

 

  除域设置外,此文件仅是包含每台主机(包括服务器)的一个列表。通过将下列选项添加到文件顶部,还可以将输出记录到一系列文件中(而非显示在屏幕上):

 

      outputdir=/tmp/cfrun_output
  maxchild=10106

 

  上述代码告诉cfrun生成10个进程,并将每台主机的输出保存在指定目录的不同文件中。通常运行cfrun可以不带参数。如果确实要指定参数,格式如下所示:

  cfrunCFRUN_OPTIONSHOSTS--CFAGENT_OPTIONS–CLASSESCFRUN_OPTIONS是可选的。可为cfrun命令包含任何数量的选项。接着,可以指定主机名的可选列表。如果已指定了某些主机,则只联系这些主机。如果未指定任何主机,则联系cfrun.hosts文件中的每个主机。第一个--之后是在每个远程系统上运行的要传送给实际cfagent命令的任何选项。第二个--之后是类的可选列表。如果指定了某些类,那么只有与其中某个类匹配的主机将实际执行cfagent(尽管已联系了每个主机,因为每个主机必须决定它是否匹配其中一个类)。

 

5.应用实例:安全加固Solaris服务器

  如果您已经阅读本文之前的大部分内容,就会知道cfengine非常棒。一旦安装并运行了cfengine,它就可以为您做任何事,包括安全加固Solaris服务器。

  cfengine可以在很多方面提高系统的安全性。首先,它允许按照统一的方法自动配置系统。cfengine配置一般可以胜任将更改快速应用到同一类或者其他类中的其他主机,甚至可以应用到尚未安装的系统。这意味着,如果通过cfengine纠正了unix系统上的安全问题,稍后又安装了新的unix系统,那么新系统上同样的安全问题也会迎刃而解(如果必要的话)。

  1使用cfengine执行基本的文件检查

  cfengine自动对files段中提到的所有文件和目录进行某些安全性检查。首先,它报告和记录那些是setuid或setgidroot的文件(一个文件最多只能报告一次)。可执行的setuid和setgid文件使程序作为特定的用户(比如root)运行,而不管真正执行该命令的用户是谁。显然,这是一项强大但同时也很危险的功能。

  另外,当处理files、tidy和copy段时,cfengine会标识出可疑文件。可以利用下列设置控制该行为:

 

      control:
  NonAlphaNumFiles=(on)
  FileExtensions=(oacgifjpghtml)#etc
  SuspiciousNames=(.molrk3lkr3)

 

  第一项设置使cfengine报告并禁用它所发现的非字母和数字的文件。第二项设置(FileExtensions)包含一列标准的文件扩展名。既然用户可能试图利用标准的文件扩展名创建它们,那么如果cfengine发现具有这些扩展名的目录,就会报告它们。第三项设置(SuspiciousNames)标识出那些如果被发现将会发出警告的文件。

  2 使用cfengine禁用系统上的各种文件和程序

  可以使用cfengine禁用系统上的各种文件和程序。当可执行文件以及其他文件遭到禁用时,用.cf-disabled扩展名对它们重命名,并把它们的权限设置为0400。示例如下:

 

      disable:
  any::
  /root/.rhosts
  /etc/hosts.equiv
  solaris::
  #Someversionsprovidealocalrootexploit
  /usr/bin/eject278

 

  第一段禁用了所有系统上的文件/root/.rhosts和/etc/hosts.equiv,因为使用这些文件通常被认为很危险。

  3 使用cfengine确保文件安全

  可以使用cfengine来保证重要系统文件具有的正确的访问权限。下面的示例是关于如何在系统账户文件上设置权限:

 

      files:
  /etc/passwdmode=644owner=rootgroup=rootaction=fixall
  /etc/shadowmode=600owner=rootgroup=rootaction=fixall
  /etc/groupmode=644owner=rootgroup=rootaction=fixall

 

  也可以使用cfengine监控系统上的二进制文件。和其他文件一样,二进制文件的权限可以被检查,任何问题都可以被修复。对于二进制文件,尤其是那些setuidroot文件,这是一项非常有用的特性。还可以使用cfengine提供某些Tripwire功能——可以使用它来监控一个文件的md5校验和。示例如下:

 

      files:
  /bin/mountmode=4555owner=rootgroup=rootaction=fixallchecksum=md5

 

  在很多系统上,/bin/mount程序都是setuidroot。这允许一般用户在无需超级用户权限的情况下挂载特定的驱动器。本例中给出的参数让cfengine检查该二进制文件(以及属于setuidroot的所有其他文件)上的权限,并在数据库中检查它的校验和。如果校验和发生了变化,那么在cfagent每次运行时,您将得到通知。这会持续下去,直到在control段中利用下列设置执行了cfagent。

 

      control:
  ChecksumUpdates=(on)

 

  该设置导致所有已存储的文件校验和被更新为当前值。您还可以让cfengine查找并消除您并没有专门列出的任何setuidroot文件:

 

      filters:
  {root_owned_files
  Owner:"root"
  Result:"Owner"
  }
  files:
  /
  filter=root_owned_files
  mode=u-s#noSUIDbitmaybeset
  recurse=inf
  action=fixall
  inform=true
  #Andthefullpathsoffilesthat*should*beSUID
  ignore=/proc
  ignore=/bin/ping
  ignore=/usr/bin/su
  ignore=/usr/bin/passwd
  ignore=/usr/bin/at
  ignore=/usr/bin/crontab
  ignore=/usr/bin/rsh
  ignore=/usr/sbin/traceroute

 

  上述代码递归整个文件系统,并禁用root拥有的所有文件的setuid位。我使用ignore选项来排除我希望设置为root的文件。您也可以忽略具有此指令的目录(此种情况下为/proc/)。保证使用了完整路径名——虽然可以使用ignore=ping来替代ignore=/bin/ping,但是前者可能会不经意间忽略掉文件/home/hackeduser/.hidden/my_fake_ping。注意本例并不广泛适用。如果您想将其放在一个有效的cfagent.conf中,那么它可能将系统搞得一团糟。原因是每个操作系统都有不同的设置root的程序,这样才能正常运行。

 

 

4使用cfengine使用控制网络服务

  首先应该在每个系统上禁用所有不需要的进程——尤其是那些接受网络连接的进程。您可能至少需要运行一定数量的服务。可以利用TCP包装器限制对这些服务的访问。

  1.禁用inetd服务

  可以利用cfengine快速禁用从inetd启动的服务。例如,希望禁用“r”服务(rsh,rlogin等):

 

      editfiles:
  {/etc/inetd.conf
  HashCommentLinesContaining"rshd"
  HashCommentLinesContaining"rlogind"
  HashCommentLinesContaining"rwall"
  DefineClasses"modified_inetd"
  }

 

  由于“r”服务实际上在利用系统的inetd侦听套接字,所以我只是注释掉inetd配置文件中的某些条目(在某些系统中是/etc/inetd.conf,而在其他系统中是/etc/inet/inetd.conf)。请求定义modified_inetd类——但只在进行更改的情况下。当该类被定义时,可以用它向inetd发送HUP信号,以便它能够重新读取其配置:

 

      processes:
  modified_inetd::
  "inetd"signal=hup

 

  2.禁用守护程序

  默认情况下,系统上可能运行了为数不少的进程。您可能发现有很多是不需要的,这些不需要的进程中有一些在端口上侦听远程连接。禁用这些进程需要两个步骤:首先,需要保证有问题的进程没有运行。利用cfengine很容易实现。例如,假定系统没有使用NFS——NFS使用了几个要终止的进程:

 

      processes:
  "nfsd"signal=kill
  "rpc.statd"signal=kill
  "rpc.rquotad"signal=kill
  "rpc.mountd"signal=kill

 

  如果这些进程在运行,当每次cfagent运行时,就会终止它们。

  总结:本文介绍了使用cfengine安全加固Solaris服务器,当然也可以用于Linux 、BSD、HPUX等其他类Unix系统。

相关TAG标签 服务器
上一篇:使用cfengine安全加固Solaris服务器(上)
下一篇:linux环境下mysql “root”提权
相关文章
图文推荐

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训

版权所有: 红黑联盟--致力于做实用的IT技术学习网站