避免分發凍結程序包,因為它們在安全更新中通常很落後。
不使用與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
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
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
net.ipv4.tcp_sack=0
net.ipv4.tcp_dsack=0
net.ipv4.tcp_fack=0
kernel.yama.ptrace_scope=2
ptrace是一個系統調用,它允許程序調試、修改和檢查另一個正在運行的進程,從而使攻擊者可以輕易修改其他正在運行的程序的內存。設置將ptrace的使用限制為僅具有CAP_SYS_PTRACE功能的進程。或者,將sysctl設置為3以完全禁用ptrace。vm.mmap_rnd_bits=32
vm.mmap_rnd_compat_bits=16
fs.protected_symlinks=1
fs.protected_hardlinks=1
fs.protected_fifos=2
fs.protected_regular=2
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}
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.
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
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
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
* 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
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
[connection]
ipv6.ip6-privacy=2
[Network]
IPv6PrivacyExtensions=kernel
/ / 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
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
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
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認證考試,學員可多次參加培訓,直到通過認證。點擊下方圖片或者閱讀原文連結查看詳情。