歡迎您光臨本站 註冊首頁

selinux入門教程

←手機掃碼閱讀     火星人 @ 2014-03-24 , reply:0

Getting Started with SE Linux HOWTO: the new SE Linux

(譯者註:本文的最原始版本為2004年3月所寫,此份HOWTO是作者在今年2月根據最新的SE Linux所作的修改後的版本。新的SE Linux與以前的有比較大的變化,而且這項技術本身也正在飛速的發展,並未最後成熟。閱讀本文是需要對Linux本身有一定深度的了解作為基礎的。本文並不是Linux的初級教程,但卻是SE Linux技術的初級教程。)

原著:Faye Coker, March 2004. faye@lurking-grue.org

中文譯者:鄒立巍, 2006年7月

mini.jerry@gmail.com;

重要的提示!注意!

我正在根據最新的SE Linux來根本的升級這份文檔。我用了很長時間來做這件事情,不過看來我好像永遠沒有足夠的時間作完它。我現在正在繼續做,請相信我!

Faye Coker, Feb 04, 2006

(譯者註:本人技術出身,英語實在比較差。翻譯如有不當之處,敬請指正!)

這份文檔已經根據最新的SE Linux做了更改。舊的"Getting Started with SE Linux HOWTO"的內容將保留在此份文檔里,不過絕大多數的內容是根據最新的SE Linux的特點作了修改。新的SE Linux是基於2.6.*內核的,但是仍然支持2.4.*的內核。這份文檔的大部分內容是原來的,我在需要修改的地方做了調整。

這份文檔是美國國家安全局的安全加強的Linux(NSA SE Linux)的概述性的說明。我們主要的環境是基於Debian Linux的,而且大部分的軟體包的操作命令實例都是基於Debian的。這份文檔主要是針對那些想要基礎了解SE Linux的人,所以這裡沒有對SE Linux比較進介的介紹。你可以在附錄的資源部分找到其它介紹SE Linux的資料。

這份文檔已經被Ivan Pesin翻譯成了俄文。你可以在http://gazette.linux.ru.net/rus/articles/intro_selinux.html找到俄文的版本。謝謝Ivan做了這些。

目錄

1. 介紹

1.1. 歡迎反饋!

1.2. 注意!

1.3. 最新的SE Linux的特色

1.4. Fedora用戶的策略(policy)源代碼目錄介紹

2. 概覽

2.1. 為什麼要使用SE Linux?

2.2. 術語的使用

2.2.1. 身份(identity)

2.2.2. 域(domain)

2.2.3. 類型(type)

2.2.4. 角色(role)

2.2.5. 安全上下文(security context)

2.2.6. 轉換(transition)

2.2.7. 策略(policy)

3.安裝

3.1. 基於Debian的安裝

3.1.1. 修改Debian包管理工具

3.2. 基於Fedora的安裝

4.登錄 4.1. 在登錄時提供用戶上下文 4.2. 用 newrole -r 命令改變上下文 4.3. 在sysadm_t域中執行命令 4.4. Permissive 和 Enforcing 模式 4.5. 不同角色運行命令的比較

5.建立用戶帳戶 5.1. 建立一個新的用戶 5.2. 給用戶分配角色和申請改變 5.3. 給用戶設置預設的安全上下文 5.4. 重新標記用戶主目錄

6.添加新的用戶域 6.1. 編輯用戶的域文件 6.2. 在此建立一個新的測試用戶

7.日誌文件信息的說明

1. 介紹

這份文檔是一個SE Linux的簡介,可以指導一部分人初步的學會SE Linux。它涵蓋和解釋了SE Linux 的各方面的術語,安裝和添加用戶並且涵蓋了一小部分別的知識。一個更高級的幫助文檔將會在不久發布(譯者註:正在翻譯中), 包含了如何編輯策略等內容。 (which causes a little too much information overload with users new to SE Linux and is not included here).

1.1. 歡迎反饋!

我們歡迎對這份文檔的反饋信息,請發郵件給faye@lurking-grue.org (中文的就給我吧!;)mini.jerry@gmail.com)

1.2. 注意!

這份文檔只是一份指導。我強烈的建議你在實際工作的機器上應用之前先找一台試驗機器來做練習 。

1.3. 最新的SE Linux的特點

最新的SE Linux有一些新的特點,下面先介紹一下:

/selinux 文件系統 加入了一個/selinux 文件系統. 因此有些安裝程序需要你編輯/etc/fstab 文件。 /selinux文件系統和 /proc 文件系統類似,都是虛擬的文件系統。你可以用ls -l /selinux 命令來顯示。

total 0

-rw-rw-rw- 1 root root 0 Nov 25 11:27 access

-rw-rw-rw- 1 root root 0 Nov 25 11:27 context

-rw-rw-rw- 1 root root 0 Nov 25 11:27 create

-rw------- 1 root root 0 Nov 25 14:19 enforce

-rw------- 1 root root 0 Nov 25 11:27 load

-r--r--r-- 1 root root 0 Nov 25 11:27 policyvers

-rw-rw-rw- 1 root root 0 Nov 25 11:27 relabel

-rw-rw-rw- 1 root root 0 Nov 25 11:27 user

運行cat 命令查看 "enforce"文件將會顯示一個值,代表SE Linux當前的狀態,1 代表 enforcing狀態, 0代表permissive 狀態。

使用了文件系統的擴展屬性 新的 SE Linux使用了文件系統的擴展屬性(Extended attributes)來存放安全上下文(security contexts)。你必須讓你的內核支持這種擴展屬性屬性。 擴展屬性是一個名稱—數據 元組 (name-data tuple)-- 舉個例子說, security.selinux 就是一個屬性的名稱,安全上下文(security context)就是要存的數據。 當SE Linux正在運行時,你可以用 ls --context filename 命令來查看一個文件的安全上下文(我們將在後面進一步解釋這個命令),無論SE Linux是否打開,你都可以用getfattr 命令查看文件系統的擴展屬性。不過你要先裝支持 attr 的軟體包並且通過 getfattr命令的manpage學會使用它。這個命令的運行方法是:

faye@kaos:~$ getfattr -m . -d /etc/passwd

getfattr: Removing leading '/' from absolute path names

# file: etc/passwd

security.selinux="system_ubject_r:etc_t\000"

你所查看的文件的 security.selinux 屬性中儲存了此文件的安全上下文, 所以上面例子中的上下文就是 system_ubject_r:etc_t 。所有運行了SE Linux的ext2/3文件系統上都有 security.selinux 這個屬性(這個新特性的關鍵). 如果你引導了一個沒有 SE Linux 的內核, 你將仍然看到這個擴展屬性. 當你用make relabel 操作設置了文件的安全上下文期間,擴展屬性就被setfiles 設置了。

從init載入SE Linux策略 打開了SE Linux的系統在引導時,init進程既要掛載 /selinux 文件系統,並在那之後載入SE Linux的策略。

安全ID(SIDs) 和 父進程安全ID(PSIDs) 不再使用 SIDs (安全ID) 在舊的 SE Linux 是用戶進程的內核介面. PSIDs (父進程安全ID SIDs) 是內核映射(設置)磁碟上的文件的上下文的根據(譯者註:這裡的概念可能不是很清晰,總的來說就是SID和PSID在舊的SE Linux中起著標記安全上下文的作用)。 請看NSA的 Configuring the SELinux Policy 獲得更多的幫助。在新的SE Linux中, 擴展屬性記錄了安全上下文,所以SIDs和PSIDs 也就不必要了。

-Z 參數 -Z 可以替代 --context 命令參數,比如ls -Z 和 ps -Z.

用 chcon 命令替代了chsid命令 chsid 命令在舊的SE Linux中用來設置文件的安全上下文。新的SE Linux 中用chcon 命令來設置。 chcon 在舊的SE Linux 中已經可以使用,但是在新的SE Linux中的設置用戶或類型方面得到了進一步改善。可以查看manpage 獲得更多的提示。

1.4. Fedora 用戶的策略(Policy)源代碼目錄介紹

在Debian 中, 策略的源代碼目錄是/etc/selinux. 在Fedora 中是/etc/security/selinux/src/policy。在這份文檔中我市參照 Debian的源代碼目錄做的操作, 如果你是Fedora用戶, 請用 /etc/security/selinux/src/policy替換。

2. 總攬

接下來是有關在什麼情況下你該使用SE Linux和它的基本使用的簡短介紹。 2.2 部分規定了後面章節將常使用的的術語。, 所以請熟悉他們。

2.1 為什麼使用SE Linux?

SE Linux 可以為你的系統提供較棒的安全防護。 使用者能被分配預先定義好的角色,以便他們不能存取文件或者訪問他們不擁有的程序。 這可不是簡單的 " chmod 777" 同等物操作。 這在角色, 或他所在的安全上下文已經限制接觸的文件和其他的資源的使用者定義中是不同於一般的 Unix 許可許可權的,除了在一種比較受約束的流行之外。帶一個用戶的.rhosts 文件在一個一般的 Unix 系統上申請。 如果他們使它成為任何人可寫入 , 那麼任何能登錄的人都可以作危險的操作。在 SE Linux 之下,你能控制其它用戶是否有能力改變他們的.rhosts文件, 以及阻止其他的人寫入 , 就算擁有者已經使它成為任何人可寫入。

一個通常的疑問是 SE Linux 的許可權設置如何與標準的 Unix 的許可權設置共存。當你做特定的操作的時候, Unix 許可權首先被檢查。 如果他們允許你的操作 , 那麼然後, SE Linux 將會檢查並且允許或拒絕使用者的使用。 但是如果 Unix 許可不讓你做某事,在那裡的運行的操作被禁止和 SE Linux 檢查沒關係。

另外的一個例子是,如果有一個設置了SUID的可執行文件,如/usr/bin/passwd 他可以運行命令chmod 666 /etc/shadow,SE Linux 會阻止任何人非法的這樣設置文件。

2.2 術語

接下來的術語將在本文當中經常出現, 也是來自SE Linux的基本概念. It is somewhat tricky to define one word without including the other terms so I realise my definitions include things that need defining(譯者註:這句實在不敢亂譯,sorry。不過不耽誤學習;-))

2.2.1 (身份)identity

在 SE Linux 中,身份的概念不同於傳統的Unix uid (user id). 它們可以共存於一個系統, 但卻是十分不同的概念。在SE Linux中的身份是安全上下文的一部分,它會影響哪個域可以進入,也就是本質上的可以被執行。一個SE Linux 的身份(identity)會跟標準的Unix登錄名有很相似的文本表示 (大部分情況下它們是這樣), 無論如何,了解它們是兩個完全不同的概念是很重要的。 運行su 命令不會改變SE Linux中的身份(identity)。(譯者註:我在紅帽系統中做的實驗卻不是這樣,不過這無所謂,可能紅帽系統的策略設置不同,我目前還沒來得及研究具體是什麼問題,只是猜測。)

舉例: 一個無特權用戶 faye 運行 id 命令 (在啟動SE Linux的情況下) 可以看到用戶的安全上下文:

context=faye:user_r:user_t

安全上下文中的身份部分就是 "faye"。 現在, 如果 faye su切換成 root 再運行id, 他將發現安全上下文仍然是:

context=faye:user_r:user_t

身份保持相同, 跟沒切換到root時一樣。, 不管怎樣,如果faye 身份被允許進入sysadm_r 角色並轉換成了sysadm_r (這裡可以使用newrole -r 命令),再運行id 命令,他將看到:

context=faye:sysadm_r:sysadm_t

身份欄位保持一樣但是角色和域(第二和第三欄位)的欄位已經變了。這樣保持身份的方式是用戶職責所必需的。身份將影響系統決定哪個角色和域可以被什麼身份所使用,這將對系統安全期決定性的作用。

2.2.2 域

所有進程都在域中運行。域直接決定了進程的訪問。 域基本上是一個進程允許做的操作的列表, 或者說它決定了一個進程可以對哪些類型進行操作。域就好像一個標準UNIX的uid的概念。 假設一個屬於root用戶的可執行程序被設置了setuid。在這個系統上的任何用戶,只要可以執行這個程序,它就有可能獲得root的許可權。這是一個很大的安全漏洞。 再有SE Linux的系統上, 如果一個正在執行的進程想要轉換進入特權域執行時,如果這個進程的角色被設置成不允許進入特權與的話, 這個進程就不能執行。

常見的例子是sysadm_t是系統管理域, user_t 是無特權用戶域。 Init運行在init_t 域, named 運行在 named_t 域。

2.2.3 類型

類型分配給一個對象並決定誰可以訪問這個對象。 它的定義和域基本相同, 不同就是域是對進程的應用而類型是分配給目錄,文件,和套接字的。

2.2.4 角色

角色決定了那些域可以使用。 有關哪些與可以被哪些角色使用可以預先定義在策略的配置文件里。如果一個策略資料庫中定義了一個角色不可以使用一個域, 它將被拒絕。

例子: 如果允許一個屬於 user_t 域 (無特權用戶域) 的用戶執行passwd 命令, 那麼必需在相關的策略配置文件中進行如下設置:

role user_r types user_passwd_t

這樣設置了一個屬於user_r角色的用戶允許進入user_passwd_t域。也就是說他可以執行 passwd 命令。

2.2.5 安全上下文

安全上下文包括了所有事情的屬性的描述,包括文件, 目錄, 進程, TCP sockets 何以上所有的東西。安全上下文包括了身份,角色和域或者類型。在SE Linux系統上你可以用id 命令來查看你當前用戶的安全上下文。

一件很重要的事情是我們需要明白的是域和類型是有區別的, 如果不明白這一點的話,將使你產生困惑。

域是為進程設置的。 當你查看一個進程的安全上下文的時候 (舉個例子,你可以查看後面"轉換"中的解釋), 最後一個欄位的設置,例如user_passwd_t 就是這個進程的域(如果你運行了passwd 命令)。

一個像文件,目錄,套接字等這樣的對象會有一個類型。 當你運行了 ls --context 命令時, 最後一個欄位就是類型的設置, 比如 user_home_t 這個類型就是一個有user_r 角色的用戶在他的主目錄下建立的文件的類型。

總的來說,域是分配給進程的,而類型是分配給除進程外其他對象的。那麼在這裡會有一個小小的混淆,就是/proc文件系統。我們知道/proc文件系統是虛擬的文件系統。並且裡面的以數字命名的目錄就是代表了各個進程,數字就是他們的pid。那麼這裡如果我們用 ls ?context 顯示/proc目錄下的1這個目錄,它會顯示:

dr-xr-xr-x root root system_u:system_r:init_t 1

那麼這個安全上下文中顯示的類型為init_t。在這裡的含義就是pid為1的這個進程的域也就是init_t 。(譯者註:這樣的區分不知道能不能說清楚?)

另一個需要說明的是 chsid 命令(改變安全 id) 和 chcon 命令(改變安全上下文) 不能在 /proc 文件系統上使用,就是說 /proc 文件系統不支持這種標記的改變。

文件的安全上下文是會根據創建這個文件的進程的域而改變的。默認情況下,一個文件或者目錄的安全上下文是從它們父目錄那裡繼承來的,當然我們可以通過策略的改變來改變這種設置。

例子: faye用戶在他的主目錄下建立了一個叫做test 的文件。 運行 ls --context test 可以看到 :

-rw-r--r-- faye faye fayebject_r:user_home_t test

他又在 /tmp 下建立了一個叫做tmptest的文件,再次運行ls --context /tmp/tmptest 這次顯示的是:

-rw-r--r-- faye faye fayebject_r:user_tmp_t /tmp/tmptest

第一個例子,安全上下文中的類型是 "user_home_t" 這是一個user_r 角色的無特權用戶默認的主目錄設置。 在第二次運行了ls --context 命令后, 你可以發現類型變成了 user_tmp_t ,這是由於執行建立文件命令的進程的域是user_t, 並且在/tmp下的文件類型要繼承 tmp_t 類型。

2.2.6 轉換

是否發生轉換,主要要根據安全上下文來判斷。有兩種主要的轉換。 第一種, 當你執行了一個被限定了類型的程序時會發生進程域的轉換。第二種, 在特殊的目錄下創建文件時會發生文件類型的轉換。

例子: 對於第二種轉換 (文件類型的轉換), 參照「安全上下文」部分中的例子。當運行了 ls --context 命令之後你會看到文件被標記成了什麼樣的類型(也就是上面例子中的 user_home_t 和user_tmp_t)。我們也可以看到當在/tmp下建立一個文件時,新的文件的類型為user_tmp_t。

對於進程域的轉換, 請參考以下的例子。 以無特權用戶的身份運行ssh, 或者說我們就是運行了一個 user_t 域的進程 (你可以用id命令查看你的安全上下文)。運行 ps ax --context 查看誰在運行 ssh。 假設是用戶 faye, 他將看到:

faye:user_r:user_ssh_t

這是顯示的一部分。由於可執行程序的類型是 ssh_exec_t 並且我們用戶的角色 user_r 允許訪問user_ssh_t 域,所以ssh進程就運行在了 user_ssh_t域中。

2.2.7 策略

策略就是可以設置的規則,決定了例如一個角色的用戶可以訪問什麼; 哪個角色可以進入哪個域 and 哪個域可以訪問哪個類型等這樣的問題。 你可以根據你想要建立的系統的特點來決定設置什麼樣的策略。

3. 安裝

接下來的一章我們講解釋怎樣獲得軟體包以及安裝, 和怎樣獲得新的SE Linux的軟體包以及安裝。 因為我運行的是Debian,所以我演示的安裝過程式基於它的。 我們假定你知道該怎樣在你所用的發布版上安裝軟體, 編譯內核,並且給內核打補丁。

如果你是從舊的SE Linux上升級的, 並且運行了 SE Linux kernel, 請進入permissive 模式 (用 avc_toggle 命令) 繼續運行指令。

3.1基於Debian的安裝

對於Debian 的開發版(不穩定版):

將下面的文字寫到你的 /etc/apt/sources.list 文件:

deb http://www.coker.com.au/newselinux/ ./

這個包是由 Russell Coker維護的.

在寫這篇文檔的時候 (2003年11月末) 還沒有可以Debian上使用的穩定版的新的SE Linux 安裝包。 開發版的 .deb文件可以從上面的網站獲得。請確保獲得了最新版本的包。 因為包的名字一直都在變,所以我沒有列出, 不過他們列出了需要的所有包的名字。

下面我們列出了對於新的 SE Linux,哪些報需要在Debian上安裝。在安裝之前你不需要引導SE Linux kernel, 所以你可以安裝它們了:

• libselinux1 包含了新 SE Linux的共享庫。

• selinux-policy-default 包含了範例策略文件,這個策略文件應用到了很多一般應用程序例如postfix, sendmail, X 等等。

• checkpolicy 包含了安全策略的編譯器。

• policycoreutils 包含了核心工具如 setfiles, load_policy, newrole 等等。

• selinux-utils 包含了例如查詢策略的操作工具。

• selinux-doc 包括了一些幫助文檔 。

Debian系統所需的附加軟體包列表:

• kernel-patch-2.4-lsm 一個支持LSM 和SE Linux的內核補丁。

• coreutils 包含了改進版的命令例如cp, mv, ls 。

• procps 包含了改進版的 ps and top命令。

• sysvinit 是一個在引導時載入策略的補丁。

• dpkg 我們需要一個改進版的dpkg,安裝之後可以保證對文件的正確標記。

• libpam-modules 因為一些安全原因。

• logrotate 一個改進版的 logrotate 可以保留一個新建文件的 SE Linux 安全上下文。

• cron 一個改進版的cron,保證計劃任務執行的腳本運行在正確的域內。

3.2基於Fedora的安裝

新SE Linux的RPM包可以在這裡找到ftp://people.redhat.com/dwalsh/SELinux

這些RPM包的維護者是Dan Walsh.

我在我的Fedora測試機上安裝SE Linux時, 我做了這些工作:

* 編輯yum.conf 文件包含如下內容:

[main]

cachedir=/var/cache/yum

debuglevel=2

logfile=/var/log/yum.log

pkgpolicy=newest

distroverpkg=fedora-release

tolerant=1

exactarch=1

[development]

name=Fedora Core $releasever - Development Tree

#baseurl=http://download.fedora.redhat.com/pub/fedora/linux/core/development/i386

baseurl=http://mirror.dulug.duke.edu/pub/fedora/linux/core/development/i386

[SELinux]

name=SELinux repository

baseurl=ftp://people.redhat.com/dwalsh/SELinux/Fedora

* 運行的命令進行安裝

yum install policy checkpolicy policycoreutils policy-sources pam passwd vixie-cron

* 在所有包安裝完之後

cd /etc/security/selinux/src/policy

make load

make relabel

*重起機器.

4. 登錄

接下來的一部分描述了系統登錄, 而且解釋了更多的關於用戶安全上下文一些內容。 本章的最後部分討論permissive模式和enforcing模式。

4.1在登錄時提供用戶上下文

在這一個階段,你應該要重新啟動系統並等待那個登錄的提示。當你安裝了 selinux 的預設策略包后 (Fedora上是策略的源代碼包), 政策文件的安裝使你能夠以一個預設用戶角色登錄系統。(當我們還沒有沒有添加一個屬於我們自己的用戶的時候)

以root身份正常登錄你的系統。 你的安全上下文默認情況下為 root:user_r:user_t。 id 命令顯示的類型和你的安全上下文顯示應該是相同的,如下所示我們需要看安全上下文部分,所以不必關心其它欄位):

uid=0(root) gid=0(root) groups=0(root) context=root:user_r:user_t

所以安全上下文是

root:user_r:user_t

現在我們假設你先前已經把你自己的帳戶設置成另外的一個角色。你可以參考 第五章: 建立用戶帳戶.。對於角色轉變有兩個方法。 第一是 , 你登錄的時候。假設使用者 faye 被認可進入 sysadm_t 域。 使用者 faye 在控制台登錄。 在那 "Your default context is faye:user_r:user_t. Do you want to choose a different one? [n]" 這是提示, 她選擇, y 並按了回車。 她將會見到如下信息:

[1] faye:user_r:user_t

[2] faye:sysadm_r:sysadm_t

Enter number of choice:

在這一個例子中, 你能見到那使用者身份 " faye" 先前已經被允許訪問sysadm_r 角色和 sysadm_t 域。 這裡將會被顯示的選項是那些你的使用者身份已經被允許訪問的對象。 請注意,這在舊的 SE Linux 已經實現了, 而且將會在新的 SE Linux(在寫這文檔的時候是不可以的) 中被設置為可配置選項, 默認的設置為關閉(OFF)。

如果用戶faye 選擇了選項二 ( 變成 sysadm_r) 然後運行id命令, 她將會見到安全上下文的內容為:

context=faye:sysadm_r:sysadm_t

意味著他現在是 sysadm_r 角色。

接下來是第二個改變用戶安全上下文的方法。

4.2用 newrole -r 命令改變上下文

變更你的安全上下文的第二個方法將使用 newrole-r 的指令。語法是

newrole -r role

這裡的role 替換你想要轉換成什麼角色。假設是sysadm_r。那麼既可以運行:

newrole -r sysadm_r

你將會被要求為你的使用者身份提供密碼, 你可以運行id指令檢查。 如果你沒有授權進入一個新的角色, 你將會見到這樣的顯示(假設使用者fred 嘗試運行的指令)

fred:sysadm_r:sysadm_t is not a valid context

這一個信息意味著fred用戶不能進入 sysadm_r:sysadm_t 角色:域,因為他沒有被授權可以這麼做。

在成功地變更角色之後, 運行id指令檢查你的安全上下文。

4.3在sysadm_t域中執行命令

你的用戶現在已經在 sysadm_r 角色,運行的程序是在 sysadm_t 域。此時我們需要把我們的安裝做的稍微完善一些, 因此讓我們去虛擬的控制台並用root用戶登錄。 你將不被要求是否想要改變上下文。

我必須在這裡說明一些事情。 我們實際上到目前為止沒有在這份HOWTO 中說明怎樣讓root用戶允許訪問 sysadm_r 角色,所以你的思路可能還停在那裡,root用戶只允許訪問user_r:user_t,這樣我們怎麼進行系統管理? 好吧,我們正在運行的模式是permissive,這是一種並不真正強制的執行安全策略的設置的模式。你依舊能在上面使用 newrole-r 指令換成 sysadm_r 角色。運行newrole 指令是轉換的方法。如果你試著做你不被允許的事情,你將看到一屏接一屏的錯誤顯示信息,這並不好玩。

所以,轉換成 sysadm_r 角色並且運行 id 來檢查你實際的上下文是不是 sysadm_r:sysadm_t。

現在我們能在 sysadm_r 角色中得到一些樂趣。 當我們在第 3 節中安裝了所有東西的時候, 當時系統上所有的文件都被標記了一個類型,但是電腦卻沒有在運行 SE Linux 。 因此如果一個文件在將程序分類發生之後建立的話, 並且在系統沒有重新啟動SE Linux的內核之前,那麼那一個文件將不屬於任何一種類型。想象一些文件可能在關機期間被創建。這些文件都沒有標記類型。 於是, 考慮到這一個情況。 如果你刪除一個文件,那麼那個文件的 inode 號可能被用來標記一個新的文件,而且這個新的文件可能是刪除的那個文件的類型。 這是一個嚴重的問題。

關於/etc/nologin 文件。 當shutdown指令被執行的時候,這一個文件產生。 如果這一個文件在引導的時候存在,只有root將會被允許登錄。如果你的啟動腳本不能刪除這個文件, 而且/etc/nologin 有錯誤的標記, 啟動腳本就不能touch it,於是就會產生一些小問題。如果你的root身份配置成在登錄之後有一個 sysadm_r 的預設角色, 那麼你就能登錄並且刪除這一個文件,問題解決。

但是如果你已經配置你的root身份在登錄之後不能得到 sysadm_r 角色怎麼辦? 在這樣的情況的下,你的root身份的上下文可能是root:user_r:user_t。但是 user_t域不允許你刪除任何在 /etc目錄下的文件。於是問題出現了,你能用root身份登錄, 但是做不了sysadm_r 角色的特權允許做的任何事。

再次想象, 這樣一種情況,你有你自己的用戶身份,再一次讓我們使用 " faye" 身份。 身份 faye 配置成一登錄就會變成 sysadm_r角色。因此身份 faye 能執行所有的 sysadm_r 角色的事情,但是root身份 (以user_r 角色在 user_t 域中運行) 不能。 faye 用戶可能有很高的許可權,但是faye 身份卻不行, 因為由於事實它將由於 /etc/nologin 文件的存在而不能夠登錄,此文件不讓非root用戶登錄。

這就是為什麼正確地將文件分類是至關重要的。 讓我們回到進程被標記之後文件已經建立,但是還沒引導SE Linux內核的情況。 為了修復這個問題, 我們必須運行

make -C /etc/selinux relabel

這一個命令將會確定在你的系統上的所有的文件正確地被標記。 執行的速度和你的機器上有多少文件有關,這可能需要一會兒。 一個粗糙的估計, 它將會像一個『find /』指令一樣的久。 這是為什麼你想要使用 newrole 指令換成 sysadm_r 然後運行指令上述make command 命令——如果你在一個不能訪問其他域的域中 (例如user_t), 你將會收到數以萬計的"permission denied" 提示。

4.4 Permissive模式 和 Enforcing 模式

Permissive 模式是指,你的 SE Linux 機器在本質上並沒進入SE Linux 只顯示相關信息的狀態, 沒有其它什麼了。所以你仍然可以用root用戶做相同的操作就像你在一部非 SE Linux 機器上一樣。 Enforcing模式強制使你的所有安全策略生效。 就是說在這種模式下,你配置的所有SE Linux的策略已經生效。所以,你可以用Permissive模式來檢查你的策略配置是否合乎要求。(通過檢查 dmesg 信息)

這裡需要強調的是:在啟動到enforcing模式之前請確定你做了合適的策略配置。所以你可以在Permissive模式中運行以下來檢查。 Permissive模式標記了文件, 但是不實際上運行任何事, 除非所有事情都被確認。一些人編譯了一個沒有CONFIG_SECURITY_SELINUX_DEVELOP 支持的內核,那意味著你不能運行Permissive模式。

在permissive 模式和enforcing模式間轉變, 你需要運行echo "1" > /etc/selinux/enforce 以打開enforcing模式。將1替換成0則意味著運行在permissive模式。 舊的 SE Linux 用了在新的 SE Linux 中已經不用的 avc_toggle 指令。 用cat /etc/selinux/enforce命令可以知道你正在哪種模式下運行。

你可以查看 "第七章:日誌文件信息的說明",找到有關轉變模式的信息提示的例子。

如果你編譯的內核使用了development模式 (意味著你的機器運行在了permissive模式,並且還沒有設置成enforcing模式), 你可以寫一個啟動腳本來轉換成enforcing模式, 或者在啟動bootloader的時候將內核參數設置為enforcing=1 。(編輯你的 lilo.conf 文件,添加 append="enforcing=1").

4.5 不同角色運行命令的比較

我們現在會在不同的安全上下文的環境下運行一些命令。 轉換到enforcing 模式。在 user_r 角色的環境下, 運行ps ax --context 命令並觀察輸出信息。 別忘了 ps ax -Z 命令可以做同樣的事情。 在角色為 user_r 的時候, 你可以看到那些被允許訪問/proc目錄的而且運行在user_t域中的進程。 如果哪個進程不能訪問/proc目錄, 那麼哪個進程不會顯示在 ps ax 命令的輸出中。

現在轉換到sysadm_t 域中,運行 ps ax --context 命令。這次, 你將會見到在系統里的所有的進程,不管他們是在哪個域下運行。 當在 sysadm_t 域的時候, 你可以訪問到user_t域不可以訪問到的其它域的進程。 這就是問什麼在 user_t 域中你不可以系統上所有的進程。想像一個惡意用戶能夠見到所有的系統程序。她能看到一個有安全漏洞的 daemon 在運行,於是她就可以針對這個漏洞進行攻擊。 如果 user_t 域不能見到 daemon進程, 那麼這樣的危險會被減少。

另外一個要考慮的問題就是命令行上的密碼問題。 默認的linux設置,是可以讓任何人讀到這樣的信息的。 當 SE Linux 阻止你看見ps 輸出的一個程序的信息時,它將減少這樣的危險。 (當然,一個密碼在命令行上顯示,是一個差勁的主意)。

轉換回permissive 模式。 你將又會在user_t 域下用ps ax 命令看到所有的系統進程。

5. 建立用戶帳戶

現在來作點有意思的事情! 我們將會建立一個 SE Linux 用戶並分配給他一個角色,然後為用戶設定默認的安全上下文。 在舊的SE Linux環境下, 封裝程序的建立用 vipw (svipw)來設置,比如, useradd (suseradd), passwd (spasswd), chfn (schfn) 等,在新的 SE Linux環境下, 這些程序有其它的名稱。

5.1 建立一個新的用戶

我們現在建立一個新用戶。我們叫它setest。

轉換到 sysadm_r:sysadm_t 角色:用戶。 現在用 useradd 命令添加用戶setest:

root@kaos:~# id

uid=0(root) gid=0(root) groups=0(root) context=faye:sysadm_r:sysadm_t sid=398

運行id命令檢查確認你的 uid 是 0 並且你的身份是在sysadm_r:sysadm_t 角色:域中。 如果你的uid是你其它似有用戶的, 請先用 su 命令轉換乘 root 身份, 然後運行newrole -r 命令。

root@kaos:~# useradd -c "SE Linux test user" -m -d /home/setest -g users -s /bin/bash -u 1005 setest

root@kaos:~# finger setest

Login: setest Name: SE Linux test user

Directory: /home/setest Shell: /bin/bash

Never logged in.

No mail.

No Plan.

root@kaos:~# passwd setest

Enter new UNIX password:

Retype new UNIX password:

passwd: password updated successfully

setest 用戶現在已經添加完了。

5.2 給用戶分配角色和申請改變

現在我們想給setest用戶設置一個角色。 我們希望他可以訪問user_r 角色。 需要配置的文件是/etc/selinux/users ,你現在可以用你最喜歡的編輯器打開他,並先瀏覽一遍。

在文件的結尾添加如下內容:

user setest roles { user_r };

這行的意思是允許 setest 用戶進入user_r 角色。 如果你還希望 setest 用戶還可以訪問sysadm_r 角色, 你可以添加:

user setest roles { user_r sysadm_r };

我們現在要讓我們的設置生效,所以我們可以在sysadm_r:sysadm_t 角色:域的情況下運行以下命令:

make -C /etc/selinux load

這將花費一段時間,這段時間裡會創建策略的數據文件並用gzip 壓縮。如果命令成功執行並退出, 你將看到以下提示:

Success

touch tmp/load

make: Leaving directory `/usr/share/selinux/policy/current'

在默認的角色user_r下的用戶是不允許向 /etc/selinux/users 文件添加內容的。如果你想要他們可以使用 user_r 之外的一個用戶角色或者讓他們能夠改變他們自己的密碼,就要他們加入這一個文件,或在 SE Linux 的記錄信息的適當部分添加他們的用戶名。

現在我們來設置一個預設的安全上下文。

5.3 給用戶設置預設的安全上下文

在向 /etc/selinux/users文件添加完新用戶之後, 預設的安全上下文必須要再登陸的時候被指定。配置文件是/etc/security/default_context 。你將看到如下信息:

system_r:local_login_t user_r:user_t

當一個用戶從本地登陸的時候 (或者說從控制台登陸), /bin/login 程序會在local_login_t 域中運行並分別地分配一個用戶角色是 user_r 和域為 user_t 。

如果顯示的是:

system_r:local_login_t sysadm_r:sysadm_t user_r:user_t

那麼用戶登錄時允許進入sysadm_t 域, 那麼他就將以 sysadm_t 域的身份登錄進來。 如果不允許, 就會使用user_t域。

請看這一行:

system_r:sshd_t user_r:user_t

這意味著所有銅壺 ssh登錄的用戶將使用 user_r:user_t 角色:域。

5.4 重新標記用戶主目錄

如果你已經用 useradd 添加了一個角色為 user_r的新用戶, 那麼那麼你需要仔細的改變它已有的標記。 如果用戶角色不是user_r, 那麼你就不能重新標記,於是你必須運行以下命令:

find /home/setest -print0 | xargs -0 chcon -h system_ubject_r:user_home_t ;\

chcon -h system_ubject_r:user_home_dir_t /home/setest

這一個命令使所有在/home/setest目錄下的文件都運行了 chcon命令(變化文件安全上下文) 改變了文件的安全上下文。用戶主目錄被標記成類型為 user_home_dir_t ,而且在戶主目錄下的文件都被標記成類型為 user_home_t 。有時,一個程序可能被允許訪問一個用戶主目錄, 但是不能訪問何再此目錄下的文件, 兩種不同的類型由此而來。

6. 添加新的用戶域

現在讓我們建立一個我們自己的用戶域, 並把它叫做second_t 。 我們也將會建立一個新的角色叫做second_r 。 要建立second_r 角色首先在前面的部分(剛剛分配了 user_r 角色並且並不真正建立這樣的用戶) 中一步一步跟著作,但是不要運行第 5.2 節中的make命令。在你已經編輯 /etc/selinux/user之後,回到這裡並且繼續下一部分,關於編輯使用者領域文件的部分。

關於為什麼我不想要你運行make指令的原因,是因為早先的部分剛剛分配了預設的一個 user_r 的角色。 但是我們將會建立一個新的角色,而且同樣地我們需要一個新的域與它搭配。以下部分進行概略說明。

6.1編輯用戶的域文件

用戶域的配置文件是 /etc/selinux/domains/user.te 。請先看一遍。 添加以下幾行:

full_user_role(second)

allow system_r second_r

allow sysadm_r second_r

在文件的什麼位置添加是無所謂的,在上面添加註釋:

# if adding new user roles make sure you edit the in_user_role macro in

# macros/user_macros.te to match

再來編輯 /etc/selinux/macros/user_macros.te 文件進行匹配。 打開此文件並找到 in_user_role (差不多在文件的結尾)這行。添加 "role second_r types $1;" 現在這部分文件應該像這樣:

undefine(`in_user_role')

define(`in_user_role', `

role user_r types $1;

role second_r types $1;

')

回到我們編輯的第一個文件 (full_user_role(second)), 這樣我們就建立了second_t域和second_home_dir_t類型以及 second_home_t 類型(用戶主目錄的類型和主目錄里文件的類型)。一個 second_tmp_t類型 ,當在/tmp目錄下建立文件時。 類型 second_tmpfs_t是在tmpfs中共享內存文件系統中建立文件的上下文。 最後,second_tty_device_t和 second_devpts_t類型分別被用來標記終端設備(tty)和虛擬終端設備。當然也建立了相應的策略應用於這些標記。

SE Linux內部並不支持任何類型的標定, 以及類型/域的繼承,等。當然策略語言的編寫也不支持這些特徵。 所以我們用M4宏編譯器來設置簡單的域和類型。

我們現在來建立一個用戶在這個新域中使用 (second_t)並訪問 second_r 角色。

6.2再次建立一個新的測試用戶

使用 useradd, 建立一個新的用戶。(讓我們假設用戶叫做 " spike" 把spike加入 /etc/selinux/users 只給予他對 second_r 角色的訪問權和沒有其它許可權。 然後運行

make -C /etc/selinux load

應用新的策略。

接下來是設置預設域和新的角色。 我們可以編輯 /etc/security/default_type 文件並添加以下行:

second_r:second_t

我們現在必須手動設定/home/spike 和它的上下文。useradd ,命令不會做這些事情,它只支持重新標記用戶的 user_r 角色。 運行下面的命令:

find /home/spike -print0 | xargs -0 chcon -h system_ubject_r:second_home_t ;\

chcon -h system_ubject_r:second_home_dir_t /home/spike

現在試著用spike用戶身份登錄。

7. 日誌信息的說明

接下來介紹提示的說明信息。我將解釋每部分信息的意義。 對於比較容易的部分,我會直接在輸出的內容上標記出來。

有些時候,日誌信息不會以你喜歡的形式清晰的表達出來, 所以我們首先要清除 ReiserFS 和Ext2/Ext3 文件系統(SE Linux支持的文件系統) 的root inode 是2。

XFS 文件系統和 JFS 文件系統現在正在測試中。

例 1

avc: denied { getattr } for pid=6011 exe=/usr/bin/vim path=/etc/shadow dev=03:03 ino=123456 \

scontext=faye:user_r:user_t tcontext=system_ubject_r:shadow_t tclass=file

這一個例子顯示的是,在enforcing模式時一個無特權用戶(faye) 嘗試編輯 /etc/shadow文件的顯示信息。

"avc: denied" 意味著這樣的操作被拒絕。 "{ getattr }" 意味著有人對文件使用 stat()函數。 在這個操作中,必須首先查看文件的屬性 (或者說至少要查看文件屬性), 如果不能查看,於是停止操作。

braces {}里的內容包含了操作的動作,或者說是SE Linux正在做的有關操作。 SE Linux 可以做出包括allow和deny兩種檢查結果, 在這個例子中檢查的結果是被拒絕, 並通知你你想要的操作被拒絕。

"for pid=" 你操作的進程的pid。 "exe=/usr/bin/vim" 是你執行的命令 (在這個例子里,執行的是vim)。 "path=/etc/shadow" 實行要操作的目標文件路徑。 "dev=03:03" 是跟此操作有關的文件系統所在的塊設備的設備號。 第一個 "03"(主設備號) 意思是使用了 hda ,第二個 "03" 是 3(輔助設備號或從設備號), 所以這個"dev=03:03" 就意味著 /dev/hda3 (如果你在 devfs 上運行那麼應該是/dev/ide/host0/bus0/target0/lun0/part3). 當SE Linux 核查許可權的時候 他並不知道你要操作的對象的完整路徑所以它不能記錄任何事情。它只知道文件系統的相關路徑, 和文件系統所在塊設備的設備號。比如說我們要訪問的 /etc/shadow. SE Linux 並不知道這個文件在根目錄下。它僅僅知道 /etc/shadow 所在的文件系統。 "ino=123456" 目標的 inode 號 (這個例子中的目標是 /etc/shadow) "scontext=faye:user_r:user_t" 操作動作來源進程的上下文"tcontext=system_ubject_r:shadow_t" 操作對象的安全上下文 (/etc/shadow)。 "tclass=file" 意味著目標對象是個文件。

Example 2

avc: granted { avc_toggle } for pid=6073 exe=/sbin/avc_toggle \

scontext=faye:sysadm_r:sysadm_t tcontext=system_u:system_r:kernel_t tclass=system

"avc: granted"意思是你的操作被允許正常運行。 "{ avc_toggle }" 表示你的程序調用了 avc_toggle()系統調用。 "tclass=system" 表示目標程序屬於system class。

例 3

avc: denied { append } for pid=6153 exe=/bin/bash path=/.bash_history dev=03:03 ino=498 \

scontext=faye:user_r:user_t tcontext=fayebject_r:root_t tclass=file

這條提示是說屬於user_r:user_t 角色:域的faye身份的用戶想要在屬於 root的類型為root_t .bash_history 文件里添加內容被拒絕。

例 4

avc: denied { write } for pid=605 exe=/bin/touch dev=09:03 ino=2 \

scontext=root:user_r:user_t tcontext=system_ubject_r:root_t tclass=dir

這個例子顯示的是路徑找不到。然而我們可以知道的是因為inode號是2,所以是根目錄。

[火星人 ] selinux入門教程已經有1183次圍觀

http://coctec.com/docs/linux/show-post-134299.html