Linux 系統的安全性與效能息息相關,其中檔案特殊許可權和程式管理扮演著至關重要的角色。SUID、SGID 和 Sticky Bit 作為特殊許可權機制,賦予檔案在執行時不同的身份和許可權,適當的設定能提升系統靈活性,然而錯誤的組態則可能導致安全漏洞。另一方面,有效地管理系統程式,包括檢視、篩選、控制和排程,是確保系統資源得到合理分配和利用的關鍵。此外,透過 Cron 工具實作任務自動化,能大幅提升工作效率。最後,I/O 最佳化策略,例如 Buffering、Caching 和非同步寫入,能顯著提升系統效能,減少磁碟耗損,對於需要高 I/O 效能的應用至關重要。這些技術的掌握和應用,對於構建安全、高效的 Linux 系統至關重要,也是系統管理員和資安人員的必備技能。

檔案特殊許可權與隱私安全:SUID、SGID及Sticky Bit

在 Linux 作業系統中,檔案的特殊許可權(SUID、SGID 和 Sticky Bit)是用來控制使用者在執行檔案或進入目錄時的行為。這些許可權能夠提供額外的安全層級,但同時也可能成為攻擊者進行特權提升的目標。玄貓將探討這些特殊許可權的運作方式及其潛在的安全風險。

SUID 位元:臨時提升許可權

SUID(Set User ID)位元允許檔案在執行時以檔案擁有者的身份執行,而不是執行者的身份。這在某些情況下非常有用,例如系統管理員可能會將 SUID 位元設定在需要存取敏感資料的程式上。例如,密碼變更程式通常會設定 SUID 位元,因為它需要存取 /etc/shadow 檔案。

設定 SUID 位元

要設定 SUID 位元,可以使用 chmod 命令。例如,將 SUID 位元設定在 filename 上,可以使用以下命令:

chmod 4644 filename

在這個命令中,4 是 SUID 位元,644 則是常規的讀取、寫入和執行許可權。

SGID 位元:臨時提升群組許可權

SGID(Set Group ID)位元則允許檔案在執行時以檔案擁有者所屬群組的身份執行。這意味著如果某個使用者不具備執行某個檔案的許可權,但該檔案擁有者屬於具備執行該檔案的群組,那麼該使用者就可以執行該檔案。

SGID 位元的應用

當 SGID 位元應用於目錄時,新建立的檔案將繼承該目錄建立者所屬群組的所有權。這對於多個使用者分享目錄來說非常有用。所有屬於該群組的使用者都可以執行該目錄中的檔案。

要設定 SGID 位元,可以使用以下命令:

chmod 2644 filename

在這個命令中,2 是 SGID 位元,644 則是常規的讀取、寫入和執行許可權。

Sticky Bit:遺留許可權

Sticky Bit 是一種較為古老的許可權機制,主要用於控制目錄中的檔案刪除和重新命名操作。然而,現代 Linux 作業系統已經忽略了 Sticky Bit 的功能,因此玄貓不會在此深入討論。

特殊許可權與隱私安全

這些特殊許可權在提供便利性的同時,也可能成為安全漏洞。攻擊者可能會利用這些特殊許可權進行特權提升攻擊。例如,如果一個程式具有 SUID 位元並且存在漏洞,攻擊者就可能利用這個漏洞獲得 root 許可權。

查詢具有 SUID 位元的檔案

要查詢具有 SUID 位元的檔案,可以使用 find 命令:

find / -user root -perm -4000

此命令會搜尋整個檔案系統中的所有擁有者為 root 的檔案,並且具備 SUID 位元(-perm -4000)。

內容解密:

find / -user root -perm -4000

此命令從檔案系統根目錄 / 引起開始查詢。

  • -user root:篩選出所有擁有者為 root 的檔案。
  • -perm -4000:篩選出具有 SUID 標記 (即第九個bit為1) 的檔案。 透過此指令我們能夠找出系統中所有具有 SUID 標記並且由 root 使用者擁有之檔案。
/usr/bin/chsh
/usr/bin/gpasswd
/usr/bin/pkexec
/usr/bin/sudo
/usr/bin/passwd
/usr/bin/kismet_capture

此列表中的檔案皆具備 SUID 標記且由 root 使用者擁有。對於包含 sudo 檔案來說我們看到其第一組許可權為 rwsr-xr-x ,表明其具有 SUID 標記並且任何人執行此檔案時都將以 root 身份執行。

Linux 特殊許可權管理與安全保障

Linux 作業系統透過細緻的人員及群組設定來保障資料安全性及防範未經授權之存取。一個熟悉 Linux 安全機制之駭客則必須充分理解此等機制以便更有效地保護自身及他人系統資料安全性。

總結來說,Linux 的特殊許可權機制提供了強大的安全功能,但同時也需要謹慎管理以避免潛在的安全風險。瞭解如何設定和管理這些特殊許可權是每個 Linux 作業系統管理員都應具備的技能。

管理流程

在任何給定的時間點,一個 Linux 系統通常會同時執行數百個,甚至上千個流程。流程簡單來說就是正在執行並使用資源的程式。這些流程包括終端機、網頁伺服器、任何正在執行的指令、任何資料函式庫、圖形使用者介面,以及更多。任何優秀的 Linux 管理員——特別是駭客——都需要了解如何管理這些流程,以最佳化系統。例如,一旦駭客控制了目標系統,他們可能會想找到並停止某個特定的流程,如防毒軟體或防火牆。為此,駭客首先需要了解如何找到該流程。駭客也可能想設定一個掃描指令碼,定期執行以找到易受攻擊的系統,因此我們也將探討如何排程這樣的指令碼。

在本章中,你將學習如何管理這些流程。首先,你將學習如何檢視和找到流程,以及如何發現哪些流程使用最多資源。然後,你將學習如何管理流程,包括在背景中執行、設定優先順序以及在必要時終止它們(不涉及流血)。最後,你將學習如何排程流程在指定的日期和時間執行。

檢視流程

在大多數情況下,管理流程的第一步是檢視系統上正在執行的流程。檢視流程的主要工具——也是 Linux 管理員最好的朋友——是 ps 指令。在命令列中執行它即可檢視正在執行的流程:

kali > ps
PID TTY TIME CMD
39659 pts/0 00:00:01 bash
39665 pts/0 00:00:00 ps

Linux 核心會為每個流程分配一個唯一的流程 ID(PID),順序依據流程建立的順序。在處理這些 Linux 流程時,你經常需要指定它們的 PID,因此記住每個流程的 PID 比記住其名稱更重要。

僅靠 ps 指令並不能提供太多資訊。沒有選項地執行 ps 指令會列出由目前登入使用者(在此情況下是 root)啟動(稱為呼叫)且正在該終端機上執行的流程。在此例子中,它僅顯示 bash 輸入法開啟並執行著且我們執行了 ps 指令。我們需要並想要更多資訊,特別是在由其他使用者和系統後台執行的那些流程方面。沒有這些資訊,我們對系統上實際正在發生的事情知之甚少。

使用 aux 選項來執行 ps 指令可以顯示所有使用者和系統上正在執行的所有流程:

kali > ps aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.4 202540 6396 ? Ss Apr24 0:46 /sbin/init
root 2 0.0 0.0 0 0 ? S Apr24 0:00 [kthreadd]
root 3 0.0 0.0 0 0 ? S Apr24 0:26 [ksoftirqd/0]
...
root 39706 0.0 0.2 36096 3204 pts/0 R+ 15:05 0:00 ps aux

內容解密:

  • USER:呼叫該程式的使用者。
  • PID:程式識別碼。
  • %CPU:該程式佔用的 CPU 檔案。
  • %MEM:該程式佔用的記憶體檔案。
  • COMMAND:啟動該程式的指令名稱。

通常來說,要對某個程式進行任何操作,我們都必須指定其 PID。讓我們來看看如何利用這個識別符號來達到我們的目的。

按程式名稱篩選

當我們查詢或對程式進行操作時,我們通常不希望所有程式都顯示在螢幕上。這只是資訊過多而造成的一個問題。大多數情況下,我們只想找到某個單一程式的資訊。為此,我們可以使用篩選指令 grep ,它已經在第1章中介紹過。

為了演示起見,我們將使用 Metasploit 擴充套件框架(Metasploit Framework),這是最廣泛使用的擴充套件框架,也是幾乎每個駭客最好的朋友之一。這個框架已經安裝在你的 Kali 作業系統上了,所以可以使用以下指令啟動 Metasploit:

kali > msfconsole

一旦擴充套件框架啟動後,讓我們看看是否能夠在進行列表中找到它。為此,使用 ps aux 指令並將其管道(|)傳遞給 grep ,搜尋字串 msfconsole ,如下所示:

kali > ps aux | grep msfconsole
root    39756   0.1   1.1   <some number>   <some number> pts/2    Ss+   <time>     sh -c service postgresql start && msfdb init & msfconsole
root    39759   <number>   <number>   <some number>   <some number> pts/2    Sl+   <time>     ruby /usr/bin/msfconsole
root    39892   <number>   <number>    <some number>    <some number> pts/2    S+     <time>     grep msfconsole

內容解密:

  • msfconsole:這是 Metasploit 的主要控制檯指令。
  • sh -c:shell 在執行一組指令。
  • service postgresql start && msfdb init & msfconsole:這是一組管道和平行執行命令。
  • <number><some number>:這些代表的是當前系統上的 CPU 和記憶體使用百分比、虛擬記憶體大小、實體記憶體大小等數值。

控制及最佳化後台工作

畢竟有時候我們不需要每次都把工作挪到前台處理才能完成任務。

工作方式

讓我們來探討一下如何更好地進行後台工作處理。

控制命令

$ sleep&

以上命令意味著把 sleep 命令送入後台去執行。

控制狀態

若需把某個工作從後台挪到前台來處理:

$ fg %jobid

若需把某個工作從前台挪回後台繼續處理:

$ bg %jobid

控制結束

若需殺死後台工作:

$ kill %jobid 或 $ kill -TERM $PID 或 $ kill -KILL $PID 或 $ kill -HUP $PID 或 $ kill -STOP $PID 或 $ kill -CONT $PID 或 $ kill -USR1 $PID 或 $ kill -USR2 $PID 或 $ kill -INT $PID 或 $ kill -QUIT $PID 或 $ kill -PIPE $PID 或 $ kill -ALRM $PID 或 ...

其中:

  • $ jobid: 是以 % 加上數字表示。
  • $ PID: 是以 # 加上數字表示。

排定工作時間

接下來討論的是如何讓工作自動化排入特定時間點去執行而不是手動操作。

cron 時間表排定

cron 是 Unix-like 作業系統中的時間表排定工具, 預設會由 crond (cron daemon) 在背景執行, 則根據 crontab (cron table) 中設定好的時間來執行相關工作 (job) 。

工作方式

以下步驟幫助你瞭解怎麼排定工作時間:

編輯 cron table

要編輯或建立 crontab:

$ crontab -e [username]
查詢 cron table

要查詢目前已存在 crontab 的資訊:

$ crontab -l [username]
清除 cron table

要清除目前已存在 crontab 的資訊:

$ crontab -r [username]
預設目錄位置

預設 crontab 的檔案會存放於 /var/spool/cron/crontabs/ 中, 每位使用者各有一份 crontab 檔案, 名稱為該使用者名稱, 若無 crontab 檔案則表示沒有設定任何工作, 不能手動編輯該檔案, 必須透過 crontab 命令編輯.

時間規則規則說明:
* * * * * command to be executed in cron syntax format.
minute (minute of the hour, from "minute" to "minute") in range "minute" to "minute" and "/step"
hour (hour of the day, from "hour" to "hour") in range "hour" to "hour" and "/step"
day of month (day of the month, from "day of month" to "day of month") in range "day of month" to "day of month" and "/step"
month (month of the year, from "month" to "month") in range "month" to "month" and "/step"
day of week (day of the week, from "week day" to "week day") in range "week day" to "week day" and "/step"
常見範例:
  1. 每小時執行一次:
* * * * *
  1. 每日凌晨兩點整執行一次:
15     *       *       *       *
  1. 每月第一天凌晨兩點整執行一次:
15      *       *       *       *
  1. 每週日早上九點整執行一次:
*       *       *       Mon     *

內容解密:

  • cron: 是 Unix-like 作業系統中的時間表排定工具。
  • crond: 是 crontab 的守護程式, 主要功能是每分鐘會去檢查 crontab 的資料夾中是否有要執行或更新.
  • crontab: 是時間表排定工具中的「工作時間表」表格檔案.
  • job: 是 cron 中所排定要執行之工作.
  • command: 命令, 意即要執行之命令.

優先順序控制及效能最佳化

Linux 提供了許多工具來控制與最佳化系統效能。其中之一就是優先順序控制(Priority Control),這使得您可以根據需求調整不同進行中的任務優先順序。

優先順序控制原理說明

Linux 中每個任務都有一個預設優先順序值(由 niceness 值決定)。優先順序值越低代表越高優先順序(比較重要),反之則越低優先順序(較不重要)。 預設新開始的任務都會給予普通優先順序(值為 zero),並可以透過修改 niceness 值來增加或降低其優先順序。

niceness 值範圍從 -2019:

  • -2o: 高優先(最高),適合需要快速處理且佔用大量資源之任務;
  • o: 預設值;
  • 1o: 較低優先(較低),適合不緊急但需要持續進行之任務。

若需瞭解某任務目前 niceness 值可以使用 ps -l pid 查詢:

$ ps -l pid
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD

其中:

  • NI: niceness 值;
  • C: CPU usage;
  • PR: Priority level;

若想修改 niceness 值可以透過以下兩種方式: 方法一、透過 nice 指令開啟新任務時修改 niceness 值(可增加至19但不得減少至 負值)。

例如:

$ nice +1 command_to_run // niceness 值加1 ,代表較低優先順序。
$ nice -n +5 command_to_run // niceness 值加5 ,代表較低優先順序。

方法二、透過 renice 指令修改已存在之任務 niceness 值(可增加至19但可減少至 負值)。

例如:

$ renice +1 pid // niceness 值加1 ,代表較低優先順序。
$ renice +5 pid // niceness 值加5 ,代表較低優先順序。

最佳化應用效能及無效運算減量方法: I/O 高效化與減量

I/O 高效化與減量相關效能評估主要集中於檔案 I/O 的高效化與減量技術。

檔案 I/O 高效化方案:

Buffering 與 Caching:

Buffering 與 Caching 技術有助於提升系統 I/O 效能與減少不必要磁碟 I/O 次數。

NFS 與 NAS:

NFS 與 NAS 技術提升遠端存取效率與獨立性。

資料壓縮與壓縮分割:

透過資料壓縮技術減少實際存取 I/O 次數及實際磁碟空間使用量。

Lazy Write 與 Asynchronous Write:

Lazy Write 與 Asynchronous Write 技術可以顯著提升應用 I/O 效能與緩解 CPU 壓力。

此外還有一些檔案系統設計上的 I/O 最佳化措施包括:檔案系統分割槽策略、目錄結構設計、硬體 RAID 組態等。

內容解密:

Linux 提供了一些策略可以提升 I/O 效能與減少磁碟耗損包括 Buffering 與 Caching 技術、NFS 與 NAS 技術以及 Lazy Write 與 Asynchronous Write 技術等;也包含一些檔案系統設計上的措施包括:檔案系統分割槽策略、目錄結構設計及硬體 RAID 組態等可供選擇進行調整最佳化效能提升之處理方法達到目的