通過服務管理工具(SMF)實現系統保護
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 |
【編輯推薦】