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. 系統可能需要多次的重新開機來驗證功能性。

使系統的關鍵性服務 (mission-critical) 設定生效之前,於非生產性系統上作所有的變更。但這不是永遠可行的。例如,缺乏足夠的硬體或軟體可以正確的作目標環境的鏡射。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



備註 - Telnet 及 FTP 服務兩者皆可延伸使用如 Kerberos 來支援嚴格驗證及加密。這些列舉的服務做為範例,原因是它們預設的配置並不支持這些安全性附加階層。



範例 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 作業系統所提供的服務。對於那些直接使用的應用程式,下列章節提供有用的資訊。

共享程式庫

瞭解支援一個應用程式需要何種程式庫是非常重要的。這項知識對於除錯情況非常有用,而且對於準備強化系統也是很有用的。當不明瞭系統狀態時,盡可能收集資料(例如軟體間的依賴性),如此才會清楚瞭解。

根據您安裝的 Solaris 作業系統,有三個方法可用來確定應用程式使用的程式庫:

範例: 判定支援 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 作業系統版本 8 和 9 適用),自執行的程序中收集資訊。


程式碼範例 2-2 自執行中程序收集資訊

# pldd 20307
20307:  /usr/sbin/in.named
/usr/lib/libresolv.so.2
/usr/lib/libsocket.so.1
/usr/lib/libnsl.so.1
/usr/lib/libc.so.1
/usr/lib/libdl.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 作業系統套裝模組:


# 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 (Core、Shared Libs) 套裝模組。此程序對執行平台最小化時特別有用,原因是此程序協助確認支援應用程式或服務所需要的套裝模組。

配置檔案

另一種方式來收集需求是透過配置檔案。由於配置檔案可以由重新命名或移除來停用服務,此程序對強化系統有更直接的影響。要取得更多資訊,請參閱「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。如同上個範例,若服務的回傳值為錯誤,表示可能有問題。小心的記錄強化之前及之後的結果可以協助加速整個驗證程序。

服務架構

此類別包括在其之上建立更大更複雜應用程式的架構或元服務 (meta-services)。通常在此類別中的架構種類有命名服務(例如: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

 

備註 - pkill 指令僅適用 Solaris 作業系統版本 7 到 9。對於其他版本,請使用 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 通訊埠對映器,應用程式可能依賴其他一般作業系統服務,如 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 作業系統版本 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 軟體隨附的安全性設定檔之一,或是開發您自己的安全性設定檔。每個機構的策略、標準以及應用程式需求皆有不同,雖然可能只有少許。

要自訂一個安全性設定檔,請透過結束程序檔、稽核程序檔、環境變數、架構功能以及檔案範例調整它的行動。

請參閱以下章節取得更多資訊:

如有需要,請參閱「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 軟體包含做為起始點使用的預設安全性設定檔。