在實際的生產環境中,開發和測試人員都儘可能的保證安全,以避免一些重要資訊泄露甚至被竊取。許多企業或組織還擁有較為完善的威脅建模,但即便如此安全問題仍層出不窮。有的企業則期望通過互聯網上的白帽或黑帽們,來幫助他們共同完成企業的安全建設。但是作為企業需要明白一點,並不是所有的白帽或黑帽,都願意將自己的安全建議分享給他們。對於安全防護也不僅僅是使用 2FA 和密碼管理器,安裝更新和不點選可疑連結這一口號那麼簡單。
這篇文章的內容其實我在一些安全會議上已經演講過兩回了,在這裏我對部分內容做了一些修改並希望再次分享給大家,主要面向那些剛剛學習或瞭解 Linux 安全的人。在本文我並不會實際討論 Web 應用的安全,想要了解和學習這方面的內容,大可以參考 OWASP Top 10 它可以教會開發和測試人員有關 SQL 隱碼攻擊,CSRF,XSS,會話管理等知識。如果你擔心的是更加高階的攻擊者,並且需要防範可能的惡意程式碼或提權指令碼被執行,那麼在本文中你將學習到你想了解的知識。遠端的入侵者甚至是一個不起眼的內部威脅者,此時可能早已潛伏在你的系統中伺機而動。
以下我會提到一些基本概念,幷包含相關的工具。同時,在這裏你需要問你自己:
ACL(訪問控制列表)
你的基礎設施是否分為不同的系統,具有不同的基於角色的訪問級別,或者使用者擁有完全相同的特權?
acl: getfacl+setfacl
系統審計
你是否已對登入到某台機器的使用者執行考慮周全?
檢視:auditd, go-audit
靜態分析和 fuzzing
你可能正在執行 C/C++。內存安全問題,佔據了大多數出現的漏洞。你是否對這些程式碼做過審計,靜態分析或 fuzzing 測試以確保它們的安全性?你是否考慮過在 Rust 中開發?
檢視:afl, Radamsa, Sulley, boofuzz, Coverity Scan, Valgrind, sanitizers
互聯網分段
你是否已將你的後端與你的前端及負載均衡器正確分離?你是否花時間設定了公司 VPN,並授予你的機器私有的內部地址?
檢視: iptables, ufw
隔離
你的員工是否將他們的工作電腦用於個人活動,例如遊戲或與其工作無關的應用程式?或者他們是否有使用像虛擬機器或容器一類的東西來進行訊息傳遞,瀏覽,開發……?
檢視: Qubes, VirtualBox
檔案許可權和 umask
任何對 Unix 有基礎瞭解的人,都不會對檔案許可權感到陌生。如果你沒有嚴格控制某些檔案的讀寫執行許可權,那麼我強烈建議你按照最嚴格的規範實施許可權控制。
更多內容
容器
集裝箱化在理論上對安全有很大的幫助。但我想知道誰被允許建立並將鏡像站羣投入生產環境,他們是否也進行了簽名和驗證,並對安全更新和 CVE 進行監控?
檢視:Docker, LXC
利用威脅情報
從 IPv4 地址空間發起惡意 IP 流,準備進行 DDoS 攻擊的殭屍互聯網以及自動化的利用掃描正在進行。你可以自己收集有關此類活動的情報,也可以訂閲相關產品的 feed 或黑名單列表。但你的端點/防火牆,是否有對此作出反應併合並這些資訊?
檢視:威脅情報資源列表
防火牆和包過濾
你多久審查一次你的 iptables 規則或你是否瞭解你的路由器/防火牆執行的內容,有沒有對它們進行執行驗證測試?你是否正確配置了包過濾規則,以確保機器只能與那些需要的資料通訊?
檢視:pfSense, OPNsense
DNS 和域名註冊商
你為此鎖定了多少努力?你已經付出了多少努力來鎖定它?當你的域名站羣服務器或 DNS 區域檔案被未經授權更改時,你是否會收到相應警報?此外,你是否啓用了 DNSSEC?
就我個人而言,我建議將 Namecheap 作為註冊服務商,並將 Cloudflare 用於高效能 DNS 。
物理訪問
如果我是法院的執法人員,資料中心工作人員或你的 WordPress 託管服務提供商,我是否可以自由的的讀取你站羣服務器的內容(全盤加密除外)?當你的磁碟退役或更換時,其中的內容是否會被擦除?如果有人將 USB 插入 1U 機架站羣服務器,你是否會收到警報提醒?
檢視:LUKS/cryptsetup
你有確定性的構建嗎?
當開發人員將構建程式碼推送到生產環境中時,你是否可以驗證這些程式碼的真實意圖,並且保證原始碼或靜態連結的依賴關係未被惡意修改?
檢視:Gitian
驗證數字簽名
毫無疑問,你可能會從一些非官方站點獲取或下載一些程式碼和站羣軟件。那麼在團隊成員繼續構建或安裝之前,你是否比較過校驗和/雜湊或驗證了該下載的簽名?
檢視:使用 GnuPG 製作和驗證簽名
沙盒環境
它是否具有 AppArmor 配置檔案,seccomp 過濾器或 RBAC 策略,指定它在系統呼叫和訪問許可權方面的功能?
檢視:seccomp, AppArmor
TLS 和加密配置
你是否已經完全棄用那些不安全的加密套件和演算法(例如 MD5,SHA1,RC4)?並在相容性和使用者期望上選擇最佳的加密方式,HMAC 和金鑰交換演算法。如果可用,優先考慮使用 RSA 加密演算法。這適用於 OpenSSH,GnuPG,OpenVPN 等。使用 Let’s Encrypt.t 即可輕鬆獲得 ssl 的免費證書。
檢視:應用密碼加固,SSL 和 TLS,站羣服務器端 TLS
公金鑰管理
如果你的每個員工都擁有自己的金鑰,請考慮在整個域中對其進行同步,並將金鑰移出版本控制。
檢視:GPGSync, sops, Vault
HTTP 頭安全
關於 HTTP 頭安全,這裏有一個列表可供大家參考:X-Frame-Options, X-XSS-Protection, X-Content-Type-Options, X-Download-Options, X-Permitted-Cross-Domain-Policies, Content-Security-Policy, Referrer-Policy, Strict-Transport-Security, Public-Key-Pins 。這些響應頭的正確配置,對安全也至關重要。
檢視: securityheaders.io, Mozilla web 安全指南
檔案完整性監控
你是否對重要檔案做定期檢查,已確保檔案未被修改並生成被更改的警報?
檢視: Tripwire, OSSEC
入侵檢測
或許你已經部署了多種型別的入侵檢測工具,但你是否僅僅只是按照預設的規則配置來執行它,並沒有花費時間來學習相關的技術知識,以及根據自身應用情況來配置合適的規則集?
檢視:比較基於 WordPress 主機的入侵檢測系統,Snort
漏洞管理
通過訂閲郵件,我們可以獲取新的漏洞報告並修復漏洞。那麼,你還記得你最後一次檢查 CVE 活動是什麼時候嗎?
檢視:Nessus, CoreOS clair
基礎系統的安全
你是否真的完全信任 Debian/Ubuntu,RHEL 或任何公司的第三方站羣軟件儲存庫,可以始終為你提供非惡意的站羣軟件包?這裏有一個想法:你可以 WordPress 託管自己的儲存庫,固定到特定的版本,並且僅在測試後才升級。
或者,你也可以執行基於 Alpine 或 LinuxKit 的極小操作系統,這樣可以最大程度上的減少你的攻擊面。
LSM(Linux 安全模組)
即 AppArmor 或 SELINUX,他們最近是否為你做過任何事情?
Linux 核心加固
這裏我建議大家直接去檢視 PaX 和 grsecurity 補丁。前不久被曝出的 Spectre 和 Meltdown 漏洞,也為我們的核心安全問題敲響了警鐘。
檢視:grsecurity.net,Linux 核心安全衞士,核心自我保護專案
移除不必要的裝置
如果你沒有使用 Thunderbolt,Firewire,無線網絡卡或任何具有 DMA(直接內存訪問)模式的模組,那麼你就沒有理由載入這些核心模組。
檢視:核心模組黑名單列表
日誌過濾
也許你還在通過手動的方式檢查日誌檔案,那麼你應該學會編寫 Logstash 過濾和 grok pattern 。 Grok 是 Logstash 最重要的插件外掛。你可以在 grok 裏預定義好命名正規表示式,在稍後 (grok 引數或者其他正規表示式裏) 引用它。它非常適用於 syslog logs,apache 和一些其他的 webserver logs,以及 mysql logs 。 grok 有很多定義好 pattern,當然也可以自己定義。
檢視:Filebeat, rsyslog, Logstash
你如何監控資源的使用情況?
RAM,CPU 負載,可用磁碟空間。這些雖然看上去無關緊要,但這些地方都是發生異常活動的關鍵位置,因此值得一提。
檢視:Metricbeat, Prometheus node_exporter, Nagios, Osquery
基礎設施測試
人們對站羣軟件測試的各個方面都很熟悉,但對於基礎設施的測試卻並不熟悉。你如何確保你的系統狀態始終符合你的預期?
檢視:Serverspec, Testinfra
平台和韌體安全
你的 BIOS 和其他低階介面受到錯誤影響。英特爾®AMT 和管理引擎,以及 Computrace 應被禁用。下面連結提供了一個非常有用的用於分析系統韌體和硬體元件安全性的框架。
檢視:CHIPSEC
保護遠端 shell
sshd 通用準則:禁用 root 登入,使用金鑰代替密碼,並設定暴破防護。而更好的站羣解決方案是將其放置在 VPN 後面,通過驗證的 Tor 隱藏服務,或者需要埠試探來動態開啓一些特定埠連線 WordPress 主機。
檢視:fail2ban, denyhosts, sshguard, Secure Secure Shell
Webserver 最佳實踐
如果你不想泄露你當前正在執行站羣服務器的版本資訊,對於 nginx 你可以通過將引數 server_tokens 設為 off 來實現,如果是 Apache 則將 ServerSignature 設為 off 即可。
在執行依賴於動態指令碼語言的複雜應用程式時,請考慮執行類似 ModSecurity 的 WAF(Web 應用程式防火牆)。 Cloudflare 正大規模的向其客户提供此項服務。
次要因素
我強烈推薦使用 YubiKey,它有很多有用的功能。它可以配置為輸出靜態密碼(非常適合 PAM 使用者登入或掛載卷加密),HOTP 或通用雙因素(U2F)認證,或者可以使用 OpenPGP 智慧卡。這些裝置對於任何系統管理員來説都是不可或缺的。為此,我已經發布了詳細的 YubiKey GPG+SSH 的安裝指南。
DNS 解析
你的/etc/resolv.conf 檔案是否正確配置? Quad9 是谷歌公共 DNS 或 OpenDNS 的替代產品,可阻止客户端訪問惡意域名,這與 Chrome 瀏覽器通過安全瀏覽功能來保護使用者的功能類似。所以將你的域名站羣服務器設定為 9.9.9.9 將能更好的保障你的安全。
審計信任方
除了讓系統的可信根證書儲存保持最新之外,還應該每隔一段時間檢查一次包管理器,以檢視哪些第三方是可信的,他們的儲存庫簽名金鑰是否足夠強大(許多仍使用 1024-bit DSA),並刪除那些過期的。
嘗試:apt-key list, rpm -qa gpg-pubkey
簽名 git 提交和標籤
目前,幾乎所有人都在使用 git 進行版本控制。當你釋出新版本時,它是否基於 GPG 簽名 git 標籤?如果你喜歡,你也可以簽名提交。