進程管理與 SELinux

  在 Linux 系統當中:『觸發任何一個事件時,系統都會將他定義成爲一個進程,並且給予這個進程一個 ID ,稱爲 PID,同時依據啓發這個進程的用戶與相關屬性關係,給予這個 PID 一組有效的權限設定。』

進程與程序 (process & program)

  • 程序 (program):通常爲 binary program ,放置在儲存媒體中 (如硬盤、光盤、軟盤、磁帶等), 爲實體文件的型態存在;
  • 進程 (process):程序被觸發後,執行者的權限與屬性、程序的程序代碼與所需數據等都會被加載內存中, 操作系統並給予這個內存內的單元一個標識符 (PID),可以說,進程就是一個正在運作中的程序。

子進程與父進程:

在這裏插入圖片描述

fork and exec:進程呼叫的流程

  在 Linux 的進程呼叫通常稱爲 fork-and-exec 的流程 !進程都會藉由父進程以複製 (fork) 的方式產生一個一模一樣的子進程, 然後被複製出來的子進程再以 exec 的方式來執行實際要進行的程序,最終就成爲一個子進程的存在。
在這裏插入圖片描述

系統或網絡服務:常駐在內存的進程

  • 常駐程序就會被我們稱爲:服務 (daemon),我們將他啓動在背景當中一直持續不斷的運作。

工作管理 (job control)

  『進行工作管理的行爲中, 其實每個工作都是目前 bash 的子進程,亦即彼此之間是有相關性的。 我們無法以 job control 的方式由 tty1 的環境去管理 tty2 的bash !』

  • 這些工作所觸發的進程必須來自於你 shell 的子進程(只管理自己的 bash);
  • 前景:你可以控制與下達指令的這個環境稱爲前景的工作 (foreground);
  • 背景:可以自行運作的工作,你無法使用 [ctrl]+c 終止他,可使用 bg/fg 呼叫該工作;
  • 背景中『執行』的進程不能等待 terminal/shell 的輸入(input)

job control 的管理

直接將指令丟到背景中『執行』的 &

[root@study ~]# tar -zpcf /tmp/etc.tar.gz /etc &
[1] 14432 <== [job number] PID
[root@study ~]# tar: Removing leading `/' from member names
# 在中括號內的號碼爲工作號碼 (job number),該號碼與 bash 的控制有關。
# 後續的 14432 則是這個工作在系統中的 PID。至於後續出現的數據是 tar 執行的數據流,
# 由於我們沒有加上數據流重導向,所以會影響畫面!不過不會影響前景的操作喔!

將『目前』的工作丟到背景中『暫停』:[ctrl]-z

[root@study ~]# vim ~/.bashrc
# 在 vim 的一般模式下,按下 [ctrl]-z 這兩個按鍵
[1]+ Stopped vim ~/.bashrc
[root@study ~]# <==順利取得了前景的操控權!
[root@study ~]# find / -print
....(輸出省略)....
# 此時屏幕會非常的忙碌!因爲屏幕上會顯示所有的文件名。請按下 [ctrl]-z 暫停
[2]+ Stopped find / -print

  那個 + 代表最近一個被丟進背景的工作,且目前在背景下預設會被取用的那個工作 (與 fg 這個指令有關 )!而那個 Stopped 則代表目前這個工作的狀態。在預設的情況下,使用 [ctrl]-z 丟到背景當中的工作都是『暫停』的狀態喔!

觀察目前的背景工作狀態: jobs

  • jobs [-lrs]
  • 選項與參數:
    • -l :除了列出 job number 與指令串之外,同時列出 PID 的號碼;
    • -r :僅列出正在背景 run 的工作;
    • -s :僅列出正在背景當中暫停 (stop) 的工作。

將背景工作拿到前景來處理:fg

  • fg %jobnumber
  • 選項與參數:
    • %jobnumber :jobnumber 爲工作號碼(數字)。注意,那個 % 是可有可無的!

讓工作在背景下的狀態變成運作中: bg

範例:讓該工作在背景下進行,並且觀察他!!
[root@study ~]# jobs ; bg %3 ; jobs
[1] Stopped vim ~/.bashrc
[2]- Stopped find / -print
[3]+ Stopped find / -perm /7000 > /tmp/text.txt
[3]+ find / -perm /7000 > /tmp/text.txt &
[1]- Stopped vim ~/.bashrc
[2]+ Stopped find / -print
[3] Running find / -perm /7000 > /tmp/text.txt &

管理背景當中的工作: kill

  • kill -signal %jobnumber
  • kill -l
  • 選項與參數:
    • -l :這個是 L 的小寫,列出目前 kill 能夠使用的訊號 (signal) 有哪些?signal :代表給予後面接的那個工作什麼樣的指示囉!用 man 7 signal 可知:
    • -1 :重新讀取一次參數的配置文件 (類似 reload);
    • -2 :代表與由鍵盤輸入 [ctrl]-c 同樣的動作;
    • -9 :立刻強制刪除一個工作;
    • -15:以正常的進程方式終止一項工作(默認)。與 -9 是不一樣的。

nohup 可以讓你在脫機或註銷系統後,還能夠讓工作繼續進行

  • nohup [指令與參數] <==在終端機前景中工作
  • nohup [指令與參數] & <==在終端機背景中工作

進程的觀察

ps :將某個時間點的進程運作情況擷取下來

  • ps aux <==觀察系統所有的進程數據
  • ps -lA <==也是能夠觀察所有系統的數據
  • ps axjf <==連同部分進程樹狀態
  • 選項與參數:
    • -A :所有的 process 均顯示出來,與 -e 具有同樣的效用;
    • -a :不與 terminal 有關的所有 process ;
    • -u :有效使用者 (effective user) 相關的 process ;
    • x :通常與 a 這個參數一起使用,可列出較完整信息。
  • 輸出格式規劃:
    • l :較長、較詳細的將該 PID 的的信息列出;
    • j :工作的格式 (jobs format)
    • -f :做一個更爲完整的輸出。

僅觀察自己的 bash 相關進程: ps -l

  • F:代表這個進程旗標 (process flags),說明這個進程的總結權限,常見號碼有:
    • 若爲 4 表示此進程的權限爲 root ;
    • 若爲 1 則表示此子進程僅進行復制(fork)而沒有實際執行(exec)。
  • S:代表這個進程的狀態 (STAT),主要的狀態有:
    • R (Running):該程序正在運作中;
    • S (Sleep):該程序目前正在睡眠狀態(idle),但可以被喚醒(signal)。
    • D :不可被喚醒的睡眠狀態,通常這支程序可能在等待 I/O 的情況(ex>打印)
    • T :停止狀態(stop),可能是在工作控制(背景暫停)或除錯 (traced) 狀態;
    • Z (Zombie):殭屍狀態,進程已經終止但卻無法被移除至內存外。通常,造成殭屍進程的成因是因爲該進程應該已經執行完畢,或者是因故應該要終止了, 但是該進程的父進程卻無法完整的將該進程結束掉,而造成那個進程一直存在內存當中。 如果你發現在某個進程的 CMD 後面還接上 時,就代表該進程是殭屍進程。
  • UID/PID/PPID:代表『此進程被該 UID 所擁有/進程的 PID 號碼/此進程的父進程 PID 號碼』
  • C:代表 CPU 使用率,單位爲百分比;
  • PRI/NI:Priority/Nice 的縮寫,代表此進程被 CPU 所執行的優先級,數值越小代表該進程越快被 CPU 執行。
  • 詳細的 PRI 與 NI 將在下一小節說明。
  • ADDR/SZ/WCHAN:都與內存有關,ADDR 是 kernel function,指出該進程在內存的哪個部分,如果是個running 的進程,一般就會顯示『 - 』 / SZ 代表此進程用掉多少內存 / WCHAN 表示目前進程是否運作中,同樣的, 若爲 - 表示正在運作中。
  • TTY:登入者的終端機位置,若爲遠程登錄則使用動態終端接口 (pts/n);
  • TIME:使用掉的 CPU 時間,注意,是此進程實際花費 CPU 運作的時間,而不是系統時間;
  • CMD:就是 command 的縮寫,造成此進程的觸發程序之指令爲何。

觀察系統所有進程: ps aux

  • USER:該 process 屬於那個使用者賬號的?
  • PID :該 process 的進程標識符。
  • %CPU:該 process 使用掉的 CPU 資源百分比;
  • %MEM:該 process 所佔用的物理內存百分比;
  • VSZ :該 process 使用掉的虛擬內存量 (Kbytes)
  • RSS :該 process 佔用的固定的內存量 (Kbytes)
  • TTY :該 process 是在那個終端機上面運作,若與終端機無關則顯示 ?,另外, tty1-tty6 是本機上面的登入者進程,若爲 pts/0 等等的,則表示爲由網絡連接進主機的進程。
  • STAT:該進程目前的狀態,狀態顯示與 ps -l 的 S 旗標相同 (R/S/T/Z)
  • START:該 process 被觸發啓動的時間;
  • TIME :該 process 實際使用 CPU 運作的時間。
  • COMMAND:該進程的實際指令爲何?

top:動態觀察進程的變化

  • top [-d 數字] | top [-bnp]
  • 選項與參數:
    • -d :後面可以接秒數,就是整個進程畫面更新的秒數。預設是 5 秒;
    • -b :以批次的方式執行 top ,還有更多的參數可以使用喔!通常會搭配數據流重導向來將批次的結果輸出成爲文件。
    • -n :與 -b 搭配,意義是,需要進行幾次 top 的輸出結果。
    • -p :指定某些個 PID 來進行觀察監測而已。
  • 在 top 執行過程當中可以使用的按鍵指令:
    • ? :顯示在 top 當中可以輸入的按鍵指令;
    • P :以 CPU 的使用資源排序顯示;
    • M :以 Memory 的使用資源排序顯示;
    • N :以 PID 來排序喔!
    • T :由該 Process 使用的 CPU 時間累積 (TIME+) 排序。
    • k :給予某個 PID 一個訊號 (signal)
    • r :給予某個 PID 重新制訂一個 nice 值。
    • q :離開 top 軟件的按鍵。

top 主要分爲兩個畫面,上面的畫面爲整個系統的資源使用狀態,基本上總共有六行,顯示的內容依序是:

  • 第一行(top…):這一行顯示的信息分別爲:
    • 目前的時間,亦即是 00:53:59 那個項目;
    • 開機到目前爲止所經過的時間,亦即是 up 6:07, 那個項目;
    • 已經登入系統的用戶人數,亦即是 3 users, 項目;
    • 系統在 1, 5, 15 分鐘的平均工作負載。我們在第十五章談到的 batch 工作方式爲負載小於 0.8 就是這個負載囉!代表的是 1, 5, 15 分鐘,系統平均要負責運作幾個進程(工作)的意思。 越小代表系統越閒置,若高於 1 得要注意你的系統進程是否太過繁複了!
  • 第二行(Tasks…):顯示的是目前進程的總量與個別進程在什麼狀態(running, sleeping, stopped, zombie)。 比較需要注意的是最後的 zombie 那個數值,如果不是 0 !好好看看到底是那個 process 變成殭屍了吧?
  • 第三行(%Cpus…):顯示的是 CPU 的整體負載,每個項目可使用 ? 查閱。需要特別注意的是 wa 項目,那個項目代表的是 I/O wait, 通常你的系統會變慢都是 I/O 產生的問題比較大!因此這裏得要注意這個項目耗用 CPU 的資源喔! 另外,如果是多核心的設備,可以按下數字鍵『1』來切換成不同 CPU 的負載率。
  • 第四行與第五行:表示目前的物理內存與虛擬內存 (Mem/Swap) 的使用情況。 再次重申,要注意的是 swap的使用量要儘量的少!如果 swap 被用的很大量,表示系統的物理內存實在不足!
  • 第六行:這個是當在 top 程序當中輸入指令時,顯示狀態的地方。
  • 至於 top 下半部分的畫面,則是每個 process 使用的資源情況。比較需要注意的是:
    • PID :每個 process 的 ID 啦!
    • USER:該 process 所屬的使用者;
    • PR :Priority 的簡寫,進程的優先執行順序,越小越早被執行;
    • NI :Nice 的簡寫,與 Priority 有關,也是越小越早被執行;
    • %CPU:CPU 的使用率;
    • %MEM:內存的使用率;
    • TIME+:CPU 使用時間的累加;

pstree 進程樹

  • pstree [-A|U] [-up]
  • 選項與參數:
    • -A :各進程樹之間的連接以 ASCII 字符來連接;
    • -U :各進程樹之間的連接以萬國碼的字符來連接。在某些終端接口下可能會有錯誤;
    • -p :並同時列出每個 process 的 PID;
    • -u :並同時列出每個 process 的所屬賬號名稱。

  所有的進程都是依附在 systemd 這支進程底下的,因爲他是由 Linux 核心所主動呼叫的第一支程序,所以 PID就是一號。

進程的管理

在這裏插入圖片描述

kill -signal PID

例題:
以 ps 找出 rsyslogd 這個進程的 PID 後,再使用 kill 傳送訊息,使得 rsyslogd 可以重新讀取配置文件。
答:
由於需要重新讀取配置文件,因此 signal 是 1 號。至於找出 rsyslogd 的 PID 可以是這樣做:
ps aux | grep 'rsyslogd' | grep -v 'grep'| awk '{print $2}'
接下來則是實際使用 kill -1 PID,因此,整串指令會是這樣:
kill -SIGHUP $(ps aux | grep 'rsyslogd' | grep -v 'grep'| awk '{print $2}')
如果要確認有沒有重新啓動 syslog ,可以參考登錄檔的內容,使用如下指令查閱:
tail -5 /var/log/messages

killall -signal 指令名稱

  • killall [-iIe] [command name]
  • 選項與參數:
    • -i :interactive 的意思,交互式的,若需要刪除時,會出現提示字符給用戶;
    • -e :exact 的意思,表示『後面接的 command name 要一致』,但整個完整的指令不能超過 15 個字符。
    • -I :指令名稱(可能含參數)忽略大小寫。

關於進程的執行順序

Priority 與 Nice 值

在這裏插入圖片描述
  我們 Linux 給予進程一個所謂的『優先執行序 (priority, PRI)』,這個PRI 值越低代表越優先的意思。不過這個 PRI 值是由核心動態調整的,用戶無法直接調整 PRI值的。

  PRI 是核心動態調整的,我們用戶也無權去幹涉 PRI !那如果你想要調整進程的優先執行序時,就得要透過 Nice 值了

  • PRI(new) = PRI(old) + nice

當 nice 值爲負值時,那麼該進程就會降低 PRI 值,亦即會變的較優先被處理。

  • nice 值可調整的範圍爲 -20 ~ 19 ;
  • root 可隨意調整自己或他人進程的 Nice 值,且範圍爲 -20 ~ 19 ;
  • 一般使用者僅可調整自己進程的 Nice 值,且範圍僅爲 0 ~ 19 (避免一般用戶搶佔系統資源);
  • 一般使用者僅可將 nice 值越調越高,例如本來 nice 爲 5 ,則未來僅能調整到大於 5;

nice :新執行的指令即給予新的 nice 值

  • nice [-n 數字] command
  • 選項與參數:
    • -n :後面接一個數值,數值的範圍 -20 ~ 19。

renice :已存在進程的 nice 重新調整

  • renice [number] PID
  • 選項與參數:
    • PID :某個進程的 ID 啊!

系統資源的觀察

free :觀察內存使用情況

  • free [-b|-k|-m|-g|-h] [-t] [-s N -c N]
  • 選項與參數:
    • -b :直接輸入 free 時,顯示的單位是 Kbytes,我們可以使用 b(bytes), m(Mbytes)k(Kbytes), 及 g(Gbytes) 來顯示單位喔!也可以直接讓系統自己指定單位 (-h)
    • -t :在輸出的最終結果,顯示物理內存與 swap 的總量。
    • -s :可以讓系統每幾秒鐘輸出一次,不間斷的一直輸出的意思!對於系統觀察挺有效!
    • -c :與 -s 同時處理~讓 free 列出幾次的意思~

uname:查閱系統與核心相關信息

  • uname [-asrmpi]
  • 選項與參數:
    • -a :所有系統相關的信息,包括底下的數據都會被列出來;
    • -s :系統核心名稱
    • -r :核心的版本
    • -m :本系統的硬件名稱,例如 i686 或 x86_64 等;
    • -p :CPU 的類型,與 -m 類似,只是顯示的是 CPU 的類型!
    • -i :硬件的平臺 (ix86)

uptime:觀察系統啓動時間與工作負載

uptime 可以顯示出 top 畫面的最上面一行!

[root@study ~]# uptime
02:35:27 up 7:48, 3 users, load average: 0.00, 0.01, 0.05

netstat :追蹤網絡或插槽文件

  • netstat -[atunlp]
  • 選項與參數:
    • -a :將目前系統上所有的聯機、監聽、Socket 數據都列出來
    • -t :列出 tcp 網絡封包的數據
    • -u :列出 udp 網絡封包的數據
    • -n :不以進程的服務名稱,以埠號 (port number) 來顯示;
    • -l :列出目前正在網絡監聽 (listen) 的服務;
    • -p :列出該網絡服務的進程 PID。

輸出信息:

  • Proto :網絡的封包協議,主要分爲 TCP 與 UDP 封包;
  • Recv-Q:非由用戶程序鏈接到此 socket 的複製的總 bytes 數;
  • Send-Q:非由遠程主機傳送過來的 acknowledged 總 bytes 數;
  • Local Address :本地端的 IP:port 情況
  • Foreign Address:遠程主機的 IP:port 情況
  • State :聯機狀態,主要有建立(ESTABLISED)及監聽(LISTEN);

dmesg :分析核心產生的訊息

範例一:輸出所有的核心開機時的信息
[root@study ~]# dmesg | more
範例二:搜尋開機的時候,硬盤的相關信息爲何?
[root@study ~]# dmesg | grep -i vda
[ 0.758551] vda: vda1 vda2 vda3 vda4 vda5 vda6 vda7 vda8 vda9
[ 3.964134] XFS (vda2): Mounting V4 Filesystem
....(底下省略)....

vmstat :偵測系統資源變化

  • vmstat [-a] [延遲 [總計偵測次數]] <==CPU/內存等信息
  • vmstat [-fs] <==內存相關
  • vmstat [-S 單位] <==設定顯示數據的單位
  • vmstat [-d] <==與磁盤有關
  • vmstat [-p 分區槽] <==與磁盤有關
  • 選項與參數:
    • -a :使用 inactive/active(活躍與否) 取代 buffer/cache 的內存輸出信息;
    • -f :開機到目前爲止,系統複製 (fork) 的進程數;
    • -s :將一些事件 (開機至目前爲止) 導致的內存變化情況列表說明;
    • -S :後面可以接單位,讓顯示的數據有單位。例如 K/M 取代 bytes 的容量;
    • -d :列出磁盤的讀寫總量統計表
    • -p :後面列出分區槽,可顯示該分區槽的讀寫總量統計表。

表格各項字段的意義:

  • 進程字段 (procs) 的項目分別爲:
    • r :等待運作中的進程數量;
    • b:不可被喚醒的進程數量。這兩個項目越多,代表系統越忙碌 (因爲系統太忙,所以很多進程就無法被執行或一直在等待而無法被喚醒之故)。
  • 內存字段 (memory) 項目分別爲:
    • swpd:虛擬內存被使用的容量;
    • free:未被使用的內存容量;
    • buff:用於緩衝存儲器;
    • cache:用於高速緩存。 這部份則與 free 是相同的。
  • 內存置換空間 (swap) 的項目分別爲:
    • si:由磁盤中將進程取出的量;
    • so:由於內存不足而將沒用到的進程寫入到磁盤的 swap 的容量。如果 si/so的數值太大,表示內存內的數據常常得在磁盤與主存儲器之間傳來傳去,系統效能會很差!
  • 磁盤讀寫 (io) 的項目分別爲:
    • bi:由磁盤讀入的區塊數量;
    • bo:寫入到磁盤去的區塊數量。如果這部份的值越高,代表系統的 I/O 非常忙碌!
  • 系統 (system) 的項目分別爲:
    • in:每秒被中斷的進程次數;
    • cs:每秒鐘進行的事件切換次數;這兩個數值越大,代表系統與接口設備的溝通非常頻繁! 這些接口設備當然包括磁盤、網絡卡、時間鍾等。
  • CPU 的項目分別爲:
    • us:非核心層的 CPU 使用狀態;
    • sy:核心層所使用的 CPU 狀態;
    • id:閒置的狀態;
    • wa:等待 I/O 所耗費的 CPU 狀態;
    • st:被虛擬機 (virtual machine) 所盜用的 CPU 使用狀態。

具有 SUID/SGID 權限的指令執行狀態

  • SUID 權限僅對二進制程序(binary program)有效;
  • 執行者對於該程序需要具有 x 的可執行權限;
  • 本權限僅在執行該程序的過程中有效 (run-time);
  • 執行者將具有該程序擁有者 (owner) 的權限。

  整個 SUID 的權限會生效是由於『具有該權限的程序被觸發』,而我們知道一個程序被觸發會變成進程, 所以,執行者可以具有程序擁有者的權限就是在該程序變成進程的那個時候!

/proc/* 代表的意義

進程都是在內存當中!而內存當中的數據又都是寫入到 /proc/* 這個目錄下的。
在這裏插入圖片描述

fuser:藉由文件(或文件系統)找出正在使用該文件的進程

  • fuser [-umv] [-k [i] [-signal]] file/dir
  • 選項與參數:
    • -u :除了進程的 PID 之外,同時列出該進程的擁有者;
    • -m :後面接的那個檔名會主動的上提到該文件系統的最頂層,對 umount 不成功很有效!
    • -v :可以列出每個文件與進程還有指令的完整相關性!
    • -k :找出使用該文件/目錄的 PID ,並試圖以 SIGKILL 這個訊號給予該 PID;
    • -i :必須與 -k 配合,在刪除 PID 之前會先詢問使用者意願!
    • -signal:例如 -1 -15 等等,若不加的話,預設是 SIGKILL (-9) !
範例一:找出目前所在目錄的使用 PID/所屬賬號/權限 爲何?
[root@study ~]# fuser -uv .
 USER PID ACCESS COMMAND
/root: root 13888 ..c.. (root)bash
 root 31743 ..c.. (root)bash

ACCESS 的項目,那個項目代表的意義爲:

  • c :此進程在當前的目錄下(非次目錄);
  • e :可被觸發爲執行狀態;
  • f :是一個被開啓的文件;
  • r :代表頂層目錄 (root directory);
  • F :該文件被開啓了,不過在等待迴應中;
  • m :可能爲分享的動態函式庫;

lsof :列出被進程所開啓的文件檔名

  • lsof [-aUu] [+d]
  • 選項與參數:
    • -a :多項數據需要『同時成立』才顯示出結果時!
    • -U :僅列出 Unix like 系統的 socket 文件類型;
    • -u :後面接 username,列出該使用者相關進程所開啓的文件;
    • +d :後面接目錄,亦即找出某個目錄底下已經被開啓的文件!

pidof :找出某支正在執行的程序的 PID

  • pidof [-sx] program_name
  • 選項與參數:
    • -s :僅列出一個 PID 而不列出所有的 PID
    • -x :同時列出該 program name 可能的 PPID 那個進程的 PID

SELinux

  SELinux他是『 Security Enhanced Linux 』的縮寫,字面上的意義就是安全強化的Linux 之意。其實 SELinux 是在進行進程、文件等細部權限設定依據的一個核心模塊! 由於啓動網絡服務的也是進程,因此剛好也能夠控制網絡服務能否存取系統資源的一道關卡!

  • 傳統的文件權限與賬號關係:自主式訪問控制, DAC。
    這種存取文件系統的方式被稱爲『自主式訪問控制 (Discretionary Access Control, DAC)』,基本上,
    就是依據進程的擁有者與文件資源的 rwx 權限來決定有無存取的能力
  • 以政策規則訂定特定進程讀取特定文件:委任式訪問控制, MAC。
    在這裏插入圖片描述

SELinux 的運作模式

在這裏插入圖片描述
  圖的重點在『主體』如何取得『目標』的資源訪問權限! 由上圖我們可以發現,(1)主體進程必須要通過 SELinux 政策內的規則放行後,就可以與目標資源進行安全性本文的比對, (2)若比對失敗則無法存取目標,若比對成功則可以開始存取目標。

安全性本文 (Security Context)

安全性本文你就將他想成 SELinux 內必備的 rwx 就是了,安全性本文是放置到文件的 inode 內的。

# 先來觀察一下 root 家目錄底下的『文件的 SELinux 相關信息』
[root@study ~]# ls -Z
-rw-------. root root system_u:object_r:admin_home_t:s0 anaconda-ks.cfg
-rw-r--r--. root root system_u:object_r:admin_home_t:s0 initial-setup-ks.cfg
-rw-r--r--. root root unconfined_u:object_r:admin_home_t:s0 regular_express.txt

這三個字段的意義爲:

  • 身份識別 (Identify):相當於賬號方面的身份識別!主要的身份識別常見有底下幾種常見的類型:
    • unconfined_u:不受限的用戶,也就是說,該文件來自於不受限的進程所產生的!一般來說,我們使用可登入賬號來取得 bash 之後, 預設的bash 環境是不受 SELinux 管制的~因爲 bash 並不是什麼特別的網絡服務!因此,在這個不受 SELinux 所限制的 bash 進程所產生的文件,其身份識別大多就是 unconfined_u 這個『不受限』用戶囉!
    • system_u:系統用戶,大部分就是系統自己產生的文件囉!基本上,如果是系統或軟件本身所提供的文件,大多就是 system_u 這個身份名稱,而如果是我們用戶透過 bash 自己建立的文件,大多則是不受限的unconfined_u 身份~如果是網絡服務所產生的文件,或者是系統服務運作過程產生的文件,則大部分的識別就會是 system_u 囉!因爲鳥哥這邊教大家使用文字界面來產生許多的數據,因此你看上面的三個文件中,系統安裝主動產生的 anaconda-ks.cfs 及 initial-setup-ks.cfg 就會是system_u,而我們自己從網絡上面抓下來的 regular_express.txt 就會是unconfined_u 這個識別啊!
  • 角色 (Role):透過角色字段,我們可以知道這個資料是屬於進程、文件資源還是代表使用者。一般的角色有:
    • object_r:代表的是文件或目錄等文件資源,這應該是最常見的囉;
    • system_r:代表的就是進程啦!不過,一般使用者也會被指定成爲 system_r 喔!你也會發現角色的字段最後面使用『 _r 』來結尾!因爲是 role 的意思嘛!
  • 類型 (Type) (最重要!):在預設的 targeted 政策中, Identify 與 Role 字段基本上是不重要的!重要的在於這個類型(type) 字段! 基本上,一個主體進程能不能讀取到這個文件資源,與類型字段有關!而類型字段在文件與進程的定義不太相同,分別是:
    • type:在文件資源 (Object) 上面稱爲類型 (Type);
    • domain:在主體進程 (Subject) 則稱爲領域 (domain) 了!domain 需要與 type 搭配,則該進程才能夠順利的讀取文件資源啦!

進程與文件 SELinux type 字段的相關性

在這裏插入圖片描述
在這裏插入圖片描述
上圖的意義我們可以這樣看的:

  1. 首先,我們觸發一個可執行的目標文件,那就是具有 crond_exec_t 這個類型的 /usr/sbin/crond 文件;
  2. 該文件的類型會讓這個文件所造成的主體進程 (Subject) 具有 crond 這個領域 (domain), 我們的政策針對
    這個領域已經制定了許多規則,其中包括這個領域可以讀取的目標資源類型;
  3. 由於 crond domain 被設定爲可以讀取 system_cron_spool_t 這個類型的目標文件 (Object), 因此你的配置
    文件放到 /etc/cron.d/ 目錄下,就能夠被 crond 那支進程所讀取了;
  4. 但最終能不能讀到正確的資料,還得要看 rwx 是否符合 Linux 權限的規範!

SELinux 三種模式的啓動、關閉與觀察

SELinux 依據啓動與否,共有三種模式,分別如下:

  • enforcing:強制模式,代表 SELinux 運作中,且已經正確的開始限制 domain/type 了;
  • permissive:寬容模式:代表 SELinux 運作中,不過僅會有警告訊息並不會實際限制 domain/type 的存取。這種模式可以運來作爲 SELinux 的 debug 之用;
  • disabled:關閉,SELinux 並沒有實際運作。

在這裏插入圖片描述

getenforce 查看SELinux模式

root@study ~]# getenforce
Enforcing <==諾!就顯示出目前的模式爲 Enforcing !

sestatus 查看SELinux 的政策 (Policy)

  • sestatus [-vb]
  • 選項與參數:
    • -v :檢查列於 /etc/sestatus.conf 內的文件與進程的安全性本文內容;
    • -b :將目前政策的規則布爾值列出,亦即某些規則 (rule) 是否要啓動 (0/1) 之意。

setenforce:SELinux 模式在 enforcing 與permissive 之間切換

  • setenforce [0|1]
  • 選項與參數:
    • 0 :轉成 permissive 寬容模式;
    • 1 :轉成 Enforcing 強制模式
      SELinux 各個規則的布爾值查詢 getsebool

SELinux 政策內的規則管理

SELinux 各個規則的布爾值查詢 getsebool

  • getsebool [-a] [規則的名稱]
  • 選項與參數:
    • -a :列出目前系統上面的所有 SELinux 規則的布爾值爲開啓或關閉值。

SELinux 各個規則規範的主體進程能夠讀取的文件 SELinux type 查詢 seinfo, sesearch

  • seinfo [-Atrub]

  • 選項與參數:

    • -A :列出 SELinux 的狀態、規則布爾值、身份識別、角色、類別等所有信息
    • -u :列出 SELinux 的所有身份識別 (user) 種類
    • -r :列出 SELinux 的所有角色 (role) 種類
    • -t :列出 SELinux 的所有類別 (type) 種類
    • -b :列出所有規則的種類 (布爾值)
  • sesearch [-A] [-s 主體類別] [-t 目標類別] [-b 布爾值]

  • 選項與參數:

    • -A :列出後面數據中,允許『讀取或放行』的相關數據
    • -t :後面還要接類別,例如 -t httpd_t
    • -b :後面還要接 SELinux 的規則,例如 -b httpd_enable_ftp_server

修改 SELinux 規則的布爾值 setsebool

  • setsebool [-P] 『規則名稱』 [0|1]
  • 選項與參數:
    • -P :直接將設定值寫入配置文件,該設定數據未來會生效的!

SELinux 安全本文的修改

使用 chcon 手動修改文件的 SELinux type

  • chcon [-R] [-t type] [-u user] [-r role] 文件
  • chcon [-R] --reference=範例文件 文件
  • 選項與參數:
    • -R :連同該目錄下的次目錄也同時修改;
    • -t :後面接安全性本文的類型字段!例如 httpd_sys_content_t ;
    • -u :後面接身份識別,例如 system_u; (不重要)
    • -r :後面街角色,例如 system_r; (不重要)
    • -v :若有變化成功,請將變動的結果列出來
    • –reference=範例文件:拿某個文件當範例來修改後續接的文件的類型!

使用 restorecon 讓文件恢復正確的 SELinux type

  • restorecon [-Rv] 文件或目錄
  • 選項與參數:
    • -R :連同次目錄一起修改;
    • -v :將過程顯示到屏幕上。

semanage 默認目錄的安全性本文查詢與修改

  • semanage {login|user|port|interface|fcontext|translation} -l
  • semanage fcontext -{a|d|m} [-frst] file_spec
  • 選項與參數:
    • fcontext :主要用在安全性本文方面的用途, -l 爲查詢的意思;
    • -a :增加的意思,你可以增加一些目錄的默認安全性本文類型設定;
    • -m :修改的意思;
    • -d :刪除的意思。

重點回顧

  • 程序 (program):通常爲 binary program ,放置在儲存媒體中 (如硬盤、光盤、軟盤、磁帶等),爲實體文件的型態存在;
  • 進程 (process):程序被觸發後,執行者的權限與屬性、程序的程序代碼與所需數據等都會被加載內存中, 操作系統並給予這個內存內的單元一個標識符 (PID),可以說,進程就是一個正在運作中的程序。
  • 程序彼此之間是有相關性的,故有父進程與子進程之分。而 Linux 系統所有進程的父進程就是 init 這個PID 爲 1 號的進程。
  • 在 Linux 的進程呼叫通常稱爲 fork-and-exec 的流程!進程都會藉由父進程以複製 (fork) 的方式產生一個一模一樣的子進程, 然後被複製出來的子進程再以 exec 的方式來執行實際要進行的程序,最終就成爲一個子進程的存在。
  • 常駐在內存當中的進程通常都是負責一些系統所提供的功能以服務用戶各項任務,因此這些常駐程序就會被我們稱爲:服務 (daemon)。
  • 在工作管理 (job control) 中,可以出現提示字符讓你操作的環境就稱爲前景 (foreground),至於其他工作就可以讓你放入背景 (background) 去暫停或運作。
  • 與 job control 有關的按鍵與關鍵詞有: &, [ctrl]-z, jobs, fg, bg, kill %n 等;
  • 進程管理的觀察指令有: ps, top, pstree 等等;
  • 進程之間是可以互相控制的,傳遞的訊息 (signal) 主要透過 kill 這個指令在處理;
  • 進程是有優先級的,該項目爲 Priority,但 PRI 是核心動態調整的,用戶只能使用 nice 值去微調 PRI
  • nice 的給予可以有: nice, renice, top 等指令;
  • vmstat 爲相當好用的系統資源使用情況觀察指令;
  • SELinux 當初的設計是爲了避免使用者資源的誤用,而 SELinux 使用的是 MAC 委任式存取設定;
  • SELinux 的運作中,重點在於主體進程 (Subject) 能否存取目標文件資源 (Object) ,這中間牽涉到政策(Policy) 內的規則, 以及實際的安全性本文類別 (type);
  • 安全性本文的一般設定爲:『Identify:role:type』其中又以 type 最重要;
  • SELinux 的模式有: enforcing, permissive, disabled 三種,而啓動的政策 (Policy) 主要是 targeted
  • SELinux 啓動與關閉的配置文件在: /etc/selinux/config
  • SELinux 的啓動與觀察: getenforce, sestatus 等指令
  • 重設 SELinux 的安全性本文可使用 restorecon 與 chcon
  • 在 SELinux 有啓動時,必備的服務至少要啓動 auditd 這個!
  • 若要管理預設的 SELinux 布爾值,可使用 getsebool, setsebool 來管理!
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章