通過服務(wù)管理工具(SMF)實(shí)現(xiàn)系統(tǒng)保護(hù)
Solaris 10系統(tǒng)上的所有設(shè)備都由服務(wù)管理工具(SMF)控制。在SMF具有許多優(yōu)勢,包括附屬服務(wù)的自動啟動和從服務(wù)損耗中恢復(fù)的功能等,后者使用的是SMF中基于角色的權(quán)限控制(RBAC)。使用基于角色的權(quán)限控制,程序能以準(zhǔn)確的權(quán)限和所需授權(quán)運(yùn)行。本文向大家展示了如何將NFS,IP過濾程序,F(xiàn)TP和Apache2 Web服務(wù)器配置成為SMF服務(wù)的方法。
3.1服務(wù)管理工具(SMF)
與傳統(tǒng)UNIX運(yùn)行控制腳本相比,SMF為Solaris服務(wù)提供的管理界面更加強(qiáng)大。
Solaris服務(wù),如系統(tǒng)進(jìn)程,無交互后臺程序,應(yīng)用和腳本都是可執(zhí)行的。數(shù)據(jù)庫軟件,Web服務(wù)器軟件和特定網(wǎng)頁腳本都可以通過SMF控制。SMF通過以下功能為我們提供簡單,快速和可視性的管理。
1. 可用管理命令svcadm啟用,禁用或重啟服務(wù)。
2. 失敗的服務(wù)會被附屬命令自動重啟。而且啟動失敗的源代碼不會影響自動重啟。
3. 可通過svcs, svcadm和svccfg等命令查看和管理服務(wù)對象。
4. 服務(wù)調(diào)試很簡單。svcs-x命令可以對服務(wù)無法正常運(yùn)行作出解釋,且每個服務(wù)的記錄文件也簡化了調(diào)試過程。
5. 由于配置狀態(tài)保留在服務(wù)清單中,所以可輕松對服務(wù)的某一特定配置進(jìn)行測試,備份和恢復(fù)。
6. 因?yàn)榉?wù)按照若干服務(wù)之間的附屬關(guān)系啟動和停止,所以系統(tǒng)啟動和關(guān)閉速度更快。多個服務(wù)可同時啟動。
7. 管理員可通過RBAC權(quán)限文件,角色,授權(quán)認(rèn)可或特權(quán)等方式,將任務(wù)放心委任給那些被許可使用特定管理服務(wù)的非根用戶。
8. SMF對系統(tǒng)初始化狀態(tài)作出響應(yīng),如多用戶運(yùn)行級別。
9. SMF同樣適用于使用傳統(tǒng)UNIX rc腳本的系統(tǒng)。雖然我們不推薦大家這樣做,但是用戶仍然可將傳統(tǒng)腳本用于某些服務(wù),欲了解相關(guān)詳情,可查看smf(5), svcadm(1M), svcs(1)和svccfg(1M)的介紹。
每個服務(wù)的清單都保存在中心存儲庫中。我們可以定義大量被稱為配置文件的清單集。
3.2 SMF配置如何
服務(wù)和SMF清單一起發(fā)送。清單格式是/var/svc/manifest/ 目錄下的XML文件。如果服務(wù)被啟用或禁用,那么其他基本配置和默認(rèn)信息,該清單會包含服務(wù)附屬信息。在系統(tǒng)啟動期間,該清單會被輸入到SMF存儲庫中。存儲庫是/etc/svc/ 目錄下的一個數(shù)據(jù)庫。
你可以擁有每個服務(wù)的多個清單或截圖。在啟動時,配置文件已被選定。配置文件會啟用或禁用每個Solaris服務(wù)。啟動期間,當(dāng)配置文件初始化系統(tǒng)后,管理員便可以進(jìn)一步用SMF命令完成自定義配置。這些命令可直接修改存儲庫和配置文件,而更改后的配置也會在下一次啟動時被保存。#p#
3.3修改Solaris服務(wù)默認(rèn)設(shè)置
在被限定配置文件強(qiáng)化的Solaris系統(tǒng)上,你想在特定系統(tǒng)上使用的網(wǎng)絡(luò)服務(wù)可能被禁用了。例如,ftp服務(wù)和NFS文件共享都被禁用了。需要配置的服務(wù),如IP過濾程序和IPsec的默認(rèn)狀態(tài)都是禁用。
下面提供幾種用SMF完成某些特殊系統(tǒng)配置的舉例。一旦你配置完系統(tǒng),清單就會出現(xiàn)在存儲庫中。當(dāng)系統(tǒng)重啟時,其配置也會被保存。請看:
1. 必須通過配置文件進(jìn)行配置的服務(wù)會在該文件被配置完成后啟用。如果你沒有配置文件或者該文件不能被讀取,那么這種情況也會記錄在案。
2. 或許你想對一項(xiàng)服務(wù)嘗試不同配置。使用不同的配置文件,就可以創(chuàng)建測試環(huán)境。最終的配置狀態(tài)會在重啟時保存下來。
3. 某些服務(wù),如FTP,是必需的但卻不要求監(jiān)控。你可以在將其聯(lián)網(wǎng)前,創(chuàng)建監(jiān)控服務(wù),如此一來,就可確保該服務(wù)首次使用時符合網(wǎng)頁的安全條款。
4. 如果你想限定一項(xiàng)網(wǎng)絡(luò)服務(wù)的攻擊面??蓪pache2 Web服務(wù)進(jìn)行配置,令其使用RBAC來限定服務(wù)所使用的權(quán)限?;蛘吣阋部梢哉埱笠粋€比root更受局限的帳戶運(yùn)行該服務(wù)。
3.3.1配置NFS服務(wù)
為了配置一個要求你自定義配置文件的服務(wù),可執(zhí)行如下操作:
1. 列出服務(wù)的狀態(tài)。
2. 修改或創(chuàng)建配置文件。
3. 啟用服務(wù)。
4. 驗(yàn)證服務(wù)是否在線。
5. 如果系統(tǒng)出具錯誤報告,請讀取服務(wù)記錄,然后修復(fù)錯誤。
6. 測試并使用服務(wù)。
在下列示例中,我們要配置一個系統(tǒng)作為幫助文檔。該文件的屬性必須是只讀共享。
# 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 |
如果我們在沒有支持文件的情況下啟用了一個服務(wù),查看記錄文件確定問題出自哪里:
# 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過濾服務(wù)
和NFS服務(wù)一樣,IP過濾服務(wù)只有在我們創(chuàng)建配置文件后才會被啟用。網(wǎng)頁的安全要求指示你在文件中放入的配置規(guī)則。某些服務(wù),如IPsec,需要每個相連的系統(tǒng)都具備一個配置文件??蓤?zhí)行如下操作啟用一個需要配置文件的服務(wù):
1. 創(chuàng)建配置文件。如果不知道配置文件名稱,可查閱服務(wù)名稱手冊頁,然后閱讀相關(guān)句法。
2. 如果有可用的驗(yàn)證句法,應(yīng)驗(yàn)證文件的句法。
3. 如果服務(wù)需要在兩個系統(tǒng)上運(yùn)行,如IPsec服務(wù),可對第二個系統(tǒng)進(jìn)行配置。
4. 在一個或兩個系統(tǒng)上啟用服務(wù)。
5. 驗(yàn)證服務(wù)是否正常運(yùn)行。
在下列例子中,我們要保護(hù)那些包含非全局區(qū)域的系統(tǒng)。IP過濾程序的規(guī)則保護(hù)了全局區(qū)域和Web服務(wù)器區(qū)域。你首先要向/etc/ipf/ipf.配置文件創(chuàng)建并添加規(guī)則。
# 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 |
然后在啟用服務(wù)前要驗(yàn)證配置文件的句法。
# 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 |
為了測試不同配置,你可以創(chuàng)建另一個配置文件,驗(yàn)證文件句法更改config/entities屬性以指向新的文件。測試文件為Web數(shù)據(jù)區(qū)域添加了規(guī)則。
# 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 |
刷新重啟服務(wù)后,要驗(yàn)證是否已經(jīng)設(shè)置該屬性。
# 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服務(wù)
ftp服務(wù)由inetd命令控制。通常,網(wǎng)頁安全策略要求FTP服務(wù)器記錄所有FTP連接的詳細(xì)信息。在下列兩個示例中,我們需要配置ftp服務(wù)的屬性,該ftp服務(wù)記錄了連接信息并啟用了調(diào)試。
為了對要求你更改服務(wù)屬性的服務(wù)進(jìn)行配置,需要執(zhí)行以下步驟:
1. 列出服務(wù)狀態(tài)。
2. 列出服務(wù)屬性。
3. 更改服務(wù)的一個或多個屬性。
4. 驗(yàn)證服務(wù)屬性是否被更改。
5. 啟用服務(wù)。
6. 驗(yàn)證屬性更改是否生效。
在這個示例的第一部分,我們可以將FTP配置為記錄FTP服務(wù)器系統(tǒng)A上的每次登錄。注意該ftp服務(wù)在系統(tǒng)A上的初始狀態(tài)為禁用。
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服務(wù)的注冊記錄屬性是tcp-trace。我們可以將其值從FALSE改為TURE,然后啟用該服務(wù)并驗(yàn)證服務(wù)是否在線。
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機(jī)上運(yùn)行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機(jī)上記錄文件中的注冊記錄。
A # tail -1 /var/adm/messages Jan 10 07:20:20 A inetd[16208]: [ID 317013 daemon.notice] ftp[6036] from B 49822 |
要繼續(xù)這一示例,應(yīng)禁用該服務(wù)。假設(shè)你想在服務(wù)上線前創(chuàng)建監(jiān)控。
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服務(wù)的exec屬性包含啟動服務(wù)的命令。該命令的手冊頁描述了命令可接受的參數(shù)。我們可以選擇參數(shù)添加到exec屬性中,以便該服務(wù)啟動時,命令按這些參數(shù)運(yùn)行。因此,若想修改運(yùn)行服務(wù)的命令,可按照如下步驟操作:
1. 列出服務(wù)的exec屬性。
2. 在手冊頁,確定要加入exec命令的參數(shù)。
3. 將選定參數(shù)添加到服務(wù)的exec屬性。
4. 驗(yàn)證exec屬性是否更改。
5. 啟用服務(wù)。
6. 測試并使用服務(wù)。#p#
在下列示例中,我們可以修改ftp服務(wù),以提供調(diào)試信息和每次連接的詳細(xì)記錄。若想修改ftp服務(wù)的exec屬性,首先要列出exec屬性,然后閱讀exec命令的手冊頁以確定要添加的參數(shù)。
# inetadm -l svc:/network/ftp:default | grep exec exec="/usr/sbin/in.ftpd -a" # man in.ftpd |
在in.ftpd(1M)手冊頁,選擇提供詳細(xì)信息的選項(xiàng)。
-v為syslogd(1M)寫調(diào)試信息。
-w 記錄wtmpx(4) file中每位用戶登錄,登出的記錄。
-i記錄FTP服務(wù)器到xferlog(4)所接收的所有文件名。
修改exec屬性,驗(yàn)證屬性是否更改成功。
# 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" |
測試屬性更改是否生效。首先,啟用服務(wù)。然后以普通用戶的身份發(fā)送一個文件。最后驗(yàn)證記錄文件是否被更新。
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機(jī)發(fā)送到A機(jī)的操作不成功。
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服務(wù)
Apache2 Web服務(wù)程序是Solaris操作系統(tǒng)的一部分。Web服務(wù)器通常是攻擊者的目標(biāo)。我們可使用RBAC來減少服務(wù)器的漏洞。其他Solaris功能,如區(qū)域,在創(chuàng)建網(wǎng)絡(luò)服務(wù)的時候也能發(fā)揮作用。
可執(zhí)行以下步驟來配置使用RBAC的服務(wù):
1. 列出服務(wù)屬性。
2. 創(chuàng)建一個權(quán)限文件或一個角色,或者是用于服務(wù)的授權(quán)許可。
3. 為服務(wù)添加權(quán)限或刪除權(quán)限。
4. 驗(yàn)證服務(wù)屬性是否更改成功。
5. 啟用服務(wù)。
6. 驗(yàn)證屬性更改是否生效。
SUNWapch2r和SUNWapch2u數(shù)據(jù)包提供了Apache2 Web服務(wù)器程序。Apache2服務(wù)的默認(rèn)狀態(tài)時禁用。
# svcs apache2 disabled 11:11:10 svc:/network/http:apache2 |
默認(rèn)狀態(tài)下,服務(wù)是通過root帳戶啟動。但是Apache2服務(wù)的http.conf文件創(chuàng)建了一個無交互后臺程序webservd來運(yùn)行該服務(wù)。當(dāng)你用默認(rèn)文件配置服務(wù)時,該服務(wù)會在root帳戶下啟動,切換到webservd帳戶,通過所有權(quán)限運(yùn)行。
執(zhí)行下列操作可減少Apache2服務(wù)器的權(quán)限,并用webservd啟動該服務(wù)。
◆刪除服務(wù)不需要的基本權(quán)限,proc_session, proc_info和file_link_any。
◆添加服務(wù)使用特權(quán)端口時所需要的網(wǎng)絡(luò)優(yōu)先權(quán), net_privaddr。
◆不要更改限定設(shè)置。
◆將用戶和組設(shè)置為webservd。那么在SMF清單中設(shè)置完用戶和組后,服務(wù)以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. |
欲驗(yàn)證該配置是否已經(jīng)被成功設(shè)置,可檢驗(yàn)服務(wù)的啟動屬性。
# 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 |
注意,如果你創(chuàng)建的權(quán)限文件包含在服務(wù)的特權(quán)中,那么你可以輸入權(quán)限文件的名稱,并將其作為use_profile屬性的值,這樣可免去設(shè)置特權(quán)的麻煩。
現(xiàn)在,我們可以啟用服務(wù)。驗(yàn)證服務(wù)是否在webservd帳戶下開啟,且是否具備受限特權(quán)。
# 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 |
【編輯推薦】