Solaris 10系统上的所有设备都由服务管理工具(SMF)控制。在SMF具有许多优势,包括附属服务的自动启动和从服务损耗中恢复的功能等,后者使用的是SMF中基于角色的权限控制(RBAC)。使用基于角色的权限控制,程序能以准确的权限和所需授权运行。本文向大家展示了如何将NFS,IP过滤程序,FTP和Apache2 Web服务器配置成为SMF服务的方法。
3.1服务管理工具(SMF)
与传统UNIX运行控制脚本相比,SMF为Solaris服务提供的管理界面更加强大。
Solaris服务,如系统进程,无交互后台程序,应用和脚本都是可执行的。数据库软件,Web服务器软件和特定网页脚本都可以通过SMF控制。SMF通过以下功能为我们提供简单,快速和可视性的管理。
1. 可用管理命令svcadm启用,禁用或重启服务。
2. 失败的服务会被附属命令自动重启。而且启动失败的源代码不会影响自动重启。
3. 可通过svcs, svcadm和svccfg等命令查看和管理服务对象。
4. 服务调试很简单。svcs-x命令可以对服务无法正常运行作出解释,且每个服务的记录文件也简化了调试过程。
5. 由于配置状态保留在服务清单中,所以可轻松对服务的某一特定配置进行测试,备份和恢复。
6. 因为服务按照若干服务之间的附属关系启动和停止,所以系统启动和关闭速度更快。多个服务可同时启动。
7. 管理员可通过RBAC权限文件,角色,授权认可或特权等方式,将任务放心委任给那些被许可使用特定管理服务的非根用户。
8. SMF对系统初始化状态作出响应,如多用户运行级别。
9. SMF同样适用于使用传统UNIX rc脚本的系统。虽然我们不推荐大家这样做,但是用户仍然可将传统脚本用于某些服务,欲了解相关详情,可查看smf(5), svcadm(1M), svcs(1)和svccfg(1M)的介绍。
每个服务的清单都保存在中心存储库中。我们可以定义大量被称为配置文件的清单集。
3.2 SMF配置如何
服务和SMF清单一起发送。清单格式是/var/svc/manifest/ 目录下的XML文件。如果服务被启用或禁用,那么其他基本配置和默认信息,该清单会包含服务附属信息。在系统启动期间,该清单会被输入到SMF存储库中。存储库是/etc/svc/ 目录下的一个数据库。
你可以拥有每个服务的多个清单或截图。在启动时,配置文件已被选定。配置文件会启用或禁用每个Solaris服务。启动期间,当配置文件初始化系统后,管理员便可以进一步用SMF命令完成自定义配置。这些命令可直接修改存储库和配置文件,而更改后的配置也会在下一次启动时被保存。#p#
3.3修改Solaris服务默认设置
在被限定配置文件强化的Solaris系统上,你想在特定系统上使用的网络服务可能被禁用了。例如,ftp服务和NFS文件共享都被禁用了。需要配置的服务,如IP过滤程序和IPsec的默认状态都是禁用。
下面提供几种用SMF完成某些特殊系统配置的举例。一旦你配置完系统,清单就会出现在存储库中。当系统重启时,其配置也会被保存。请看:
1. 必须通过配置文件进行配置的服务会在该文件被配置完成后启用。如果你没有配置文件或者该文件不能被读取,那么这种情况也会记录在案。
2. 或许你想对一项服务尝试不同配置。使用不同的配置文件,就可以创建测试环境。最终的配置状态会在重启时保存下来。
3. 某些服务,如FTP,是必需的但却不要求监控。你可以在将其联网前,创建监控服务,如此一来,就可确保该服务首次使用时符合网页的安全条款。
4. 如果你想限定一项网络服务的攻击面。可对Apache2 Web服务进行配置,令其使用RBAC来限定服务所使用的权限。或者你也可以请求一个比root更受局限的帐户运行该服务。
3.3.1配置NFS服务
为了配置一个要求你自定义配置文件的服务,可执行如下操作:
1. 列出服务的状态。
2. 修改或创建配置文件。
3. 启用服务。
4. 验证服务是否在线。
5. 如果系统出具错误报告,请读取服务记录,然后修复错误。
6. 测试并使用服务。
在下列示例中,我们要配置一个系统作为帮助文档。该文件的属性必须是只读共享。
# svcs -a | grep nfs disabled Jan_10 svc:/network/nfs/server:default # vi /etc/dfs/dfstab share -F nfs -o ro /export/helpdocs # svcadm enable svc:/network/nfs/server # svcs -x svc:/network/nfs/server:default State: online since Tue Jan 20 5:15:05 2009 See: nfsd(1M) See: /var/svc/log/network-nfs-server:default.log Impact: None |
如果我们在没有支持文件的情况下启用了一个服务,查看记录文件确定问题出自哪里:
# svcs -x svc:/network/nfs/server:default (NFS server) State: disabled since Tue Jan 20 5:10:10 2009 Reason: Temporarily disabled by an administrator. See: http://sun.com/msg/SMF-8000-1S See: nfsd(1M) See: /var/svc/log/network-nfs-server:default.log Impact: This service is not running. # vi /var/svc/log/network-nfs-server:default.log ... No NFS filesystems are shared ... |
#p#
3.3.2 配置IP过滤服务
和NFS服务一样,IP过滤服务只有在我们创建配置文件后才会被启用。网页的安全要求指示你在文件中放入的配置规则。某些服务,如IPsec,需要每个相连的系统都具备一个配置文件。可执行如下操作启用一个需要配置文件的服务:
1. 创建配置文件。如果不知道配置文件名称,可查阅服务名称手册页,然后阅读相关句法。
2. 如果有可用的验证句法,应验证文件的句法。
3. 如果服务需要在两个系统上运行,如IPsec服务,可对第二个系统进行配置。
4. 在一个或两个系统上启用服务。
5. 验证服务是否正常运行。
在下列例子中,我们要保护那些包含非全局区域的系统。IP过滤程序的规则保护了全局区域和Web服务器区域。你首先要向/etc/ipf/ipf.配置文件创建并添加规则。
# vi /etc/ipf/ipf.conf set intercept_loopback true; # *** GLOBAL ZONE: (IN: TCP/22, OUT: ANYTHING) pass in quick proto tcp from any to global-zone port = 22 keep state keep frags pass out quick from global-zone to any keep state keep frags # *** Web Server ZONE: (IN: TCP/80, OUT: NOTHING) pass in quick proto tcp from any to websvc port = 80 keep state keep frags block out quick from websvc to any # *** DEFAULT DENY block in log all block in from any to 255.255.255.255 block in from any to 127.0.0.1/32 |
然后在启用服务前要验证配置文件的句法。
# ipf /etc/ipf/ipf.conf # svcs -a | grep ipf disabled Dec_10 svc:/network/ipfilter:default # svcadm enable svc:/network/ipfilter:default # svcs ipfilter enabled Jan_10 svc:/network/ipfilter:default |
为了测试不同配置,你可以创建另一个配置文件,验证文件句法更改config/entities属性以指向新的文件。测试文件为Web数据区域添加了规则。
# vi /etc/ipf/testipf.conf set intercept_loopback true; # *** GLOBAL ZONE: (IN: TCP/22, OUT: ANYTHING) pass in quick proto tcp from any to global-zone port = 22 keep state keep frags pass out quick from global-zone to any keep state keep frags # *** Web Server ZONE: (IN: TCP/80, OUT: NOTHING) pass in quick proto tcp from any to websvc port = 80 keep state keep frags block out quick from websvc to any # *** Web Data ZONE: (IN: TCP/22, OUT: ANYTHING) pass in quick proto tcp from any to webdat port = 22 keep state keep frags pass out quick from webdat to any keep state keep frags # *** DEFAULT DENY block in log all block in from any to 255.255.255.255 block in from any to 127.0.0.1/32 # ipf /etc/ipf/testipf.conf # svcprop ipfilter | grep config config/entities fmri file://localhost/etc/ipf/ipf.conf config/grouping astring require_all config/restart_on astring restart config/type astring path # svccfg -s /network/ipfilter \ setprop config/entities=file://localhost/etc/ipf/testipf.conf |
刷新重启服务后,要验证是否已经设置该属性。
# svcadm refresh ipfilter # svcadm restart ipfilter # svcprop ipfilter | grep etc config/entities fmri file://localhost/etc/ipf/testipf.conf |
测试完成后,可保存原始文件。
# svccfg -s /network/ipfilter \ setprop config/entities=file://localhost/etc/ipf/ipf.conf # svcadm refresh ipfilter # svcadm restart ipfilter # svcprop ipfilter | grep etc config/entities fmri file://localhost/etc/ipf/ipf.conf |
#p#
3.3.3 配置ftp服务
ftp服务由inetd命令控制。通常,网页安全策略要求FTP服务器记录所有FTP连接的详细信息。在下列两个示例中,我们需要配置ftp服务的属性,该ftp服务记录了连接信息并启用了调试。
为了对要求你更改服务属性的服务进行配置,需要执行以下步骤:
1. 列出服务状态。
2. 列出服务属性。
3. 更改服务的一个或多个属性。
4. 验证服务属性是否被更改。
5. 启用服务。
6. 验证属性更改是否生效。
在这个示例的第一部分,我们可以将FTP配置为记录FTP服务器系统A上的每次登录。注意该ftp服务在系统A上的初始状态为禁用。
A # svcs ftp STATE STIME FMRI disabled Jan_10 svc:/network/ftp:default A # inetadm -l svc:/network/ftp:default SCOPE NAME=VALUE name="ftp" endpoint_type="stream" proto="tcp6" isrpc=FALSE wait=FALSE exec="/usr/sbin/in.ftpd -a" user="root" ... default tcp_trace=FALSE default tcp_wrappers=FALSE default connection_backlog=10 |
用于ftp服务的注册记录属性是tcp-trace。我们可以将其值从FALSE改为TURE,然后启用该服务并验证服务是否在线。
A # inetadm -m svc:/network/ftp:default tcp_trace=TRUE A # inetadm -l svc:/network/ftp:default SCOPE NAME=VALUE name="ftp" tcp_trace=TRUE A # svcadm enable svc:/network/ftp:default A # svcs ftp STATE STIME FMRI online 07:07:07 svc:/network/ftp:default |
而后,以普通用户身份在B机上运行ftp命令
B $ ftp A Connected to A. 220 A FTP server ready. Name (A:testftp): 331 Password required for testftp. Password: 230 User testftp logged in. Remote system type is UNIX. Using binary mode to transfer files. ftp> |
作为超级用户,再检查A机上记录文件中的注册记录。
A # tail -1 /var/adm/messages Jan 10 07:20:20 A inetd[16208]: [ID 317013 daemon.notice] ftp[6036] from B 49822 |
要继续这一示例,应禁用该服务。假设你想在服务上线前创建监控。
A # svcadm disable ftp A # svcs -x ftp svc:/network/ftp:default (FTP server) State: disabled since January 20, 2009 07:20:22 AM PST Reason: Disabled by an administrator. See: http://sun.com/msg/SMF-8000-05 See: in.ftpd(1M) See: ftpd(1M) Impact: This service is not running. |
用于ftp服务的exec属性包含启动服务的命令。该命令的手册页描述了命令可接受的参数。我们可以选择参数添加到exec属性中,以便该服务启动时,命令按这些参数运行。因此,若想修改运行服务的命令,可按照如下步骤操作:
1. 列出服务的exec属性。
2. 在手册页,确定要加入exec命令的参数。
3. 将选定参数添加到服务的exec属性。
4. 验证exec属性是否更改。
5. 启用服务。
6. 测试并使用服务。#p#
在下列示例中,我们可以修改ftp服务,以提供调试信息和每次连接的详细记录。若想修改ftp服务的exec属性,首先要列出exec属性,然后阅读exec命令的手册页以确定要添加的参数。
# inetadm -l svc:/network/ftp:default | grep exec exec="/usr/sbin/in.ftpd -a" # man in.ftpd |
在in.ftpd(1M)手册页,选择提供详细信息的选项。
-v为syslogd(1M)写调试信息。
-w 记录wtmpx(4) file中每位用户登录,登出的记录。
-i记录FTP服务器到xferlog(4)所接收的所有文件名。
修改exec属性,验证属性是否更改成功。
# inetadm -m ftp exec="/usr/sbin/in.ftpd -a -i -v -w" # inetadm -l ftp | grep exec exec="/usr/sbin/in.ftpd -a -i -v -w" |
测试属性更改是否生效。首先,启用服务。然后以普通用户的身份发送一个文件。最后验证记录文件是否被更新。
A # svcadm enable svc:/network/ftp:default A # svcs ftp STATE STIME FMRI online 07:07:07 svc:/network/ftp:default |
以普通用户的身份,将一个文件放入FTP存储库中。
以超级用户身份,检查xferlo
B $ ftp A Connected to A. 220 A FTP server ready. Name (A:testftp): 331 Password required for testftp. Password: 230 User testftp logged in. Remote system type is UNIX. Using binary mode to transfer files. ftp> mput design.tar mput design.tar? y 200 PORT command successful. 150 Opening BINARY mode data connection for design.tar. 226 Transfer complete. ^D ftp> 221-You have transferred 0 bytes in 0 files. 221-Total traffic for this session was 361 bytes in 0 transfers. 221-Thank you for using the FTP service on A. 221 Goodbye. B $ |
g文件中的记录。该记录表明用户将design.tar文件从B机发送到A机的操作不成功。
A # cat /var/log/xferlog Sat Jan 20 07:18:10 2009 1 B.mydomain.com 0 /home/test/design.tar b _ i r test ftp 0 * c |
3.3.4 配置Apache2 Web服务
Apache2 Web服务程序是Solaris操作系统的一部分。Web服务器通常是攻击者的目标。我们可使用RBAC来减少服务器的漏洞。其他Solaris功能,如区域,在创建网络服务的时候也能发挥作用。
可执行以下步骤来配置使用RBAC的服务:
1. 列出服务属性。
2. 创建一个权限文件或一个角色,或者是用于服务的授权许可。
3. 为服务添加权限或删除权限。
4. 验证服务属性是否更改成功。
5. 启用服务。
6. 验证属性更改是否生效。
SUNWapch2r和SUNWapch2u数据包提供了Apache2 Web服务器程序。Apache2服务的默认状态时禁用。
# svcs apache2 disabled 11:11:10 svc:/network/http:apache2 |
默认状态下,服务是通过root帐户启动。但是Apache2服务的http.conf文件创建了一个无交互后台程序webservd来运行该服务。当你用默认文件配置服务时,该服务会在root帐户下启动,切换到webservd帐户,通过所有权限运行。
执行下列操作可减少Apache2服务器的权限,并用webservd启动该服务。
◆删除服务不需要的基本权限,proc_session, proc_info和file_link_any。
◆添加服务使用特权端口时所需要的网络优先权, net_privaddr。
◆不要更改限定设置。
◆将用户和组设置为webservd。那么在SMF清单中设置完用户和组后,服务以webservd启动而不是以root帐户启动。
# svccfg -s apache2 ... apache2> setprop start/user = astring: webservd ... apache2> setprop start/group = astring: webservd ... apache2> setprop start/privileges = astring: basic,!proc_session,!proc_info,!file_link_any,net_privaddr ... apache2> end # svcadm -v refresh apache2 Action refresh set for svc:/network/http:apache2. |
欲验证该配置是否已经被成功设置,可检验服务的启动属性。
# svcprop -v -p start apache2 start/exec astring /lib/svc/method/http-apache2\ start start/user astring webservd start/group astring webservd start/privileges astring basic,!proc_session,!proc_info,!file_link_any,net_privaddr start/limit_privileges astring :default start/use_profile boolean false |
注意,如果你创建的权限文件包含在服务的特权中,那么你可以输入权限文件的名称,并将其作为use_profile属性的值,这样可免去设置特权的麻烦。
现在,我们可以启用服务。验证服务是否在webservd帐户下开启,且是否具备受限特权。
# svcadm -v enable -s apache2 svc:/network/http:apache2 enabled. # svcs apache2 STATE STIME FMRI online 12:02:21 svc:/network/http:apache2 # ps -aef | grep apache | grep -v grep webservd 5568 5559 0 12:02:22 ? 0:00 /usr/apache2/bin/httpd -k start ... # ppriv -S 5559 5559: /usr/apache2/bin/httpd -k start flags = E: net_privaddr,proc_exec,proc_fork I: net_privaddr,proc_exec,proc_fork P: net_privaddr,proc_exec,proc_fork L: limit |
【编辑推荐】