3.5. 兩種設定方法

使用節 3.1, "設定檔元件和語法" (↑Novell AppArmor 2.0 管理指南) 中的 Novell AppArmor 設定檔語法,您可以建立設定檔而不需要使用工具。不過其所需要的作業將會非常繁雜。若要避免這些困擾,請使用 Novell AppArmor 工具來自動建立和修改設定檔。

您可以使用兩種方法來建立 Novell AppArmor 設定檔,並使用各種工具來支援這兩種方法。

獨立設定方法

此方法適用於設定執行時間有限的小型應用程式,例如郵件用戶端等使用者用戶端伺服器。如需詳細資訊,請參閱節 3.5.1, "獨立設定方法" (↑Novell AppArmor 2.0 管理指南)

系統化設定方法

此方法適用於一次設定大量的程式,或設定執行數天、數週或開機時連續執行的應用程式,例如網頁伺服器和郵件伺服器等網路伺服器應用程式。如需詳細資訊,請參閱節 3.5.2, "系統化設定方法" (↑Novell AppArmor 2.0 管理指南)

您可以使用 Novell AppArmor 工具以提升自動化設定檔開發的可管理性。

  1. 決定符合您需求的設定方法。

  2. 執行統計分析。根據您所選擇的設定方法,執行 genprof 或 autodep。

  3. 啟用動態學習。啟用所有已設定程式的學習模式。

3.5.1. 獨立設定方法

獨立設定檔的產生與更新是由一種稱為 genprof 的程式所管理。此方法非常容易,因為 genprof 會處理所有的程序,但是 genprof 必須在程式測試執行期間持續不斷執行 (在設定檔開發期間您不能重新啟動機器)。

若要使用 genprof 進行獨立設定方法,請參閱節 3.5.3.4, "genprof" (↑Novell AppArmor 2.0 管理指南)

3.5.2. 系統化設定方法

此方法之所以稱為系統化設定方法是因為它會一次執行系統上的全部設定檔,不像 genprof 或 獨立設定方法 只會針對一個或幾個設定檔。

使用系統化設定方法來建立和更新設定檔較缺乏自動化功能,但卻較具彈性。此方法適用於設定重新開機後仍持續運作的長時間執行應用程式,或者是一次設定大量的程式。

建立一組應用程式的 Novell AppArmor 設定檔,如下所示:

  1. 建立組成應用程式之個別程式的設定檔。.  即使這是系統化的方法,Novell AppArmor 仍只能監控包含設定檔與子程式的程式。因此,為了讓 Novell AppArmor 能夠考量該程式,您必須至少讓 autodep 為其建立一個近似的設定檔。若要建立此近似設定檔,請參閱節 3.5.3.1, "autodep" (↑Novell AppArmor 2.0 管理指南)

  2. 將相關設定檔置學習或 complain 模式。.  以 root 身份登入並在終端機視窗中輸入 complain /etc/apparmor.d/* 以啟動所有已設定程式的學習或 complain 模式。

    在學習模式中,存取要求並不會因為設定檔的規定而遭到封鎖。這可讓您透過數個測試來執行 (詳細資訊請參閱步驟 3 (↑Novell AppArmor 2.0 管理指南)) 並瞭解程式的存取需求以正常運作。透過此資訊,您可以決定如何制定設定檔的安全性。

    請參閱節 3.5.3.2, "complain 或學習模式" (↑Novell AppArmor 2.0 管理指南),取得使用學習或 complian 模式的詳細說明。

  3. 使用應用程式。.  執行應用程式並使用其功能。您可以決定要如何使用該程式,但是您必須讓程式存取各種檔案以表示其存取需求。由於該執行並非由 genprof 所監控,此步驟將會持續數天或數週,並跨越整個系統重新開機期間。

  4. 分析記錄。.  在系統化設定方法中,請直接執行 logprof 而不需透過 genprof 來執行 (如獨立設定方法)。logprof 的一般格式為:

    logprof [ -d /path/to/profiles ] [ -f /path/to/logfile ]

    如需關於使用 logprof 的詳細資訊,請參閱節 3.5.3.5, "logprof" (↑Novell AppArmor 2.0 管理指南)

  5. 重複步驟 3-4。.  這將會產生最佳的設定檔。重複的方法可取得較小的資料集,使原則引擎能加以學習並重新將其載入。後續的重複步驟將產生較少的訊息,速度也會變得更快。

  6. 編輯設定檔。.  您可能會需要檢視已產生的設定檔。您可以使用 vim 來開啟和編輯 /etc/apparmor.d/ 中的設定檔。如需關於使用 vim 完整功能的說明,請參閱節 3.5.3.8, "apparmor.vim" (↑Novell AppArmor 2.0 管理指南)

  7. 回到 "enforce" 模式。.  這會讓系統強制執行設定檔的規則,而不是只登入資訊。您可以移除設定檔中的 flags=(complain) 以手動完成,或使用 enforce 指令以自動完成,其運作方式與 complian 指令相同,但會將設定檔設定成 enforce 模式。

    若要確定所有的設定檔都已離開 complian 模式並進入 enforce 模式,請輸入 enforce /etc/apparmor.d/*

  8. 重新掃描所有設定檔。.  若要讓 Novell AppArmor 重新掃描所有的設定檔並變更核心中的強制模式,請輸入 /etc/init.d/apparmor restart

3.5.3. 設定工具摘要

所有的 Novell AppArmor 建立設定檔公用程式都是由 apparmor-utils RPM 套件所提供,且大部份都儲存在 /usr/sbin 中。下列小節將介紹各種工具。

3.5.3.1. autodep

這將會建立程式的近似設定檔或進行 autodep 的應用程式。您可以產生二進位執行檔和已解譯程序檔程式的近似設定檔。產生的設定檔之所以稱為 "近似",是因為其並不完全包含所有的設定檔項目,其程式必須由 Novell AppArmor 所限制。最小的 autodep 近似設定檔必須至少具備一個基本 include 指示詞,其中包含大部份程式所需要的基本設定檔項目。針對某些類型的程式,autodep 會產生擴充的設定檔。您可以在列於指令行中的執行檔上循環呼叫 ldd(1) 以產生設定檔。

若要產生近似設定檔,請使用 autodep 程式。程式引數可以是程式的簡易名稱,也就是 autodep 搜尋外圍程序路徑變數所找到的名稱,或者是完整的路徑。程式本身可以是任何的類型 (ELF 二進位、外圍程序程序檔、Perl 程序檔等),且 autodep 會產生近似設定檔,並透過之後的動態設定方法加強。

產生的近似 Novell AppArmor 設定檔所使用的命名慣例,是在程式的絕對路徑之後命名設定檔以寫入 /etc/apparmor.d 目錄,並以句號 (.) 字元取代路徑中的正斜線 (/) 字元。當您以 root 身份登入時,可以在終端機視窗中輸入以下的 autodep 一般格式:

autodep [ -d /path/to/profiles ] [program1 program2...]

如果您未輸入程式名稱或名稱,系統會提示您這些名稱。/path/to/profiles會覆寫 /etc/apparmor.d 的預設位置。

若要開始設定,您必須為應用程式中每個主要可執行服務建立設定檔 (其並不需要是其他已具有設定檔的子程式)。根據相關的應用程式來尋找這些程式。以下是尋找這些程式的一些策略:

目錄

如果您要設定的所有程式都位於一個目錄中,且該目錄中沒有其他的程式,則簡單指令 autodep /path/to/your/programs/* 將會為目錄中的所有程式建立名目設定檔。

ps 指令

您可以執行應用程式並使用標準 Linux ps 指令來尋找所有執行中的程序。然後您必須手動尋找這些程式的位置,並執行每個 autodep 程式。如果程式位於路徑中,autpdep 會自行尋找這些程式。如果程式不在路徑中,標準 Linux 指令 locate 將會協助您尋找這些程式。如果 locate 無法運作, (其並未預設安裝在 中) 請使用 find . -name '*foo*' -print

3.5.3.2. complain 或學習模式

complain 或學習模式工具會偵測是否有違反 Novell AppArmor 設定檔規則的情形,例如已設定程式未經設定檔允許而存取檔案。允許的違規情況仍會記錄下來。若要改善設定檔,請開啟 complain 模式,透過一組測試來執行程式以產生記錄事件來描述程式的存取需求,然後使用 Novell AppArmor 工具以執行記錄的後續處理,將記錄事件轉換成加強的設定檔。

手動啟用 complain 模式 (使用指令行) 並在設定檔的頂端加上旗標,使 /bin/foo 變成 /bin/foo flags=(complain)。若要使用 complain 模式,請開啟終端機視窗並以 root 使用者的身份輸入以下其中一行。

  • 如果範例程式 (program1) 位於路徑中,請使用:

    complain [program1 program2 ...]
  • 如果程式並不在路徑中,請指定完整路徑,如下所示:

    complain /sbin/program1
    
  • 如果設定檔並不在 /etc/apparmor.d 之中,請鍵入下行來取代預設位置:

    complain /path/to/profiles/ program1
         
  • 指定 program1 的設定檔,如下所示:

    complain /etc/apparmor.d/sbin.program1

上述的每個指令都會啟動所列設定檔/程式的 complain 模式。指令可列出程式或設定檔。如果程式名稱並未包含整個路徑,則 complain 會搜尋程式的 $PATH。例如,complain /usr/sbin/* 會尋找與 /usr/sbin 中所有程式有關的設定檔,並將其置於 complain 模式,而 complain /etc/apparmor.d/* 會將 /etc/apparmor.d 中的所有設定檔置於 complain 模式。

3.5.3.3. enforce 模式

enforce 模式工具會偵測是否有違反 Novell AppArmor 設定檔規則的情形,例如已設定程式未經設定檔允許而存取檔案。違規情形將會記錄下來且被允許。系統會預設開啟 enforce 模式。如果您要讓 Novell AppArmor 設定檔控制已設定程式的存取,請開啟 complain 模式。可切換 enforce 與 complain 模式。

手動啟用 enforce 模式 (使用指令行) 並在設定檔的頂端加上旗標,使 /bin/foo 變成 /bin/foo flags=(enforce)。若要使用 enforce 模式,請開啟終端機視窗並以 root 使用者的身份輸入以下其中一行。

  • 如果範例程式 (program1) 位於路徑中,請使用:

    enforce [program1 program2 ...]
  • 如果程式並不在路徑中,請指定完整路徑,如下所示:

    enforce /sbin/program1
  • 如果設定檔並不在 /etc/apparmor.d 之中,請使用下行來取代預設位置:

    enforce /path/to/profiles/ program1
  • 指定 program1 的設定檔,如下所示:

    enforce /etc/apparmor.d/sbin.program1

上述的每個指令都會啟動所列設定檔和程式的 enforce 模式。

如果您未輸入程式名稱或設定檔名稱,系統會提示您輸入一種名稱。/path/to/profiles會覆寫 /etc/apparmor.d 的預設位置。

引數可以是程式清單或設定檔清單。如果程式名稱並未包含整個路徑,則 enforce 會搜尋程式的 $PATH。例如,enforce /usr/sbin/* 會尋找與 /usr/sbin 中所有程式有關的設定檔,並將其置於 enforce 模式,而 enforce /etc/apparmor.d/* 會將 /etc/apparmor.d 中的所有設定檔置於 enforce 模式。

3.5.3.4. genprof

genprof (或產生設定檔) 為 Novell AppArmor 的設定檔產生公用程式。它會在指定的程式中執行 autodep,建立一個近似設定檔 (如果其中並不存在設定檔),將其設定為 complain 模式,重新將其載入至 Novell AppArmor 中,然後提示使用者執行程式並使用其功能。其語法如下所示:

genprof [ -d /path/to/profiles ]  program

如果您要為 Apache 網頁伺服器程式 httpd2-prefork 建立設定檔,您必須在 root 外圍程序中執行以下步驟:

  1. 輸入 rcapache2 stop

  2. 接下來,輸入 genprof httpd2-prefork

    現在 genprof 會執行以下動作:

    • 根據外圍程序路徑變數來解析 httpd2-prefork 的完整路徑。您也可以指定完整路徑。在 SUSE Linux 中,完整路徑為 /usr/sbin/httpd2-prefork

    • 檢查 httpd2-prefork 是否有現有的設定檔。如果有,其將會更新該設定檔。如果沒有,則會使用節 3.5.3, "設定工具摘要" (↑Novell AppArmor 2.0 管理指南)所描述的 autodep 程式來建立一個設定檔。

      [Note]

      其命名慣例會將程式的完整路徑與其設定檔檔案名稱相關聯,使各種的 Novell AppArmor 設定工具能進行一致性的操作。此慣例會以句號 (.) 來取代正斜線 (/),使 /usr/sbin/httpd2-prefork 的設定檔會儲存在 /etc/apparmor.d/usr.sbin.httpd2-prefork 中。

    • 將此程式的設定檔置於學習或 complain 模式,以記錄設定檔的違規情形,但仍允許其繼續執行。記錄事件將如下所示:

      Oct  9 15:40:31 AppArmor: PERMITTING r access to /etc/apache2/httpd.conf (httpd2-prefork(6068) profile /usr/sbin/httpd2-prefork active /usr/sbin/httpd2-prefork)
    • 以記錄事件的開頭標記來標示 syslog。範例:

      Sep 13 17:48:52 h2o root: GenProf: e2ff78636296f16d0b5301209a04430d
  3. 在工具提示時,在其他終端機視窗中執行要設定的應用程式,並盡量執行更多的應用程式功能,使學習模式能記錄程式所需要存取的檔案和目錄以正常運作。例如,在新的終端機視窗中輸入 rcapache2 start

  4. 選擇以下的選項,以供您執行程式功能之後使用:

    • S 會針對系統記錄來執行 logrof,其中將會標示啟動 genprof 和重新載入設定檔的時間。

      如果記錄中存在系統事件,Novell AppArmor 會分析學習模式記錄檔。這將會產生一系列的問題,您必須回答這些問題以引導 genprof 產生安全性設定檔。

    • F 會結束工具並回到主功能表。

  5. 回答兩種問題:

    在每個類別中,您都必須回答一系列的問題以將資源新增至設定檔,或將程式新增至設定檔中。以下兩張圖片顯示各種類別的範例。後續步驟將說明回答這些問題的選項。

    範例 3.1. 學習模式例外:控制特定資源的存取

    Reading log entries from /var/log/messages.
    Updating apparmor profiles in /etc/apparmor.d.
    
    Profile: /usr/sbin/xinetd
    Execute: /usr/sbin/vsftpd
    
    [(I)nherit] / (P)rofile / (U)nconfined / (D)eny / Abo(r)t / (F)inish)
    

    執行存取的處理程序相當複雜。您必須決定要授與程式哪一種執行許可權:

    inherit (ix)

    下層設定檔會繼承上層設定檔,並執行與上層設定檔相同的存取控制。當限制程式需要呼叫其他的限制程式卻不具備目標設定檔的許可權,或者缺少目前設定檔的許可權時,此模式將很有用。當子程式為 協助程式應用程式時通常會使用此模式,例如 /usr/bin/mail 用戶端使用較低階的程式為呼叫器,或 Mozilla 網頁瀏覽器使用 Acrobat 程式來顯示 PDF 檔案。

    profile (px)

    子程式使用必須載入核心的自身設定檔來執行。如果設定檔不存在,嘗試執行子程式將會因許可權被拒絕而失敗。當父程式呼叫全域服務時這將非常有用,例如 DNS 查閱或透過系統的 MTA 傳送郵件。

    unconfined (ux)

    子程式完全執行 unconfined 而不需要在執行的資源中套用任何 Novell AppArmor 設定檔。

    範例 3.2. 學習模式例外:定義項目的執行許可權。

    Adding /bin/ps ix to profile.
    
    Profile:  /usr/sbin/xinetd
    Path:     /etc/hosts.allow
    New Mode: r
    
     [1 - /etc/hosts.allow]
    
    [(A)llow] / (D)eny / (N)ew / (G)lob / Glob w/(E)xt / Abo(r)t / (F)inish
    

    以上的功能表會顯示已由設定之應用程式所存取的 Novell AppArmor 建議目錄路徑項目。您也需要定義項目的執行許可權。

    Novell AppArmor 可提供一個或多個路徑名稱或 Include。按一下選項號碼,選擇以下的一個或多個選項,然後繼續進行下一個步驟。

    [Note]

    Novell AppArmor 功能表並不一定會顯示所有的選項。

    #include

    這是參照到 include 檔案的 Novell AppArmor 設定檔區段,該檔案可取得程式的存取權限。使用 Include,您就可以讓程式存取其他程式也需要的目錄路徑或檔案。使用 Include 可減少設定檔的大小。請在系統建議時選擇 Include。

    萬用字元版本

    請按一下 Glob 進行存取,如下一步驟中所述。如需更多關於 globbing 語法的資訊,請參閱節 3.6, "路徑名稱和 globbing" (↑Novell AppArmor 2.0 管理指南)

    實際路徑名稱

    這是程式所必須存取的文字路徑,使其能夠正常執行。

  6. 在選擇路徑名稱或 Include 之後,您可以按一下允許拒絕,才能將其當作 Novell AppArmor 設定檔的項目來處理。如果您不滿意顯示的目錄路徑項目,您也可以為其進行 Glob編輯

    您可以使用以下選項來處理學習模式項目,並建立設定檔:

    按 Enter

    允許存取選擇的目錄路徑。

    允許

    允許存取選擇的目錄路徑項目。Novell AppArmor 會建議檔案存取許可權。如需詳細資訊,請參閱節 3.7, "檔案許可權存取模式" (↑Novell AppArmor 2.0 管理指南)

    拒絕

    避免程式存取指定目錄路徑項目。Novell AppArmor then 會繼續執行下一個事件。

    新的

    提示您輸入對此事件的規則,並允許您指定一般表示式的格式。如果您輸入的表示式並無法實際滿足起初提示問題的事件,Novell AppArmor 將會要求您進行確認並讓您重新輸入表示式。

    Glob

    按一下該選項以修改目錄路徑 (使用萬用字元),將所有檔案包含在建議的項目路徑中。按兩下滑鼠,授與所有檔案和其下方子目錄的存取權。

    如需更多關於 globbing 語法的資訊,請參閱節 3.6, "路徑名稱和 globbing" (↑Novell AppArmor 2.0 管理指南)

    Glob 含副檔名

    按一下以修改原始目錄路徑並保留檔案名稱副檔名。例如,/etc/apache2/file.ext 會變成 /etc/apache2/*.ext,並在檔案名稱中加入萬用字元 (星號)。這可讓程式在建議之目錄中存取副檔名為 .ext 的所有檔案。按兩下以授與所有檔案 (含特殊副檔名) 和其下方子目錄的存取權。

    編輯

    讓您編輯選擇的行。新的已編輯行會出現在清單底部。

    中止

    中止 logprof、刪除目前為止所輸入的所有規則變更,並保留所有的設定檔而不要改變。

    完成

    關閉 logprof、儲存目前為止所輸入的所有規則變更,並修改所有的設定檔。

  7. 若要使用 vim 來檢視和編輯設定檔,請在終端機視窗中輸入 vim /etc/apparmor.d/profilename。若您在 vim 中編輯 Novell AppArmor 設定檔時需要啟用語法色彩顯示,請使用 :syntax on:set syntax=apparmor 指令。如需更多關於 vim 和語法色彩顯示的資訊,請參閱節 3.5.3.8, "apparmor.vim" (↑Novell AppArmor 2.0 管理指南)

3.5.3.5. logprof

logprof 是一種互動式工具,可用來檢閱 syslog 項目中的學習或 complain 模式輸出,然後在 Novell AppArmor 安全性設定檔中產生新項目。

當您執行 logprof 時,它會開始掃描在學習或 complain 模式中產生的記錄檔,如果有任何現有設定檔集所未涵蓋的新安全性事件,它也會提供修改設定檔的建議。學習或 complain 模式會追蹤程式行為並將其輸入至 syslog。logprof 會使用此資訊來觀察程式行為。

如果限制程式在其他的程式中執行 fork 和 exec,logprof 將會發現該行為並詢問使用者在啟動子程序時要使用哪種執行模式。您可以選擇以下的執行模式來啟動子程序:ixpxux。如果存在子程序的個別設定檔,則預設的選項為px。如果不存在,則設定檔將預設為 ix。含個別設定檔的子程序上會執行 autodep,並在執行時載入至 Novell AppArmor 。

若存在 logprof,設定檔將會以這些變更進行更新。如果 AppArmor 模組正在執行,更新的設定檔將會重新載入,如果產生安全性事件的任何程序仍在 null-complain 設定檔中執行,則這些程序將會設定為在正確的設定檔中執行。

若要執行 logprof,請以 root 身份登入並在終端機視窗中輸入 logprof。您也可以在 logprof 中使用以下的選項:

logprof -d /path/to/profile/directory/

如果設定檔並不位於標準的目錄 /etc/apparmor.d/ 之中,請指定設定檔位置的完整路徑。

logprof -f /path/to/logfile/

如果記錄檔並不位於預設的目錄 /var/log/messages 之中,請指定記錄檔位置的完整路徑。

logprof -m "string marker in logfile"

標示 logprof 在系統記錄中的查看起點。logprof 會忽略系統記錄中指定標示之前的所有事件。如果標示中包含空格,必須在其外加上引號以正常運作。範例:logprof -m e2ff78636296f16d0b5301209a04430d

logprof 會掃描記錄,並詢問您如何處理每個記錄的事件。每個問題都會提供 Novell AppArmor 規則的編號清單,可按下清單上的項目號碼將其加入。

依預設,logprof 會查閱 /etc/apparmor.d/ 中的所有設定檔,並掃描 /var/log/messages 中的記錄,因此在大部份的情況中,以 root 身份執行 logprof 將足以建立設定檔。

然而,搜尋已歸檔的記錄檔將會非常費時,例如程式的執行時間可能會超過記錄檔的週期 (當記錄檔已歸檔並啟動新的記錄檔時)。如果發生此狀況,您可以輸入 zcat -f `ls -1tr /var/log/messages*` | logprof -f -

3.5.3.6. logprof 範例 1

以下為 logprof 使用 httpd2-prefork 存取檔案 /etc/group 的範例。此範例使用 [] 來表示預設選項。

在此範例中,/etc/group 存取為 httpd2-prefork 存取名稱服務的一部份。適當的回應為 1,並使用於預先定義的 Novell AppArmor 規則集中。若選擇 1#include,則名稱服務套件將會分析所有關於 DNS 查詢的未來問題,並使設定檔較為固定,因此其中任何的 DNS 組態變更和相關的名稱服務設定檔套件都只需調整一次, 而不用修改許多的設定檔。

Profile:  /usr/sbin/httpd2-prefork
Path:     /etc/group
New Mode: r

[1 - #include <abstractions/nameservice>]
 2 - /etc/group
[(A)llow] / (D)eny / (N)ew / (G)lob / Glob w/(E)xt / Abo(r)t / (F)inish

請選擇以下其中一種回應:

按 Enter

允許存取選擇的目錄路徑。

允許

允許存取選擇的目錄路徑項目。Novell AppArmor 會建議檔案存取許可權。如需更多相關資訊,請參閱節 3.7, "檔案許可權存取模式" (↑Novell AppArmor 2.0 管理指南)

拒絕

避免程式存取指定目錄路徑項目。Novell AppArmor then 會繼續執行下一個事件。

新的

提示您輸入對此事件的規則,並允許您指定一般表示式的格式。如果您輸入的表示式並無法實際滿足起初提示問題的事件,Novell AppArmor 將會要求您進行確認並讓您重新輸入表示式。

Glob

按一下該選項以修改目錄路徑 (使用萬用字元),將所有檔案包含在建議的項目路徑中。按兩下滑鼠,授與所有檔案和其下方子目錄的存取權。

如需更多關於 globbing 語法的資訊,請參閱節 3.6, "路徑名稱和 globbing" (↑Novell AppArmor 2.0 管理指南)

Glob 含副檔名

按一下以修改原始目錄路徑並保留檔案名稱副檔名。例如,/etc/apache2/file.ext 會變成 /etc/apache2/*.ext,並在檔案名稱中加入萬用字元 (星號)。這可讓程式在建議之目錄中存取副檔名為 .ext 的所有檔案。按兩下以授與所有檔案 (含特殊副檔名) 和其下方子目錄的存取權。

編輯

讓您編輯選擇的行。新的已編輯行會出現在清單底部。

中止

中止 logprof、刪除目前為止所輸入的所有規則變更,並保留所有的設定檔而不要改變。

完成

關閉 logprof、儲存目前為止所輸入的所有規則變更,並修改所有的設定檔。

3.5.3.7. logprof 範例 2

在設定 vsftpd 的範例中,我們可以看到此問題:

Profile:  /usr/sbin/vsftpd
Path:     /y2k.jpg
New Mode: r

[1 - /y2k.jpg]

(A)llow / [(D)eny] / (N)ew / (G)lob / Glob w/(E)xt / Abo(r)t / (F)inish

其中有許重要的項目可討論。首先,請注意 vsftpd 會詢問目錄樹最上層的路徑項目,即時 SUSE Linux 中的 vsftpd 依預設是 /srv/ftp 中的 FTP 檔案。這是因為 httpd2-prefork 會使用 chroot,而且在 chroot jail 內部的程式碼區域中,Novell AppArmor 會依據 chroot 環境來查看檔案存取,而不是全域絕對路徑。

第二個重要的項目是,您可能要授與 FTP 在目錄中所有 JPEG 檔案的讀取權限,因此您可能會使用 Glob w/Ext 和建議的 /*.jpg 路徑。這樣做將會取消之前授與個別 .jpg 檔案存取權限的所有規則,並預先制訂關於存取 .jpg 檔案的任何問題。

最後,您可能會需要授與更多 FTP 檔案的一般存取權限。如果您在最後的項目中選擇 Glob,logprof 將會以 /* 來取代建議的 /y2k.jpg 路徑。或者您可能要授與整個目錄樹更多的存取權限,您可以使用 新的路徑選項並輸入 /**.jpg (授與整個目錄樹中所有 .jpg 檔案的存取權限) 或 /** (授與目錄樹中所有檔案的存取權限)。

以上為讀取權限的處理方法。寫入權限也很類似,不過在使用寫入權限的一般表示式時您可能需要特別謹慎。

執行存取的處理程序相當複雜。您必須決定要授與哪一種執行許可權:

inherit (ix)

下層設定檔會繼承上層設定檔,並執行與上層設定檔相同的存取控制。當限制程式需要呼叫其他的限制程式卻不具備目標設定檔的許可權,或者缺少目前設定檔的許可權時,此模式將很有用。當子程式為協助程式應用程式時通常會使用此模式,例如 /usr/bin/mail 用戶端使用較低階的程式為呼叫器,或 Mozilla 網頁瀏覽器使用 Acrobat 程式來顯示 PDF 檔案。

profile (px)

子程式使用必須載入核心的自身設定檔來執行。如果設定檔不存在,嘗試執行子程式將會因許可權被拒絕而失敗。當父程式呼叫全域服務時這將非常有用,例如 DNS 查閱或透過系統的 MTA 傳送郵件。

unconfined (ux)

子程式完全執行 unconfined 而不需要在執行的資源中套用任何 Novell AppArmor 設定檔。

在以下的範例中,/usr/bin/mail 郵件用戶端已完成設定且 logprof 已發現 /usr/bin/mail 會執行 /usr/bin/less 做為協助應用程式以"呼叫"較長的郵件訊息。因此,其會提供以下的提示:

/usr/bin/nail -> /usr/bin/less
(I)nherit / (P)rofile / (U)nconstrained / (D)eny
[Tip]提示

/usr/bin/mail 的實際可執行檔將會變成 /usr/bin/nail,這並不是打字錯誤。

/usr/bin/less 程式可讓您在長度超過一個畫面的文字中進行捲動,這也是 /usr/bin/mail 所使用的方法。less 實際上也是一種強大的程式,可使用許多其他的協助應用程式,例如 tar 和 rpm。

[Tip]提示

在 tar ball 或 RPM 檔案中執行 less 可顯示這些容器的儲存清單。

在讀取郵件訊息時您可能不想要自動執行 rpm (這將可能直接導致 Microsoft* Outlook 樣式的病毒攻擊,因為 rpm 具有安裝並修改系統程式的能力) ,在此情況中,最好的選擇就是使用 Inherit。這可使程式不會從 /usr/bin/mail 設定檔之下執行的內容中執行。這會產生兩種結果:

  • 您必須將 /usr/bin/less 的所有基本檔案存取權限新增至 /usr/bin/mail 的設定檔中。

  • 這可避免將 tar 和 rpm 等協助應用程式新增至 /usr/bin/mail 設定檔中,使得當 /usr/bin/mail 在此內容中執行 /usr/bin/mail/less 時,與缺少 Novell AppArmor 的保護比較起來,程式將更為安全。

在其他的情況中,您可能會需要使用 Profile 選項。這會在 logprof 中產生兩種效果:

  • 寫入至設定檔的規則為 px,它會強制轉換成子程式自身的設定檔。

  • logprof 會為子程式建構設定檔並開始進行建立,其所使用的方法與建立上層設定檔相同,其會將子程序的事件歸給下層設定檔,並詢問 logprof 使用者以上的問題。

最後,您可能需要指定 Unconfined 以授與子程序非常強大的存取權限。這會將 ux 寫入上層設定檔,使得子程式在執行時不會套用任何的 Novell AppArmor 設定檔。這表示該執行將不會受到任何保護,且只有在確實需要時才使用。

3.5.3.8. apparmor.vim

這是一種 vim 文字編輯器的語法色彩顯示檔案,可使用顏色來強調各種 Novell AppArmor 的功能。使用 vim 以及 Novell AppArmor 語法模式,您可以夠過色彩來了解設定檔的含意。在終端機視窗中鍵入 vim,以便使用 vim 來檢視和編輯設定檔。

當您在 vim 中編輯 Novell AppArmor 設定檔時,若要啟用語法色彩顯示,請使用 :syntax on:set syntax=subdomain 指令。此外,您也可以將這些行置於 ~/.vimrc 檔案中:

syntax on
set modeline
set modelines=5

當您啟用此功能時,vim 會以顏色來標示設定檔的行:

藍色

在其他# 開頭的 Novell AppArmor 規則和註解中使用的 #include

白色

一般讀取權限行

褐色

功能陳述式和 complain 旗標

黃色

授與寫入權限的行

綠色

授與執行許可權的行 (ix 或 px)

紅色

授與最大存取權限 (ux) 的行

紅色背景

未正確載入 AppArmor 模組的語法錯誤

[Note]

當您在 .vimrc 檔案中使用這些行時可能會產生安全性的風險,因為它會讓 vim 自動信任編輯之檔案中提供的語法模式。這可能會讓攻擊者傳送以 vim 開啟的檔案,這可能會產生一些危險的情況

請使用 apparmor.vimvim man 頁面以及 vim 編輯器中的 :help 語法,以取得 vim 關於語法反白的協助。Novell AppArmor 語法存放在 /usr/share/vim/current/syntax/apparmor.vim

3.5.3.9. Unconfined

unconfined 指令會檢查系統上開啟的網路連接埠,並比較已在系統中載入設定檔集,與不具 Novell AppArmor 設定檔的報告網路服務。它需要 root 權限,因此不會受到 Novell AppArmor 設定檔的限制。

unconfined 必須以 root 的身份來執行,以擷取 proc 檔案系統的程序可執行連結。在以下情況中此程式很容易發生錯誤:

  • 處理錯誤的未連結執行檔

  • 在載入 Novell AppArmor 設定檔之前啟動的執行檔並未出現在輸出中,即使執行並未受到限制

  • netstat(8) 之間停止運作的程序,且未正確執行進一步的檢查

[Note]

此程式僅列出使用 TCP 和 UDP 的程序。總之,此程式並不適用於做為鑑識之用,只能用來輔助設定所有的網路存取程序。

如需更多關於 Novell AppArmor 技術和安全性的資訊,請參閱以下報告:

SubDomain: Parsimonious Server Security,作者群:Crispin Cowan、Steve Beattie、Greg Kroah-Hartman、Calton Pu、Perry Wagle 和 Virgil Gligor

描述 Novell AppArmor 的最初設計和建置。在 2000 年 12 月 於 洛杉磯 New Orleans 舉辦的 USENIX LISA 會議之前所發表。

此報告已過期,其描述的語法和功能與目前的 Novell AppArmor 產品不同。此報告僅適用於科學研究,並不適合做為技術文件。

Defcon Capture the Flag: Defending Vulnerable Code from Intense Attack,作者群:Crispin Cowan、Seth Arnold、Steve Beattie、Chris Wright 和 John Viega

這是一本使用 Novell AppArmor 的策略性和技術性指南,可在短期之內解決嚴重的安全性問題。在 2003 年 4 月 於 華盛頓特區所舉辦的 DARPA Information Survivability Conference and Expo (DISCEX III) 之前所發表。