大多數(shù)時候,您的主要關注點是啟動和運行您的云應用程序。作為您的設置和部署過程的一部分,在您的系統(tǒng)和應用程序公開可用之前,為您的系統(tǒng)和應用程序構(gòu)建強大而全面的安全措施非常重要。在部署應用程序之前實施本教程中的安全措施將確保您在基礎架構(gòu)上運行的任何軟件都具有安全的基本配置,而不是可能在部署后實施的臨時措施。
本指南重點介紹了您在配置和設置服務器基礎架構(gòu)時可以采取的一些實用安全措施。此列表并非詳盡無遺地列出了您可以采取的所有措施來保護您的服務器,但它為您提供了一個可以構(gòu)建的起點。隨著時間的推移,您可以開發(fā)出更加量身定制的安全方法,以滿足您的環(huán)境和應用程序的特定需求。
SSH 密鑰
SSH,或安全外殼,是一種用于管理服務器和與服務器通信的加密協(xié)議。使用服務器時,您可能會將大部分時間花在通過 SSH 連接到服務器的終端會話中。作為基于密碼登錄的替代方案,SSH 密鑰使用加密來提供一種安全的登錄服務器的方式,建議所有用戶使用。
使用 SSH 密鑰,會創(chuàng)建一對私鑰和公鑰以用于身份驗證。私鑰由用戶保密和安全,而公鑰可以共享。這通常稱為非對稱加密,您可能會在其他地方看到這種模式。
要配置 SSH 密鑰身份驗證,您需要將您的公共 SSH 密鑰放在服務器上的預期位置(通常是~/.ssh/authorized_keys
)。要了解有關基于 SSH 密鑰的身份驗證如何工作的更多信息,請閱讀了解 SSH 加密和連接過程。
SSH 密鑰如何增強安全性?
使用 SSH,任何類型的身份驗證——包括密碼身份驗證——都是完全加密的。但是,當允許基于密碼的登錄時,惡意用戶可以反復自動嘗試訪問服務器,尤其是當它具有面向公眾的 IP 地址時。盡管在從同一 IP 多次嘗試失敗后有多種方法可以鎖定訪問權限,并且惡意用戶在實踐中會受到他們嘗試登錄您的服務器的速度的限制,但用戶可以合理地嘗試獲得訪問權限的任何情況通過反復的暴力攻擊對您的堆棧造成安全風險。
設置 SSH 密鑰身份驗證允許您禁用基于密碼的身份驗證。SSH 密鑰的數(shù)據(jù)位通常比密碼多得多——您可以從 12 個字符的密碼創(chuàng)建一個 128 個字符的 SSH 密鑰散列——這使得它們更難被暴力破解。盡管如此,一些加密算法仍被認為是可破解的,因為它試圖在足夠強大的計算機上對密碼哈希進行足夠多次的逆向工程。其他密鑰,包括由現(xiàn)代 SSH 客戶端生成的默認 RSA 密鑰,尚無法破解。
如何實現(xiàn) SSH 密鑰
SSH 密鑰是遠程登錄任何 Linux 服務器環(huán)境的推薦方式??梢允褂迷撁钤谀谋镜赜嬎銠C上生成一對 SSH 密鑰ssh
,然后您可以將公鑰傳輸?shù)竭h程服務器。
要在您的服務器上設置 SSH 密鑰,您可以按照如何為 Ubuntu、Debian 或 CentOS設置 SSH 密鑰進行操作。
對于堆棧中需要密碼訪問或容易受到暴力攻擊的任何部分,您可以在服務器上實施類似fail2ban的解決方案來限制密碼猜測。
最佳做法是不允許root
用戶直接通過 SSH 登錄。相反,以非特權用戶身份登錄,然后根據(jù)需要使用sudo
.?這種限制權限的方法被稱為最小權限原則。一旦你連接到你的服務器并創(chuàng)建了一個你已經(jīng)驗證可以使用 SSH 的非特權帳戶,你可以通過在你的服務器上設置指令來禁用root
登錄,然后使用類似命令重新啟動服務器的 SSH 進程。PermitRootLogin no
/etc/ssh/sshd_config
sudo systemctl restart sshd
防火墻
防火墻是一種軟件或硬件設備,用于控制服務如何暴露于網(wǎng)絡,以及允許哪些類型的流量進出給定服務器。正確配置的防火墻將確保只有應該公開可用的服務才能從您的服務器或網(wǎng)絡外部訪問。
在典型的服務器上,許多服務可能默認運行。這些可以分為以下幾組:
- 互聯(lián)網(wǎng)上任何人都可以訪問的公共服務,通常是匿名訪問。這方面的一個例子是為您的實際網(wǎng)站提供服務的網(wǎng)絡服務器。
- 只能由一組選定的授權帳戶或從特定位置訪問的私人服務。例如,像 phpMyAdmin 這樣的數(shù)據(jù)庫控制面板。
- 內(nèi)部服務應該只能從服務器本身訪問,而不會將服務暴露給公共互聯(lián)網(wǎng)。例如,一個應該只接受本地連接的數(shù)據(jù)庫。
防火墻可以確保根據(jù)上述類別以不同程度的粒度限制對軟件的訪問。公共服務可以保持開放并可供互聯(lián)網(wǎng)使用,而私人服務可以根據(jù)不同的標準(例如連接類型)進行限制??梢允箖?nèi)部服務完全無法訪問 Internet。對于未使用的端口,在大多數(shù)配置中訪問都被完全阻止。
防火墻如何增強安全性?
即使您的服務實現(xiàn)了安全功能或僅限于您希望它們在其上運行的接口,防火墻也可以作為基礎保護層,在應用程序處理流量之前限制進出您的服務的連接。
正確配置的防火墻將限制對除您需要保持打開的特定服務之外的所有內(nèi)容的訪問,通常只打開與這些服務關聯(lián)的端口。例如,SSH 一般運行在 22 端口,而通過 Web 瀏覽器進行的 HTTP/HTTPS 訪問通常分別運行在 80 和 443 端口。僅公開少量軟件可減少服務器的攻擊面,從而限制易受攻擊的組件。
如何實施防火墻
有許多適用于 Linux 系統(tǒng)的防火墻,有些比其他的更復雜。通常,當您更改服務器上運行的服務時,您只需要更改防火墻配置。以下是啟動和運行的一些選項:
- UFW 或 Uncomplicated Firewall 在某些 Linux 發(fā)行版(如 Ubuntu)上默認安裝。您可以在如何在 Ubuntu 20.04 上使用 UFW 設置防火墻中了解更多信息
- 如果您使用的是 Red Hat、Rocky 或 Fedora Linux,您可以閱讀如何使用 firewalld 設置防火墻以使用它們的默認工具。
- 許多軟件防火墻,如 UFW 和 firewalld 會將它們配置的規(guī)則直接寫入一個名為
iptables
.?要了解如何直接使用iptables
配置,您可以查看Iptables Essentials:通用防火墻規(guī)則和命令?。請注意,其他一些自行實現(xiàn)端口規(guī)則的軟件(例如 Docker)也會直接寫入,并且可能與您使用 UFW 創(chuàng)建的規(guī)則沖突,因此在這種情況下iptables
了解如何讀取配置會很有幫助。iptables
注意:許多托管服務提供商,包括 DigitalOcean,將允許您將防火墻配置為一項服務,該服務作為云服務器上的外部層運行,而不需要直接實施防火墻。這些配置使用托管工具在網(wǎng)絡邊緣實施,在實踐中通常不那么復雜,但編寫和復制腳本可能更具挑戰(zhàn)性??梢詤⒖糄igitalOcean的?云防火墻的文檔。
確保您的防火墻配置默認為阻止未知流量。這樣,您部署的任何新服務都不會無意中暴露在 Internet 上。相反,您將必須明確允許訪問,這將迫使您評估服務的運行方式、訪問方式以及誰應該能夠使用它。
專有網(wǎng)絡
虛擬私有云 (VPC) 網(wǎng)絡是基礎設施資源的私有網(wǎng)絡。VPC 網(wǎng)絡在資源之間提供更安全的連接,因為網(wǎng)絡的接口無法從公共互聯(lián)網(wǎng)訪問。
VPC 網(wǎng)絡如何增強安全性?
一些主機商會默認為你的云服務器分配一個公網(wǎng)接口和一個私網(wǎng)接口。在部分基礎設施上禁用公共網(wǎng)絡接口將只允許這些實例通過內(nèi)部網(wǎng)絡使用它們的專用網(wǎng)絡接口相互連接,這意味著您的系統(tǒng)之間的流量將不會通過公共互聯(lián)網(wǎng)路由,而它可能是暴露或攔截。
通過有條件地僅公開幾個專用互聯(lián)網(wǎng)網(wǎng)關(也稱為入口網(wǎng)關)作為 VPC 網(wǎng)絡資源和公共互聯(lián)網(wǎng)之間的唯一訪問點,您將對連接到您的資源的公共流量有更多的控制和可見性。像 Kubernetes 這樣的現(xiàn)代容器編排系統(tǒng)有一個定義非常明確的入口網(wǎng)關概念,因為它們默認創(chuàng)建了許多私有網(wǎng)絡接口,需要有選擇地公開這些接口。
如何實施 VPC 網(wǎng)絡
許多云基礎架構(gòu)提供商使您能夠在其數(shù)據(jù)中心內(nèi)創(chuàng)建資源并將其添加到 VPC 網(wǎng)絡。
注意:如果您正在使用 DigitalOcean 并希望設置自己的 VPC 網(wǎng)關,您可以按照如何將 Droplet 配置為 VPC 網(wǎng)關指南來了解如何在基于 Debian、Ubuntu 和 CentOS 的服務器上進行操作。
手動配置您自己的專用網(wǎng)絡可能需要高級服務器配置和網(wǎng)絡知識。設置 VPC 網(wǎng)絡的另一種方法是在服務器之間使用 VPN 連接。
VPN 和專用網(wǎng)絡
VPN 或虛擬專用網(wǎng)絡是一種在遠程計算機之間創(chuàng)建安全連接并將連接呈現(xiàn)為本地專用網(wǎng)絡的方法。這提供了一種方法來配置您的服務,就好像它們在專用網(wǎng)絡上一樣,并通過安全連接連接遠程服務器。
例如,DigitalOcean 私有網(wǎng)絡可以實現(xiàn)同一地區(qū)內(nèi)同一賬戶或團隊的服務器之間的隔離通信。
VPN 如何增強安全性?
使用 VPN 是一種繪制只有您的服務器可以看到的專用網(wǎng)絡的方法。通信將是完全私密和安全的。其他應用程序可以配置為通過 VPN 軟件公開的虛擬接口傳遞它們的流量。這樣,只有打算由公共互聯(lián)網(wǎng)上的客戶端使用的服務才需要在公共網(wǎng)絡上公開。
如何實施 VPN
使用專用網(wǎng)絡通常需要您在首次部署服務器時就網(wǎng)絡接口做出決定,并配置您的應用程序和防火墻以優(yōu)先使用這些接口。相比之下,部署 VPN 需要安裝額外的工具并創(chuàng)建額外的網(wǎng)絡路由,但通常可以部署在現(xiàn)有架構(gòu)之上。VPN 上的每個服務器都必須具有建立 VPN 連接所需的共享安全和配置數(shù)據(jù)。VPN 啟動并運行后,應用程序必須配置為使用 VPN 隧道。
如果您使用的是 Ubuntu 或 CentOS,則可以按照如何在 Ubuntu 20.04 上設置和配置 OpenVPN 服務器?教程進行操作。
Wireguard?是另一種流行的 VPN 部署。通常,VPN 遵循通過在幾個入口點后面實施一系列專用網(wǎng)絡接口來限制進入云服務器的相同原則,但是 VPC 配置通常是核心基礎設施考慮因素,VPN 可以部署在更臨時的基礎上.
服務審計
良好的安全性包括分析您的系統(tǒng)、了解可用的攻擊面并盡可能鎖定組件。
服務審計是了解給定系統(tǒng)上正在運行哪些服務、它們使用哪些端口進行通信以及這些服務正在使用哪些協(xié)議的一種方式。此信息可幫助您配置哪些服務應可公開訪問、防火墻設置、監(jiān)控和警報。
服務審計如何增強安全性?
每個正在運行的服務,無論是內(nèi)部服務還是公共服務,都代表了惡意用戶的擴展攻擊面。您運行的服務越多,漏洞影響您的軟件的可能性就越大。
一旦您對計算機上運行的網(wǎng)絡服務有了很好的了解,就可以開始分析這些服務。當您執(zhí)行服務審核時,請問自己以下有關每個正在運行的服務的問題:
- 該服務應該運行嗎?
- 服務是否在不應運行的網(wǎng)絡接口上運行?
- 該服務應該綁定到公共網(wǎng)絡接口還是專用網(wǎng)絡接口?
- 我的防火墻規(guī)則的結(jié)構(gòu)是否可以將合法流量傳遞到此服務?
- 我的防火墻規(guī)則是否阻止了不合法的流量?
- 我是否有一種方法可以接收有關這些服務中每一項服務漏洞的安全警報?
在您的基礎架構(gòu)中配置任何新服務器時,這種類型的服務審核應該是標準做法。每隔幾個月執(zhí)行一次服務審核也將幫助您發(fā)現(xiàn)配置可能已無意更改的任何服務。
如何實施服務審計
要審核系統(tǒng)上運行的網(wǎng)絡服務,請使用命令ss
列出服務器上正在使用的所有 TCP 和 UDP 端口。顯示用于偵聽 TCP 和 UDP 流量的程序名稱、PID 和地址的示例命令是:
p
、l
、u
、n
和選項的工作方式t
如下:
p
顯示使用給定套接字的特定進程。l
僅顯示正在主動偵聽連接的套接字。u
包括 UDP 套接字(除了 TCP 套接字)。n
顯示數(shù)字流量值。t
包括 TCP 套接字(除了 UDP 套接字)。
您將收到類似于此的輸出:
Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
tcp LISTEN 0 128 0.0.0.0:22 0.0.0.0:* users:(("sshd",pid=812,fd=3))
tcp LISTEN 0 511 0.0.0.0:80 0.0.0.0:* users:(("nginx",pid=69226,fd=6),("nginx",pid=69225,fd=6))
tcp LISTEN 0 128 [::]:22 [::]:* users:(("sshd",pid=812,fd=4))
tcp LISTEN 0 511 [::]:80 [::]:* users:(("nginx",pid=69226,fd=7),("nginx",pid=69225,fd=7))
需要注意的主要列是 Netid、Local Address:Port 和 Process name 列。如果 Local Address:Port 是0.0.0.0,則該服務正在接受所有 IPv4 網(wǎng)絡接口上的連接。如果地址是,[::]則服務正在接受所有 IPv6 接口上的連接。在上面的示例輸出中,SSH 和 Nginx 都在 IPv4 和 IPv6 網(wǎng)絡堆棧上的所有公共接口上進行偵聽。
您可以決定是否要允許 SSH 和 Nginx 在兩個接口上偵聽,或者只在一個或另一個上偵聽。通常,您應該禁用在未使用的接口上運行的服務。
無人值守更新
為確保良好的基本安全級別,必須使用補丁程序使您的服務器保持最新狀態(tài)。運行過時的服務器和不安全的軟件版本是大多數(shù)安全事件的罪魁禍首,但定期更新可以緩解漏洞并防止攻擊者在您的服務器上站穩(wěn)腳跟。無人值守更新允許系統(tǒng)自動更新大部分軟件包。
無人值守更新如何增強安全性?
實施無人值守(即自動)更新可降低保持服務器安全所需的工作量,并縮短服務器易受已知錯誤影響的時間。如果出現(xiàn)影響服務器上軟件的漏洞,無論您運行更新需要多長時間,您的服務器都將容易受到攻擊。每日無人值守升級將確保您不會遺漏任何軟件包,并且一旦修復程序可用,任何易受攻擊的軟件都會得到修補。
如何實現(xiàn)無人值守更新
您可以參考如何保持 Ubuntu 服務器更新,了解在 Ubuntu 上實現(xiàn)無人值守更新的概述。
公鑰基礎設施和 SSL/TLS 加密
公鑰基礎設施或 PKI 是指旨在創(chuàng)建、管理和驗證用于識別個人和加密通信的證書的系統(tǒng)。SSL 或 TLS 證書可用于相互驗證不同的實體。經(jīng)過身份驗證后,它們還可以用于建立加密通信。
PKI 如何增強安全性?
為您的服務器建立證書頒發(fā)機構(gòu) (CA) 和管理證書允許您的基礎設施中的每個實體驗證其他成員的身份并加密他們的流量。這可以防止攻擊者模仿您的基礎架構(gòu)中的服務器來攔截流量的中間人攻擊。
每個服務器都可以配置為信任一個集中的證書頒發(fā)機構(gòu)。之后,可以隱式信任由該機構(gòu)簽署的任何證書。
如何實施 PKI
配置證書頒發(fā)機構(gòu)和設置其他公鑰基礎結(jié)構(gòu)可能涉及相當多的初始工作。此外,當需要創(chuàng)建、簽署或撤銷新證書時,管理證書會增加額外的管理負擔。
對于許多用戶來說,實施成熟的公鑰基礎設施只有在他們的基礎設施需求增長時才有意義。使用 VPN 保護組件之間的通信可能是一種更好的中間措施,直到您達到 PKI 值得額外管理成本的地步。
如果您想創(chuàng)建自己的證書頒發(fā)機構(gòu),可以參考如何設置和配置證書頒發(fā)機構(gòu) (CA)指南,具體取決于您使用的 Linux 發(fā)行版。
結(jié)論
本教程中概述的策略是對您可以用來提高系??統(tǒng)安全性的一些步驟的概述。重要的是要認識到,您等待實施安全措施的時間越長,其有效性就會降低。安全不應該是事后才想到的,必須在您首次配置基礎設施時實施。一旦您有了一個安全的基礎,您就可以開始部署您的服務和應用程序,并確保它們默認在安全的環(huán)境中運行。
即使有一個安全的起始環(huán)境,請記住安全是一個持續(xù)和迭代的過程。始終務必問問自己任何更改可能帶來的安全影響是什么,以及您可以采取哪些步驟來確保始終為您的軟件創(chuàng)建安全的默認配置和環(huán)境。