本指南旨在說明如何盡可能地加強Linux的安全性和隱私性,并且不限于任何特定的指南。
免責聲明:如果您不確定自己在做什么,請不要嘗試在本文中使用任何內容。
本指南僅關注安全性和隱私性,而不關注性能,可用性或其他內容。列出的所有命令都將需要root特權。以“$”符號開頭的單詞表示一個變量,不同終端之間可能會有所不同。
選擇正確的Linux發行版
選擇一個好的Linux發行版有很多因素。
避免分發凍結程序包,因為它們在安全更新中通常很落后
不使用與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根二進制文件。因此,對內核進行盡可能多的強化非常重要。
Stable vs LTS 內核
Linux內核以兩種主要形式發布:穩定和長期支持(LTS)。穩定版本是較新的版本,而LTS發行版本是較老的穩定版本,長期以來一直受支持。選擇上述任何一個發行版本都有許多后果。
Linux內核未使用CVE標識安全漏洞。這意味著大多數安全漏洞的修復程序不能向后移植到LTS內核。但是穩定版本包含到目前為止進行的所有安全修復。
但是,有了這些修復程序,穩定的內核將包含更多新功能,因此大大增加了內核的攻擊面,并引入了大量新錯誤。相反,LTS內核的受攻擊面較小,因為這些功能沒有被不斷添加。
此外,穩定的內核還包括更新的強化功能,以減輕LTS內核沒有的某些利用。此類功能的一些示例是Lockdown LSM和STACKLEAK GCC插件。
總而言之,在選擇穩定或LTS內核時需要權衡取舍。LTS內核具有較少的強化功能,并且并非當時所有的公共錯誤修復都已向后移植,但是通常它的攻擊面更少,并且引入未知錯誤的可能性也較小。穩定的內核具有更多的強化功能,并且包括所有已知的錯誤修復,但它也具有更多的攻擊面以及引入更多未知錯誤的機會更大。最后,最好使用較新的LTS分支(如4.19內核)。
Sysctl
Sysctl是允許用戶配置某些內核設置并啟用各種安全功能或禁用危險功能以減少攻擊面的工具。要臨時更改設置,您可以執行:
sysctl -w $tunable = $value
要永久更改sysctls,您可以將要更改的sysctls添加到/etc/sysctl.conf或/etc/sysctl.d中的相應文件,具體取決于您的Linux發行版。
以下是您應更改的建議sysctl設置。
Kernel self-protection
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之前已在許多漏洞利用中被濫用。
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行的末尾。
建議使用以下設置以提高安全性。
Kernel self-protection
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的所有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配置文件才能應用這些文件。
hidepid
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[1]驅動程序僅用于測試目的,并且是特權提升漏洞的原因,因此應禁用它。
install bluetooth /bin/false
install btusb /bin/false
禁用具有安全問題歷史記錄的藍牙。
install uvcvideo /bin/false
這會禁用網絡攝像頭,以防止其被用來監視您。
您也可以將麥克風模塊列入黑名單,但這在系統之間可能會有所不同。要查找模塊的名稱,請在/proc/asound/modules中查找并將其列入黑名單。例如,一個這樣的模塊是snd_hda_intel。
請注意,盡管有時麥克風的內核模塊與揚聲器的模塊相同。這意味著像這樣禁用麥克風也可能會無意中禁用任何揚聲器,雖然揚聲器也有可能變成麥克風,所以這不一定是消極的結果。
最好從物理上刪除這些設備,或者至少在BIOS/UEFI中禁用它們。禁用內核模塊并不總是那么有效。
rfkill
可以通過rfkill將無線設備列入黑名單,以進一步減少遠程攻擊面。要將所有無線設備列入黑名單,請執行:
rfkill block all
WiFi可以通過以下方式解鎖:
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的訪問
sysfs是偽文件系統,可提供大量的內核和硬件信息。它通常安裝在/sys上。 sysfs導致大量信息泄漏,尤其是內核指針泄漏。Whonix的security-misc軟件包包括hide-hardware-info腳本,該腳本限制訪問此目錄以及/proc中的一些腳本,以試圖隱藏潛在的硬件標識符并防止內核指針泄漏。該腳本是可配置的,并允許基于組將特定的應用程序列入白名單。建議應用此方法,并使其在啟動時使用init腳本執行。或者這樣做成systemd服務[2]。
為了使基本功能在使用systemd的系統上運行,必須將一些系統服務列入白名單。這可以通過創建/etc/systemd/system/user@.service.d/sysfs.conf并添加以下內容來完成:
[Service]
SupplementaryGroups=sysfs
但是,這不能解決所有問題。許多應用程序可能仍會中斷,您需要將它們正確列入白名單。
Linux強化
某些發行版(例如Arch Linux)包括強化的內核程序包。它包含許多強化補丁程序和更注重安全性的內核配置。如果可能的話,建議安裝它。
Grsecurity
Grsecurity是一組內核修補程序,可以大大提高內核安全性。這些補丁曾經可以免費獲得,但是現在需要購買[3]了。如果可用,則強烈建議您獲取它。Grsecurity提供了最新的內核和用戶空間保護。
內核運行時防護
Linux Kernel Runtime Guard(LKRG)是一個內核模塊,可確保運行時內核的完整性并檢測漏洞。它可以殺死整個類別的內核漏洞。但這并不是一個完美的緩解方法,因為LKRG在設計上可以繞開。它僅適用于現成的惡意軟件。但是,盡管可能性不大,但LKRG本身可能會像其他任何內核模塊一樣公開新的漏洞。
自編譯內核
建議編譯您自己的內核,同時啟用盡可能少的內核模塊和盡可能多的安全性功能,以將內核的受攻擊面保持在絕對最低限度。
另外,應用內核強化補丁,例如如上所述的linux-hardened或grsecurity。
發行版編譯的內核還具有公共內核指針/符號,這對于漏洞利用非常有用。編譯自己的內核將為您提供獨特的內核符號,連同kptr_restrict,dmesg_restrict和其他針對內核指針泄漏的強化措施,將使攻擊者更加難以創建依賴于內核指針知識的漏洞利用程序。
您就可以從Whonix的強化內核[4]中汲取靈感或使用它。
強制訪問措施
強制訪問控制(MAC)系統對程序可以訪問的內容進行細粒度的控制。這意味著您的瀏覽器將無權訪問您的整個主目錄或類似目錄。
最常用的MAC措施是SELinux和AppArmor。SELinux比AppArmor更安全,因為它的粒度更細。例如,它是基于inode而不是基于路徑的,允許強制執行明顯更嚴格的限制,可以過濾內核ioctl等。不幸的是,這是以難以使用和難以學習為代價的,因此某些人可能會首選AppArmor。
要在內核中啟用AppArmor,必須設置以下引導參數:
apparmor=1 security=apparmor
要啟用SELinux,請設置以下參數:
selinux=1 security=selinux
請記住,僅啟用MAC措施本身并不能神奇地提高安全性。您必須制定嚴格的政策才能充分利用它。例如,要創建AppArmor配置文件,請執行:
aa-genprof $path_to_program
打開程序,然后像往常一樣開始使用它。AppArmor將檢測需要訪問哪些文件,并將它們添加到配置文件中(如果您選擇的話)。但是,僅憑這一點不足以提供高質量的配置文件。請參閱AppArmor文檔[5]以獲取更多詳細信息。
如果您想更進一步,則可以通過實施initramfs勾子來設置一個完整的系統MAC策略,該策略限制每個單個用戶空間進程,該掛鉤對init系統強制實施MAC策略。這就是Android使用SELinux的方式,以及Whonix未來將如何使用AppArmor的方式。對于加強實施最小特權原則的強大安全模型是必要的。
沙箱
應用沙箱
沙箱可讓您在隔離的環境中運行程序,該環境對系統的其余部分具有有限的訪問權限或完全沒有訪問權限。您可以使用它們來保護應用程序安全或運行不受信任的程序。
建議與AppArmor或SELinux一起在單獨的用戶帳戶中使用Bubblewrap[6]到沙箱程序。您也可以考慮改用gVisor,它的優點是為每個來賓提供了自己的內核。
這些方法中的任何一個都可以用來創建一個功能強大的沙箱,并且暴露的攻擊面最小。如果您不想自己創建沙箱,請在完成后考慮使用Whonix的sandbox-app-launcher。您不應該使用Firejail[7]。
諸如Docker和LXC之類的容器解決方案經常被誤導為沙盒形式。它們太寬松了,無法廣泛支持各種應用程序,因此不能認為它們是強大的應用程序沙箱。
###常見沙箱逃逸
PulseAudio
PulseAudio是一種常見的聲音服務器,但在編寫時并未考慮隔離或沙盒的問題,這使其成為重復出現的沙盒逃逸漏洞。為了防止這種情況,建議您從沙箱中阻止對PulseAudio的訪問,或者從系統中完全卸載它。
D-Bus
D-Bus是臺式機Linux上最流行的進程間通信形式,但它也是沙箱逃逸的另一種常見途徑,因為它允許與服務自由交互。這些漏洞的一個例子就是Firejail。您應該從沙箱中阻止對D-Bus的訪問,或者通過MAC以細粒度的規則進行調解。
GUI隔離
任何Xorg窗口都可以訪問另一個窗口。這允許瑣碎的鍵盤記錄或屏幕截圖程序,甚至可以記錄諸如root密碼之類的內容。您可以使用嵌套的X11服務器(例如Xpra或Xephyr和bubblewrap)將Xorg窗口沙箱化。默認情況下,Wayland將窗口彼此隔離,這將是一個比Xorg更好的選擇,盡管Wayland可能不如Xorg普遍可用,因為它在開發中較早。
ptrace
如前所述,ptrace是一個系統調用,可能會被濫用破壞在沙箱外部運行的進程。為避免這種情況,您可以通過sysctl啟用內核YAMA ptrace限制,也可以在seccomp過濾器中將ptrace syscall列入黑名單。
TIOCSTI
TIOCSTI是一個ioctl,它允許注入終端命令,并為攻擊者提供了一種簡單的機制,可以在同一用戶會話內的其他進程之間橫向移動。可以通過將seccomp過濾器中的ioctl列入黑名單或使用bubblewrap的--new-session參數來緩解這種攻擊。
Systemd沙箱
雖然不建議使用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[8]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](https://www.freedesktop.org/software/systemd/man/systemd.exec.html#System Call Filtering “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[9]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手冊頁[10]。
如果您使用的系統不是systemd而是init,那么可以使用bubblewrap輕松復制所有這些選項。
gVisor
普通沙箱固有地與主機共享同一內核。您信任我們已經評估為不安全的內核,可以正確限制這些程序。由于主機內核的整個攻擊面已完全暴露,因此沙盒中的內核利用程序可以繞過任何限制。已經進行了一些努力來限制使用seccomp的攻擊面,但不足以完全解決此問題。
GVisor是解決此問題的方法。它為每個應用程序提供了自己的內核,該內核以內存安全的語言重新實現了Linux內核的大部分系統調用,從而提供了明顯更強的隔離性。
虛擬機
雖然不是傳統的“沙盒”,但虛擬機通過虛擬化全新系統來分離進程,從而提供了非常強大的隔離性。KVM是內核模塊,它允許內核充當管理程序,而QEMU是利用KVM的仿真器。Virt-manager和GNOME Boxs都是良好且易于使用的GUI,用于管理KVM / QEMU虛擬機。不建議使用Virtualbox的原因[11]有很多。
強化內存分配器
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項目[12]為基于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 但該選項的存在目前正在辯論[13]中。
內存安全語言
用內存安全語言編寫的程序會自動受到保護,免受各種安全漏洞的影響,這些安全漏洞包括緩沖區溢出,未初始化的變量,售后使用等。Microsoft和Google的安全研究人員進行的研究證明,已發現的大多數漏洞都是內存安全問題。這樣的內存安全語言的示例包括Rust,Swift和Java,而內存不安全語言的示例包括C和C ++。如果可行,應使用內存安全替代品替換盡可能多的程序。
Root賬戶
root可以執行任何操作,并且可以訪問您的整個系統。因此,應盡可能將其鎖定,以使攻擊者無法輕松獲得root用戶訪問權限。
/etc/securetty
/etc/securetty文件指定允許您以root用戶身份登錄的位置。該文件應保留為空,以便任何人都不能從終端上這樣做。
限制su
su可讓您從終端切換用戶。默認情況下,它嘗試以root用戶身份登錄。要將su的使用限制在wheel組中,請編輯/etc/pam.d/su和/etc/pam.d/su-l并添加:
auth required pam_wheel.so use_uid
您應該在wheel組中擁有盡可能少的用戶。
鎖定root賬戶
要鎖定root帳戶以防止任何人以root身份登錄,請執行:
passwd -l root
在執行此操作之前,請確保您具有獲取根的替代方法(例如,從活動USB引導并更改為文件系統的chroot),以免您無意中將自己鎖定在系統之外。
拒絕通過SSH的遠程root登陸
為了防止某人通過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
這使shadow執行65536次散列回合。
應用此設置后,密碼不會自動重新加密,因此您需要使用以下方法重置密碼:
passwd $username
限制Xorg root訪問
默認情況下,某些發行版以root用戶身份運行Xorg,這是一個問題,因為Xorg包含大量古老而又復雜的代碼,這增加了巨大的攻擊面,并使其更有可能擁有可以獲取root特權的漏洞利用程序。要阻止它作為root用戶執行,請編輯/etc/X11/Xwrapper.config并添加:
needs_root_rights = no
安全訪問root
惡意軟件可以使用多種方法來嗅探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[14]和手冊頁[15]都是很好的資源。
這是基本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
一個獨一無二的機器ID被存儲在/var/lib/dbus/machine-id (systemd系統是保存在/etc/machine-id)這些應編輯為通用名稱,例如Whonix ID[16]
b08dfa6083e7567a1921a715000001fb
MAC地址欺騙
MAC地址是分配給網絡接口控制器(NIC)的唯一標識符。每次您連接到網絡時(WIFI或以太網)則您的MAC地址已暴露。這使人們可以使用它來跟蹤您并在本地網絡上唯一地標識您。
但您不應該完全隨機化MAC地址。擁有完全隨機的MAC地址是顯而易見的,并且會對您脫穎而出的行為產生不利影響。
MAC地址的OUI(組織唯一標識符)部分標識芯片組的制造商。對MAC地址的這一部分進行隨機化處理可能會為您提供以前從未使用過的OUI,數十年來從未使用過的OUI或在您所在的地區極為罕見的OUI,因此使您脫穎而出,很明顯地表明您在欺騙MAC地址。
MAC地址的末尾標識您的特定設備,并且可以用來跟蹤您的設備。僅對MAC地址的這一部分進行隨機化可防止您被跟蹤,同時仍使MAC地址看起來可信。
要欺騙這些地址,請首先執行以下命令找出您的網絡接口名稱:
ip a
接下來,安裝macchanger并執行:
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時間戳會在查詢答復中泄漏系統時間。阻止這些攻擊的最簡單方法是利用防火墻阻止傳入連接,或者使內核忽略ICMP請求。
TCP時間戳
TCP時間戳也會泄漏系統時間。內核嘗試通過對每個連接使用隨機偏移量來解決此問題,但這不足以解決問題[17]。因此應該禁用TCP時間戳,可以通過使用sysctl設置以下內容來完成:
net.ipv4.tcp_timestamps=0
TCP初始化序號
TCP初始序列號(ISN)是泄漏系統時間的另一種方法。為了減輕這種情況,您必須安裝tirdad內核模塊[18],該模塊會生成用于連接的隨機ISN。
時間同步
時間同步對于匿名性和安全性至關重要。錯誤的系統時鐘可能使您遭受時鐘偏斜指紋攻擊,或者可以用來為您提供過時的HTTPS證書,從而繞過證書到期或吊銷。
最流行的時間同步方法NTP是不安全的,因為它未經加密和未經身份驗證,因此攻擊者可以輕易地攔截和修改請求。NTP還會以NTP時間戳格式泄漏本地系統時間,該格式可用于時鐘偏斜指紋識別,如前所述。
因此,您應該卸載所有NTP客戶端并禁用systemd-timesyncd(如果正在使用)。您可以通過安全連接(HTTPS或最好是Torion服務)連接到受信任的網站,而不是NTP,并從HTTP標頭中提取當前時間。達到此目的的工具是sdwdate或我自己的安全時間同步工具[19]。
按鍵指紋
可以通過他們在鍵盤上輸入鍵的方式來對人進行指紋識別。您可以通過鍵入速度,在兩次按鍵之間的暫停,每次按鍵被按下和釋放的確切時間等方式來唯一地進行指紋識別。可以使用KeyTrac[20]在線進行測試。
Kloak[21]是一種工具,旨在通過混淆按鍵和釋放事件之間的時間間隔來克服這種跟蹤方法。當按鍵被按下時,它會引入隨機延遲,然后由應用程序選擇。
文件權限
默認情況下,文件的權限是非常寬松的。您應該在整個系統中搜索權限不當的文件和目錄,并對其進行限制。例如,在諸如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[22]會自動應用本節中詳細介紹的步驟。
setuid / setgid
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
要刪除setgid位,執行:
chmod g-s $path_to_program
要向文件添加功能,請執行:
setcap $capability+ep $path_to_program
或者,要刪除不必要的功能,請執行:
setcap -r $path_to_program
umask
umask設置新創建文件的默認文件權限。默認的umask是0022,它不是很安全,因為它為系統上的每個用戶提供了對新創建文件的讀取訪問權限。要使所有者以外的任何人都不可讀新文件,請編輯/etc/profile并添加:
umask 0077
核心轉儲
核心轉儲包含特定時間(通常是該程序崩潰時)該程序的已記錄內存。它們可能包含敏感信息,例如密碼和加密密鑰,因此必須將其禁用。
禁用它們的方法主要有三種:sysctl,systemd和ulimit
sysctl
通過sysctl設置以下設置:
kernel.core_pattern=|/bin/false
systemd
創建/etc/systemd/coredump.conf.d/disable.conf并添加如下內容:
[Coredump]
Storage=none
ulimit
編輯/etc/security/limits.conf并添加如下內容:
* hard core 0
setuid進程
即使在進行了這些設置之后,以提升的特權運行的進程仍可能會轉儲其內存。
為了防止他們這樣做,請通過sysctl設置以下內容:
fs.suid_dumpable=0
Swap
與核心轉儲類似,交換或分頁將部分內存復制到磁盤,其中可能包含敏感信息。應該將內核配置為僅在絕對必要時進行交換,相應的sysctl設置:
vm.swappiness=1
PAM
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
4000000 是4秒(以微秒為單位)。
Microcode更新
Microcode更新對于修復關鍵的CPU漏洞(如Meltdown和Spectre等)至關重要。大多數發行版都將這些發行版包含在其軟件倉庫中,例如Arch Linux[23]和Debian[24]。
IPv6隱私擴展
IPv6地址是從計算機的MAC地址生成的,從而使您的IPv6地址是唯一的,并直接綁定到計算機。隱私擴展會生成一個隨機的IPv6地址,以減輕這種形式的跟蹤。請注意,如果您開啟了MAC地址欺騙機制或禁用了IPv6,則無需執行這些步驟。
要啟用這些功能,請通過sysctl設置以下設置:
net.ipv6.conf.all.use_tempaddr=2
net.ipv6.conf.default.use_tempaddr=2
NetworkManager
要為NetworkManager啟用隱私擴展,請編輯/etc/NetworkManager/NetworkManager.conf并添加:
[connection]
ipv6.ip6-privacy=2
systemd-networkd
要為systemd-networkd啟用隱私擴展,請創建/etc/systemd/network/ipv6-privacy.conf并添加:
[Network]
IPv6PrivacyExtensions=kernel
分區和掛載選項
文件系統應分為多個分區,以對其權限進行細粒度控制。可以添加不同的安裝選項以限制可以執行的操作:
nodev - 禁止使用設備
nosuid - 禁止setuid或setgid位
noexec - 禁止執行任何二進制文件
這些安裝選項應在/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
請注意,可以通過shell腳本繞過noexec[25]。
熵
熵基本上反應操作系統信息收集的隨機程度,對于諸如加密之類的事情至關重要。因此,最好通過安裝其他隨機數生成器(如haveged[26]和jitterentropy[27])從各種來源收集盡可能多的熵。
為了使jitterentropy正確運行,必須通過創建/usr/lib/modules-load.d/jitterentropy.conf并添加以下內容盡早加載內核模塊:
jitterentropy_rng
RDRAND
RDRAN是提供隨機數的CPU指令。如果可用,內核會自動將其用作熵源。但是由于它是專有的并且是CPU本身的一部分,因此無法審核和驗證其安全性。您甚至無法對代碼進行反向工程。該RNG以前曾遭受過漏洞的攻擊,其中有些可能是后門攻擊。通過設置以下引導參數可以不信任此功能:
random.trust_cpu=off
以root身份編輯文件
建議不要以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中全局設置此環境變量。
特定發行版的安全強化
HTTP包管理器鏡像
默認情況下,Linux發行版通常使用HTTP或HTTP和HTTPS鏡像的混合來從其軟件存儲庫下載軟件包。人們認為這很好,因為程序包管理器會在安裝前驗證程序包的簽名。但是,從歷史上看,已經有很多繞過此方法的地方。您應將軟件包管理器配置為從HTTPS鏡像專門下載以進行深度防御。
APT seccomp-bpf
自軟件包管理器Debian Buster以來,APT已支持可選的seccomp-bpf過濾。這限制了允許執行APT的系統調用,這可能嚴重限制攻擊者嘗試利用APT中的漏洞時對系統造成危害的能力。要啟用此功能,請創建/etc/apt/apt.conf.d/40sandbox并添加:
APT::Seccomp “true”;
物理安全
全盤加密可確保對驅動器上的所有數據進行加密,并且不會被物理攻擊者讀取。大多數發行版都支持在安裝過程中啟用加密,請確保設置了強密碼。您也可以使用dm-crypt[28]手動加密驅動器。
請注意,全盤加密不包括/boot,這樣仍然可以修改內核、引導加載程序和其他關鍵文件。為了完全防止篡改,您還必須實施經過驗證的引導。
BIOS / UEFI強化
如果您仍在使用舊版BIOS,則應遷移到UEFI,以利用較新的安全功能。大多數BIOS或UEFI實現都支持設置密碼。最好啟用它并設置一個非常強壯的密碼。雖然這是很弱的保護,因為重置密碼很簡單。它通常存儲在易失性內存中,因此攻擊者只需要能夠卸下CMOS電池幾秒鐘,或者他們就可以使用某些主板上的跳線將其重置。
您還應該禁用所有未使用的設備和引導選項,例如USB引導,以減少攻擊面。
別忽略BIOS或UEFI的更新,確保將其更新。將其與常規操作系統更新一樣重要。
此外,請參閱《NSA的硬件和固件安全指南》[29]
Bootloader密碼
引導加載程序會在引導過程的早期執行,并負責加載操作系統。保護它非常重要,否則,它可能會被篡改。例如,本地攻擊者可以通過在啟動時使用init=/bin/bash作為內核參數來輕松獲得root shell,該命令告訴內核執行/bin/bash而不是常規的init系統。您可以通過為引導加載程序設置密碼來防止這種情況。僅設置引導程序密碼不足以完全保護它。還必須按照以下說明設置經過驗證的啟動。
Grub
要為GRUB設置密碼,請執行:
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可以設置主密碼或菜單密碼。引導任何條目都需要主密碼,而引導特定條目僅需要菜單密碼。
要為Syslinux設置主密碼,請編輯/boot/syslinux/syslinux.cfg并添加:
MENU MASTER PASSWD $password
要設置菜單密碼,請編輯/boot/syslinux/syslinux.cfg,并在帶有您要密碼保護的項目的標簽內,添加:
MENU PASSWD $password
將“ $password”替換為您要設置的密碼。
這些密碼可以是純文本,也可以使用MD5,SHA-1,SHA-256或SHA-512進行散列。建議先使用強哈希算法(例如SHA-256或SHA-512)對密碼進行哈希處理,以避免將其存儲為明文形式。
systemd-boot
systemd-boot具有防止在引導時編輯內核參數的選項。在loader.conf文件中,添加:
editor no
systemd-boot并不正式支持保護內核參數編輯器的密碼,但是您可以使用systemd-boot-password來實現[30]。
驗證引導
經過驗證的引導通過密碼驗證來確保引導鏈和基本系統的完整性。這可用于確保物理攻擊者無法修改設備上的軟件。
如果沒有經過驗證的引導,則一旦獲得物理訪問權限,就可以輕松繞過上述所有預防措施。經過驗證的引導不僅像許多人認為的那樣是為了物理安全。它還可以用于防止遠程惡意軟件持久化——如果攻擊者設法破壞了整個系統并獲得了很高的特權,則經過驗證的引導將在重新引導后還原其更改,并確保它們無法持久化。
經過驗證的最常見的引導實現是UEFI安全引導,但是它本身并不是一個完整的實現,因為它僅會驗證引導加載程序和內核,這意味著可以通過以下方法:
僅UEFI安全啟動就沒有一成不變的信任根,因此物理攻擊者仍然可以刷新設備的固件。為了減輕這種情況,請結合使用UEFI安全啟動和Intel Boot Guard或AMD Secure Boot。
遠程攻擊者(或不使用加密的物理攻擊者)可以簡單地修改操作系統的任何其他特權部分。例如,如果他們有修改內核的特權,那么他們也可以修改/sbin/init來有效地獲得相同的結果。因此,僅驗證內核和引導加載程序不會對遠程攻擊者產生任何影響。為了減輕這種情況,您必須使用dm-verity[31]驗證基本操作系統,盡管由于傳統Linux發行版的布局,這非常困難且笨拙。
通常,很難在傳統Linux上實現可靠的經過驗證的引導實現。
USBs
USB設備為物理攻擊提供了重要的攻擊面。例如BadUSB[32]和Stuxnet[33]是此類攻擊的范例。最佳實踐是禁止所有新連接的USB且僅將受信任設備列入白名單,USBGuard[34]對此非常有用。
您也可以將nousb用作內核引導參數,以禁用內核中的所有USB支持。可以sysctl設置kernel.deny_new_usb=1
DMA攻擊
直接內存訪問(DMA)攻擊涉及通過插入某些物理設備來完全訪問所有系統內存。這可以通過控制設備可訪問的內存區域的IOMMU[35]或將特別易受攻擊的內核模塊列入黑名單來緩解。
要啟用IOMMU,請設置以下內核引導參數:
intel_iommu=on amd_iommu=on
您只需要為特定的CPU制造商啟用該選項,但同時啟用這兩個選項就沒有問題。
efi=disable_early_pci_dma
通過在非常早的啟動過程中禁用所有PCI橋接器上的busmaster位,此選項可修復上述IOMMU中的漏洞[36]。
此外,Thunderbolt和FireWire通常容易受到DMA攻擊。要禁用它們,請將這些內核模塊列入黑名單:
install firewire-core /bin/false
install thunderbolt /bin/false
冷啟動攻擊
當攻擊者在擦除RAM中的數據之前對其進行分析時,就會發生冷啟動攻擊[37]。使用現代RAM時,冷啟動攻擊不太實用,因為RAM通常會在幾秒鐘或幾分鐘內清除,除非將其放入冷卻液(如液氮或冷凍機)中。攻擊者必須在幾秒鐘內將設備中的RAM棒拔出并將其暴露于液氮中,而且確保用戶不會注意到。
如果冷啟動攻擊是威脅模型的一部分,請在關機后保護計算機幾分鐘,以確保沒有人可以訪問您的RAM記憶棒。您也可以將RAM棒焊接到主板上,以使其更難以卡住。如果使用筆記本電腦,請取出電池,然后直接用充電電纜供電。關機后請拔出電纜,以確保RAM徹底斷電無法訪問。
在內核自我保護啟動參數部分中,空閑時內存清零選項將用零覆蓋內存中的敏感數據。此外,強化的內存分配器可以通過CONFIG_ZERO_ON_FREE配置選項清除用戶空間堆內存中的敏感數據。盡管如此,某些數據仍可能保留在內存中。
此外,現代內核還包括復位攻擊緩解[38]措施,該命令可命令固件在關機時擦除數據,盡管這需要固件支持[39]。
確保正常關閉計算機,以使上述緩解措施可以開始。
如果以上都不適用您的威脅模型,則可以實施Tails的內存擦除過程[40],該過程將擦除大部分內存(視頻內存除外),并且已被證明是有效的。
最佳實踐
一旦對系統進行了盡可能多的加固,就應該遵循良好的隱私和安全性慣例:
禁用或刪除不需要的東西以最小化攻擊面。
保持更新。配置cron任務或init腳本以每天更新系統。
不要泄漏有關您或您的系統的任何信息,無論它看起來多么渺小。
遵循常規的安全和隱私建議[41]
盡管已經進行了強化,但您必須記住Linux仍然是一個有缺陷的操作系統,沒有任何強化可以完全修復它。
其他指南
您應該進行盡可能多的研究,而不要依賴單一的信息來源。最大的安全問題之一就是用戶。這些是我認為有價值的其他指南的鏈接:
Arch Linux Security wiki page[42]
Whonix Documentation[43]
NSA RHEL 5 Hardening Guide[44](稍有過時,但仍包含有用的信息)
KSPP recommended kernel settings[45]
kconfig-hardened-check[46]
術語
您可能需要重新生成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[47])。這在應用最小特權原則時很有幫助——可以給它們僅授予特定的子集,而不是授予進程總的root特權。例如,如果程序只需要設置系統時間,則只需要CAP_SYS_TIME而不是root所有能力。這會限制可能造成的損害,但是,您仍必須謹慎授予能力,因為無論如何,其中許多能力可能會被濫用以獲取完整的root特權[48]。
原文標題:Linux 系統安全強化指南
文章出處:【微信公眾號:Linux愛好者】歡迎添加關注!文章轉載請注明出處。
責任編輯:haq
-
Linux
+關注
關注
87文章
11227瀏覽量
208922
原文標題:Linux 系統安全強化指南
文章出處:【微信號:LinuxHub,微信公眾號:Linux愛好者】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論