2


保护系统安全:方法论

本章提供保护系统安全的方法论。它提供了一个在使用 Solaris Security Toolkit 软件保护系统安全之前可以采用的过程。

本章包含以下主题:


规划和准备

适当的规划是成功使用 Solaris Security Toolkit 软件来保护系统安全的关键。规划阶段将根据组织的安全策略和标准以及系统的应用程序和操作要求,为系统构建一个 Solaris Security Toolkit 配置文件。该阶段分为以下任务:

尽管未在本书中说明,该阶段的其他注意事项可能包括了解风险和收益,了解基础结构及其安全要求,考虑责任,日志以及对使用的审计。

考虑风险和收益

本节给出了在尝试保护系统安全之前必须准确理解的注意事项。仔细权衡风险与收益以确定适合您的组织的操作。

加强系统的安全性时,必须采取特殊的预防措施以确保在使用 Solaris Security Toolkit 软件之后,系统可以正常运行。此外,优化该过程来确保尽可能短的停机时间也非常重要。



注 - 保护经过部署的系统的安全时,在某些情况下,重新构建系统是更加有效的方法,这样可在安装时加强系统的安全性,然后重新加载操作所需的全部软件。



1. 了解系统上的服务和应用程序的要求。

在运行 Solaris Security Toolkit 软件之前,必须识别运行在系统上的服务和应用程序。必须列举出所有与服务和应用程序相关的从属性,以便 Solaris Security Toolkit 软件可以有效地进行调整。无法执行此操作可能会禁用或阻止必需的服务启动。因为由 Solaris Security Toolkit 软件所做的更改在大多数情况下都可以撤消,在安装之前开发正确的配置文件可以限制与 Solaris Security Toolkit 软件实现相关的潜在的停机时间。

2. 要考虑到系统必须脱机和重新引导的情况。

要使由 Solaris Security Toolkit 软件所做的更改生效,必须重新引导系统。根据系统的重要程度、系统所提供的服务、维护窗口的可用性,组织可能在执行该软件时遇到不同的困难。在仔细权衡停机时间的花费与不增强安全性的风险之后,必须做出一个决定。

3. 系统可能要求多次重新引导以验证其功能性。

在将更改应用到影响关键任务的实际环境之前,首先应在非生产系统中进行试验。但有时无法满足这样的要求,例如,没有足够的硬件和软件对目标环境进行有效的镜像。在 Solaris Security Toolkit 软件安装前后都必须进行测试。在系统加强安全性后,可能仍然存在未识别的、需要进行错误诊断的从属性。在大多数情况下,可以使用本章中介绍的技术非常快速地解决这些问题。如果在 Solaris Security Toolkit 软件安装后发现了功能问题,可能需要额外的平台重新引导来撤消 Solaris Security Toolkit 软件的影响或者对系统的配置做进一步的更改以支持并启用缺失的功能。

4. 平台安全性需要的不仅仅是加强和最小化。

当考虑改进系统配置以增强其安全状态时,必须了解的是,平台加强和最小化只代表了可以用于和应该用于保护系统、服务和数据的一小部分措施。其他措施和控制不在本文的范围之内,但希望您考虑到与帐户管理、权限管理、文件系统和数据完整性、基于主机的访问控制、入侵检测、安全漏洞扫描和分析以及应用程序安全相关的问题。

5. 系统可能已经被利用或者具有可被利用的安全漏洞。

正在加强安全性的平台可能已经被攻击者利用。Solaris Security Toolkit 软件的执行可能已经太晚而无法为已被利用的安全漏洞提供保护。在这种情况下,请重新安装系统,然后安装并使用 Solaris Security Toolkit 软件来增强安全性。

查看安全策略、标准和相关文档

保护系统安全的首要任务就是了解组织的相关安全策略、标准以及关于平台安全性的准则。使用这些文档来构成您的 Solaris Security Toolkit 配置文件的基础,因为这些文档提供了对于组织内的所有系统要遵循的要求和实践。如果您的组织没有这些文档,则开发它可以提高定制 Solaris Security Toolkit 软件的能力。



注 - 当查找这些文档时,请记住某些材料可能列于最佳做法或其他文档中。



有关安全策略的详细信息,请参阅 Sun BluePrints OnLine 文章“Developing a Security Policy”。该文档可以使您对安全策略在组织安全性计划中发挥的作用有更进一步的了解。

以下两个实例说明了策略声明是如何直接影响 Solaris Security Toolkit 配置文件的配置方式的。

实例 1



注 - 可以使用扩展(例如 Kerberos)将 Telnet 和 FTP 服务配置为支持更强的身份验证和加密。这些服务作为实例列出,虽然它们的缺省配置并不支持这些已添加的安全级别。



实例 2

策略 -- 强制所有用户每 30 天更改一次他们的口令。

配置文件影响 -- 可以将 Solaris Security Toolkit 软件配置为启用口令过期。缺省情况下,Solaris Security Toolkit 软件设定口令最长的过期时间为 8 周(56 天)。要符合该策略,必须更改 Solaris Security Toolkit 软件的配置文件。请参阅《Solaris Security Toolkit 4.1 Reference Manual》

尽管 Solaris Security Toolkit 软件在系统上运行时缺省情况下启用了口令过期,但这种更改并不会影响现有用户。要为现有用户启用口令过期,请在每个用户帐户上调用 passwd(1) 命令。

确定应用程序和服务要求

该任务确保在系统加强安全性后服务仍然保持正常工作。该任务包括以下步骤:

确定应用程序和可用服务清单

清点应用程序、服务和可用功能或管理功能。该清单对于确定实际在系统上使用的软件是必需的。在很多情况下,系统会配置比使用的软件更多的软件,甚至配置有不支持业务功能的软件。

应该构建尽可能小的系统。也就是说,不应该安装不是支持业务功能所必需的软件。系统上不必要的软件应用程序会增加攻击者可以用于利用系统的机会的数量。此外,系统上安装更多的软件通常就等于必须要应用更多的修补程序。有关最小化 Solaris 操作系统的信息,请参阅 Sun BluePrints OnLine 文章“Minimizing the Solaris Operating Environment for Security”。

当构建软件的清单时,请确保除包括位于系统上的应用程序之外,还要包括基础结构组件(例如管理、监视以及备份软件)。

确定服务要求

在完成应用程序和服务清单后,确定加强安全性的过程是否会影响到组件的从属性。很多第三方应用程序不直接使用由 Solaris OS 提供的服务。对于直接使用 Solaris OS 提供的服务的应用程序,以下各节提供了有用的信息。

共享库

了解支持应用程序需要的库是非常重要的。在调试环境时这种知识最为有用,在准备要进行安全性加强的系统时也很有用。当系统状态未知时,收集尽可能多的信息以便准确地理解问题(例如,软件相关性)。

有三种方法可以确定应用程序所使用的库,这取决于所安装的 Solaris OS 版本:

实例: 确定支持 DNS 服务器软件所需要的库。

要收集有关文件系统对象的信息,请使用 /usr/bin/ldd 命令。


代码示例 2-1 获得有关文件系统对象的信息

# ldd /usr/sbin/in.named
libresolv.so.2 => /usr/lib/libresolv.so.2
libsocket.so.1 => /usr/lib/libsocket.so.1
libnsl.so.1 =>    /usr/lib/libnsl.so.1
libc.so.1 =>      /usr/lib/libc.so.1
libdl.so.1 =>    /usr/lib/libdl.so.1
libmp.so.2 =>    /usr/lib/libmp.so.2
/usr/platform/SUNW,Ultra-5_10/lib/libc_psr.so.1

 

要从正在运行的进程中收集信息,请使用 /usr/proc/bin/pldd 命令(在 Solaris OS 版本 8 和 9 中可用)。


代码示例 2-2 从正在运行的进程中收集信息

# pldd 20307
20307:  /usr/sbin/in.named
/usr/lib/libresolv.so.2
/usr/lib/libsocket.so.1
/usr/lib/libdhcpagent.so.1
/usr/lib/libdhcpagent.so.1
/usr/lib/libdhcpagent.so.1
/usr/lib/libmp.so.2
/usr/platform/sun4u/lib/libc_psr.so.1
/usr/lib/dns/dnssafe.so.1
/usr/lib/dns/cylink.so.1

 

除应用程序所链接的库之外,pldd 命令还显示由应用程序动态加载的共享库。也可以使用以下 truss 命令来收集该信息。



注 - 为简洁起见,将输出内容做了删节。




代码示例 2-3 确定动态加载的应用程序

# truss -f -topen,open64 /usr/sbin/in.named
20357:  open("/usr/lib/libresolv.so.2", O_RDONLY)       = 3
20357:  open("/usr/lib/libsocket.so.1", O_RDONLY)       = 3
20357:  open("/usr/lib/libnsl.so.1", O_RDONLY)          = 3
20357:  open("/usr/lib/libc.so.1", O_RDONLY)            = 3
20357:  open("/usr/lib/libdl.so.1", O_RDONLY)           = 3
20357:  open("/usr/lib/libmp.so.2", O_RDONLY)           = 3
20357:  open("/usr/lib/nss_files.so.1", O_RDONLY)       = 4
20357:  open("/usr/lib/nss_files.so.1", O_RDONLY)       = 4
20357:  open("/usr/lib/dns/dnssafe.so.1", O_RDONLY)     = 4
20357:  open("/usr/lib/dns/cylink.so.1", O_RDONLY)      = 4
20357:  open("/usr/lib/dns/sparcv9/cylink.so.1", O_RDONLY) = 4

 

此输出的版本包含进程标识符、系统调用(在本例中为 open)及其变量以及系统调用的返回值。使用返回值,可清晰地看到系统调用成功找到和打开共享库。

了解清楚共享库列表后,请使用以下命令来确定它们属于哪个 Solaris OS 软件包。


# grep '/usr/lib/dns/cylink.so.1' /var/sadm/install/contents
/usr/lib/dns/cylink.so.1 f none 0755 root bin 63532 24346 \
  1018126408 SUNWcsl

 

结果输出表示该共享库属于 SUNWcsl(核心,共享库)软件包。当执行平台最小化时该进程尤其有用,因为它有助于确定支持应用程序或服务所必需的软件包。

配置文件

另一种收集要求的方法就是通过配置文件。因为可以重命名或删除配置文件以禁用服务,该过程更直接地影响系统的安全性加强方式。有关详细信息,请参阅《Solaris Security Toolkit 4.1 Reference Manual》

要确定是否正在使用配置文件,请使用 truss 命令。



注 - 为简洁起见,将输出内容做了删节。




代码示例 2-4 确定是否正在使用配置文件

# truss -f -topen,open64 /usr/sbin/in.named 2>&1 | \grep -v "/usr/lib/.*.so.*"
20384:  open("/etc/resolv.conf", O_RDONLY)              = 3
20384:  open("/dev/conslog", O_WRONLY)                  = 3
20384:  open("/usr/share/lib/zoneinfo/US/Eastern", O_RDONLY) = 4
20384:  open("/var/run/syslog_door", O_RDONLY)          = 4
20384:  open("/etc/nsswitch.conf", O_RDONLY)            = 4
20384:  open("/etc/services", O_RDONLY)                 = 4
20384:  open("/etc/protocols", O_RDONLY)                = 4
20384:  open("/etc/named.conf", O_RDONLY)               = 4
20384:  open("named.ca", O_RDONLY)                      = 5
20384:  open("named.local", O_RDONLY)                   = 5
20384:  open("db.192.168.1", O_RDONLY)                  = 5
20384:  open("db.internal.net", O_RDONLY)               = 5

 

在本例中,DNS 服务使用了配置文件(例如 /etc/named.conf)。正如前面的实例中介绍的,如果服务的返回值表明一个错误,则可能存在问题。仔细记录加强安全性前后的结果有助于加速整个验证过程。

服务框架

该类别包括框架或元服务,基于这些来构建更大、更复杂的应用程序。通常可以在该类别中找到的框架类型是命名服务(例如,NIS、NIS+ 和 LDAP)、身份验证服务(例如,Kerberos 和 LDAP)以及由 RPC 工具所使用的服务(例如端口映射器)。

并不能总是清楚地了解应用程序何时依赖于这些类型的服务。当需要特殊的调整来配置应用程序时(例如将其添加到 Kerberos 领域),相关性是已知的。在某些情况下,应用程序相关性不需要添加任何任务,而且供应商可能不会记录实际的相关性。

这样的一个实例是 RPC 端口映射器。缺省情况下,Solaris Security Toolkit 软件禁用 RPC 端口映射器。该操作可能会引起依赖于该服务的其他服务中的异常行为。基于过去的经验,服务退出、挂起或者失败取决于处理异常情况的应用程序代码编写的好坏程度。要确定应用程序是否正在使用 RPC 端口映射器,请使用 rpcinfo 命令。例如:


代码示例 2-5 确定哪些应用程序使用 RPC

# rpcinfo -p
100000    3   tcp    111  rpcbind
100000    4   udp    111  rpcbind
100000    2   udp    111  rpcbind
100024    1   udp  32777  status
100024    1   tcp  32772  status
100133    1   udp  32777
100133    1   tcp  32772
100021    1   udp   4045  nlockmgr
100021    2   udp   4045  nlockmgr
100021    3   udp   4045  nlockmgr
100021    4   udp   4045  nlockmgr
100021    1   tcp   4045  nlockmgr

 

服务列中填充了来自 /etc/rpc 文件和/或已配置的命名服务(例如 LDAP)的信息。

如果该文件没有用于某个服务(通常是第三方产品)的条目,该服务字段可能为空。这就使确定由其他应用程序注册的应用程序变得更加困难。

例如,考虑 rusers 命令。该命令依赖于 RPC 端口映射服务。如果 RPC 端口映射器没有运行,rusers 命令显示为挂起。程序最终会超时,并显示以下错误消息:


# rusers -a localhost
localhost: RPC: Rpcbind failure

 

出现此问题是因为该程序无法与服务进行通信。在从 /etc/init.d/rpc 启动 RPC 端口映射服务之后,该程序立即产生其结果。

作为另一个实例,请考虑 RPC 端口映射服务正在运行,而 rusers 服务没有配置为运行的情况。在这种情况下,就会产生完全不同的响应,并且可以相对简单地进行验证。


代码示例 2-6 验证 rusers 服务

# rusers -a localhost
localhost: RPC: Program not registered
# grep rusers /etc/rpc
rusersd         100002  rusers
# rpcinfo -p | grep rusers
<No output generated>

 

假设 rpcinfo 命令没有用于 rusers 服务的注册表,可以肯定的认为该服务没有配置为运行。这种假设是通过查看 /etc/inet/inetd.conf 中的服务条目进行验证的。


# grep rusers /etc/inet/inetd.conf
# rusersd/2-3   tli     rpc/datagram_v,circuit_v     wait root
/usr/lib/netsvc/rusers/rpc.rusersd     rpc.rusersd

 

该服务行开头的注释标记 (#) 表明已禁用 rusers 服务。要启用该服务,请取消注释行并将 SIGHUP 信号发送到 /usr/sbin/inetd 进程,如下所示。


# pkill -HUP inetd

 

注 - 仅 Solaris OS 版本 7 至 9 中有 pkill 命令。对于其他版本,请分别使用 pskill 命令来查找并通知该进程。



另一种确定应用程序是否使用 RPC 工具的方法是使用前面介绍的 ldd 命令。


代码示例 2-7 确定使用 RPC 的应用程序的备选方法

# ldd /usr/lib/netsvc/rusers/rpc.rusersd
libnsl.so.1 =>   /usr/lib/libnsl.so.1
librpcsvc.so.1 =>        /usr/lib/librpcsvc.so.1
libc.so.1 =>     /usr/lib/libc.so.1
libdl.so.1 =>    /usr/lib/libdl.so.1
libmp.so.2 =>    /usr/lib/libmp.so.2
/usr/platform/SUNW,Ultra-250/lib/libc_psr.so.1

 

librpcsvc.so.1 条目与文件名指明该服务依赖于 RPC 端口映射服务。

除 RPC 端口映射器外,应用程序可能依赖于其他常用的 OS 服务,例如 FTP、SNMP 或 NFS。可以使用类似的技术来调试这些服务并确定它们是否确实是支持业务功能所必需的。一种方法涉及使用 netstat 命令,如下所示。


# netstat -a | egrep "ESTABLISHED|TIME_WAIT"

 

该命令返回一个最近使用的服务列表,例如:


表 2-1 列出最近使用的服务

localhost.32827      localhost.32828      49152      0 49152      0 ESTABLISHED
localhost.35044      localhost.32784      49152      0 49152      0 ESTABLISHED
localhost.32784      localhost.35044      49152      0 49152      0 ESTABLISHED
localhost.35047      localhost.35046      49152      0 49152      0 ESTABLISHED
localhost.35046      localhost.35047      49152      0 49152      0 ESTABLISHED
filefly.ssh 192.168.0.3.2969     17615      1 50320      0 ESTABLISHED

 

在此实例中,正在使用多种服务,但是不清楚哪些服务或应用程序拥有哪些端口。可以通过使用 pfiles 命令(在 Solaris OS 版本 8 和 9 上可用)对进程进行检查以收集该信息。


代码示例 2-8 确定哪些服务或应用程序拥有哪些端口

# for pid in `ps -aeo pid | grep -v PID`; do
> pfiles ${pid} | egrep "^${pid}:|sockname:"
> done

 

一个更显著、有效的确定这些从属性的方法就是使用 lsof列出打开的文件)命令。该命令确定哪些进程正在使用哪些文件和端口。例如,要确定前面实例中的哪些进程使用端口 35047,请使用以下命令。


代码示例 2-9 确定哪些进程正在使用文件和端口

# ./lsof -i | grep 35047
ttsession   600 root 9u  IPv4 0x3000b4d47e8     0t1  TCP
localhost:35047->localhost:35046 (ESTABLISHED)
dtexec     5614 root 9u  IPv4 0x3000b4d59e8     0t0  TCP
localhost:35046->localhost:35047 (ESTABLISHED)

 

lsof 的输出表明端口 35047 正在用于 dtexecttsession 进程之间的通信。

使用 lsof 程序,您可能能够更迅速地确定系统之间或应用程序之间的需要使用文件系统或网络的从属性。在本节中阐述的几乎所有内容都可以使用 lsof 程序来获取。

要获得 lsof 程序,请从以下位置下载:

ftp://vic.cc.purdue.edu/pub/tools/unix/lsof/



注 - 此处介绍的确定从属性的方法可能无法找出那些极少使用的从属性。除使用这些方法外,还请查看此文档和供应商提供的文档。




开发和执行 Solaris Security Toolkit 配置文件

在完成规划和准备阶段后,即可开发和执行安全性配置文件。安全性配置文件包括安全性加强驱动程序(例如 name-hardening.driver)、所有相关的驱动程序、脚本以及与执行现场相关的安全策略的文件。

定制 Solaris Security Toolkit 软件附带的一个安全性配置文件,或者自己进行开发。每个组织的策略、标准和应用程序都不会相同,即使只有细微的差别。

要定制一个安全性配置文件,请通过 finish 脚本、 audit 脚本、环境变量、框架功能以及文件模板来调整该文件的操作。

有关详细信息,请参阅以下各章节:

根据需要,请参阅《Solaris Security Toolkit 4.1 Reference Manual》的其他相应章节以获得有关脚本、框架功能、环境变量和文件的信息。您可能要定制的两个关键环境变量是 JASS_FILESJASS_SCRIPTS

要跨越大多数平台强制执行标准,同时保证特定平台之间的差异,请使用嵌套或分层安全性配置文件技术。有关详细信息,请参阅《Solaris Security Toolkit 4.1 Reference Manual》。比较结果配置文件与您组织的策略、标准和要求以确保不存在粗心大意或错误的更改。


安装软件

Solaris Security Toolkit 软件的安装对于经过部署的或正在安装的新系统来说是相同的。有关详细指导,请参阅第 3 章

对于经过部署的系统,一些特定的例子可以使该过程更简单、迅速。这些例子的重点不在于加强安全性过程,而是在于安装前和安装后的任务。

执行安装前任务

在加强经过部署的系统的安全性之前,请考虑并计划两个主要任务 -- 备份和验证。这两个任务有助于确定已部署系统的状态,并且有助于在加强系统安全性之前解决所有潜在的配置问题。

备份数据

该任务重点在于意外事故的规划。发生问题时,必须确保系统的配置和数据以某种形式进行了归档。必须备份系统,确保可以读取备份媒体并验证其内容可以进行恢复。在对系统配置进行任何重要更改之前,请采用此步骤。

验证系统稳定性

验证任务几乎与备份任务同等重要。在实现任何配置更改(例如,由加强安全性过程所做的更改)之前,验证过程可确保系统处于稳定工作状态。此验证过程涉及到在成功测试任何应用程序或服务之后的重新引导。尽管已经选择了定义好的测试和验收计划,文档也可能无法始终可用。如果情况确实如此,请根据系统的使用方式以合理的方式测试该系统。其目的在于确保实际运行的配置与所保存的配置相匹配。

系统引导或应用程序启动时,查看所显示的任何错误消息或警告。如果无法纠正错误,请记录它们,以便在加强安全性过程中不会将其当作问题的潜在原因。当查看日志文件时,确保将系统、服务以及应用程序日志包括在内,例如:

重新启动系统时如果没有遇到错误或警告消息,或者没有遇到任何未知的错误或警告(所有已知的都已记录),则该任务完成。系统应该重新启动到一个已知并稳定的状态。如果在验证过程中发现系统正在运行的配置和存储的配置有所不同,请重新评估您组织的更改控制策略和过程以确定导致该情况的原因。

执行安装后的任务

安装后的任务是安装前的任务的延伸。目的在于确保安全性加强过程没有对系统或应用程序造成任何新的问题。该任务主要是通过查看系统和应用程序日志文件来完成的。在加强安全性以及随后的重新引导之后创建的日志文件应该与那些在对系统进行定型之前收集的日志文件相似。在某些情况下,由于只启动了较少的服务,因此消息可能会少一些。最重要的一点是,不应该出现新的错误或警告消息。

查看日志文件外,还要测试功能,因为某些应用程序可能会发生故障但不生成日志条目。请参阅下节以获得详细的验证信息。


验证应用程序和服务功能

保护系统安全过程的最后任务会涉及到验证由系统提供的应用程序和服务是否能够正确地运行。该任务还验证安全性配置文件是否成功地满足了安全策略的要求。在加强安全性的平台启动之后彻底地执行该任务,以确保可检测到任何异常或问题并立即得到纠正。该任务分为两个子任务: 验证安全性配置文件安装和验证应用程序和服务功能。

验证安全性配置文件安装

要验证 Solaris Security Toolkit 软件正确无误地安装了安全性配置文件,请查看安装日志文件。该文件安装在 JASS_REPOSITORY/jass-install-log.txt 中。



注 - 请参考该日志文件以了解 Solaris Security Toolkit 软件对系统所完成的操作。对于系统上的每个运行操作,都会有一个新的日志文件存储在一个基于运行操作起始时间的目录中。



除了要验证所安装的配置文件外,还要评估系统的安全配置。执行手动检查或使用工具使该过程自动化。

验证应用程序和服务功能

要对过程应用程序和服务进行验证,请执行已定义好的测试和验收计划。该计划将运行系统或应用程序的各个组件以确定它们处于可用和正常工作状态。如果没有这样的计划,则根据系统的使用方式以合理的方式测试该系统。其目的在于确保安全性加强安全性过程绝对不会影响应用程序或服务执行其功能的能力。

如果发现在加强系统安全性后,应用程序或服务出现故障,请查看应用程序日志文件来确定该问题。在很多情况下,可以使用 truss 命令来确定应用程序遇到的问题。在知道问题所在后,可以针对该问题并跟踪返回到 Solaris Security Toolkit 软件所做的更改。


维护系统安全

很多组织通常会犯的一个错误就是仅在安装过程中强调安全,然后就很少或不再重新考虑它。维护安全是一个实时进行的过程。必须定期查看和重新考虑系统安全。

维护一个安全的系统要求提高警惕,因为任何系统的缺省安全配置随着时间的推移都会逐渐地公开。例如,系统漏洞就会暴露出来。以下基本准则提供了一个概述:

Solaris Security Toolkit 软件可以协助您应用修补程序,因为它支持在系统上的重复运行操作,所以可以在安装修补程序后保护系统的安全。在安装任何修补程序后,以适当的驱动程序运行该软件以确保您的配置与已定义的安全策略保持一致。此外,请手动查看系统,因为正在使用的 Solaris Security Toolkit 软件的版本可能不支持由已安装的修补程序添加的新功能。

Solaris Security Toolkit 软件包括用作起点的缺省安全性配置文件。