<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          Linux 系統(tǒng)安全強化指南(建議收藏的教程)

          共 34766字,需瀏覽 70分鐘

           ·

          2021-10-08 16:49

          在下方公眾號后臺回復(fù):面試手冊,可獲取杰哥匯總的 3 份面試 PDF 手冊。

          本指南旨在說明如何盡可能地加強Linux的安全性和隱私性,并且不限于任何特定的指南。


          免責(zé)聲明:如果您不確定自己在做什么,請不要嘗試在本文中使用任何內(nèi)容。


          本指南僅關(guān)注安全性和隱私性,而不關(guān)注性能,可用性或其他內(nèi)容。列出的所有命令都將需要root特權(quán)。以“$”符號開頭的單詞表示一個變量,不同終端之間可能會有所不同。

          選擇正確的Linux發(fā)行版

          選擇一個好的Linux發(fā)行版有很多因素。

          避免分發(fā)凍結(jié)程序包,因為它們在安全更新中通常很落后


          不使用與Systemd機制的發(fā)行版。Systemd包含許多不必要的攻擊面;它嘗試做的事情遠遠超出了必要,并且超出了初始化系統(tǒng)應(yīng)做的事情。


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


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


          用作強化操作系統(tǒng)基礎(chǔ)的最佳發(fā)行版是Gentoo Linux,因為它可以讓您精確地配置系統(tǒng),以達到理想的效果,這將非常有用,尤其是參考我們在后面的章節(jié)中使用更安全的編譯標志。


          但是,由于Gentoo的巨大可用性缺陷,它對于許多人來說可能并不順手。在這種情況下,Void Linux的Musl構(gòu)建是一個很好的折衷方案。

          內(nèi)核

          內(nèi)核是操作系統(tǒng)的核心,不幸的是很容易受到攻擊。正如Brad Spengler曾經(jīng)說過的那樣,可以將其視為系統(tǒng)上最大,最易受攻擊的setuid根二進制文件。因此,對內(nèi)核進行盡可能多的強化非常重要。

          Stable vs LTS 內(nèi)核

          Linux內(nèi)核以兩種主要形式發(fā)布:穩(wěn)定和長期支持(LTS)。穩(wěn)定版本是較新的版本,而LTS發(fā)行版本是較老的穩(wěn)定版本,長期以來一直受支持。選擇上述任何一個發(fā)行版本都有許多后果。

          Linux內(nèi)核未使用CVE標識安全漏洞。這意味著大多數(shù)安全漏洞的修復(fù)程序不能向后移植到LTS內(nèi)核。但是穩(wěn)定版本包含到目前為止進行的所有安全修復(fù)。

          但是,有了這些修復(fù)程序,穩(wěn)定的內(nèi)核將包含更多新功能,因此大大增加了內(nèi)核的攻擊面,并引入了大量新錯誤。相反,LTS內(nèi)核的受攻擊面較小,因為這些功能沒有被不斷添加。

          此外,穩(wěn)定的內(nèi)核還包括更新的強化功能,以減輕LTS內(nèi)核沒有的某些利用。此類功能的一些示例是Lockdown LSM和STACKLEAK GCC插件。

          總而言之,在選擇穩(wěn)定或LTS內(nèi)核時需要權(quán)衡取舍。LTS內(nèi)核具有較少的強化功能,并且并非當時所有的公共錯誤修復(fù)都已向后移植,但是通常它的攻擊面更少,并且引入未知錯誤的可能性也較小。穩(wěn)定的內(nèi)核具有更多的強化功能,并且包括所有已知的錯誤修復(fù),但它也具有更多的攻擊面以及引入更多未知錯誤的機會更大。最后,最好使用較新的LTS分支(如4.19內(nèi)核)。

          Sysctl

          Sysctl是允許用戶配置某些內(nèi)核設(shè)置并啟用各種安全功能或禁用危險功能以減少攻擊面的工具。要臨時更改設(shè)置,您可以執(zhí)行:

          sysctl?-w?$tunable?=?$value

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

          以下是您應(yīng)更改的建議sysctl設(shè)置。

          Kernel self-protection

          kernel.kptr_restrict=2

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

          kernel.dmesg_restrict=1

          dmesg是內(nèi)核日志,它公開了大量有用的內(nèi)核調(diào)試信息,但這通常會泄漏敏感信息,例如內(nèi)核指針。更改上述sysctl設(shè)置會將內(nèi)核日志限制為CAP_SYSLOG功能。

          kernel.printk=3?3?3?3

          盡管dmesg_restrict的值,啟動過程中內(nèi)核日志仍將顯示在控制臺中。能夠在引導(dǎo)過程中記錄屏幕的惡意軟件可能會濫用此惡意軟件以獲得更高的特權(quán)。此選項可防止這些信息泄漏。必須將其與下面描述的某些引導(dǎo)參數(shù)結(jié)合使用才能完全有效。

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

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

          dev.tty.ldisc_autoload=0

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

          vm.unprivileged_userfaultfd=0

          userfaultfd() 系統(tǒng)調(diào)用經(jīng)常被濫用以利用“事后使用(use-after-free)”缺陷。因此,該sysctl用于將此syscall限制為CAP_SYS_PTRACE功能。

          kernel.kexec_load_disabled=1

          kexec是一個系統(tǒng)調(diào)用,用于在運行時引導(dǎo)另一個內(nèi)核??梢詾E用此功能來加載惡意內(nèi)核并在內(nèi)核模式下獲得任意代碼執(zhí)行能力,因此該sysctl設(shè)置將被禁用。

          kernel.sysrq=4

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

          kernel.unprivileged_userns_clone=0

          用戶名稱空間是內(nèi)核中的一項功能,旨在改善沙箱并使非特權(quán)用戶易于訪問它,但是,此功能公開了重要的內(nèi)核攻擊面,以進行特權(quán)升級,因此該sysctl將用戶名稱空間的使用限制為CAP_SYS_ADMIN功能。對于無特權(quán)的沙箱,建議使用具有很少攻擊面的setuid二進制文件,以最大程度地減少特權(quán)升級的可能性。沙箱章節(jié)部分將進一步討論此主題。

          請注意,盡管該sysctl僅在某些Linux發(fā)行版中存在,因為它需要內(nèi)核補丁。如果您的內(nèi)核不包含此補丁,則可以通過設(shè)置user.max_user_namespaces = 0來完全禁用用戶名稱空間(包括root用戶)。

          kernel.perf_event_paranoid=3

          性能事件會增加大量內(nèi)核攻擊面,并導(dǎo)致大量漏洞。此sysctl設(shè)置將性能事件的所有使用限制為CAP_PERFMON功能(5.8之前的內(nèi)核版本為CAP_SYS_ADMIN)。

          請注意,此sysctl設(shè)置需要在某些發(fā)行版中具備相關(guān)的內(nèi)核補丁。否則,此設(shè)置等效于kernel.perf_event_paranoid = 2,它僅限制此功能的子集。

          網(wǎng)絡(luò)

          net.ipv4.tcp_syncookies=1

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

          net.ipv4.tcp_rfc1337=1

          這通過丟棄處于時間等待狀態(tài)的套接字的RST數(shù)據(jù)包來防止time-wait狀態(tài)。

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

          這些啟用了源驗證,以驗證從計算機所有網(wǎng)絡(luò)接口接收到的數(shù)據(jù)包。

          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

          這些設(shè)置禁用了ICMP重定向,以防止中間人攻擊并最大程度地減少信息泄露。

          net.ipv4.icmp_echo_ignore_all=1

          此設(shè)置使您的系統(tǒng)忽略所有ICMP請求,以避免Smurf攻擊,使設(shè)備更難以在網(wǎng)絡(luò)上枚舉,并防止通過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

          源路由是一種允許用戶重定向網(wǎng)絡(luò)流量的機制。由于這可用于執(zhí)行中間人攻擊,在中間人攻擊中,出于惡意目的將流量重定向,因此上述設(shè)置將會禁用此功能。

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

          惡意的IPv6路由廣告可能會導(dǎo)致中間人攻擊,因此應(yīng)將其禁用。

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

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

          用戶空間

          kernel.yama.ptrace_scope=2

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

          vm.mmap_rnd_bits=32
          vm.mmap_rnd_compat_bits=16

          ASLR是一種常見的漏洞利用緩解措施,它可以使進程的關(guān)鍵部分在內(nèi)存中的位置隨機化。這可能會使各種各樣的漏洞利用更困難,因為它們首先需要信息泄漏。上述設(shè)置增加了用于mmap ASLR的熵的位數(shù),從而提高了其有效性。

          這些sysctls的值必須根據(jù)CPU體系結(jié)構(gòu)進行設(shè)置。以上值與x86兼容,但其他體系結(jié)構(gòu)可能有所不同。

          fs.protected_symlinks=1
          fs.protected_hardlinks=1

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

          fs.protected_fifos=2
          fs.protected_regular=2

          這些阻止了在可能由攻擊者控制的環(huán)境(例如,全局可寫目錄)中創(chuàng)建文件,從而使數(shù)據(jù)欺騙攻擊更加困難。

          引導(dǎo)參數(shù)

          引導(dǎo)參數(shù)在引導(dǎo)時使用引導(dǎo)加載程序(bootloader)將設(shè)置傳遞給內(nèi)核。類似于sysctl,可以使用某些設(shè)置來提高安全性。引導(dǎo)加載程序通常在引導(dǎo)參數(shù)設(shè)置方式上有所不同。下面列出了一些示例,但是您應(yīng)該研究特定bootloader的修改參數(shù)的必要步驟。

          如果使用GRUB作為引導(dǎo)程序,請編輯/etc /default/grub并將參數(shù)添加到GRUB_CMDLINE_LINUX_DEFAULT=line。

          如果使用Syslinux,請編輯/boot/syslinux/syslinux.cfg并將它們添加到APPEND行中。

          如果使用systemd-boot,請編輯您的加載程序條目,并將其附加到linux行的末尾。

          建議使用以下設(shè)置以提高安全性。

          Kernel self-protection

          slab_nomerge

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

          slub_debug=FZ

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

          init_on_alloc=1?init_on_free=1

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

          page_alloc.shuffle=1

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

          pti=on

          這將啟用內(nèi)核頁表隔離,從而減輕崩潰并防止某些KASLR繞過。

          vsyscall=none

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

          debugfs=off

          這將禁用debugfs,它會公開許多有關(guān)內(nèi)核的敏感信息。

          oops=panic

          有時某些內(nèi)核漏洞利用會導(dǎo)致所謂的“oops”。此參數(shù)將引發(fā)內(nèi)核對此類事件panic,從而防止這些攻擊。但是,有時錯誤的驅(qū)動程序會導(dǎo)致無害的操作,這會導(dǎo)致系統(tǒng)崩潰,這意味著此引導(dǎo)參數(shù)只能在某些硬件上使用。

          module.sig_enforce=1

          這僅允許加載已使用有效密鑰簽名的內(nèi)核模塊,使加載惡意內(nèi)核模塊更加困難。

          這可以防止加載所有樹外內(nèi)核模塊(包括DKMS模塊),除非您已對其進行簽名,這意味著諸如VirtualBox或Nvidia驅(qū)動程序之類的模塊可能不可用,但根據(jù)您的設(shè)置可能并不重要。

          lockdown=confidentiality

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

          mce=0

          這將導(dǎo)致內(nèi)核對ECC內(nèi)存中無法利用的錯誤panic,而這些錯誤可能會被利用。對于沒有ECC內(nèi)存的系統(tǒng),這是不必要的。

          quiet?loglevel=0

          這些參數(shù)可防止引導(dǎo)期間信息泄漏,并且必須與上面的kernel.printk sysctl結(jié)合使用。

          CPU緩解

          最好啟用適用于您的CPU的所有CPU緩解措施,以確保您不受已知漏洞的影響。這是啟用所有內(nèi)置緩解措施的列表:

          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

          您必須研究系統(tǒng)受其影響的CPU漏洞,并相應(yīng)地選擇上述緩解措施。請記住,您將需要安裝微代碼更新,以完全免受這些漏洞的影響。但所有這些操作都可能導(dǎo)致性能顯著下降。

          結(jié)果

          如果遵循了以上所有建議(不包括特定的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用作引導(dǎo)加載程序,則可能需要重新生成GRUB配置文件才能應(yīng)用這些文件。

          hidepid

          proc是一個偽文件系統(tǒng),其中包含有關(guān)系統(tǒng)上當前正在運行的所有進程的信息。默認情況下,所有用戶都可以訪問此程序,這可能使攻擊者可以窺探其他進程。要只允許用戶看到自己的進程,而不能看到其他用戶的進程,則必須使用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系統(tǒng)上正常工作,必須創(chuàng)建/etc/systemd/system/systemd-logind.service.d/hidepid.conf并添加:

          [Service]
          SupplementaryGroups=proc

          減少內(nèi)核攻擊面

          最好禁用不是絕對必要的任何功能,以最大程度地減少潛在的內(nèi)核攻擊面。這些功能不必一定很危險,它們可以只是被刪除以減少攻擊面的良性代碼。切勿禁用您不了解的隨機事物。以下是一些可能有用的示例,具體取決于您的設(shè)置。

          引導(dǎo)參數(shù)

          引導(dǎo)參數(shù)通常可以用來減少攻擊面,這樣的例子之一是:

          ipv6.disable=1

          這將禁用整個IPv6堆棧,如果您尚未遷移到該堆棧,則可能不需要該堆棧。如果正在使用的IPv6,請不要使用此引導(dǎo)參數(shù)。

          將內(nèi)核模塊列入黑名單

          內(nèi)核允許非特權(quán)的用戶通過模塊自動加載來間接導(dǎo)致某些模塊被加載。這使攻擊者可以自動加載易受攻擊的模塊,然后加以利用。一個這樣的示例是CVE-2017-6074,其中攻擊者可以通過啟動DCCP連接來觸發(fā)DCCP內(nèi)核模塊的加載,然后利用該內(nèi)核模塊中的漏洞。

          可以通過將文件插入/etc/modprobe.d并將指定的內(nèi)核模塊列入黑名單的方法,將特定的內(nèi)核模塊列入黑名單。

          Install參數(shù)告訴modprobe運行特定命令,而不是像往常一樣加載模塊。/bin/false是僅返回1的命令,該命令實際上不會執(zhí)行任何操作。兩者都告訴內(nèi)核運行/bin/false 而不是加載模塊,這將防止攻擊者利用該模塊。以下是最有可能不需要的內(nèi)核模塊:

          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

          特別是模糊的網(wǎng)絡(luò)協(xié)議會增加大量的遠程攻擊面。此黑名單:

          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

          將各種稀有文件系統(tǒng)列入黑名單。

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

          如果不使用網(wǎng)絡(luò)文件系統(tǒng),也可以將其列入黑名單。

          install?vivid?/bin/false

          vivid driver[1]驅(qū)動程序僅用于測試目的,并且是特權(quán)提升漏洞的原因,因此應(yīng)禁用它。

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

          禁用具有安全問題歷史記錄的藍牙。

          install?uvcvideo?/bin/false

          這會禁用網(wǎng)絡(luò)攝像頭,以防止其被用來監(jiān)視您。

          您也可以將麥克風(fēng)模塊列入黑名單,但這在系統(tǒng)之間可能會有所不同。要查找模塊的名稱,請在/proc/asound/modules中查找并將其列入黑名單。例如,一個這樣的模塊是snd_hda_intel。

          請注意,盡管有時麥克風(fēng)的內(nèi)核模塊與揚聲器的模塊相同。這意味著像這樣禁用麥克風(fēng)也可能會無意中禁用任何揚聲器,雖然揚聲器也有可能變成麥克風(fēng),所以這不一定是消極的結(jié)果。

          最好從物理上刪除這些設(shè)備,或者至少在BIOS/UEFI中禁用它們。禁用內(nèi)核模塊并不總是那么有效。

          rfkill

          可以通過rfkill將無線設(shè)備列入黑名單,以進一步減少遠程攻擊面。要將所有無線設(shè)備列入黑名單,請執(zhí)行:

          rfkill?block?all

          WiFi可以通過以下方式解鎖:

          rfkill?unblock?wifi

          在使用systemd的系統(tǒng)上,rfkill在所有會話中均保持不變,但是,在使用其他init系統(tǒng)的系統(tǒng)上,您可能必須創(chuàng)建一個init腳本以在引導(dǎo)時執(zhí)行這些命令。

          其他內(nèi)核指針泄漏

          前面的部分已經(jīng)防止了一些內(nèi)核指針泄漏,但是還有更多泄漏。

          在文件系統(tǒng)上,/boot中存在內(nèi)核映像和System.map文件。/usr/src和/{,usr/} lib/modules目錄中還有其他敏感的內(nèi)核信息。您應(yīng)該限制這些目錄的文件權(quán)限,以使它們只能由root用戶讀取。您還應(yīng)該刪除System.map文件,因為除高級調(diào)試外,它們都不需要。

          此外,某些日志記錄守護程序(例如systemd的journalctl)包括內(nèi)核日志,可用于繞過上述dmesg_restrict保護。從adm組中刪除用戶通常足以撤銷對以下日志的訪問:

          gpasswd?-d?$user?adm

          限制對sysfs的訪問

          sysfs是偽文件系統(tǒng),可提供大量的內(nèi)核和硬件信息。它通常安裝在/sys上。sysfs導(dǎo)致大量信息泄漏,尤其是內(nèi)核指針泄漏。Whonix的security-misc軟件包包括hide-hardware-info腳本,該腳本限制訪問此目錄以及/proc中的一些腳本,以試圖隱藏潛在的硬件標識符并防止內(nèi)核指針泄漏。該腳本是可配置的,并允許基于組將特定的應(yīng)用程序列入白名單。建議應(yīng)用此方法,并使其在啟動時使用init腳本執(zhí)行?;蛘哌@樣做成systemd服務(wù)[2]。

          為了使基本功能在使用systemd的系統(tǒng)上運行,必須將一些系統(tǒng)服務(wù)列入白名單。這可以通過創(chuàng)建/etc/systemd/system/[email protected]/sysfs.conf并添加以下內(nèi)容來完成:

          [Service]
          SupplementaryGroups=sysfs

          但是,這不能解決所有問題。許多應(yīng)用程序可能仍會中斷,您需要將它們正確列入白名單。

          Linux強化

          某些發(fā)行版(例如Arch Linux)包括強化的內(nèi)核程序包。它包含許多強化補丁程序和更注重安全性的內(nèi)核配置。如果可能的話,建議安裝它。

          Grsecurity

          Grsecurity是一組內(nèi)核修補程序,可以大大提高內(nèi)核安全性。這些補丁曾經(jīng)可以免費獲得,但是現(xiàn)在需要購買[3]了。如果可用,則強烈建議您獲取它。Grsecurity提供了最新的內(nèi)核和用戶空間保護。

          內(nèi)核運行時防護

          Linux Kernel Runtime Guard(LKRG)是一個內(nèi)核模塊,可確保運行時內(nèi)核的完整性并檢測漏洞。它可以殺死整個類別的內(nèi)核漏洞。但這并不是一個完美的緩解方法,因為LKRG在設(shè)計上可以繞開。它僅適用于現(xiàn)成的惡意軟件。但是,盡管可能性不大,但LKRG本身可能會像其他任何內(nèi)核模塊一樣公開新的漏洞。

          自編譯內(nèi)核

          建議編譯您自己的內(nèi)核,同時啟用盡可能少的內(nèi)核模塊和盡可能多的安全性功能,以將內(nèi)核的受攻擊面保持在絕對最低限度。

          另外,應(yīng)用內(nèi)核強化補丁,例如如上所述的linux-hardened或grsecurity。

          發(fā)行版編譯的內(nèi)核還具有公共內(nèi)核指針/符號,這對于漏洞利用非常有用。編譯自己的內(nèi)核將為您提供獨特的內(nèi)核符號,連同kptr_restrict,dmesg_restrict和其他針對內(nèi)核指針泄漏的強化措施,將使攻擊者更加難以創(chuàng)建依賴于內(nèi)核指針知識的漏洞利用程序。

          您就可以從Whonix的強化內(nèi)核[4]中汲取靈感或使用它。

          強制訪問措施

          強制訪問控制(MAC)系統(tǒng)對程序可以訪問的內(nèi)容進行細粒度的控制。這意味著您的瀏覽器將無權(quán)訪問您的整個主目錄或類似目錄。

          最常用的MAC措施是SELinux和AppArmor。SELinux比AppArmor更安全,因為它的粒度更細。例如,它是基于inode而不是基于路徑的,允許強制執(zhí)行明顯更嚴格的限制,可以過濾內(nèi)核ioctl等。不幸的是,這是以難以使用和難以學(xué)習(xí)為代價的,因此某些人可能會首選AppArmor。

          要在內(nèi)核中啟用AppArmor,必須設(shè)置以下引導(dǎo)參數(shù):

          apparmor=1?security=apparmor

          要啟用SELinux,請設(shè)置以下參數(shù):

          selinux=1?security=selinux

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

          aa-genprof?$path_to_program

          打開程序,然后像往常一樣開始使用它。AppArmor將檢測需要訪問哪些文件,并將它們添加到配置文件中(如果您選擇的話)。但是,僅憑這一點不足以提供高質(zhì)量的配置文件。請參閱AppArmor文檔[5]以獲取更多詳細信息。

          如果您想更進一步,則可以通過實施initramfs勾子來設(shè)置一個完整的系統(tǒng)MAC策略,該策略限制每個單個用戶空間進程,該掛鉤對init系統(tǒng)強制實施MAC策略。這就是Android使用SELinux的方式,以及Whonix未來將如何使用AppArmor的方式。對于加強實施最小特權(quán)原則的強大安全模型是必要的。

          沙箱

          應(yīng)用沙箱

          沙箱可讓您在隔離的環(huán)境中運行程序,該環(huán)境對系統(tǒng)的其余部分具有有限的訪問權(quán)限或完全沒有訪問權(quán)限。您可以使用它們來保護應(yīng)用程序安全或運行不受信任的程序。

          建議與AppArmor或SELinux一起在單獨的用戶帳戶中使用Bubblewrap[6]到沙箱程序。您也可以考慮改用gVisor,它的優(yōu)點是為每個來賓提供了自己的內(nèi)核。

          這些方法中的任何一個都可以用來創(chuàng)建一個功能強大的沙箱,并且暴露的攻擊面最小。如果您不想自己創(chuàng)建沙箱,請在完成后考慮使用Whonix的sandbox-app-launcher。您不應(yīng)該使用Firejail[7]。

          諸如Docker和LXC之類的容器解決方案經(jīng)常被誤導(dǎo)為沙盒形式。它們太寬松了,無法廣泛支持各種應(yīng)用程序,因此不能認為它們是強大的應(yīng)用程序沙箱。

          常見沙箱逃逸

          PulseAudio

          PulseAudio是一種常見的聲音服務(wù)器,但在編寫時并未考慮隔離或沙盒的問題,這使其成為重復(fù)出現(xiàn)的沙盒逃逸漏洞。為了防止這種情況,建議您從沙箱中阻止對PulseAudio的訪問,或者從系統(tǒng)中完全卸載它。

          D-Bus

          D-Bus是臺式機Linux上最流行的進程間通信形式,但它也是沙箱逃逸的另一種常見途徑,因為它允許與服務(wù)自由交互。這些漏洞的一個例子就是Firejail。您應(yīng)該從沙箱中阻止對D-Bus的訪問,或者通過MAC以細粒度的規(guī)則進行調(diào)解。

          GUI隔離

          任何Xorg窗口都可以訪問另一個窗口。這允許瑣碎的鍵盤記錄或屏幕截圖程序,甚至可以記錄諸如root密碼之類的內(nèi)容。您可以使用嵌套的X11服務(wù)器(例如Xpra或Xephyr和bubblewrap)將Xorg窗口沙箱化。默認情況下,Wayland將窗口彼此隔離,這將是一個比Xorg更好的選擇,盡管Wayland可能不如Xorg普遍可用,因為它在開發(fā)中較早。

          ptrace

          如前所述,ptrace是一個系統(tǒng)調(diào)用,可能會被濫用破壞在沙箱外部運行的進程。為避免這種情況,您可以通過sysctl啟用內(nèi)核YAMA ptrace限制,也可以在seccomp過濾器中將ptrace syscall列入黑名單。

          TIOCSTI

          TIOCSTI是一個ioctl,它允許注入終端命令,并為攻擊者提供了一種簡單的機制,可以在同一用戶會話內(nèi)的其他進程之間橫向移動。可以通過將seccomp過濾器中的ioctl列入黑名單或使用bubblewrap的--new-session參數(shù)來緩解這種攻擊。

          Systemd沙箱

          雖然不建議使用systemd,但有些系統(tǒng)可能無法切換。這些人至少可以使用沙盒服務(wù),因此他們只能訪問所需的內(nèi)容。這是一個沙箱化systemd服務(wù)的示例:

          [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.

          您不能僅將此示例配置復(fù)制到您的配置中,每種服務(wù)的要求各不相同,并且必須針對每種服務(wù)微調(diào)沙箱。要了解有關(guān)您可以設(shè)置的所有選項的更多信息,請閱讀systemd.exec手冊頁[10]。

          如果您使用的系統(tǒng)不是systemd而是init,那么可以使用bubblewrap輕松復(fù)制所有這些選項。

          gVisor

          普通沙箱固有地與主機共享同一內(nèi)核。您信任我們已經(jīng)評估為不安全的內(nèi)核,可以正確限制這些程序。由于主機內(nèi)核的整個攻擊面已完全暴露,因此沙盒中的內(nèi)核利用程序可以繞過任何限制。已經(jīng)進行了一些努力來限制使用seccomp的攻擊面,但不足以完全解決此問題。

          GVisor是解決此問題的方法。它為每個應(yīng)用程序提供了自己的內(nèi)核,該內(nèi)核以內(nèi)存安全的語言重新實現(xiàn)了Linux內(nèi)核的大部分系統(tǒng)調(diào)用,從而提供了明顯更強的隔離性。

          虛擬機

          雖然不是傳統(tǒng)的“沙盒”,但虛擬機通過虛擬化全新系統(tǒng)來分離進程,從而提供了非常強大的隔離性。KVM是內(nèi)核模塊,它允許內(nèi)核充當管理程序,而QEMU是利用KVM的仿真器。Virt-manager和GNOME Boxs都是良好且易于使用的GUI,用于管理KVM / QEMU虛擬機。不建議使用Virtualbox的原因[11]有很多。

          強化內(nèi)存分配器

          hardened_malloc是一種硬化的內(nèi)存分配器,可為堆內(nèi)存損壞漏洞提供實質(zhì)性的保護。它很大程度上基于OpenBSD的malloc設(shè)計,但具有許多改進。

          可以通過LD_PRELOAD環(huán)境變量針對每個應(yīng)用程序使用hardened_malloc。例如,假設(shè)您編譯的庫位于/usr/lib/libhardened_malloc.so,則可以執(zhí)行:

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

          通過全局預(yù)加載該庫,也可以在系統(tǒng)范圍內(nèi)使用它,這是使用它的推薦方法。為此,請編輯/etc/ld.so.preload并插入:

          /usr/lib/libhardened_malloc.so

          盡管大多數(shù)應(yīng)用程序都可以正常工作,但hardened_malloc可能會破壞某些應(yīng)用程序。建議使用以下選項編譯hardened_malloc以最大程度地減少損壞:

          CONFIG_SLAB_QUARANTINE_RANDOM_LENGTH=0?CONFIG_SLAB_QUARANTINE_QUEUE_LENGTH=0?CONFIG_GUARD_SLABS_INTERVAL=8

          您還應(yīng)該使用sysctl設(shè)置以下內(nèi)容,以適應(yīng)hardened_malloc創(chuàng)建的大量保護頁:

          vm.max_map_count=524240

          Whonix項目[12]為基于Debian的發(fā)行版提供了hardened_malloc軟件包。

          強化編譯標志

          編譯自己的程序可以帶來很多好處,因為它使您能夠優(yōu)化程序的安全性。但是,執(zhí)行完全相反的操作并降低安全性很容易,如果您不確定自己在做什么,請?zhí)^本節(jié)。在基于源的發(fā)行版(例如Gentoo)上,這將是最簡單的,但也可以在其他發(fā)行版上這樣做。

          某些編譯選項可用于添加其他漏洞利用緩解措施,從而消除整個類別的常見漏洞。您可能聽說過常規(guī)保護,例如位置獨立可執(zhí)行文件,堆棧粉碎保護程序,立即綁定,只讀重定位和FORTIFY_SOURCE,但是本節(jié)將不做介紹,因為它們已被廣泛采用。相反,它將討論諸如控制流完整性和影子堆棧之類的現(xiàn)代漏洞利用緩解措施。

          本節(jié)涉及主要用C或C ++編寫的本機程序。您必須使用Clang編譯器,因為這些功能在GCC上不可用。請記住,由于未廣泛采用這些緩解措施,因此某些應(yīng)用程序在啟用它們后可能無法運行。

          控制流完整性(CFI)是一種緩解漏洞利用的方法,旨在防止諸如ROP或JOP之類的代碼重用攻擊。由于更廣泛采用的緩解措施(例如NX)使過時的利用技術(shù)過時了,因此使用這些技術(shù)利用了很大一部分漏洞。Clang支持細粒度的前沿CFI,這意味著它可以有效緩解JOP攻擊。Clang的CFI本身并不能減輕ROP;您還必須使用下面記錄的單獨機制。要啟用此功能,必須應(yīng)用以下編譯標志:-flto -fvisibility=hidden -fsanitize=cfi

          影子堆棧通過將程序復(fù)制到其他隱藏堆棧中來保護程序的返回地址。然后比較主堆棧和影子堆棧中的返回地址,看兩者是否不同。如果是這樣,則表明存在攻擊,程序?qū)⒅兄?,從而減輕了ROP攻擊。Clang具有稱為ShadowCallStack的功能,可以完成此操作,但是,僅在ARM64上可用。要啟用此功能,必須應(yīng)用以下編譯標志:-fsanitize=shadow-call-stack

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

          最常見的內(nèi)存損壞漏洞之一是未初始化的內(nèi)存。Clang有一個選項可以使用零或特定模式自動初始化變量。建議將變量初始化為零,因為使用其他模式比利用漏洞緩解功能更適合發(fā)現(xiàn)錯誤。要啟用此功能,必須應(yīng)用以下編譯標志:-ftrivial-auto-var-init=zero -enable-trivial-auto-var-init-zero-knowing-it-will-be-removed-from-clang 但該選項的存在目前正在辯論[13]中。

          內(nèi)存安全語言

          用內(nèi)存安全語言編寫的程序會自動受到保護,免受各種安全漏洞的影響,這些安全漏洞包括緩沖區(qū)溢出,未初始化的變量,售后使用等。Microsoft和Google的安全研究人員進行的研究證明,已發(fā)現(xiàn)的大多數(shù)漏洞都是內(nèi)存安全問題。這樣的內(nèi)存安全語言的示例包括Rust,Swift和Java,而內(nèi)存不安全語言的示例包括C和C ++。如果可行,應(yīng)使用內(nèi)存安全替代品替換盡可能多的程序。

          Root賬戶

          root可以執(zhí)行任何操作,并且可以訪問您的整個系統(tǒng)。因此,應(yīng)盡可能將其鎖定,以使攻擊者無法輕松獲得root用戶訪問權(quán)限。

          /etc/securetty

          /etc/securetty文件指定允許您以root用戶身份登錄的位置。該文件應(yīng)保留為空,以便任何人都不能從終端上這樣做。

          限制su

          su可讓您從終端切換用戶。默認情況下,它嘗試以root用戶身份登錄。要將su的使用限制在wheel組中,請編輯/etc/pam.d/su和/etc/pam.d/su-l并添加:

          auth?required?pam_wheel.so?use_uid

          您應(yīng)該在wheel組中擁有盡可能少的用戶。

          鎖定root賬戶

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

          passwd?-l?root

          在執(zhí)行此操作之前,請確保您具有獲取根的替代方法(例如,從活動USB引導(dǎo)并更改為文件系統(tǒng)的chroot),以免您無意中將自己鎖定在系統(tǒng)之外。

          拒絕通過SSH的遠程root登陸

          為了防止某人通過SSH以root身份登錄,請編輯/etc/ssh/sshd_config并添加:

          PermitRootLogin?no

          增加散列回合數(shù)

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

          password?required?pam_unix.so?sha512?shadow?nullok?rounds=65536

          這使shadow執(zhí)行65536次散列回合。

          應(yīng)用此設(shè)置后,密碼不會自動重新加密,因此您需要使用以下方法重置密碼:

          passwd?$username

          限制Xorg root訪問

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

          needs_root_rights?=?no

          安全訪問root

          惡意軟件可以使用多種方法來嗅探root帳戶的密碼。因此,訪問根帳戶的傳統(tǒng)方式是不安全的,最好根本不訪問根,但這實際上是不可行的。本節(jié)詳細介紹了訪問根帳戶的最安全方法。在安裝操作系統(tǒng)后,應(yīng)立即應(yīng)用這些說明,以確保該軟件不含惡意軟件。

          您絕對不能使用普通用戶帳戶訪問root,因為root可能已被盜用。您也不能直接登錄到根帳戶。通過執(zhí)行以下操作,創(chuàng)建一個單獨的“管理員”用戶帳戶,該帳戶僅用于訪問root用戶,而不能用于訪問其他用戶:

          useradd?admin

          執(zhí)行并來設(shè)置一個非常強的密碼:

          passwd?admin

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

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

          然后輸入:

          admin?ALL=(ALL)?ALL

          確保沒有其他帳戶可以訪問sudo(或您的首選機制)

          現(xiàn)在,要實際登錄到該帳戶,請先重新啟動-例如,這可以防止受損的窗口管理器執(zhí)行登錄欺騙。當提供登錄提示時,請通過按鍵盤上的以下組合鍵來激活安全注意鍵:

          Alt?+?SysRq?+?k

          這將殺死當前虛擬控制臺上的所有應(yīng)用程序,從而克服登錄欺騙攻擊?,F(xiàn)在,您可以安全地登錄到您的管理員帳戶,并使用root用戶執(zhí)行任務(wù)。完成后,注銷管理員帳戶,然后重新登錄到非特權(quán)用戶帳戶。

          防火墻

          防火墻可以控制傳入和傳出的網(wǎng)絡(luò)流量,并且可以用來阻止或允許某些類型的流量。除非有特殊原因,否則應(yīng)始終阻止所有傳入流量。建議設(shè)置嚴格的iptables或nftables防火墻?;饓Ρ仨氠槍δ南到y(tǒng)進行微調(diào),并且沒有一個適合所有防火墻的規(guī)則集。建議您熟悉創(chuàng)建防火墻規(guī)則。Arch Wiki[14]和手冊頁[15]都是很好的資源。

          這是基本iptables配置的示例,該配置禁止所有傳入的網(wǎng)絡(luò)流量:

          *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

          但是,您不應(yīng)嘗試在實際系統(tǒng)上使用此示例。它僅適用于某些臺式機系統(tǒng)。

          身份標識

          為了保護隱私,最好最大程度地減少可追溯到您的信息量。

          主機名和用戶名

          請勿在主機名或用戶名中添加唯一標識的內(nèi)容。將它們保留為通用名稱,例如“host”和“user”,以便它們無法識別您。

          Timezones / Locales / Keymaps

          如果可能,應(yīng)將您的時區(qū)設(shè)置為“ UTC”,將區(qū)域設(shè)置和鍵盤映射設(shè)置為“ US”。

          機器ID

          一個獨一無二的機器ID被存儲在/var/lib/dbus/machine-id (systemd系統(tǒng)是保存在/etc/machine-id)這些應(yīng)編輯為通用名稱,例如Whonix ID[16]

          b08dfa6083e7567a1921a715000001fb

          MAC地址欺騙

          MAC地址是分配給網(wǎng)絡(luò)接口控制器(NIC)的唯一標識符。每次您連接到網(wǎng)絡(luò)時(WIFI或以太網(wǎng))則您的MAC地址已暴露。這使人們可以使用它來跟蹤您并在本地網(wǎng)絡(luò)上唯一地標識您。

          但您不應(yīng)該完全隨機化MAC地址。擁有完全隨機的MAC地址是顯而易見的,并且會對您脫穎而出的行為產(chǎn)生不利影響。

          MAC地址的OUI(組織唯一標識符)部分標識芯片組的制造商。對MAC地址的這一部分進行隨機化處理可能會為您提供以前從未使用過的OUI,數(shù)十年來從未使用過的OUI或在您所在的地區(qū)極為罕見的OUI,因此使您脫穎而出,很明顯地表明您在欺騙MAC地址。

          MAC地址的末尾標識您的特定設(shè)備,并且可以用來跟蹤您的設(shè)備。僅對MAC地址的這一部分進行隨機化可防止您被跟蹤,同時仍使MAC地址看起來可信。

          要欺騙這些地址,請首先執(zhí)行以下命令找出您的網(wǎng)絡(luò)接口名稱:

          ip?a

          接下來,安裝macchanger并執(zhí)行:

          macchanger?-e?$network_interface

          要在每次引導(dǎo)時隨機分配MAC地址,您應(yīng)該為您的特定初始化系統(tǒng)創(chuàng)建一個初始化腳本。這是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替換為您的網(wǎng)絡(luò)接口。

          時間攻擊

          幾乎每個系統(tǒng)都有不同的時間。這可用于時鐘偏斜指紋攻擊,幾毫秒的差異足以使用戶被暴露識別。

          ICMP時間戳

          ICMP時間戳?xí)诓樵兇饛?fù)中泄漏系統(tǒng)時間。阻止這些攻擊的最簡單方法是利用防火墻阻止傳入連接,或者使內(nèi)核忽略ICMP請求。

          TCP時間戳

          TCP時間戳也會泄漏系統(tǒng)時間。內(nèi)核嘗試通過對每個連接使用隨機偏移量來解決此問題,但這不足以解決問題[17]。因此應(yīng)該禁用TCP時間戳,可以通過使用sysctl設(shè)置以下內(nèi)容來完成:

          net.ipv4.tcp_timestamps=0

          TCP初始化序號

          TCP初始序列號(ISN)是泄漏系統(tǒng)時間的另一種方法。為了減輕這種情況,您必須安裝tirdad內(nèi)核模塊[18],該模塊會生成用于連接的隨機ISN。

          時間同步

          時間同步對于匿名性和安全性至關(guān)重要。錯誤的系統(tǒng)時鐘可能使您遭受時鐘偏斜指紋攻擊,或者可以用來為您提供過時的HTTPS證書,從而繞過證書到期或吊銷。

          最流行的時間同步方法NTP是不安全的,因為它未經(jīng)加密和未經(jīng)身份驗證,因此攻擊者可以輕易地攔截和修改請求。NTP還會以NTP時間戳格式泄漏本地系統(tǒng)時間,該格式可用于時鐘偏斜指紋識別,如前所述。

          因此,您應(yīng)該卸載所有NTP客戶端并禁用systemd-timesyncd(如果正在使用)。您可以通過安全連接(HTTPS或最好是Torion服務(wù))連接到受信任的網(wǎng)站,而不是NTP,并從HTTP標頭中提取當前時間。達到此目的的工具是sdwdate或我自己的安全時間同步工具[19]。

          按鍵指紋

          可以通過他們在鍵盤上輸入鍵的方式來對人進行指紋識別。您可以通過鍵入速度,在兩次按鍵之間的暫停,每次按鍵被按下和釋放的確切時間等方式來唯一地進行指紋識別??梢允褂肒eyTrac[20]在線進行測試。

          Kloak[21]是一種工具,旨在通過混淆按鍵和釋放事件之間的時間間隔來克服這種跟蹤方法。當按鍵被按下時,它會引入隨機延遲,然后由應(yīng)用程序選擇。

          文件權(quán)限

          默認情況下,文件的權(quán)限是非常寬松的。您應(yīng)該在整個系統(tǒng)中搜索權(quán)限不當?shù)奈募湍夸洠ζ溥M行限制。例如,在諸如Debian之類的某些發(fā)行版中,用戶的Home目錄是全局可讀的。

          這可以通過執(zhí)行以下操作來限制:

          chmod?700?/home/$user

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

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

          在基于Debian的發(fā)行版中,必須使用dpkg-statoverride保留文件許可權(quán)。否則,它們將在更新期間被覆蓋。

          Whonix的SUID Disabler和Permission Hardener[22]會自動應(yīng)用本節(jié)中詳細介紹的步驟。

          setuid / setgid

          Setuid / SUID允許用戶使用二進制文件所有者的特權(quán)執(zhí)行二進制文件。這通常用于允許非特權(quán)用戶使用通常僅為root用戶保留的某些功能。因此,許多SUID二進制文件都有特權(quán)升級安全漏洞的歷史記錄。Setgid / SGID類似,但適用于組而不是用戶。要使用setuid或setgid位查找系統(tǒng)上的所有二進制文件,請執(zhí)行:

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

          然后,您應(yīng)該刪除不使用的程序上的所有不必要的setuid / setgid位,或?qū)⑵涮鎿Q為功能。要刪除setuid位,請執(zhí)行:

          chmod?u-s?$path_to_program

          要刪除setgid位,執(zhí)行:

          chmod?g-s?$path_to_program

          要向文件添加功能,請執(zhí)行:

          setcap?$capability+ep?$path_to_program

          或者,要刪除不必要的功能,請執(zhí)行:

          setcap?-r?$path_to_program

          umask

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

          umask?0077

          核心轉(zhuǎn)儲

          核心轉(zhuǎn)儲包含特定時間(通常是該程序崩潰時)該程序的已記錄內(nèi)存。它們可能包含敏感信息,例如密碼和加密密鑰,因此必須將其禁用。

          禁用它們的方法主要有三種:sysctl,systemd和ulimit

          sysctl

          通過sysctl設(shè)置以下設(shè)置:

          kernel.core_pattern=|/bin/false

          systemd

          創(chuàng)建/etc/systemd/coredump.conf.d/disable.conf并添加如下內(nèi)容:

          [Coredump]
          Storage=none

          ulimit

          編輯/etc/security/limits.conf并添加如下內(nèi)容:

          *?hard?core?0

          setuid進程

          即使在進行了這些設(shè)置之后,以提升的特權(quán)運行的進程仍可能會轉(zhuǎn)儲其內(nèi)存。

          為了防止他們這樣做,請通過sysctl設(shè)置以下內(nèi)容:

          fs.suid_dumpable=0

          Swap

          與核心轉(zhuǎn)儲類似,交換或分頁將部分內(nèi)存復(fù)制到磁盤,其中可能包含敏感信息。應(yīng)該將內(nèi)核配置為僅在絕對必要時進行交換,相應(yīng)的sysctl設(shè)置:

          vm.swappiness=1

          PAM

          PAM是用于用戶身份驗證的框架。這就是您登錄時使用的機制。您可以通過要求使用強密碼或在失敗的登錄嘗試后強制執(zhí)行延遲驗證來使其更加安全。

          要強制使用強密碼,可以使用pam_pwquality。它強制執(zhí)行密碼的可配置策略。例如,如果您希望密碼至少包含16個字符(最?。?,與舊密碼(difok)至少6個不同的字符,至少3個數(shù)字(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

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

          auth?optional?pam_faildelay.so?delay=4000000

          4000000 是4秒(以微秒為單位)。

          Microcode更新

          Microcode更新對于修復(fù)關(guān)鍵的CPU漏洞(如Meltdown和Spectre等)至關(guān)重要。大多數(shù)發(fā)行版都將這些發(fā)行版包含在其軟件倉庫中,例如Arch Linux[23]和Debian[24]。

          IPv6隱私擴展

          IPv6地址是從計算機的MAC地址生成的,從而使您的IPv6地址是唯一的,并直接綁定到計算機。隱私擴展會生成一個隨機的IPv6地址,以減輕這種形式的跟蹤。請注意,如果您開啟了MAC地址欺騙機制或禁用了IPv6,則無需執(zhí)行這些步驟。

          要啟用這些功能,請通過sysctl設(shè)置以下設(shè)置:

          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啟用隱私擴展,請創(chuàng)建/etc/systemd/network/ipv6-privacy.conf并添加:

          [Network]
          IPv6PrivacyExtensions=kernel

          分區(qū)和掛載選項

          文件系統(tǒng)應(yīng)分為多個分區(qū),以對其權(quán)限進行細粒度控制??梢蕴砑硬煌陌惭b選項以限制可以執(zhí)行的操作:

          • nodev - 禁止使用設(shè)備

          • nosuid - 禁止setuid或setgid位

          • noexec - 禁止執(zhí)行任何二進制文件

          這些安裝選項應(yīng)在/etc/fstab中盡可能設(shè)置。如果您不能使用單獨的分區(qū),請創(chuàng)建綁定掛載。一個更安全的/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??????

          請注意,可以通過shell腳本繞過noexec[25]。

          熵基本上反應(yīng)操作系統(tǒng)信息收集的隨機程度,對于諸如加密之類的事情至關(guān)重要。因此,最好通過安裝其他隨機數(shù)生成器(如haveged[26]和jitterentropy[27])從各種來源收集盡可能多的熵。

          為了使jitterentropy正確運行,必須通過創(chuàng)建/usr/lib/modules-load.d/jitterentropy.conf并添加以下內(nèi)容盡早加載內(nèi)核模塊:

          jitterentropy_rng

          RDRAND

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

          random.trust_cpu=off

          以root身份編輯文件

          建議不要以root用戶身份運行普通的文本編輯器。大多數(shù)文本編輯器可以做的不僅僅是簡單地編輯文本文件,而且還可以被利用。例如,以root身份打開vi并輸入:sh?,F(xiàn)在,您具有一個可以訪問整個系統(tǒng)的root shell,攻擊者可以輕松利用該shell。

          解決方案是使用sudoedit。這會將文件復(fù)制到一個臨時位置,以普通用戶身份打開文本編輯器,編輯該臨時文件并以root用戶身份覆蓋原始文件。這樣,實際的編輯器就不會以root身份運行。要使用sudoedit,執(zhí)行:

          sudoedit?$path_to_file

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

          EDITOR=nano?sudoedit?$path_to_file

          可以在/etc/environment中全局設(shè)置此環(huán)境變量。

          特定發(fā)行版的安全強化

          HTTP包管理器鏡像

          默認情況下,Linux發(fā)行版通常使用HTTP或HTTP和HTTPS鏡像的混合來從其軟件存儲庫下載軟件包。人們認為這很好,因為程序包管理器會在安裝前驗證程序包的簽名。但是,從歷史上看,已經(jīng)有很多繞過此方法的地方。您應(yīng)將軟件包管理器配置為從HTTPS鏡像專門下載以進行深度防御。

          APT seccomp-bpf

          自軟件包管理器Debian Buster以來,APT已支持可選的seccomp-bpf過濾。這限制了允許執(zhí)行APT的系統(tǒng)調(diào)用,這可能嚴重限制攻擊者嘗試利用APT中的漏洞時對系統(tǒng)造成危害的能力。要啟用此功能,請創(chuàng)建/etc/apt/apt.conf.d/40sandbox并添加:

          APT::Sandbox::Seccomp?"true";

          物理安全

          全盤加密可確保對驅(qū)動器上的所有數(shù)據(jù)進行加密,并且不會被物理攻擊者讀取。大多數(shù)發(fā)行版都支持在安裝過程中啟用加密,請確保設(shè)置了強密碼。您也可以使用dm-crypt[28]手動加密驅(qū)動器。

          請注意,全盤加密不包括/boot,這樣仍然可以修改內(nèi)核、引導(dǎo)加載程序和其他關(guān)鍵文件。為了完全防止篡改,您還必須實施經(jīng)過驗證的引導(dǎo)。

          BIOS / UEFI強化

          如果您仍在使用舊版BIOS,則應(yīng)遷移到UEFI,以利用較新的安全功能。大多數(shù)BIOS或UEFI實現(xiàn)都支持設(shè)置密碼。最好啟用它并設(shè)置一個非常強壯的密碼。雖然這是很弱的保護,因為重置密碼很簡單。它通常存儲在易失性內(nèi)存中,因此攻擊者只需要能夠卸下CMOS電池幾秒鐘,或者他們就可以使用某些主板上的跳線將其重置。

          您還應(yīng)該禁用所有未使用的設(shè)備和引導(dǎo)選項,例如USB引導(dǎo),以減少攻擊面。

          別忽略BIOS或UEFI的更新,確保將其更新。將其與常規(guī)操作系統(tǒng)更新一樣重要。

          此外,請參閱《NSA的硬件和固件安全指南》[29]

          Bootloader密碼

          引導(dǎo)加載程序會在引導(dǎo)過程的早期執(zhí)行,并負責(zé)加載操作系統(tǒng)。保護它非常重要,否則,它可能會被篡改。例如,本地攻擊者可以通過在啟動時使用init=/bin/bash作為內(nèi)核參數(shù)來輕松獲得root shell,該命令告訴內(nèi)核執(zhí)行/bin/bash而不是常規(guī)的init系統(tǒng)。您可以通過為引導(dǎo)加載程序設(shè)置密碼來防止這種情況。僅設(shè)置引導(dǎo)程序密碼不足以完全保護它。還必須按照以下說明設(shè)置經(jīng)過驗證的啟動。

          Grub

          要為GRUB設(shè)置密碼,請執(zhí)行:

          grub-mkpasswd-pbkdf2

          輸入您的密碼,該密碼將生成一個字符串。它將類似于“ grub.pbkdf2.sha512.10000.C4009… “ 。創(chuàng)建/etc/grub.d/40_password并添加:

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

          用grub-mkpasswd-pbkdf2生成的字符串替換“
          。
          username”將用于被允許使用GRUB命令行,編輯菜單項和執(zhí)行任何菜單項的超級用戶。對于大多數(shù)人來說,這只是“root”。

          重新生成您的配置文件,GRUB現(xiàn)在將受到密碼保護。

          要僅限制編輯引導(dǎo)參數(shù)并訪問GRUB控制臺,同時仍然允許您引導(dǎo),請編輯 /boot/grub/grub.cfg并在 “menuentry '$OSName' ”旁邊添加“ --unrestricted”參數(shù)。

          menuentry?'Arch?Linux'?--unrestricted

          您將需要再次重新生成配置文件以應(yīng)用此更改。

          Syslinux

          Syslinux可以設(shè)置主密碼或菜單密碼。引導(dǎo)任何條目都需要主密碼,而引導(dǎo)特定條目僅需要菜單密碼。

          要為Syslinux設(shè)置主密碼,請編輯/boot/syslinux/syslinux.cfg并添加:

          MENU?MASTER?PASSWD?$password

          要設(shè)置菜單密碼,請編輯/boot/syslinux/syslinux.cfg,并在帶有您要密碼保護的項目的標簽內(nèi),添加:

          MENU?PASSWD?$password

          將“ $password”替換為您要設(shè)置的密碼。

          這些密碼可以是純文本,也可以使用MD5,SHA-1,SHA-256或SHA-512進行散列。建議先使用強哈希算法(例如SHA-256或SHA-512)對密碼進行哈希處理,以避免將其存儲為明文形式。

          systemd-boot

          systemd-boot具有防止在引導(dǎo)時編輯內(nèi)核參數(shù)的選項。在loader.conf文件中,添加:

          editor?no

          systemd-boot并不正式支持保護內(nèi)核參數(shù)編輯器的密碼,但是您可以使用systemd-boot-password來實現(xiàn)[30]。

          驗證引導(dǎo)

          經(jīng)過驗證的引導(dǎo)通過密碼驗證來確保引導(dǎo)鏈和基本系統(tǒng)的完整性。這可用于確保物理攻擊者無法修改設(shè)備上的軟件。

          如果沒有經(jīng)過驗證的引導(dǎo),則一旦獲得物理訪問權(quán)限,就可以輕松繞過上述所有預(yù)防措施。經(jīng)過驗證的引導(dǎo)不僅像許多人認為的那樣是為了物理安全。它還可以用于防止遠程惡意軟件持久化——如果攻擊者設(shè)法破壞了整個系統(tǒng)并獲得了很高的特權(quán),則經(jīng)過驗證的引導(dǎo)將在重新引導(dǎo)后還原其更改,并確保它們無法持久化。

          經(jīng)過驗證的最常見的引導(dǎo)實現(xiàn)是UEFI安全引導(dǎo),但是它本身并不是一個完整的實現(xiàn),因為它僅會驗證引導(dǎo)加載程序和內(nèi)核,這意味著可以通過以下方法:

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

          遠程攻擊者(或不使用加密的物理攻擊者)可以簡單地修改操作系統(tǒng)的任何其他特權(quán)部分。例如,如果他們有修改內(nèi)核的特權(quán),那么他們也可以修改/sbin/init來有效地獲得相同的結(jié)果。因此,僅驗證內(nèi)核和引導(dǎo)加載程序不會對遠程攻擊者產(chǎn)生任何影響。為了減輕這種情況,您必須使用dm-verity[31]驗證基本操作系統(tǒng),盡管由于傳統(tǒng)Linux發(fā)行版的布局,這非常困難且笨拙。

          通常,很難在傳統(tǒng)Linux上實現(xiàn)可靠的經(jīng)過驗證的引導(dǎo)實現(xiàn)。

          USBs

          USB設(shè)備為物理攻擊提供了重要的攻擊面。例如BadUSB[32]和Stuxnet[33]是此類攻擊的范例。最佳實踐是禁止所有新連接的USB且僅將受信任設(shè)備列入白名單,USBGuard[34]對此非常有用。

          您也可以將nousb用作內(nèi)核引導(dǎo)參數(shù),以禁用內(nèi)核中的所有USB支持。可以sysctl設(shè)置kernel.deny_new_usb=1

          DMA攻擊

          直接內(nèi)存訪問(DMA)攻擊涉及通過插入某些物理設(shè)備來完全訪問所有系統(tǒng)內(nèi)存。這可以通過控制設(shè)備可訪問的內(nèi)存區(qū)域的IOMMU[35]或?qū)⑻貏e易受攻擊的內(nèi)核模塊列入黑名單來緩解。

          要啟用IOMMU,請設(shè)置以下內(nèi)核引導(dǎo)參數(shù):

          intel_iommu=on?amd_iommu=on

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

          efi=disable_early_pci_dma

          通過在非常早的啟動過程中禁用所有PCI橋接器上的busmaster位,此選項可修復(fù)上述IOMMU中的漏洞[36]。

          此外,Thunderbolt和FireWire通常容易受到DMA攻擊。要禁用它們,請將這些內(nèi)核模塊列入黑名單:

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

          冷啟動攻擊

          當攻擊者在擦除RAM中的數(shù)據(jù)之前對其進行分析時,就會發(fā)生冷啟動攻擊[37]。使用現(xiàn)代RAM時,冷啟動攻擊不太實用,因為RAM通常會在幾秒鐘或幾分鐘內(nèi)清除,除非將其放入冷卻液(如液氮或冷凍機)中。攻擊者必須在幾秒鐘內(nèi)將設(shè)備中的RAM棒拔出并將其暴露于液氮中,而且確保用戶不會注意到。

          如果冷啟動攻擊是威脅模型的一部分,請在關(guān)機后保護計算機幾分鐘,以確保沒有人可以訪問您的RAM記憶棒。您也可以將RAM棒焊接到主板上,以使其更難以卡住。如果使用筆記本電腦,請取出電池,然后直接用充電電纜供電。關(guān)機后請拔出電纜,以確保RAM徹底斷電無法訪問。

          在內(nèi)核自我保護啟動參數(shù)部分中,空閑時內(nèi)存清零選項將用零覆蓋內(nèi)存中的敏感數(shù)據(jù)。此外,強化的內(nèi)存分配器可以通過CONFIG_ZERO_ON_FREE配置選項清除用戶空間堆內(nèi)存中的敏感數(shù)據(jù)。盡管如此,某些數(shù)據(jù)仍可能保留在內(nèi)存中。

          此外,現(xiàn)代內(nèi)核還包括復(fù)位攻擊緩解[38]措施,該命令可命令固件在關(guān)機時擦除數(shù)據(jù),盡管這需要固件支持[39]。

          確保正常關(guān)閉計算機,以使上述緩解措施可以開始。

          如果以上都不適用您的威脅模型,則可以實施Tails的內(nèi)存擦除過程[40],該過程將擦除大部分內(nèi)存(視頻內(nèi)存除外),并且已被證明是有效的。

          最佳實踐

          一旦對系統(tǒng)進行了盡可能多的加固,就應(yīng)該遵循良好的隱私和安全性慣例:

          • 禁用或刪除不需要的東西以最小化攻擊面。

          • 保持更新。配置cron任務(wù)或init腳本以每天更新系統(tǒng)。

          • 不要泄漏有關(guān)您或您的系統(tǒng)的任何信息,無論它看起來多么渺小。

          • 遵循常規(guī)的安全和隱私建議[41]

          盡管已經(jīng)進行了強化,但您必須記住Linux仍然是一個有缺陷的操作系統(tǒng),沒有任何強化可以完全修復(fù)它。

          其他指南

          您應(yīng)該進行盡可能多的研究,而不要依賴單一的信息來源。最大的安全問題之一就是用戶。這些是我認為有價值的其他指南的鏈接:

          Arch Linux Security wiki page[42]
          Whonix Documentation[43]
          NSA RHEL 5 Hardening Guide[44](稍有過時,但仍包含有用的信息)
          KSPP recommended kernel settings[45]
          kconfig-hardened-check[46]

          術(shù)語

          您可能需要重新生成GRUB配置,以應(yīng)用對引導(dǎo)加載程序所做的某些更改。在不同的發(fā)行版之間,執(zhí)行此操作的步驟有時可能會有所不同。例如,在諸如Arch Linux之類的發(fā)行版上,應(yīng)通過執(zhí)行以下命令來重新生成配置文件:

          grub-mkconfig?-o?$path_to_grub_config

          "$path_to_grub_config" 取決于您如何設(shè)置系統(tǒng)。它通常是/boot/grub/grub.cfg或/boot/EFI/grub/grub.cfg,但是在執(zhí)行此命令之前,請務(wù)必確保正確。

          另外,在Debian或Ubuntu等發(fā)行版上,您應(yīng)該執(zhí)行以下命令:

          update-grub

          能力

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

          參考資料

          [1]vivid driver: https://www.kernel.org/doc/html/v4.12/media/v4l-drivers/vivid.html
          [2]做成systemd服務(wù): https://github.com/Whonix/security-misc/blob/master/lib/systemd/system/hide-hardware-info.service
          [3]需要購買: https://grsecurity.net/passing_the_baton
          [4]Whonix的強化內(nèi)核: https://www.whonix.org/wiki/Hardened-kernel
          [5]AppArmor文檔: https://gitlab.com/apparmor/apparmor/-/wikis/Documentation
          [6]Bubblewrap: https://github.com/containers/bubblewrap
          [7]您不應(yīng)該使用Firejail: https://madaidans-insecurities.github.io/linux.html#firejail
          [8]capabilities: https://madaidans-insecurities.github.io/guides/linux-hardening.html#capabilities
          [9]umask: https://madaidans-insecurities.github.io/guides/linux-hardening.html#umask
          [10]systemd.exec手冊頁: https://www.freedesktop.org/software/systemd/man/systemd.exec.html
          [11]原因: https://www.whonix.org/wiki/KVM#Why_Use_KVM_Over_VirtualBox.3F
          [12]Whonix項目: https://www.whonix.org/wiki/Hardened_Malloc
          [13]辯論: https://lists.llvm.org/pipermail/cfe-dev/2020-April/065221.html
          [14]Arch Wiki: https://wiki.archlinux.org/index.php/Iptables
          [15]手冊頁: https://linux.die.net/man/8/iptables
          [16]Whonix ID: https://github.com/Whonix/dist-base-files/blob/master/etc/machine-id
          [17]這不足以解決問題: https://forums.whonix.org/t/do-ntp-and-tcp-timestamps-really-leak-your-local-time/7824/10
          [18]安裝tirdad內(nèi)核模塊: https://github.com/0xsirus/tirdad
          [19]安全時間同步工具: https://gitlab.com/madaidan/secure-time-sync
          [20]KeyTrac: https://www.keytrac.net/en/tryout
          [21]Kloak: https://github.com/vmonaco/kloak
          [22]SUID Disabler和Permission Hardener: https://www.whonix.org/wiki/SUID_Disabler_and_Permission_Hardener
          [23]Arch Linux: https://wiki.archlinux.org/index.php/Microcode
          [24]Debian: https://wiki.debian.org/Microcode
          [25]通過shell腳本繞過noexec: https://chromium.googlesource.com/chromiumos/docs/+/master/security/noexec_shell_scripts.md
          [26]haveged: http://www.issihosts.com/haveged/
          [27]jitterentropy: https://github.com/smuellerDD/jitterentropy-rngd
          [28]dm-crypt: https://wiki.archlinux.org/index.php/Dm-crypt
          [29]《NSA的硬件和固件安全指南》: https://github.com/nsacyber/Hardware-and-Firmware-Security-Guidance
          [30]使用systemd-boot-password來實現(xiàn): https://github.com/kitsunyan/systemd-boot-password
          [31]dm-verity: https://www.kernel.org/doc/html/latest/admin-guide/device-mapper/verity.html
          [32]BadUSB: https://srlabs.de/bites/badusb/
          [33]Stuxnet: https://en.wikipedia.org/wiki/Stuxnet
          [34]USBGuard: https://usbguard.github.io/
          [35]IOMMU: https://en.wikipedia.org/wiki/Input–output_memory_management_unit
          [36]修復(fù)上述IOMMU中的漏洞: https://mjg59.dreamwidth.org/54433.html
          [37]冷啟動攻擊: https://en.wikipedia.org/wiki/Cold_boot_attack
          [38]復(fù)位攻擊緩解: https://lwn.net/Articles/730006/
          [39]固件支持: https://www.trustedcomputinggroup.org/wp-content/uploads/Platform-Reset-Attack-Mitigation-Specification.pdf
          [40]Tails的內(nèi)存擦除過程: https://tails.boum.org/contribute/design/memory_erasure/
          [41]常規(guī)的安全和隱私建議: https://madaidans-insecurities.github.io/security-privacy-advice.html
          [42]Arch Linux Security wiki page: https://wiki.archlinux.org/index.php/Security
          [43]Whonix Documentation: https://www.whonix.org/wiki/Documentation
          [44]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
          [45]KSPP recommended kernel settings: https://kernsec.org/wiki/index.php/Kernel_Self_Protection_Project/Recommended_Settings
          [46]kconfig-hardened-check: https://github.com/a13xp0p0v/kconfig-hardened-check/
          [47]capabilities: https://man7.org/linux/man-pages/man7/capabilities.7.html
          [48]可能會被濫用以獲取完整的root特權(quán): https://forums.grsecurity.net/viewtopic.php?t=252

          譯者Blog:http://blog.gaochao.me ?轉(zhuǎn)自:Freebuf ,翻譯:geekGao
          翻譯:www.freebuf.com/articles/system/266248.html

          推薦閱讀

          Linux 系統(tǒng)開機加電后發(fā)生了什么?

          Linux 網(wǎng)絡(luò)子系統(tǒng)

          Linux 虛擬網(wǎng)絡(luò)設(shè)備之 bridge

          利用 Linux 查找重復(fù)文件

          20 個提高生產(chǎn)力的 Linux 命令與技巧!

          瀏覽 38
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  人人人人人色 | 日本黄色A免费 | 久久夜色精品国产噜噜 | 视频一区二区三区免费 | 国产网站91 |