Linux系統安全強化指南

2021-12-25 分布式實驗室


本指南旨在說明如何儘可能地加強Linux的安全性和隱私性,並且不限於任何特定的指南。免責聲明:如果您不確定自己在做什麼,請不要嘗試在本文中使用任何內容。本指南僅關注安全性和隱私性,而不關注性能,可用性或其他內容。列出的所有命令都將需要root特權。以「$」符號開頭的單詞表示一個變量,不同終端之間可能會有所不同。

避免分發凍結程序包,因為它們在安全更新中通常很落後。

不使用與Systemd機制的發行版。Systemd包含許多不必要的攻擊面;它嘗試做的事情遠遠超出了必要,並且超出了初始化系統應做的事情。

使用musl作為默認的C庫。Musl專注於最小化,這會導致很小的攻擊面,而其他C庫(例如glibc)過於複雜,容易產生漏洞。例如,與musl中的極少數漏洞相比,glibc中的一百多個漏洞已被公開披露。儘管僅靠披露的CVE本身通常是不準確的統計信息,但有時這種情況有時可以用來表示過分的問題。Musl還具有不錯的漏洞利用緩解措施,尤其是其新的強化內存分配器。

最好默認情況下使用LibreSSL而不是OpenSSL的發行版。OpenSSL包含大量完全不必要的攻擊面,並且遵循不良的安全做法。例如,它仍然保持OS / 2和VMS支持這些已有數十年歷史的古老作業系統。這些令人討厭的安全做法導致了可怕的Heartbleed漏洞。LibreSSL是OpenBSD團隊的OpenSSL分支,它採用了出色的編程實踐並消除了很多攻擊面。在LibreSSL成立的第一年內,它緩解了許多漏洞,其中包括一些高嚴重性的漏洞。

用作強化作業系統基礎的最佳發行版是Gentoo Linux,因為它可以讓您精確地配置系統,以達到理想的效果,這將非常有用,尤其是參考我們在後面的章節中使用更安全的編譯標誌。但是,由於Gentoo的巨大可用性缺陷,它對於許多人來說可能並不順手。在這種情況下,Void Linux的Musl構建是一個很好的折衷方案。

內核是作業系統的核心,不幸的是很容易受到攻擊。正如Brad Spengler曾經說過的那樣,可以將其視為系統上最大,最易受攻擊的setuid根二進位文件。因此,對內核進行儘可能多的強化非常重要。Linux內核以兩種主要形式發布:穩定和長期支持(LTS)。穩定版本是較新的版本,而LTS發行版本是較老的穩定版本,長期以來一直受支持。選擇上述任何一個發行版本都有許多後果。Linux內核未使用CVE標識安全漏洞。這意味著大多數安全漏洞的修復程序不能向後移植到LTS內核。但是穩定版本包含到目前為止進行的所有安全修復。但是,有了這些修復程序,穩定的內核將包含更多新功能,因此大大增加了內核的攻擊面,並引入了大量新錯誤。相反,LTS內核的受攻擊面較小,因為這些功能沒有被不斷添加。此外,穩定的內核還包括更新的強化功能,以減輕LTS內核沒有的某些利用。此類功能的一些示例是Lockdown LSM和STACKLEAK GCC插件。總而言之,在選擇穩定或LTS內核時需要權衡取捨。LTS內核具有較少的強化功能,並且並非當時所有的公共錯誤修復都已向後移植,但是通常它的攻擊面更少,並且引入未知錯誤的可能性也較小。穩定的內核具有更多的強化功能,並且包括所有已知的錯誤修復,但它也具有更多的攻擊面以及引入更多未知錯誤的機會更大。最後,最好使用較新的LTS分支(如4.19內核)。Sysctl是允許用戶配置某些內核設置並啟用各種安全功能或禁用危險功能以減少攻擊面的工具。要臨時更改設置,您可以執行:

sysctl -w $tunable = $value

要永久更改sysctls,您可以將要更改的sysctls添加到/etc/sysctl.conf或/etc/sysctl.d中的相應文件,具體取決於您的Linux發行版。

kernel.kptr_restrict=2

內核指針指向內核內存中的特定位置。這些在利用內核方面可能非常有用,但是默認情況下不會隱藏內核指針,例如,通過讀取/proc/kallsyms的內容即可輕鬆發現它們。此設置旨在減輕內核指針洩漏。另外,您可以設置kernel.kptr_restrict = 1以僅從沒有CAP_SYSLOG功能的進程中隱藏內核指針。

kernel.dmesg_restrict=1

dmesg是內核日誌,它公開了大量有用的內核調試信息,但這通常會洩漏敏感信息,例如內核指針。更改上述sysctl設置會將內核日誌限制為CAP_SYSLOG功能。

kernel.printk=3 3 3 3

儘管dmesg_restrict的值,啟動過程中內核日誌仍將顯示在控制臺中。能夠在引導過程中記錄屏幕的惡意軟體可能會濫用此惡意軟體以獲得更高的特權。此選項可防止這些信息洩漏。必須將其與下面描述的某些引導參數結合使用才能完全有效。

kernel.unprivileged_bpf_disabled=1  
net.core.bpf_jit_harden=2

eBPF暴露了很大的攻擊面,因此需加以限制。這些系統將eBPF限制為CAP_BPF功能(在5.8之前的內核版本上為CAP_SYS_ADMIN),並啟用JIT強化技術,例如常量綁定。

dev.tty.ldisc_autoload=0

這將加載TTY行規則限制為CAP_SYS_MODULE功能,以防止非特權的攻擊者使用TIOCSETD ioctl加載易受攻擊的線路規則,而該TIOCSETD ioctl之前已在許多漏洞利用中被濫用。

vm.unprivileged_userfaultfd=0

userfaultfd() 系統調用經常被濫用以利用「事後使用(use-after-free)」缺陷。因此,該sysctl用於將此syscall限制為CAP_SYS_PTRACE功能。

kernel.kexec_load_disabled=1

kexec是一個系統調用,用於在運行時引導另一個內核。可以濫用此功能來加載惡意內核並在內核模式下獲得任意代碼執行能力,因此該sysctl設置將被禁用。

kernel.sysrq=4

SysRq密鑰向非特權用戶公開了許多潛在的危險調試功能。與通常的假設相反,SysRq不僅是物理攻擊的問題,而且還可以遠程觸發。該sysctl的值使其可以使用戶只能使用SAK密鑰,這對於安全地訪問root是必不可少的。或者,您可以簡單地將值設置為0以完全禁用SysRq。

kernel.unprivileged_userns_clone=0

用戶名稱空間是內核中的一項功能,旨在改善沙箱並使非特權用戶易於訪問它,但是,此功能公開了重要的內核攻擊面,以進行特權升級,因此該sysctl將用戶名稱空間的使用限制為CAP_SYS_ADMIN功能。對於無特權的沙箱,建議使用具有很少攻擊面的setuid二進位文件,以最大程度地減少特權升級的可能性。沙箱章節部分將進一步討論此主題。請注意,儘管該sysctl僅在某些Linux發行版中存在,因為它需要內核補丁。如果您的內核不包含此補丁,則可以通過設置user.max_user_namespaces = 0來完全禁用用戶名稱空間(包括root用戶)。

kernel.perf_event_paranoid=3

性能事件會增加大量內核攻擊面,並導致大量漏洞。此sysctl設置將性能事件的所有使用限制為CAP_PERFMON功能(5.8之前的內核版本為CAP_SYS_ADMIN)。請注意,此sysctl設置需要在某些發行版中具備相關的內核補丁。否則,此設置等效於kernel.perf_event_paranoid = 2,它僅限制此功能的子集。

net.ipv4.tcp_syncookies=1

這有助於防止SYN泛洪攻擊,這種攻擊是拒絕服務攻擊的一種形式,在這種攻擊中,攻擊者發送大量虛假的SYN請求,以嘗試消耗足夠的資源以使系統對合法流量不響應。

net.ipv4.tcp_rfc1337=1

這通過丟棄處於時間等待狀態的套接字的RST數據包來防止time-wait狀態。

net.ipv4.conf.all.rp_filter=1  
net.ipv4.conf.default.rp_filter=1

這些啟用了源驗證,以驗證從計算機所有網絡接口接收到的數據包。

net.ipv4.conf.all.accept_redirects=0  
net.ipv4.conf.default.accept_redirects=0  
net.ipv4.conf.all.secure_redirects=0  
net.ipv4.conf.default.secure_redirects=0  
net.ipv6.conf.all.accept_redirects=0  
net.ipv6.conf.default.accept_redirects=0  
net.ipv4.conf.all.send_redirects=0  
net.ipv4.conf.default.send_redirects=0

這些設置禁用了ICMP重定向,以防止中間人攻擊並最大程度地減少信息洩露。

net.ipv4.icmp_echo_ignore_all=1

此設置使您的系統忽略所有ICMP請求,以避免Smurf攻擊,使設備更難以在網絡上枚舉,並防止通過ICMP時間戳識別時鐘指紋。

net.ipv4.conf.all.accept_source_route=0  
net.ipv4.conf.default.accept_source_route=0  
net.ipv6.conf.all.accept_source_route=0  
net.ipv6.conf.default.accept_source_route=0

源路由是一種允許用戶重定向網絡流量的機制。由於這可用於執行中間人攻擊,在中間人攻擊中,出於惡意目的將流量重定向,因此上述設置將會禁用此功能。

net.ipv6.conf.all.accept_ra=0  
net.ipv6.conf.default.accept_ra=0

惡意的IPv6路由廣告可能會導致中間人攻擊,因此應將其禁用。

net.ipv4.tcp_sack=0  
net.ipv4.tcp_dsack=0  
net.ipv4.tcp_fack=0

禁用TCP SACK。ACK通常被利用,並且在許多情況下是不必要的,因此如果您不需要它,則應將其禁用。

kernel.yama.ptrace_scope=2

ptrace是一個系統調用,它允許程序調試、修改和檢查另一個正在運行的進程,從而使攻擊者可以輕易修改其他正在運行的程序的內存。設置將ptrace的使用限制為僅具有CAP_SYS_PTRACE功能的進程。或者,將sysctl設置為3以完全禁用ptrace。

vm.mmap_rnd_bits=32  
vm.mmap_rnd_compat_bits=16

ASLR是一種常見的漏洞利用緩解措施,它可以使進程的關鍵部分在內存中的位置隨機化。這可能會使各種各樣的漏洞利用更困難,因為它們首先需要信息洩漏。上述設置增加了用於mmap ASLR的熵的位數,從而提高了其有效性。這些sysctls的值必須根據CPU體系結構進行設置。以上值與x86兼容,但其他體系結構可能有所不同。

fs.protected_symlinks=1  
fs.protected_hardlinks=1

僅當在可全局寫入的粘性目錄之外,當符號連結和關注者的所有者匹配或目錄所有者與符號連結的所有者匹配時,才允許遵循符號連結。這還可以防止沒有對源文件的讀/寫訪問權限的用戶創建硬連結。這兩者都阻止了許多常見的TOCTOU漏洞(time-of-check-to-time-of-use)。

fs.protected_fifos=2  
fs.protected_regular=2

這些阻止了在可能由攻擊者控制的環境(例如,全局可寫目錄)中創建文件,從而使數據欺騙攻擊更加困難。引導參數在引導時使用引導加載程序(bootloader)將設置傳遞給內核。類似於sysctl,可以使用某些設置來提高安全性。引導加載程序通常在引導參數設置方式上有所不同。下面列出了一些示例,但是您應該研究特定bootloader的修改參數的必要步驟。如果使用GRUB作為引導程序,請編輯/etc /default/grub並將參數添加到GRUB_CMDLINE_LINUX_DEFAULT=line。如果使用Syslinux,請編輯/boot/syslinux/syslinux.cfg並將它們添加到APPEND行中。如果使用systemd-boot,請編輯您的加載程序條目,並將其附加到linux行的末尾。

slab_nomerge

這將禁用slab合併,這將通過防止覆蓋合併的緩存中的對象並使其更難以影響slab緩存的布局,從而大大增加了堆利用的難度。

slub_debug=FZ

這些啟用健全性檢查(F)和重新分區(Z)。健全性檢查會添加各種檢查,以防止某些slab操作中的損壞。重新分區會在slab周圍添加額外的區域,以檢測slab何時被覆蓋超過其實際大小,從而有助於檢測溢出。

init_on_alloc=1 init_on_free=1

這樣可以在分配和空閒時間期間將內存清零,這可以幫助減輕使用後使用的漏洞並清除內存中的敏感信息。如果您的內核版本低於5.3,則這些選項不存在。而是在上述slub_debug選項後面附加「P」,以獲得slub_debug=FZP並添加page_poison=1。由於它們實際上是一種調試功能,剛好具有一些安全性,因此它們在釋放時提供的內存擦除形式較弱。

page_alloc.shuffle=1

此選項使頁分配器空閒列表隨機化,從而通過降低頁分配的可預測性來提高安全性,同時這也提高了性能。

pti=on

這將啟用內核頁表隔離,從而減輕崩潰並防止某些KASLR繞過。

vsyscall=none

這將禁用vsyscall,因為它們已過時且已被vDSO取代。vsyscall也在內存中的固定地址上,使其成為ROP攻擊的潛在目標。

debugfs=off

這將禁用debugfs,它會公開許多有關內核的敏感信息。

oops=panic

有時某些內核漏洞利用會導致所謂的「oops」。此參數將引發內核對此類事件panic,從而防止這些攻擊。但是,有時錯誤的驅動程序會導致無害的操作,這會導致系統崩潰,這意味著此引導參數只能在某些硬體上使用。

module.sig_enforce=1

這僅允許加載已使用有效密鑰籤名的內核模塊,使加載惡意內核模塊更加困難。這可以防止加載所有樹外內核模塊(包括DKMS模塊),除非您已對其進行籤名,這意味著諸如VirtualBox或Nvidia驅動程序之類的模塊可能不可用,但根據您的設置可能並不重要。

lockdown=confidentiality

內核鎖定LSM可以消除用戶空間代碼濫用以升級為內核特權並提取敏感信息的許多方法。為了在用戶空間和內核之間實現清晰的安全邊界,此LSM是必需的。上面的選項在confidentiality模式(最嚴格的選項)中啟用此功能。這意味著module.sig_enforce=1。

mce=0

這將導致內核對ECC內存中無法利用的錯誤panic,而這些錯誤可能會被利用。對於沒有ECC內存的系統,這是不必要的。

quiet loglevel=0

這些參數可防止引導期間信息洩漏,並且必須與上面的kernel.printk sysctl結合使用。最好啟用適用於您的CPU的所有CPU緩解措施,以確保您不受已知漏洞的影響。這是啟用所有內置緩解措施的列表:

spectre_v2=on spec_store_bypass_disable=on tsx=off tsx_async_abort=full,nosmt mds=full,nosmt l1tf=full,force nosmt=force kvm.nx_huge_pages=force

您必須研究系統受其影響的CPU漏洞,並相應地選擇上述緩解措施。請記住,您將需要安裝微代碼更新,以完全免受這些漏洞的影響。但所有這些操作都可能導致性能顯著下降。如果遵循了以上所有建議(不包括特定的CPU緩解措施),則將具有:

slab_nomerge slub_debug=FZ init_on_alloc=1 init_on_free=1 page_alloc.shuffle=1 pti=on vsyscall=none debugfs=off oops=panic module.sig_enforce=1 lockdown=confidentiality mce=0 quiet loglevel=0

如果將GRUB用作引導加載程序,則可能需要重新生成GRUB配置文件才能應用這些文件。/proc是一個偽文件系統,其中包含有關系統上當前正在運行的所有進程的信息。默認情況下,所有用戶都可以訪問此程序,這可能使攻擊者可以窺探其他進程。要只允許用戶看到自己的進程,而不能看到其他用戶的進程,則必須使用hidepid=2,gid=proc掛載選項來掛載/proc。gid=proc將proc組從此功能中排除,因此您可以將特定的用戶或進程列入白名單。添加這些選項的一種方法是編輯/etc/fstab並添加:

proc /proc proc nosuid,nodev,noexec,hidepid=2,gid=proc 0 0

systemd-logind仍然需要查看其他用戶的進程,因此,要使用戶會話在systemd系統上正常工作,必須創建/etc/systemd/system/systemd-logind.service.d/hidepid.conf並添加:

[Service]  
SupplementaryGroups=proc

最好禁用不是絕對必要的任何功能,以最大程度地減少潛在的內核攻擊面。這些功能不必一定很危險,它們可以只是被刪除以減少攻擊面的良性代碼。切勿禁用您不了解的隨機事物。以下是一些可能有用的示例,具體取決於您的設置。引導參數通常可以用來減少攻擊面,這樣的例子之一是:

ipv6.disable=1

這將禁用整個IPv6堆棧,如果您尚未遷移到該堆棧,則可能不需要該堆棧。如果正在使用的IPv6,請不要使用此引導參數。內核允許非特權的用戶通過模塊自動加載來間接導致某些模塊被加載。這使攻擊者可以自動加載易受攻擊的模塊,然後加以利用。一個這樣的示例是CVE-2017-6074,其中攻擊者可以通過啟動DCCP連接來觸發DCCP內核模塊的加載,然後利用該內核模塊中的漏洞。可以通過將文件插入/etc/modprobe.d並將指定的內核模塊列入黑名單的方法,將特定的內核模塊列入黑名單。Install參數告訴modprobe運行特定命令,而不是像往常一樣加載模塊。/bin/false是僅返回1的命令,該命令實際上不會執行任何操作。兩者都告訴內核運行/bin/false 而不是加載模塊,這將防止攻擊者利用該模塊。以下是最有可能不需要的內核模塊:

install dccp /bin/false  
install sctp /bin/false  
install rds /bin/false  
install tipc /bin/false  
install n-hdlc /bin/false  
install ax25 /bin/false  
install netrom /bin/false  
install x25 /bin/false  
install rose /bin/false  
install decnet /bin/false  
install econet /bin/false  
install af_802154 /bin/false  
install ipx /bin/false  
install appletalk /bin/false  
install psnap /bin/false  
install p8023 /bin/false  
install p8022 /bin/false  
install can /bin/false  
install atm /bin/false

特別是模糊的網絡協議會增加大量的遠程攻擊面。此黑名單:

DCCP — Datagram Congestion Control Protocol

SCTP — Stream Control Transmission Protocol

RDS — Reliable Datagram Sockets

TIPC — Transparent Inter-process Communication

HDLC — High-Level Data Link Control

AX25 — Amateur X.25

NetRom

X25

ROSE

DECnet

Econet

af_802154 — IEEE 802.15.4

IPX — Internetwork Packet Exchange

AppleTalk

PSNAP — Subnetwork Access Protocol

p8023 — Novell raw IEEE 802.3

p8022 — IEEE 802.2

CAN — Controller Area Network

ATM

install cramfs /bin/false  
install freevxfs /bin/false  
install jffs2 /bin/false  
install hfs /bin/false  
install hfsplus /bin/false  
install squashfs /bin/false  
install udf /bin/false

install cifs /bin/true  
install nfs /bin/true  
install nfsv3 /bin/true  
install nfsv4 /bin/true  
install gfs2 /bin/true

install vivid /bin/false

vivid driver驅動程序僅用於測試目的,並且是特權提升漏洞的原因,因此應禁用它。

install bluetooth /bin/false  
install btusb /bin/false

install uvcvideo /bin/false

您也可以將麥克風模塊列入黑名單,但這在系統之間可能會有所不同。要查找模塊的名稱,請在/proc/asound/modules中查找並將其列入黑名單。例如,一個這樣的模塊是snd_hda_intel。請注意,儘管有時麥克風的內核模塊與揚聲器的模塊相同。這意味著像這樣禁用麥克風也可能會無意中禁用任何揚聲器,雖然揚聲器也有可能變成麥克風,所以這不一定是消極的結果。最好從物理上刪除這些設備,或者至少在BIOS/UEFI中禁用它們。禁用內核模塊並不總是那麼有效。可以通過rfkill將無線設備列入黑名單,以進一步減少遠程攻擊面。要將所有無線設備列入黑名單,請執行:

rfkill block all

rfkill unblock wifi

在使用systemd的系統上,rfkill在所有會話中均保持不變,但是,在使用其他init系統的系統上,您可能必須創建一個init腳本以在引導時執行這些命令。前面的部分已經防止了一些內核指針洩漏,但是還有更多洩漏。在文件系統上,/boot中存在內核映像和System.map文件。/usr/src和/{,usr/} lib/modules目錄中還有其他敏感的內核信息。您應該限制這些目錄的文件權限,以使它們只能由root用戶讀取。您還應該刪除System.map文件,因為除高級調試外,它們都不需要。此外,某些日誌記錄守護程序(例如systemd的journalctl)包括內核日誌,可用於繞過上述dmesg_restrict保護。從adm組中刪除用戶通常足以撤銷對以下日誌的訪問:

gpasswd -d $user adm

sysfs是偽文件系統,可提供大量的內核和硬體信息。它通常安裝在/sys上。sysfs導致大量信息洩漏,尤其是內核指針洩漏。Whonix的security-misc軟體包包括hide-hardware-info腳本,該腳本限制訪問此目錄以及/proc中的一些腳本,以試圖隱藏潛在的硬體標識符並防止內核指針洩漏。該腳本是可配置的,並允許基於組將特定的應用程式列入白名單。建議應用此方法,並使其在啟動時使用init腳本執行。或者這樣做成systemd服務[1]。為了使基本功能在使用systemd的系統上運行,必須將一些系統服務列入白名單。這可以通過創建/etc/systemd/system/user@.service.d/sysfs.conf並添加以下內容來完成:

[Service]  
SupplementaryGroups=sysfs}

但是,這不能解決所有問題。許多應用程式可能仍會中斷,您需要將它們正確列入白名單。某些發行版(例如Arch Linux)包括強化的內核程序包。它包含許多強化補丁程序和更注重安全性的內核配置。如果可能的話,建議安裝它。Grsecurity是一組內核修補程序,可以大大提高內核安全性。這些補丁曾經可以免費獲得,但是現在需要購買了。如果可用,則強烈建議您獲取它。Grsecurity提供了最新的內核和用戶空間保護。Linux Kernel Runtime Guard(LKRG)是一個內核模塊,可確保運行時內核的完整性並檢測漏洞。它可以殺死整個類別的內核漏洞。但這並不是一個完美的緩解方法,因為LKRG在設計上可以繞開。它僅適用於現成的惡意軟體。但是,儘管可能性不大,但LKRG本身可能會像其他任何內核模塊一樣公開新的漏洞。建議編譯您自己的內核,同時啟用儘可能少的內核模塊和儘可能多的安全性功能,以將內核的受攻擊面保持在絕對最低限度。另外,應用內核強化補丁,例如如上所述的linux-hardened或grsecurity。發行版編譯的內核還具有公共內核指針/符號,這對於漏洞利用非常有用。編譯自己的內核將為您提供獨特的內核符號,連同kptr_restrict,dmesg_restrict和其他針對內核指針洩漏的強化措施,將使攻擊者更加難以創建依賴於內核指針知識的漏洞利用程序。您就可以從Whonix的強化內核中汲取靈感或使用它。強制訪問控制(MAC)系統對程序可以訪問的內容進行細粒度的控制。這意味著您的瀏覽器將無權訪問您的整個主目錄或類似目錄。最常用的MAC措施是SELinux和AppArmor。SELinux比AppArmor更安全,因為它的粒度更細。例如,它是基於inode而不是基於路徑的,允許強制執行明顯更嚴格的限制,可以過濾內核ioctl等。不幸的是,這是以難以使用和難以學習為代價的,因此某些人可能會首選AppArmor。要在內核中啟用AppArmor,必須設置以下引導參數:

apparmor=1 security=apparmor

selinux=1 security=selinux

請記住,僅啟用MAC措施本身並不能神奇地提高安全性。您必須制定嚴格的政策才能充分利用它。例如,要創建AppArmor配置文件,請執行:

aa-genprof $path_to_program

打開程序,然後像往常一樣開始使用它。AppArmor將檢測需要訪問哪些文件,並將它們添加到配置文件中(如果您選擇的話)。但是,僅憑這一點不足以提供高質量的配置文件。請參閱AppArmor文檔[2]以獲取更多詳細信息。如果您想更進一步,則可以通過實施initramfs勾子來設置一個完整的系統MAC策略,該策略限制每個單個用戶空間進程,該掛鈎對init系統強制實施MAC策略。這就是Android使用SELinux的方式,以及Whonix未來將如何使用AppArmor的方式。對於加強實施最小特權原則的強大安全模型是必要的。

沙箱可讓您在隔離的環境中運行程序,該環境對系統的其餘部分具有有限的訪問權限或完全沒有訪問權限。您可以使用它們來保護應用程式安全或運行不受信任的程序。建議與AppArmor或SELinux一起在單獨的用戶帳戶中使用Bubblewrap到沙箱程序。您也可以考慮改用gVisor,它的優點是為每個來賓提供了自己的內核。這些方法中的任何一個都可以用來創建一個功能強大的沙箱,並且暴露的攻擊面最小。如果您不想自己創建沙箱,請在完成後考慮使用Whonix的sandbox-app-launcher。您不應該使用Firejail。諸如Docker和LXC之類的容器解決方案經常被誤導為沙盒形式。它們太寬鬆了,無法廣泛支持各種應用程式,因此不能認為它們是強大的應用程式沙箱。PulseAudio是一種常見的聲音伺服器,但在編寫時並未考慮隔離或沙盒的問題,這使其成為重複出現的沙盒逃逸漏洞。為了防止這種情況,建議您從沙箱中阻止對PulseAudio的訪問,或者從系統中完全卸載它。D-Bus是臺式機Linux上最流行的進程間通信形式,但它也是沙箱逃逸的另一種常見途徑,因為它允許與服務自由交互。這些漏洞的一個例子就是Firejail。您應該從沙箱中阻止對D-Bus的訪問,或者通過MAC以細粒度的規則進行調解。任何Xorg窗口都可以訪問另一個窗口。這允許瑣碎的鍵盤記錄或屏幕截圖程序,甚至可以記錄諸如root密碼之類的內容。您可以使用嵌套的X11伺服器(例如Xpra或Xephyr和bubblewrap)將Xorg窗口沙箱化。默認情況下,Wayland將窗口彼此隔離,這將是一個比Xorg更好的選擇,儘管Wayland可能不如Xorg普遍可用,因為它在開發中較早。如前所述,ptrace是一個系統調用,可能會被濫用破壞在沙箱外部運行的進程。為避免這種情況,您可以通過sysctl啟用內核YAMA ptrace限制,也可以在seccomp過濾器中將ptrace syscall列入黑名單。TIOCSTI是一個ioctl,它允許注入終端命令,並為攻擊者提供了一種簡單的機制,可以在同一用戶會話內的其他進程之間橫向移動。可以通過將seccomp過濾器中的ioctl列入黑名單或使用bubblewrap的--new-session參數來緩解這種攻擊。雖然不建議使用systemd,但有些系統可能無法切換。這些人至少可以使用沙盒服務,因此他們只能訪問所需的內容。這是一個沙箱化systemd服務的示例:

[Service]  
CapabilityBoundingSet=CAP_NET_BIND_SERVICE  
ProtectSystem=strict  
ProtectHome=true  
ProtectKernelTunables=true  
ProtectKernelModules=true  
ProtectControlGroups=true  
ProtectKernelLogs=true  
ProtectHostname=true  
ProtectClock=true  
ProtectProc=invisible  
ProcSubset=pid  
PrivateTmp=true  
PrivateUsers=yes  
PrivateDevices=true  
MemoryDenyWriteExecute=true  
NoNewPrivileges=true  
LockPersonality=true  
RestrictRealtime=true  
RestrictSUIDSGID=true  
RestrictAddressFamilies=AF_INET  
RestrictNamespaces=yes  
SystemCallFilter=write read openat close brk fstat lseek mmap mprotect munmap rt_sigaction rt_sigprocmask ioctl nanosleep select access execve getuid arch_prctl set_tid_address set_robust_list prlimit64 pread64 getrandom  
SystemCallArchitectures=native  
UMask=0077  
IPAddressDeny=any  
AppArmorProfile=/etc/apparmor.d/usr.bin.example

CapabilityBoundingSet=— Specifies the capabilities the process is given.

ProtectHome=true— Makes all home directories inaccessible.

ProtectKernelTunables=true— Mounts kernel tunables such as those modified throughsysctlas read-only.

ProtectKernelModules=true— Denies module loading and unloading.

ProtectControlGroups=true— Mounts all control group hierarchies as read-only.

ProtectKernelLogs=true— Prevents accessing the kernel logs.

ProtectHostname=true— Prevents changes to the system hostname.

ProtectClock— Prevents changes to the system clock.

ProtectProc=invisible— Hides all outside processes.

ProcSubset=pid— Permits access to only the pid subset of/proc.

PrivateTmp=true— Mounts an empty tmpfs over/tmpand/var/tmp, therefore hiding their previous contents.

PrivateUsers=true— Sets up an empty user namespace to hide other user accounts on the system.

PrivateDevices=true— Creates a new/devmount with minimal devices present.

MemoryDenyWriteExecute=true— Enforces a memory W^X policy.

NoNewPrivileges=true— Prevents escalating privileges.

LockPersonality=true— Locks down thepersonality()syscall to prevent switching execution domains.

RestrictRealtime=true— Prevents attempts to enable realtime scheduling.

RestrictSUIDSGID=true— Prevents executing setuid or setgid binaries.

RestrictAddressFamilies=AF_INET— Restricts the usable socket address families to IPv4 only (AF_INET).

RestrictNamespaces=true— Prevents creating any new namespaces.

SystemCallFilter=...— Restricts the allowed syscalls to the absolute minimum. If you aren't willing to maintain your own custom seccomp filter, then systemd provides many predefined system call sets that you can use.@system-servicewill be suitable for many use cases.

SystemCallArchitectures=native— Prevents executing syscalls from other CPU architectures.

UMask=0077— Sets the umask to a more restrictive value.

IPAddressDeny=any— Blocks all incoming and outgoing traffic to/from any IP address. SetIPAddressAllow=to configure a whitelist. Alternatively, setup a network namespace withPrivateNetwork=true.

AppArmorProfile=...— Runs the process under the specified AppArmor profile.


您不能僅將此示例配置複製到您的配置中,每種服務的要求各不相同,並且必須針對每種服務微調沙箱。要了解有關您可以設置的所有選項的更多信息,請閱讀systemd.exec手冊頁[3]。如果您使用的系統不是systemd而是init,那麼可以使用bubblewrap輕鬆複製所有這些選項。普通沙箱固有地與主機共享同一內核。您信任我們已經評估為不安全的內核,可以正確限制這些程序。由於主機內核的整個攻擊面已完全暴露,因此沙盒中的內核利用程序可以繞過任何限制。已經進行了一些努力來限制使用seccomp的攻擊面,但不足以完全解決此問題。GVisor是解決此問題的方法。它為每個應用程式提供了自己的內核,該內核以內存安全的語言重新實現了Linux內核的大部分系統調用,從而提供了明顯更強的隔離性。雖然不是傳統的「沙盒」,但虛擬機通過虛擬化全新系統來分離進程,從而提供了非常強大的隔離性。KVM是內核模塊,它允許內核充當管理程序,而QEMU是利用KVM的仿真器。Virt-manager和GNOME Boxs都是良好且易於使用的GUI,用於管理KVM / QEMU虛擬機。不建議使用Virtualbox的原因有很多。

hardened_malloc是一種硬化的內存分配器,可為堆內存損壞漏洞提供實質性的保護。它很大程度上基於OpenBSD的malloc設計,但具有許多改進。可以通過LD_PRELOAD環境變量針對每個應用程式使用hardened_malloc。例如,假設您編譯的庫位於/usr/lib/libhardened_malloc.so,則可以執行:

LD_PRELOAD="/usr/lib/libhardened_malloc.so" $program

通過全局預加載該庫,也可以在系統範圍內使用它,這是使用它的推薦方法。為此,請編輯/etc/ld.so.preload並插入:

/usr/lib/libhardened_malloc.so

儘管大多數應用程式都可以正常工作,但hardened_malloc可能會破壞某些應用程式。建議使用以下選項編譯hardened_malloc以最大程度地減少損壞:

CONFIG_SLAB_QUARANTINE_RANDOM_LENGTH=0 CONFIG_SLAB_QUARANTINE_QUEUE_LENGTH=0 CONFIG_GUARD_SLABS_INTERVAL=8

您還應該使用sysctl設置以下內容,以適應hardened_malloc創建的大量保護頁:

vm.max_map_count=524240

Whonix項目為基於Debian的發行版提供了hardened_malloc軟體包。編譯自己的程序可以帶來很多好處,因為它使您能夠優化程序的安全性。但是,執行完全相反的操作並降低安全性很容易,如果您不確定自己在做什麼,請跳過本節。在基於源的發行版(例如Gentoo)上,這將是最簡單的,但也可以在其他發行版上這樣做。某些編譯選項可用於添加其他漏洞利用緩解措施,從而消除整個類別的常見漏洞。您可能聽說過常規保護,例如位置獨立可執行文件,堆棧粉碎保護程序,立即綁定,只讀重定位和FORTIFY_SOURCE,但是本節將不做介紹,因為它們已被廣泛採用。相反,它將討論諸如控制流完整性和影子堆棧之類的現代漏洞利用緩解措施。本節涉及主要用C或C ++編寫的本機程序。您必須使用Clang編譯器,因為這些功能在GCC上不可用。請記住,由於未廣泛採用這些緩解措施,因此某些應用程式在啟用它們後可能無法運行。控制流完整性(CFI)是一種緩解漏洞利用的方法,旨在防止諸如ROP或JOP之類的代碼重用攻擊。由於更廣泛採用的緩解措施(例如NX)使過時的利用技術過時了,因此使用這些技術利用了很大一部分漏洞。Clang支持細粒度的前沿CFI,這意味著它可以有效緩解JOP攻擊。Clang的CFI本身並不能減輕ROP;您還必須使用下面記錄的單獨機制。要啟用此功能,必須應用以下編譯標誌:

-flto -fvisibility=hidden -fsanitize=cfi

影子堆棧通過將程序複製到其他隱藏堆棧中來保護程序的返回地址。然後比較主堆棧和影子堆棧中的返回地址,看兩者是否不同。如果是這樣,則表明存在攻擊,程序將中止,從而減輕了ROP攻擊。Clang具有稱為ShadowCallStack的功能,可以完成此操作,但是,僅在ARM64上可用。要啟用此功能,必須應用以下編譯標誌:

-fsanitize=shadow-call-stack

如果上述ShadowCallStack不是一個選項,則可以選擇使用具有相似目標的SafeStack。但是,不幸的是,此功能有許多漏洞,因此效果不甚理想。如果仍然希望啟用此功能,則必須應用以下編譯標誌:

-fsanitize=safe-stack

最常見的內存損壞漏洞之一是未初始化的內存。Clang有一個選項可以使用零或特定模式自動初始化變量。建議將變量初始化為零,因為使用其他模式比利用漏洞緩解功能更適合發現錯誤。要啟用此功能,必須應用以下編譯標誌:

-ftrivial-auto-var-init=zero -enable-trivial-auto-var-init-zero-knowing-it-will-be-removed-from-clang

用內存安全語言編寫的程序會自動受到保護,免受各種安全漏洞的影響,這些安全漏洞包括緩衝區溢出,未初始化的變量,售後使用等。Microsoft和Google的安全研究人員進行的研究證明,已發現的大多數漏洞都是內存安全問題。這樣的內存安全語言的示例包括Rust,Swift和Java,而內存不安全語言的示例包括C和C ++。如果可行,應使用內存安全替代品替換儘可能多的程序。root可以執行任何操作,並且可以訪問您的整個系統。因此,應儘可能將其鎖定,以使攻擊者無法輕鬆獲得root用戶訪問權限。/etc/securetty文件指定允許您以root用戶身份登錄的位置。該文件應保留為空,以便任何人都不能從終端上這樣做。su可讓您從終端切換用戶。默認情況下,它嘗試以root用戶身份登錄。要將su的使用限制在wheel組中,請編輯/etc/pam.d/su和/etc/pam.d/su-l並添加:

auth required pam_wheel.so use_uid

要鎖定root帳戶以防止任何人以root身份登錄,請執行:

passwd -l root

在執行此操作之前,請確保您具有獲取根的替代方法(例如,從活動USB引導並更改為文件系統的chroot),以免您無意中將自己鎖定在系統之外。為了防止某人通過SSH以root身份登錄,請編輯/etc/ssh/sshd_config並添加:

PermitRootLogin no

您可以增加shadow使用的哈希回合數,從而通過迫使攻擊者計算更多的哈希值來破解您的密碼,從而提高哈希密碼的安全性。默認情況下,shadow使用5000次回合,但是您可以將其增加到任意數量。儘管配置的回合越多,登錄速度就越慢。編輯/etc/pam.d/passwd並添加回合選項。

password required pam_unix.so sha512 shadow nullok rounds=65536

應用此設置後,密碼不會自動重新加密,因此您需要使用以下方法重置密碼:

passwd $username

默認情況下,某些發行版以root用戶身份運行Xorg,這是一個問題,因為Xorg包含大量古老而又複雜的代碼,這增加了巨大的攻擊面,並使其更有可能擁有可以獲取root特權的漏洞利用程序。要阻止它作為root用戶執行,請編輯/etc/X11/Xwrapper.config並添加:

needs_root_rights = no

惡意軟體可以使用多種方法來嗅探root帳戶的密碼。因此,訪問根帳戶的傳統方式是不安全的,最好根本不訪問根,但這實際上是不可行的。本節詳細介紹了訪問根帳戶的最安全方法。在安裝作業系統後,應立即應用這些說明,以確保該軟體不含惡意軟體。您絕對不能使用普通用戶帳戶訪問root,因為root可能已被盜用。您也不能直接登錄到根帳戶。通過執行以下操作,創建一個單獨的「管理員」用戶帳戶,該帳戶僅用於訪問root用戶,而不能用於訪問其他用戶:

useradd admin

passwd admin

僅允許該帳戶使用您首選的權限提升機制。例如,如果使用sudo,則通過執行以下命令來添加sudoers異常:

visudo -f /etc/sudoers.d/admin-account

admin ALL=(ALL) ALL

確保沒有其他帳戶可以訪問sudo(或您的首選機制)。現在,要實際登錄到該帳戶,請先重新啟動-例如,這可以防止受損的窗口管理器執行登錄欺騙。當提供登錄提示時,請通過按鍵盤上的以下組合鍵來激活安全注意鍵:

Alt + SysRq + k

這將殺死當前虛擬控制臺上的所有應用程式,從而克服登錄欺騙攻擊。現在,您可以安全地登錄到您的管理員帳戶,並使用root用戶執行任務。完成後,註銷管理員帳戶,然後重新登錄到非特權用戶帳戶。防火牆可以控制傳入和傳出的網絡流量,並且可以用來阻止或允許某些類型的流量。除非有特殊原因,否則應始終阻止所有傳入流量。建議設置嚴格的iptables或nftables防火牆。火牆必須針對您的系統進行微調,並且沒有一個適合所有防火牆的規則集。建議您熟悉創建防火牆規則。Arch Wiki和手冊頁[5]都是很好的資源。這是基本iptables配置的示例,該配置禁止所有傳入的網絡流量:

*filter  
:INPUT DROP [0:0]  
:FORWARD DROP [0:0]  
:OUTPUT ACCEPT [0:0]  
:TCP - [0:0]  
:UDP - [0:0]  
-A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT  
-A INPUT -i lo -j ACCEPT  
-A INPUT -m conntrack --ctstate INVALID -j DROP  
-A INPUT -p udp -m conntrack --ctstate NEW -j UDP  
-A INPUT -p tcp --tcp-flags FIN,SYN,RST,ACK SYN -m conntrack --ctstate NEW -j TCP  
-A INPUT -p udp -j REJECT --reject-with icmp-port-unreachable  
-A INPUT -p tcp -j REJECT --reject-with tcp-reset  
-A INPUT -j REJECT --reject-with icmp-proto-unreachable  
COMMIT

但是,您不應嘗試在實際系統上使用此示例。它僅適用於某些臺式機系統。為了保護隱私,最好最大程度地減少可追溯到您的信息量。請勿在主機名或用戶名中添加唯一標識的內容。將它們保留為通用名稱,例如「host」和「user」,以便它們無法識別您。Timezones / Locales / Keymaps如果可能,應將您的時區設置為「 UTC」,將區域設置和鍵盤映射設置為「 US」。一個獨一無二的機器ID被存儲在/var/lib/dbus/machine-id (systemd系統是保存在/etc/machine-id)這些應編輯為通用名稱,例如Whonix ID:

b08dfa6083e7567a1921a715000001fb

MAC地址是分配給網絡接口控制器(NIC)的唯一標識符。每次您連接到網絡時(WIFI或乙太網)則您的MAC地址已暴露。這使人們可以使用它來跟蹤您並在本地網絡上唯一地標識您。但您不應該完全隨機化MAC地址。擁有完全隨機的MAC地址是顯而易見的,並且會對您脫穎而出的行為產生不利影響。MAC地址的OUI(組織唯一標識符)部分標識晶片組的製造商。對MAC地址的這一部分進行隨機化處理可能會為您提供以前從未使用過的OUI,數十年來從未使用過的OUI或在您所在的地區極為罕見的OUI,因此使您脫穎而出,很明顯地表明您在欺騙MAC地址。MAC地址的末尾標識您的特定設備,並且可以用來跟蹤您的設備。僅對MAC地址的這一部分進行隨機化可防止您被跟蹤,同時仍使MAC地址看起來可信。要欺騙這些地址,請首先執行以下命令找出您的網絡接口名稱:

ip a

macchanger -e $network_interface

要在每次引導時隨機分配MAC地址,您應該為您的特定初始化系統創建一個初始化腳本。這是systemd的一個示例:

[Unit]  
Description=macchanger on eth0  
Wants=network-pre.target  
Before=network-pre.target  
BindsTo=sys-subsystem-net-devices-eth0.device  
After=sys-subsystem-net-devices-eth0.device  
  
[Service]  
ExecStart=/usr/bin/macchanger -e eth0  
Type=oneshot  
  
[Install]  
WantedBy=multi-user.target

上面的示例在啟動時欺騙了eth0接口的MAC地址。將eth0替換為您的網絡接口。幾乎每個系統都有不同的時間。這可用於時鐘偏斜指紋攻擊,幾毫秒的差異足以使用戶被暴露識別。ICMP時間戳會在查詢答覆中洩漏系統時間。阻止這些攻擊的最簡單方法是利用防火牆阻止傳入連接,或者使內核忽略ICMP請求。TCP時間戳也會洩漏系統時間。內核嘗試通過對每個連接使用隨機偏移量來解決此問題,但這不足以解決問題。因此應該禁用TCP時間戳,可以通過使用sysctl設置以下內容來完成:

net.ipv4.tcp_timestamps=0

TCP初始序列號(ISN)是洩漏系統時間的另一種方法。為了減輕這種情況,您必須安裝tirdad內核模塊,該模塊會生成用於連接的隨機ISN。時間同步對於匿名性和安全性至關重要。錯誤的系統時鐘可能使您遭受時鐘偏斜指紋攻擊,或者可以用來為您提供過時的HTTPS證書,從而繞過證書到期或吊銷。最流行的時間同步方法NTP是不安全的,因為它未經加密和未經身份驗證,因此攻擊者可以輕易地攔截和修改請求。NTP還會以NTP時間戳格式洩漏本地系統時間,該格式可用於時鐘偏斜指紋識別,如前所述。因此,您應該卸載所有NTP客戶端並禁用systemd-timesyncd(如果正在使用)。您可以通過安全連接(HTTPS或最好是Torion服務)連接到受信任的網站,而不是NTP,並從HTTP標頭中提取當前時間。達到此目的的工具是sdwdate或我自己的安全時間同步工具。可以通過他們在鍵盤上輸入鍵的方式來對人進行指紋識別。您可以通過鍵入速度,在兩次按鍵之間的暫停,每次按鍵被按下和釋放的確切時間等方式來唯一地進行指紋識別。可以使用KeyTrac在線進行測試。Kloak是一種工具,旨在通過混淆按鍵和釋放事件之間的時間間隔來克服這種跟蹤方法。當按鍵被按下時,它會引入隨機延遲,然後由應用程式選擇。默認情況下,文件的權限是非常寬鬆的。您應該在整個系統中搜索權限不當的文件和目錄,並對其進行限制。例如,在諸如Debian之類的某些發行版中,用戶的Home目錄是全局可讀的。

chmod 700 /home/$user

另外一些示例是/boot,/usr /src和/ {,usr /} lib/modules 它們包含內核映像,System.map和其他各種文件,所有這些文件都可能洩漏有關內核的敏感信息。

chmod 700 /boot /usr/src /lib/modules /usr/lib/modules

在基於Debian的發行版中,必須使用dpkg-statoverride保留文件許可權。否則,它們將在更新期間被覆蓋。Whonix的SUID Disabler和Permission Hardener會自動應用本節中詳細介紹的步驟。Setuid / SUID允許用戶使用二進位文件所有者的特權執行二進位文件。這通常用於允許非特權用戶使用通常僅為root用戶保留的某些功能。因此,許多SUID二進位文件都有特權升級安全漏洞的歷史記錄。Setgid / SGID類似,但適用於組而不是用戶。要使用setuid或setgid位查找系統上的所有二進位文件,請執行:

find / -type f \( -perm -4000 -o -perm -2000 \)

然後,您應該刪除不使用的程序上的所有不必要的setuid / setgid位,或將其替換為功能。要刪除setuid位,請執行:

chmod u-s $path_to_program

chmod g-s $path_to_program

setcap $capability+ep $path_to_program

setcap -r $path_to_program

umask設置新創建文件的默認文件權限。默認的umask是0022,它不是很安全,因為它為系統上的每個用戶提供了對新創建文件的讀取訪問權限。要使所有者以外的任何人都不可讀新文件,請編輯/etc/profile並添加:

umask 0077

核心轉儲包含特定時間(通常是該程序崩潰時)該程序的已記錄內存。它們可能包含敏感信息,例如密碼和加密密鑰,因此必須將其禁用。禁用它們的方法主要有三種:sysctl,systemd和ulimit。

kernel.core_pattern=|/bin/false

創建/etc/systemd/coredump.conf.d/disable.conf並添加如下內容:

[Coredump]  
Storage=none

編輯/etc/security/limits.conf並添加如下內容:

* hard core 0

即使在進行了這些設置之後,以提升的特權運行的進程仍可能會轉儲其內存。為了防止他們這樣做,請通過sysctl設置以下內容:

fs.suid_dumpable=0

與核心轉儲類似,交換或分頁將部分內存複製到磁碟,其中可能包含敏感信息。應該將內核配置為僅在絕對必要時進行交換,相應的sysctl設置:

vm.swappiness=1

PAM是用於用戶身份驗證的框架。這就是您登錄時使用的機制。您可以通過要求使用強密碼或在失敗的登錄嘗試後強制執行延遲驗證來使其更加安全。要強制使用強密碼,可以使用pam_pwquality。它強制執行密碼的可配置策略。例如,如果您希望密碼至少包含16個字符(最小),與舊密碼(difok)至少6個不同的字符,至少3個數字(dcredit),至少2個大寫字母(ucredit),至少2個字符小寫字母(lcredit)和至少3個其他字符(ocredit),然後編輯/etc/pam.d/passwd並添加:

password required pam_pwquality.so retry=2 minlen=16 difok=6 dcredit=-3 ucredit=-2 lcredit=-2 ocredit=-3 enforce_for_root  
password required pam_unix.so use_authtok sha512 shadow

要強制執行延遲驗證,可以使用pam_faildelay。要在兩次失敗的登錄嘗試之間添加至少4秒的延遲以阻止暴力破解嘗試,請編輯/etc/pam.d/system-login並添加:

auth optional pam_faildelay.so delay=4000000

Microcode更新對於修復關鍵的CPU漏洞(如Meltdown和Spectre等)至關重要。大多數發行版都將這些發行版包含在其軟體倉庫中,例如Arch Linux和Debian。IPv6地址是從計算機的MAC地址生成的,從而使您的IPv6地址是唯一的,並直接綁定到計算機。隱私擴展會生成一個隨機的IPv6地址,以減輕這種形式的跟蹤。請注意,如果您開啟了MAC地址欺騙機制或禁用了IPv6,則無需執行這些步驟。

net.ipv6.conf.all.use_tempaddr=2  
net.ipv6.conf.default.use_tempaddr=2

要為NetworkManager啟用隱私擴展,請編輯/etc/NetworkManager/NetworkManager.conf並添加:

[connection]  
ipv6.ip6-privacy=2

要為systemd-networkd啟用隱私擴展,請創建/etc/systemd/network/ipv6-privacy.conf並添加:

[Network]  
IPv6PrivacyExtensions=kernel

文件系統應分為多個分區,以對其權限進行細粒度控制。可以添加不同的安裝選項以限制可以執行的操作:


這些安裝選項應在/etc/fstab中儘可能設置。如果您不能使用單獨的分區,請創建綁定掛載。一個更安全的/etc/fstab的示例:

/        /          ext4    defaults                              1 1  
/home    /home      ext4    defaults,nosuid,noexec,nodev          1 2  
/tmp     /tmp       ext4    defaults,bind,nosuid,noexec,nodev     1 2  
/var     /var       ext4    defaults,bind,nosuid                  1 2  
/boot    /boot      ext4    defaults,nosuid,noexec,nodev          1 2

熵基本上反應作業系統信息收集的隨機程度,對於諸如加密之類的事情至關重要。因此,最好通過安裝其他隨機數生成器(如haveged和jitterentropy)從各種來源收集儘可能多的熵。為了使jitterentropy正確運行,必須通過創建/usr/lib/modules-load.d/jitterentropy.conf並添加以下內容儘早加載內核模塊:

jitterentropy_rng

RDRAN是提供隨機數的CPU指令。如果可用,內核會自動將其用作熵源。但是由於它是專有的並且是CPU本身的一部分,因此無法審核和驗證其安全性。您甚至無法對代碼進行反向工程。該RNG以前曾遭受過漏洞的攻擊,其中有些可能是後門攻擊。通過設置以下引導參數可以不信任此功能:

random.trust_cpu=off

建議不要以root用戶身份運行普通的文本編輯器。大多數文本編輯器可以做的不僅僅是簡單地編輯文本文件,而且還可以被利用。例如,以root身份打開vi並輸入:sh。現在,您具有一個可以訪問整個系統的root shell,攻擊者可以輕鬆利用該shell。解決方案是使用sudoedit。這會將文件複製到一個臨時位置,以普通用戶身份打開文本編輯器,編輯該臨時文件並以root用戶身份覆蓋原始文件。這樣,實際的編輯器就不會以root身份運行。要使用sudoedit,執行:

sudoedit $path_to_file

默認情況下,它使用vi,但是可以通過EDITOR或SUDO_EDITOR環境變量來切換默認編輯器。例如,要使用nano,請執行:

EDITOR=nano sudoedit $path_to_file

可以在/etc/environment中全局設置此環境變量。默認情況下,Linux發行版通常使用HTTP或HTTP和HTTPS鏡像的混合來從其軟體存儲庫下載軟體包。人們認為這很好,因為程序包管理器會在安裝前驗證程序包的籤名。但是,從歷史上看,已經有很多繞過此方法的地方。您應將軟體包管理器配置為從HTTPS鏡像專門下載以進行深度防禦。自軟體包管理器Debian Buster以來,APT已支持可選的seccomp-bpf過濾。這限制了允許執行APT的系統調用,這可能嚴重限制攻擊者嘗試利用APT中的漏洞時對系統造成危害的能力。要啟用此功能,請創建/etc/apt/apt.conf.d/40sandbox並添加:

APT::Sandbox::Seccomp "true";

全盤加密可確保對驅動器上的所有數據進行加密,並且不會被物理攻擊者讀取。大多數發行版都支持在安裝過程中啟用加密,請確保設置了強密碼。您也可以使用dm-crypt手動加密驅動器。請注意,全盤加密不包括/boot,這樣仍然可以修改內核、引導加載程序和其他關鍵文件。為了完全防止篡改,您還必須實施經過驗證的引導。如果您仍在使用舊版BIOS,則應遷移到UEFI,以利用較新的安全功能。大多數BIOS或UEFI實現都支持設置密碼。最好啟用它並設置一個非常強壯的密碼。雖然這是很弱的保護,因為重置密碼很簡單。它通常存儲在易失性內存中,因此攻擊者只需要能夠卸下CMOS電池幾秒鐘,或者他們就可以使用某些主板上的跳線將其重置。您還應該禁用所有未使用的設備和引導選項,例如USB引導,以減少攻擊面。別忽略BIOS或UEFI的更新,確保將其更新。將其與常規作業系統更新一樣重要。此外,請參閱《NSA的硬體和固件安全指南[6]》。引導加載程序會在引導過程的早期執行,並負責加載作業系統。保護它非常重要,否則,它可能會被篡改。例如,本地攻擊者可以通過在啟動時使用init=/bin/bash作為內核參數來輕鬆獲得root shell,該命令告訴內核執行/bin/bash而不是常規的init系統。您可以通過為引導加載程序設置密碼來防止這種情況。僅設置引導程序密碼不足以完全保護它。還必須按照以下說明設置經過驗證的啟動。

grub-mkpasswd-pbkdf2

輸入您的密碼,該密碼將生成一個字符串。它將類似於「grub.pbkdf2.sha512.10000.C4009...」。創建/etc/grub.d/40_password並添加:

set superusers="$username"  
password_pbkdf2 $username $password

用grub-mkpasswd-pbkdf2生成的字符串替換「$username」將用於被允許使用GRUB命令行,編輯菜單項和執行任何菜單項的超級用戶。對於大多數人來說,這只是「root」。重新生成您的配置文件,GRUB現在將受到密碼保護。要僅限制編輯引導參數並訪問GRUB控制臺,同時仍然允許您引導,請編輯 /boot/grub/grub.cfg並在 「menuentry '$OSName' 」旁邊添加「 --unrestricted」參數。

menuentry 'Arch Linux' --unrestricted

Syslinux可以設置主密碼或菜單密碼。引導任何條目都需要主密碼,而引導特定條目僅需要菜單密碼。要為Syslinux設置主密碼,請編輯/boot/syslinux/syslinux.cfg並添加:

MENU MASTER PASSWD $password

要設置菜單密碼,請編輯/boot/syslinux/syslinux.cfg,並在帶有您要密碼保護的項目的標籤內,添加:

MENU PASSWD $password

這些密碼可以是純文本,也可以使用MD5,SHA-1,SHA-256或SHA-512進行散列。建議先使用強哈希算法(例如SHA-256或SHA-512)對密碼進行哈希處理,以避免將其存儲為明文形式。systemd-boot具有防止在引導時編輯內核參數的選項。在loader.conf文件中,添加:

editor no

systemd-boot並不正式支持保護內核參數編輯器的密碼,但是您可以使用systemd-boot-password來實現。經過驗證的引導通過密碼驗證來確保引導鏈和基本系統的完整性。這可用於確保物理攻擊者無法修改設備上的軟體。如果沒有經過驗證的引導,則一旦獲得物理訪問權限,就可以輕鬆繞過上述所有預防措施。經過驗證的引導不僅像許多人認為的那樣是為了物理安全。它還可以用於防止遠程惡意軟體持久化——如果攻擊者設法破壞了整個系統並獲得了很高的特權,則經過驗證的引導將在重新引導後還原其更改,並確保它們無法持久化。經過驗證的最常見的引導實現是UEFI安全引導,但是它本身並不是一個完整的實現,因為它僅會驗證引導加載程序和內核,這意味著可以通過以下方法:

僅UEFI安全啟動就沒有一成不變的信任根,因此物理攻擊者仍然可以刷新設備的固件。為了減輕這種情況,請結合使用UEFI安全啟動和Intel Boot Guard或AMD Secure Boot。

遠程攻擊者(或不使用加密的物理攻擊者)可以簡單地修改作業系統的任何其他特權部分。例如,如果他們有修改內核的特權,那麼他們也可以修改/sbin/init來有效地獲得相同的結果。因此,僅驗證內核和引導加載程序不會對遠程攻擊者產生任何影響。為了減輕這種情況,您必須使用dm-verity驗證基本作業系統,儘管由於傳統Linux發行版的布局,這非常困難且笨拙。

通常,很難在傳統Linux上實現可靠的經過驗證的引導實現。USB設備為物理攻擊提供了重要的攻擊面。例如BadUSB和Stuxnet是此類攻擊的範例。最佳實踐是禁止所有新連接的USB且僅將受信任設備列入白名單,USBGuard對此非常有用。您也可以將nousb用作內核引導參數,以禁用內核中的所有USB支持。可以sysctl設置kernel.deny_new_usb=1直接內存訪問(DMA)攻擊涉及通過插入某些物理設備來完全訪問所有系統內存。這可以通過控制設備可訪問的內存區域的IOMMU或將特別易受攻擊的內核模塊列入黑名單來緩解。

intel_iommu=on amd_iommu=on

您只需要為特定的CPU製造商啟用該選項,但同時啟用這兩個選項就沒有問題。

efi=disable_early_pci_dma

通過在非常早的啟動過程中禁用所有PCI橋接器上的busmaster位,此選項可修復上述IOMMU中的漏洞。此外,Thunderbolt和FireWire通常容易受到DMA攻擊。要禁用它們,請將這些內核模塊列入黑名單:

install firewire-core /bin/false  
install thunderbolt /bin/false

當攻擊者在擦除RAM中的數據之前對其進行分析時,就會發生冷啟動攻擊。使用現代RAM時,冷啟動攻擊不太實用,因為RAM通常會在幾秒鐘或幾分鐘內清除,除非將其放入冷卻液(如液氮或冷凍機)中。攻擊者必須在幾秒鐘內將設備中的RAM棒拔出並將其暴露於液氮中,而且確保用戶不會注意到。如果冷啟動攻擊是威脅模型的一部分,請在關機後保護計算機幾分鐘,以確保沒有人可以訪問您的RAM記憶棒。您也可以將RAM棒焊接到主板上,以使其更難以卡住。如果使用筆記本電腦,請取出電池,然後直接用充電電纜供電。關機後請拔出電纜,以確保RAM徹底斷電無法訪問。在內核自我保護啟動參數部分中,空閒時內存清零選項將用零覆蓋內存中的敏感數據。此外,強化的內存分配器可以通過CONFIG_ZERO_ON_FREE配置選項清除用戶空間堆內存中的敏感數據。儘管如此,某些數據仍可能保留在內存中。此外,現代內核還包括復位攻擊緩解措施,該命令可命令固件在關機時擦除數據,儘管這需要固件支持。如果以上都不適用您的威脅模型,則可以實施Tails的內存擦除過程,該過程將擦除大部分內存(視頻內存除外),並且已被證明是有效的。一旦對系統進行了儘可能多的加固,就應該遵循良好的隱私和安全性慣例:


儘管已經進行了強化,但您必須記住Linux仍然是一個有缺陷的作業系統,沒有任何強化可以完全修復它。您應該進行儘可能多的研究,而不要依賴單一的信息來源。最大的安全問題之一就是用戶。這些是我認為有價值的其他指南的連結:Arch Linux Security wiki page:https://wiki.archlinux.org/index.php/SecurityWhonix Documentation:https://www.whonix.org/wiki/DocumentationNSA RHEL 5 Hardening Guide(稍有過時,但仍包含有用的信息):https://apps.nsa.gov/iaarchive/library/ia-guidance/security-configuration/operating-systems/guide-to-the-secure-configuration-of-red-hat-enterprise.cfmKSPP recommended kernel settings:https://kernsec.org/wiki/index.php/Kernel_Self_Protection_Project/Recommended_Settingskconfig-hardened-check:https://github.com/a13xp0p0v/kconfig-hardened-check/您可能需要重新生成GRUB配置,以應用對引導加載程序所做的某些更改。在不同的發行版之間,執行此操作的步驟有時可能會有所不同。例如,在諸如Arch Linux之類的發行版上,應通過執行以下命令來重新生成配置文件:

grub-mkconfig -o $path_to_grub_config

"$path_to_grub_config" 取決於您如何設置系統。它通常是/boot/grub/grub.cfg或/boot/EFI/grub/grub.cfg,但是在執行此命令之前,請務必確保正確。另外,在Debian或Ubuntu等發行版上,您應該執行以下命令:

update-grub

在Linux內核中,「root特權」分為各種不同的能力(capabilities)。這在應用最小特權原則時很有幫助——可以給它們僅授予特定的子集,而不是授予進程總的root特權。例如,如果程序只需要設置系統時間,則只需要CAP_SYS_TIME而不是root所有能力。這會限制可能造成的損害,但是,您仍必須謹慎授予能力,因為無論如何,其中許多能力可能會被濫用以獲取完整的root特權。

https://github.com/Whonix/security-misc/blob/master/lib/systemd/system/hide-hardware-info.service

https://gitlab.com/apparmor/apparmor/-/wikis/Documentation

https://www.freedesktop.org/software/systemd/man/systemd.exec.html

https://lists.llvm.org/pipermail/cfe-dev/2020-April/065221.html

https://href.li/?https://linux.die.net/man/8/iptables

https://github.com/nsacyber/Hardware-and-Firmware-Security-Guidance

譯文連結:https://blog.gaochao.me/post/645734976535543808/linux系統安全強化指南本次CKA培訓在北京開班,基於最新考綱,通過線下授課、考題解讀、模擬演練等方式,幫助學員快速掌握Kubernetes的理論知識和專業技能,並針對考試做特別強化訓練,讓學員能從容面對CKA認證考試,使學員既能掌握Kubernetes相關知識,又能通過CKA認證考試,學員可多次參加培訓,直到通過認證。點擊下方圖片或者閱讀原文連結查看詳情。


相關焦點

  • Linux 系統安全強化指南(建議收藏的教程)
    使用musl作為默認的C庫。Musl專注於最小化,這會導致很小的攻擊面,而其他C庫(例如glibc)過於複雜,容易產生漏洞。例如,與musl中的極少數漏洞相比,glibc中的一百多個漏洞已被公開披露。儘管僅靠披露的CVE本身通常是不準確的統計信息,但有時這種情況有時可以用來表示過分的問題。Musl還具有不錯的漏洞利用緩解措施,尤其是其新的強化內存分配器。
  • 在 VirtualBox 上安裝 Kali Linux:最快速和最安全的方法 | Linux 中國
    Kali Linux 是 最適合脆弱性測試和安全愛好者的 Linux 發行版 之一。因為它涉及一個像黑客之類的敏感話題,就像一把雙刃劍。我們過去在詳細的 Kali Linux 評論中討論過,所以我不會再次贅述。雖然你可以通過替換現有的作業系統的形式安裝 Kali Linux,但是通過虛擬機來使用它可能會是更好、更安全的選擇。
  • 檔案信息系統安全等級保護定級工作指南
    隨著檔案信息化進程的不斷加快,檔案部門通過檔案信息系統管理的數字檔案資源越來越多,提高檔案信息系統的安全防護能力和水平,已經成為加強檔案信息安全管理、促進檔案事業健康發展的一項重要內容。為做好檔案信息系統安全等級保護工作,國家檔案局編制《檔案信息系統安全等級保護定級工作指南》(以下簡稱《指南》),以指導檔案信息系統安全等級保護的定級工作。2.
  • linux使用SFTP安全的傳輸文件
    S有時也代表 SSH(或 Secure Shell),它是文件傳輸服務運行的安全加密隧道。SFTP 是一種通過遠程系統安全傳輸文件的流行方法。該sftp命令通常是 OpenSSH 包的一部分。它被設計為 SSH v2.0 的擴展,以增強 安全文件傳輸功能。該sftp命令行界面被設計為類似於ftp命令。
  • 如何在 Linux 中查看已掛載的文件系統類型 | Linux 中國
    如你所知,Linux 支持非常多的文件系統,例如 ext4、ext3、ext2、sysfs、securityfs、FAT16、FAT32、NTFS 等等,當前被使用最多的文件系統是 ext4。你曾經疑惑過你的 Linux 系統使用的是什麼類型的文件系統嗎?沒有疑惑過?不用擔心!我們將幫助你。本指南將解釋如何在類 Unix 的作業系統中查看已掛載的文件系統類型。
  • 在 Linux 上安全傳輸文件的 14 SCP 命令示例 | Linux 中國
    SCP(安全複製Secure Copy)是 Linux 和 Unix 之類的系統中的命令行工具,用於通過網絡安全地跨系統傳輸文件和目錄。當我們使用 scp 命令將文件和目錄從本地系統複製到遠程系統時,則在後端與遠程系統建立了 ssh 連接。換句話說,我們可以說 scp 在後端使用了相同的 SSH 安全機制,它需要密碼或密鑰進行身份驗證。
  • 升級 Ubuntu Linux 內核的幾種不同方法 | Linux 中國
    然後下載符合以下格式的兩個文件(其中 X.Y.Z 是最高版本號):1. linux-image-X.Y.Z-generic-*.deb2. linux-modules-X.Y.Z-generic-.deb在終端中改變到文件所在的目錄,然後執行此命令手動安裝內核:$ sudo dpkg --install *.deb重啟系統,使用新內核:
  • linux中遠程伺服器上傳輸文件的10個sftp命令示例
    File Transfer Protocol (FTP) 是一種廣泛使用的協議,用於以未加密的格式遠程傳輸文件或數據,這不是一種安全的通信方式。
  • Linux十大PHP安全要點
    一個原因是PHP的安全。PHP的安全是廣大開發人員擔心的主要問題。雖然PHP提供從裡到外的可靠安全,但是需要由開發人員正確地落實這些安全機制。我們在本文中將為Linux管理員介紹幾個PHP安全要點。這些要點將幫助你確保Web應用程式安全,並確保從長遠來看正常運行。在我們開始之前,有必要了解一下我們所要處理的系統。出於演示的需要,我們使用Fedora。
  • 雲原生安全認證CKS考試不掛科指南-CKA篇
    在雲原生技術及應用日漸普及的今天, 新的技術也帶來了新的安全挑戰。由於多個容器共享了同一內核,在隔離和安全性方面必然存在天然缺陷,並進一步限制了容器的應用場景和發展,雲原生應用會在同一宿主機上運行多個業務的容器,而安全性的要求是即使運行在同一臺宿主機上不同業務也必須具備強隔離的安全保證; 在雲原生產品時代,容器運行時除了需繼續保持輕量、高效、自包含、一次打包到處運行的優秀特性外,還需進一步確保良好的安全隔離性,鏡像安全、容器安全、雲原生網絡微隔離等能力便成為雲原生安全的重中之重
  • linux系統備份和還原
    linux系統備份和還原
  • 一文匯總Linux 系統動態追蹤(高級調試)技術
    目錄動態追蹤歷史追蹤機制說明常用追蹤工具線上實踐指南總結參考動態追蹤歷史
  • Linux 權限入門指南 | Linux 中國
    與其他系統相比而言 Linux 系統的眾多優點中最為主要一個便是 Linux 系統有著更少的安全漏洞和被攻擊的隱患。
  • Linux 系統動態追蹤(高級調試)技術
    目錄動態追蹤歷史追蹤機制說明常用追蹤工具線上實踐指南總結動態追蹤歷史嚴格來講 Linux 中的動態追蹤技術其實是一種高級的調試技術, 可以在內核態和用戶態進行深入的分析, 方便開發者或系統管理者便捷快速的定位和處理問題.
  • 【航天專題】美國航空航天公司發布《日本逐步強化太空安全》報告
    日本最近宣布成立負責太空領域的「太空作戰中隊」,使該國的太空安全活動備受外界矚目。根據相關政策,2008年前日本防衛省禁止擁有衛星,太空活動僅服務非軍事用途。日本2008年的《宇宙基本法》允許防衛省擁有衛星,使得日本以防禦性軍事目的為理由開展軍事太空活動成為可能。然而,從20世紀80年代開始,日本就逐步推進太空軍事化。
  • Linux系統結構詳解
    linux系統中每個分區都是一個文件系統,都有自己的目錄層次結構。linux會將這些分屬不同分區的、單獨的文件系統按一定的方式形成一個系統的總的目錄層次結構。一個作業系統的運行離不開對文件的操作,因此必然要擁有並維護自己的文件系統。
  • Linux 下 SSH 命令實例指南
    基本用法最簡單的 SSH 命令只需要指定用戶名和主機名參數即可. 主機名可以是 IP 地址或者域名.命令格式如下:$ ssh user@hostname比如要在我的區域網內登錄一個樹莓派系統, 只需要簡單的在命令行輸入如下命令:$ ssh pi@10.42.0.47命令中的 pi 和 10.42.0.47 分別是我的樹莓派系統的用戶名和區域網 IP 地址.
  • linux系統帳號密碼破解
    在獲得網站Webshell權限的前提下,通過提權等方法獲得了系統權限,通過查看「/etc/shadow」文件內容獲取了Linux作業系統的用戶名和加密密碼,獲取密碼文件後,如何進行破解是一大難題,本文就Linux下的密碼原理,加密算法等進行分析,並對如何破解linux的密碼進行研究。
  • 冰錐安全使用指南
    與巖石的穩定性質不同,冰質是會不斷變化的,如果冰況差,冰錐無法發揮作用,便會威脅到攀登者的安全。指南一:冰況判斷安全指南第一項便是冰況判斷,只有在真正堅實的冰層中設置冰錐,才能形成有效的保護。冰錐的強度取決於打錐位置的冰況。
  • 美國軍方可信終端節點安全(TENS)系統簡介
    美國家安全局6月3日發布美國空軍可信終端節點安全Trusted End Node Security(TENS)虛擬機指南,介紹利用虛擬機啟動TENS