返回文章列表

Linux核心安全強化與Sysctl引陣列態

本文探討 Linux 的 /proc 虛擬檔案系統,並講解如何透過 sysctl 命令組態核心引數,強化系統安全與效能。文章涵蓋了行程資訊、核心資訊、網路安全引數設定、SYN Cookies、IP 封包轉發、ICMP 重定向、Martian 封包紀錄、Magic SysRq 鍵設定、連結保護等重要議題,並提供

系統管理 資安

Linux 的 /proc 虛擬檔案系統提供系統和行程資訊的即時檢視,讓管理員能深入瞭解系統運作狀態。然而,/proc 也暴露了一些敏感資訊,可能成為資安漏洞。透過 sysctl 工具,我們可以調整核心引數,在效能和安全之間取得平衡。本文將探討如何善用 sysctl 組態核心引數,強化系統安全,並提供實務操作。特別針對網路安全方面,我們將討論 SYN Cookies、IP 封包轉發、ICMP 重定向等關鍵設定,並提供 CentOS、AlmaLinux 和 Ubuntu 等發行版的組態範例,協助管理員有效提升系統防護能力。

探索Linux的/proc虛擬檔案系統

在Linux系統中,/proc目錄是一個虛擬檔案系統,提供了豐富的系統和行程資訊。這個目錄下的檔案和子目錄包含了系統硬體、行程狀態、核心引數等重要資訊。

瞭解/proc下的行程資訊

/proc目錄下,每個數字命名的子目錄代表了一個正在執行的行程。例如,/proc/1代表了系統初始化行程。這些目錄下包含了行程的詳細資訊,如:

  • cmdline:記錄了啟動該行程的命令列引數。
  • comm:顯示了該行程的名稱。
  • status:包含了行程的狀態資訊,如記憶體使用情況、UID、GID等。
ls -l /proc/1

內容解密:

  • ls -l命令用於列出指定目錄下的檔案和子目錄的詳細資訊。
  • /proc/1目錄代表了PID為1的行程,通常是系統初始化行程。
  • 透過檢視/proc/<PID>下的檔案,可以取得特定行程的詳細資訊。

使用top和ps命令檢視行程資訊

雖然直接檢視/proc下的檔案可以取得大量資訊,但對於一般使用者來說,更方便的方式是使用topps命令。

  • ps aux:提供了一個完整的行程列表,包含了各行程的詳細資訊。
  • top:動態顯示系統中正在執行的行程,並按CPU使用率等排序。
ps aux
top

內容解密:

  • ps aux命令列出了系統中所有行程的詳細資訊,包括使用者、PID、CPU使用率、記憶體使用量等。
  • top命令提供了一個實時更新的行程列表,可以用於監控系統資源的使用情況。

瞭解核心資訊

/proc目錄下除了行程資訊外,還包含了許多與Linux核心相關的資訊。例如:

  • cpuinfo:顯示了CPU的詳細資訊,如型號、速度、快取大小等。
  • meminfo:提供了系統記憶體的使用情況。
cat /proc/cpuinfo
cat /proc/meminfo

內容解密:

  • cat /proc/cpuinfo命令顯示了CPU的詳細資訊,有助於瞭解系統的硬體組態。
  • cat /proc/meminfo命令提供了系統記憶體的使用情況,可以用於監控記憶體資源。

設定核心引數

/proc/sys目錄下,可以找到許多可設定的核心引數。例如,在/proc/sys/net/ipv4目錄下,可以調整與IPv4網路相關的引數。

ls -l /proc/sys/net/ipv4

內容解密:

  • /proc/sys/net/ipv4目錄包含了與IPv4網路協定相關的核心引數。
  • 透過調整這些引數,可以最佳化網路效能或修改網路行為。

使用sysctl命令設定核心引數

傳統上,可以透過直接寫入/proc下的引數檔案來修改核心引數。但更方便的方法是使用sysctl命令。

sysctl -w net.ipv4.icmp_echo_ignore_all=1

內容解密:

  • sysctl -w命令用於寫入新的核心引數值。
  • net.ipv4.icmp_echo_ignore_all=1表示忽略所有的ICMP回應請求,達到禁止ping回應的效果。

網路安全引陣列態:使用 sysctl 提升 Linux 系統防護

在 Linux 系統管理中,/proc/sys 目錄下的引數設定對於系統的安全性和效能至關重要。本文將介紹如何使用 sysctl 命令來組態這些引數,並探討相關的安全設定。

使用 sysctl 組態網路引數

sysctl 是一個用於檢視和修改核心引數的工具。與直接編輯 /proc/sys 下的檔案不同,sysctl 提供了一個更為現代化和方便的方式來管理這些引數。

檢視所有引數設定

要檢視所有可用的引數設定,可以使用以下命令:

sudo sysctl -a

這將列出系統中所有可組態的引數及其當前值。

修改引數

要修改某個引數,可以使用 -w 選項。例如,將 icmp_echo_ignore_all 設為 0

sudo sysctl -w net.ipv4.icmp_echo_ignore_all=0

這種變更預設是暫時的,重啟後會還原預設值。

使引數變更永久生效

要使變更永久生效,需要編輯相關的組態檔案。主要的組態檔案是 /etc/sysctl.conf,但不同發行版可能會使用不同的檔案或目錄來存放預設組態。

Ubuntu 的組態方式

在 Ubuntu 中,/etc/sysctl.conf 檔案包含了許多註解和範例設定。要啟用某項設定,只需取消相關行的註解即可。例如,啟用反向路徑過濾(rp_filter)以防止 IP 欺騙攻擊:

# Uncomment the next two lines to enable Spoof protection (reverse-path filter)
net.ipv4.conf.default.rp_filter=1
net.ipv4.conf.all.rp_filter=1

此外,Ubuntu 還在 /etc/sysctl.d/ 目錄下存放了其他組態檔案。

CentOS/AlmaLinux 的組態方式

在 CentOS 和 AlmaLinux 中,/etc/sysctl.conf 檔案預設為空,需要在 /usr/lib/sysctl.d/ 目錄下查詢預設組態。此外,/etc/sysctl.d/ 目錄下可能包含一個指向 /etc/sysctl.conf 的符號連結。

檢視當前組態

使用以下命令可以檢視目前透過 sysctl 組態檔案定義的核心引數:

systemd-analyze cat-config sysctl.d

SYN Cookies 設定

SYN Cookies 是一種防禦 SYN Flood 攻擊的機制。在 Ubuntu 22.04 中,儘管 /etc/sysctl.conf 中相關設定被註解,但透過 sysctl -a 命令仍可看到 net.ipv4.tcp_syncookies 被設為 1,表示已啟用。

sudo sysctl -a | grep syncookie

查詢特定設定

對於某些設定,可能需要深入 /boot/ 目錄下的核心組態檔案進行查詢。例如,使用 grep -i 命令進行大小寫不敏感的搜尋。

圖表翻譯:

此圖示顯示了 sysctl 組態的基本結構。

@startuml
skinparam backgroundColor #FEFEFE
skinparam defaultTextAlignment center
skinparam rectangleBackgroundColor #F5F5F5
skinparam rectangleBorderColor #333333
skinparam arrowColor #333333

title 圖表翻譯:

rectangle "包含主要組態" as node1
rectangle "存放預設組態" as node2
rectangle "存放額外組態" as node3
rectangle "影響" as node4
rectangle "控制" as node5

node1 --> node2
node2 --> node3
node3 --> node4
node4 --> node5

@enduml

圖表翻譯: 此圖示呈現了 sysctl 組態檔案的結構和其如何影響系統核心引數。主要的組態檔案包括 /etc/sysctl.conf/usr/lib/sysctl.d//etc/sysctl.d/,它們共同決定了系統的核心引數,從而控制系統的行為。

組態 sysctl 設定以增強 Linux 系統安全

深入解析 sysctl 組態檔案

在 Linux 系統中,sysctl 是一個強大的工具,用於組態核心引數以增強系統的安全性和效能。本文將探討如何在 Ubuntu、CentOS 和 AlmaLinux 上組態 sysctl 設定。

搜尋與理解 SYN Cookies 設定

首先,我們需要在組態檔案中搜尋與 SYN Cookies 相關的設定。在 Ubuntu 22.04 中,透過在 /boot 目錄下搜尋 syn 關鍵字,我們發現:

donnie@ubuntu-2204:/boot$ grep -i 'syn' config-5.15.0-52-generic
...
CONFIG_SYN_COOKIES=y
...

內容解密:

  • grep -i 'syn' config-5.15.0-52-generic:在指定的組態檔案中搜尋包含 syn 關鍵字的行,忽略大小寫。
  • CONFIG_SYN_COOKIES=y:表示 SYN Cookies 功能已被編譯到核心中並啟用。

這意味著 Ubuntu 22.04 的開發者已將 SYN Cookies 設定硬編碼到核心中,因此無需在 sysctl.conf 檔案中進行組態。

IP 封包轉發設定

接下來,我們來看看 IP 封包轉發的設定:

# Uncomment the next line to enable packet forwarding for IPv4
#net.ipv4.ip_forward=1

# Uncomment the next line to enable packet forwarding for IPv6
# Enabling this option disables Stateless Address Autoconfiguration
# based on Router Advertisements for this host
#net.ipv6.conf.all.forwarding=1

內容解密:

  • net.ipv4.ip_forward=1:啟用 IPv4 封包轉發功能,允許多個網路介面之間的封包流動。
  • net.ipv6.conf.all.forwarding=1:啟用 IPv6 封包轉發功能,但會停用 Stateless Address Autoconfiguration。

通常,除非正在設定路由器或 VPN 伺服器,否則應保持這些設定為註解狀態。

ICMP 重定向設定

ICMP 重定向設定控制是否接受 ICMP 重定向訊息:

# Do not accept ICMP redirects (prevent MITM attacks)
#net.ipv4.conf.all.accept_redirects = 0
#net.ipv6.conf.all.accept_redirects = 0

# Accept ICMP redirects only for gateways listed in our default
# gateway list (enabled by default)
# net.ipv4.conf.all.secure_redirects = 1

內容解密:

  • net.ipv4.conf.all.accept_redirects = 0:停用接受所有網路介面的 ICMP 重定向訊息,以防止中間人攻擊。
  • net.ipv4.conf.all.secure_redirects = 1:僅接受來自預設閘道器列表中的閘道器的 ICMP 重定向訊息,預設為啟用。

即使 secure_redirects 設定為註解狀態,其預設值仍為啟用。建議完全停用 ICMP 重定向以增強安全性。

Martian 封包紀錄

Martian 封包是指具有無效源 IP 地址的封包,例如具有私有 IP 地址或迴路裝置地址的封包:

# Log Martian Packets
#net.ipv4.conf.all.log_martians = 1

內容解密:

  • net.ipv4.conf.all.log_martians = 1:啟用 Martian 封包的紀錄功能,有助於監控和診斷網路問題。

啟用此設定可以幫助檢測和記錄可疑的網路活動。

Magic SysRq 鍵設定

Magic SysRq 鍵允許管理員透過特定的按鍵組合執行諸如關閉或重啟系統等操作:

# Magic system request key
# 0=disable, 1=enable all
# Debian kernels have this set to 0 (disable the key)
# See https://www.kernel.org/doc/Documentation/sysrq.txt
# for what other values do
#kernel.sysrq=438

內容解密:

  • kernel.sysrq=438:設定 Magic SysRq 鍵的功能,0 表示停用,1 表示啟用所有功能。

根據實際需要,可以停用或啟用此功能。

連結保護

連結保護功能可以防止惡意連結的建立和跟隨:

# Protected links
# Protects against creating or following links under certain conditions
# Debian kernels have both set to 1 (restricted)
# See https://www.kernel.org/doc/Documentation/sysctl/fs.txt
fs.protected_fifos = 1
fs.protected_hardlinks = 1
fs.protected_regular = 2
fs.protected_symlinks = 1

內容解密:

  • fs.protected_hardlinks = 1fs.protected_symlinks = 1:啟用硬連結和符號連結保護,防止在特定條件下建立或跟隨連結。

這些設定有助於提高系統的安全性。

CentOS 和 AlmaLinux 的 sysctl 組態

在 CentOS 和 AlmaLinux 上,/etc/sysctl.conf 檔案預設為空,需要在 /etc/sysctl.d/ 目錄下建立新的組態檔案來進行自定義設定。

加強Linux核心安全性的實務操作

瞭解預設安全設定

CentOS和AlmaLinux的預設安全設定與Ubuntu基本相同,但組態位置不同。以CentOS和AlmaLinux為例,spoof防護(rp_filter)引數和連結防護引數位於/usr/lib/sysctl.d/50-default.conf檔案中。

檢查SYN cookies和secure_redirects設定

使用sysctl -a命令並透過grep篩選,可以看到SYN cookies和secure_redirects已啟用:

sudo sysctl -a | grep 'syncookie'
net.ipv4.tcp_syncookies = 1
sudo sysctl -a | grep 'secure_redirects'
net.ipv4.conf.all.secure_redirects = 1
net.ipv4.conf.default.secure_redirects = 1
net.ipv4.conf.enp0s3.secure_redirects = 1
net.ipv4.conf.lo.secure_redirects = 1
net.ipv4.conf.virbr0.secure_redirects = 1
net.ipv4.conf.virbr0-nic.secure_redirects = 1

SYN cookies的設定已硬編碼在Linux核心中:

cd /boot
grep -i cookies config-5.14.0-70.30.1.el9_0.x86_64
CONFIG_SYN_COOKIES=y

設定額外的核心強化引數

雖然目前的設定尚可,但仍有改進空間。使用Lynis等系統掃描工具可以發現一些未在組態檔案中設定的預設值。

使用Lynis掃描核心引數

Lynis是一個安全掃描工具,可以提供大量系統資訊。安裝Lynis後,執行系統掃描:

sudo apt update
sudo apt install lynis  # Ubuntu
sudo yum install lynis  # CentOS 7
sudo dnf install lynis  # AlmaLinux 8 或 9

sudo lynis audit system

掃描結果中的[+] Kernel Hardening部分顯示了需要調整的引數。

實作:使用Lynis掃描核心引數並強化安全性

  1. 安裝Lynis並執行系統掃描。
  2. [+] Kernel Hardening部分的內容複製到一個文字檔案中,例如secure_values.conf
  3. 使用grep篩選出標記為DIFFERENT的行,並將其儲存到60-secure_values.conf中。
  4. 編輯60-secure_values.conf,將其轉換為sysctl組態格式,設定引數為建議的安全值。
  5. 60-secure_values.conf複製到/etc/sysctl.d/目錄下。
  6. 重啟機器以套用新的設定。

範例組態:60-secure_values.conf

kernel.dmesg_restrict = 1
kernel.kptr_restrict = 2
kernel.sysrq = 0
kernel.yama.ptrace_scope = 1 2 3
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.all.log_martians = 1
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.accept_redirects = 0
net.ipv4.conf.default.log_martians = 1
net.ipv6.conf.all.accept_redirects = 0
net.ipv6.conf.default.accept_redirects = 0

解說強化引數的作用

kernel.dmesg_restrict = 1

限制非特權使用者使用dmesg命令檢視核心資訊。

kernel.kptr_restrict = 2

防止/proc暴露核心記憶體位址資訊。設定為2可完全防止任何人檢視位址資訊,但可能會影響某些效能監控程式的運作。

kernel.yama.ptrace_scope = 1 2 3

限制ptrace工具的使用,防止惡意除錯。可設定為1(僅允許除錯父行程)、2(僅允許root使用者使用)或3(完全禁止使用)。

防範使用者檢視其他使用者的行程

預設情況下,使用者可以使用pstop命令檢視其他使用者的行程。透過調整核心引數,可以限制這種行為。

範例輸出:ps aux命令

USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  0.0  0.7 179124 13752 ?        Ss   12:05   0:03 /usr/lib/systemd/systemd --switc
root         2  0.0  0.0      0     0 ?        S    12:05   0:00 [kthreadd]
root         3  0.0  0.0      0     0 ?        I<   12:05   0:00 [rcu_gp]
...
colord    2218  0.0  0.5 323948 10344 ?        Ssl  12:06   0:00 /usr/libexec/colord
gdm       2237  0.0  0.2 206588  5612 tty1     Sl   12:06   0:00 /usr/libexec/ibus-engine-simple
...
donnie    2293  0.0  0.5 93280   9696 ?        Ss   12:06   0:00 /usr/lib/systemd/systemd --user
donnie    2301  0.0  0.2 251696 4976 ?         S    12:06   0:00 (sd-pam)
donnie    2307  0.0  0.6 1248768 
12656 ?        S<sl 

#### 圖表翻譯:此圖示顯示行程列表及其對應的使用者與資源佔用情況。