點選上方 "程式設計技術圈"關注, 星标或置頂一起成長
背景回複“大禮包”有驚喜禮包!
每日英文
When faced with two choices, simply toss a coin.because in that brief moment when the coin is in the air, you suddenly know what you are hoping for.
當面對兩個選擇時,抛硬币總能奏效,因為在你把它抛在空中的那一秒裡,你突然知道你希望它是什麼!
每日掏心話
人生,就是這樣,倘若有運,不用祈求,祈求終歸無用;倘若無運,無需悲傷,悲傷終歸無助。
責編:樂樂 | 來自:分布式實驗室連結:blog.gaochao.me/post/645734976535543808/linux系統安全強化指南
程式設計技術圈(ID:study_tech)第 1258 次推文
往日回顧:剛剛用華為鴻蒙跑了個“hello world”!跑通後,我特麼開始懷疑人生....
正文
本指南旨在說明如何盡可能地加強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=1dmesg是核心日志,它公開了大量有用的核心調試資訊,但這通常會洩漏敏感資訊,例如核心指針。更改上述sysctl設定會将核心日志限制為CAP_SYSLOG功能。kernel.printk=3 3 3 3盡管dmesg_restrict的值,啟動過程中核心日志仍将顯示在控制台中。能夠在引導過程中記錄螢幕的惡意軟體可能會濫用此惡意軟體以獲得更高的特權。此選項可防止這些資訊洩漏。必須将其與下面描述的某些引導參數結合使用才能完全有效。kernel.unprivileged_bpf_disabled=1
net.core.bpf_jit_harden=2eBPF暴露了很大的攻擊面,是以需加以限制。這些系統将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=0userfaultfd() 系統調用經常被濫用以利用“事後使用(use-after-free)”缺陷。是以,該sysctl用于将此syscall限制為CAP_SYS_PTRACE功能。kernel.kexec_load_disabled=1kexec是一個系統調用,用于在運作時引導另一個核心。可以濫用此功能來加載惡意核心并在核心模式下獲得任意代碼執行能力,是以該sysctl設定将被禁用。kernel.sysrq=4SysRq密鑰向非特權使用者公開了許多潛在的危險調試功能。與通常的假設相反,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=2ptrace是一個系統調用,它允許程式調試、修改和檢查另一個正在運作的程序,進而使攻擊者可以輕易修改其他正在運作的程式的記憶體。設定将ptrace的使用限制為僅具有CAP_SYS_PTRACE功能的程序。或者,将sysctl設定為3以完全禁用ptrace。vm.mmap_rnd_bits=32
vm.mmap_rnd_compat_bits=16ASLR是一種常見的漏洞利用緩解措施,它可以使程序的關鍵部分在記憶體中的位置随機化。這可能會使各種各樣的漏洞利用更困難,因為它們首先需要資訊洩漏。上述設定增加了用于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 0systemd-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 ProtocolSCTP — Stream Control Transmission ProtocolRDS — Reliable Datagram SocketsTIPC — Transparent Inter-process CommunicationHDLC — High-Level Data Link ControlAX25 — Amateur X.25NetRomX25ROSEDECnetEconetaf_802154 — IEEE 802.15.4IPX — Internetwork Packet ExchangeAppleTalkPSNAP — Subnetwork Access Protocolp8023 — Novell raw IEEE 802.3p8022 — IEEE 802.2CAN — Controller Area NetworkATMinstall 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/falsevivid driver驅動程式僅用于測試目的,并且是特權提升漏洞的原因,是以應禁用它。install bluetooth /bin/false
install btusb /bin/false禁用具有安全問題曆史記錄的藍牙。install uvcvideo /bin/false這會禁用網絡攝像頭,以防止其被用來監視您。
您也可以将麥克風子產品列入黑名單,但這在系統之間可能會有所不同。要查找子產品的名稱,請在/proc/asound/modules中查找并将其列入黑名單。例如,一個這樣的子產品是snd_hda_intel。
請注意,盡管有時麥克風的核心子產品與揚聲器的子產品相同。這意味着像這樣禁用麥克風也可能會無意中禁用任何揚聲器,雖然揚聲器也有可能變成麥克風,是以這不一定是消極的結果。
最好從實體上删除這些裝置,或者至少在BIOS/UEFI中禁用它們。禁用核心子產品并不總是那麼有效。
rfkill
可以通過rfkill将無線裝置列入黑名單,以進一步減少遠端攻擊面。要将所有無線裝置列入黑名單,請執行:rfkill block allWiFi可以通過以下方式解鎖: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服務[1]。
為了使基本功能在使用systemd的系統上運作,必須将一些系統服務列入白名單。這可以通過建立/etc/systemd/system/[email protected]/sysfs.conf并添加以下内容來完成:[Service]
SupplementaryGroups=sysfs}但是,這不能解決所有問題。許多應用程式可能仍會中斷,您需要将它們正确列入白名單。
Linux強化
某些發行版(例如Arch Linux)包括強化的核心程式包。它包含許多強化更新檔程式和更注重安全性的核心配置。如果可能的話,建議安裝它。
Grsecurity
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,請設定以下參數: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是一種常見的聲音伺服器,但在編寫時并未考慮隔離或沙盒的問題,這使其成為重複出現的沙盒逃逸漏洞。為了防止這種情況,建議您從沙箱中阻止對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 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 [email protected] 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輕松複制所有這些選項。
gVisor
普通沙箱固有地與主機共享同一核心。您信任我們已經評估為不安全的核心,可以正确限制這些程式。由于主機核心的整個攻擊面已完全暴露,是以沙盒中的核心利用程式可以繞過任何限制。已經進行了一些努力來限制使用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=524240Whonix項目為基于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但該選項的存在目前正在辯論[4]中。記憶體安全語言用記憶體安全語言編寫的程式會自動受到保護,免受各種安全漏洞的影響,這些安全漏洞包括緩沖區溢出,未初始化的變量,售後使用等。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和手冊頁[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
一個獨一無二的機器ID被存儲在/var/lib/dbus/machine-id (systemd系統是儲存在/etc/machine-id)這些應編輯為通用名稱,例如Whonix ID: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時間戳也會洩漏系統時間。核心嘗試通過對每個連接配接使用随機偏移量來解決此問題,但這不足以解決問題。是以應該禁用TCP時間戳,可以通過使用sysctl設定以下内容來完成:net.ipv4.tcp_timestamps=0
TCP初始化序号
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 / setgid
Setuid / SUID允許使用者使用二進制檔案所有者的特權執行二進制檔案。這通常用于允許非特權使用者使用通常僅為root使用者保留的某些功能。是以,許多SUID二進制檔案都有特權更新安全漏洞的曆史記錄。Setgid / SGID類似,但适用于組而不是使用者。要使用setuid或setgid位查找系統上的所有二進制檔案,請執行:find / -type f \( -perm -4000 -o -perm -2000 \)然後,您應該删除不使用的程式上的所有不必要的setuid / setgid位,或将其替換為功能。要删除setuid位,請執行:搜尋公衆号頂級架構師背景回複“offer”,擷取一份驚喜禮包。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
PAMPAM是用于使用者身份驗證的架構。這就是您登入時使用的機制。您可以通過要求使用強密碼或在失敗的登入嘗試後強制執行延遲驗證來使其更加安全。
要強制使用強密碼,可以使用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=40000004000000 是4秒(以微秒為機關)。Microcode更新Microcode更新對于修複關鍵的CPU漏洞(如Meltdown和Spectre等)至關重要。大多數發行版都将這些發行版包含在其軟體倉庫中,例如Arch Linux和Debian。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。熵熵基本上反應作業系統資訊收集的随機程度,對于諸如加密之類的事情至關重要。是以,最好通過安裝其他随機數生成器(如haveged和jitterentropy)從各種來源收集盡可能多的熵。
為了使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::Sandbox::Seccomp "true";
實體安全全盤加密可確定對驅動器上的所有資料進行加密,并且不會被實體攻擊者讀取。大多數發行版都支援在安裝過程中啟用加密,請確定設定了強密碼。您也可以使用dm-crypt手動加密驅動器。
請注意,全盤加密不包括/boot,這樣仍然可以修改核心、引導加載程式和其他關鍵檔案。為了完全防止篡改,您還必須實施經過驗證的引導。
BIOS / UEFI強化
如果您仍在使用舊版BIOS,則應遷移到UEFI,以利用較新的安全功能。大多數BIOS或UEFI實作都支援設定密碼。最好啟用它并設定一個非常強壯的密碼。雖然這是很弱的保護,因為重置密碼很簡單。它通常存儲在易失性記憶體中,是以攻擊者隻需要能夠卸下CMOS電池幾秒鐘,或者他們就可以使用某些主機闆上的跳線将其重置。
您還應該禁用所有未使用的裝置和引導選項,例如USB引導,以減少攻擊面。
别忽略BIOS或UEFI的更新,確定将其更新。将其與正常作業系統更新一樣重要。
此外,請參閱《NSA的硬體和固件安全指南[6]》。
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 nosystemd-boot并不正式支援保護核心參數編輯器的密碼,但是您可以使用systemd-boot-password來實作。
驗證引導
經過驗證的引導通過密碼驗證來確定引導鍊和基本系統的完整性。這可用于確定實體攻擊者無法修改裝置上的軟體。
如果沒有經過驗證的引導,則一旦獲得實體通路權限,就可以輕松繞過上述所有預防措施。經過驗證的引導不僅像許多人認為的那樣是為了實體安全。它還可以用于防止遠端惡意軟體持久化——如果攻擊者設法破壞了整個系統并獲得了很高的特權,則經過驗證的引導将在重新開機後還原其更改,并確定它們無法持久化。
經過驗證的最常見的引導實作是UEFI安全引導,但是它本身并不是一個完整的實作,因為它僅會驗證引導加載程式和核心,這意味着可以通過以下方法:
僅UEFI安全啟動就沒有一成不變的信任根,是以實體攻擊者仍然可以重新整理裝置的固件。為了減輕這種情況,請結合使用UEFI安全啟動和Intel Boot Guard或AMD Secure Boot。遠端攻擊者(或不使用加密的實體攻擊者)可以簡單地修改作業系統的任何其他特權部分。例如,如果他們有修改核心的特權,那麼他們也可以修改/sbin/init來有效地獲得相同的結果。是以,僅驗證核心和引導加載程式不會對遠端攻擊者産生任何影響。為了減輕這種情況,您必須使用dm-verity驗證基本作業系統,盡管由于傳統Linux發行版的布局,這非常困難且笨拙。
通常,很難在傳統Linux上實作可靠的經過驗證的引導實作。
USBs
USB裝置為實體攻擊提供了重要的攻擊面。例如BadUSB和Stuxnet是此類攻擊的範例。最佳實踐是禁止所有新連接配接的USB且僅将受信任裝置列入白名單,USBGuard對此非常有用。
您也可以将nousb用作核心引導參數,以禁用核心中的所有USB支援。可以sysctl設定kernel.deny_new_usb=1
DMA攻擊
直接記憶體通路(DMA)攻擊涉及通過插入某些實體裝置來完全通路所有系統記憶體。這可以通過控制裝置可通路的記憶體區域的IOMMU或将特别易受攻擊的核心子產品列入黑名單來緩解。
要啟用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的記憶體擦除過程,該過程将擦除大部分記憶體(視訊記憶體除外),并且已被證明是有效的。最佳實踐一旦對系統進行了盡可能多的加強,就應該遵循良好的隐私和安全性慣例:
禁用或删除不需要的東西以最小化攻擊面。保持更新。配置cron任務或init腳本以每天更新系統。不要洩漏有關您或您的系統的任何資訊,無論它看起來多麼渺小。遵循正常的安全和隐私建議盡管已經進行了強化,但您必須記住Linux仍然是一個有缺陷的作業系統,沒有任何強化可以完全修複它。其他指南您應該進行盡可能多的研究,而不要依賴單一的資訊來源。最大的安全問題之一就是使用者。這些是我認為有價值的其他指南的連結:
Arch Linux Security wiki page:https://wiki.archlinux.org/index.php/Security
Whonix Documentation:https://www.whonix.org/wiki/Documentation
NSA 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.cfm
KSPP recommended kernel settings:https://kernsec.org/wiki/index.php/Kernel_Self_Protection_Project/Recommended_Settings
kconfig-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.servicehttps://gitlab.com/apparmor/apparmor/-/wikis/Documentationhttps://www.freedesktop.org/software/systemd/man/systemd.exec.htmlhttps://lists.llvm.org/pipermail/cfe-dev/2020-April/065221.htmlhttps://href.li/?https://linux.die.net/man/8/iptableshttps://github.com/nsacyber/Hardware-and-Firmware-Security-GuidancePS:歡迎在留言區留下你的觀點,一起讨論提高。如果今天的文章讓你有新的啟發,歡迎轉發分享給更多人。
版權申明:内容來源網絡,版權歸原創者所有。除非無法确認,我們都會标明作者及出處,如有侵權煩請告知,我們會立即删除并表示歉意。謝謝!
歡迎加入後端架構師交流群,在背景回複“學習”即可。
最近面試BAT,整理一份面試資料《Java面試BAT通關手冊》,覆寫了Java核心技術、JVM、Java并發、SSM、微服務、資料庫、資料結構等等。在這裡,我為大家準備了一份2021年最新最全BAT等大廠Java面試經驗總結。别找了,想擷取史上最簡單的Java大廠面試題學習資料掃下方二維碼回複「面試」就好了猜你還想看阿裡、騰訊、百度、華為、京東最新面試題彙集鴻蒙OS終于來了,今天正式釋出!
一名程式員自建停車繳費系統,面向監獄程式設計!
9名程式員被抓!這次我并不同情他們!
嘿,你在看嗎?