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下的檔案可以取得大量資訊,但對於一般使用者來說,更方便的方式是使用top和ps命令。
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 = 1和fs.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掃描核心引數並強化安全性
- 安裝Lynis並執行系統掃描。
- 將
[+] Kernel Hardening部分的內容複製到一個文字檔案中,例如secure_values.conf。 - 使用
grep篩選出標記為DIFFERENT的行,並將其儲存到60-secure_values.conf中。 - 編輯
60-secure_values.conf,將其轉換為sysctl組態格式,設定引數為建議的安全值。 - 將
60-secure_values.conf複製到/etc/sysctl.d/目錄下。 - 重啟機器以套用新的設定。
範例組態: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(完全禁止使用)。
防範使用者檢視其他使用者的行程
預設情況下,使用者可以使用ps或top命令檢視其他使用者的行程。透過調整核心引數,可以限制這種行為。
範例輸出: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
#### 圖表翻譯:此圖示顯示行程列表及其對應的使用者與資源佔用情況。