假設今天你人在家,突然收到同事的訊息:「洧杰網站出問題了,求救 RRR!!!」
於是乎你打開電腦,準備用 SSH 遠端登入 AWS 上的 EC2 主機,卻發現怎麼連都連不上
奇怪,白天在公司明明可以,TCP 22 也有開啊?
這就接回我們本日的主題哩,Port 有開,但允許的來源是誰?
上一篇我們認識了 Security Group(安全群組),後面簡稱 SG,也知道 Inbound 是連進來、Outbound 是連出去。今天就用這個情境,繼續看規則裡的 Port 跟 Source(來源)
先回到這張全貌圖,今天一樣看橘色的 SG,本日主角就是旁邊那一小格的「TCP 443、來源 0.0.0.0/0」
這裡也幫大家整理一下目前我們走到哪裡:
| 已經認識的部分 | 在處理什麼? | 今天接著看什麼? |
|---|---|---|
| 藍色 VPC、Subnet | 主機放在哪個網路範圍 | 主機就算放在同一個網路,也要確認安全規則 |
| 紫色路由表、IGW | 資料往哪裡送、透過哪個 Internet 出入口 | 有路可以走,還要看 SG 有沒有允許 |
| 橘色 SG | 哪些連線可以通過 | Port 是連哪個服務,Source 是允許哪個來源 |
例如網站要給大家看,但 SSH 遠端登入只想給辦公室,資料庫只想給網站主機連
都是「允許連進來」,允許的對象卻不一樣,這樣資訊安全才能做到落實把關
或許大家會很疑惑,不是在教 AWS 嗎?為啥要花時間講這段,但真正安全的雲服務設計,絕大部分時間都得在這些最基礎實務上的網路安全做好把關,才能讓基礎設計好好運作勒 :D
我們繼續接著下去~
假設網站要給大家看,但遠端登入主機的 SSH 只給辦公室使用,可以像這樣設定:
| 用途 | 協定 | Port | 來源 Source |
|---|---|---|---|
| HTTPS 網站 | TCP | 443 | 0.0.0.0/0 |
| SSH 遠端登入 | TCP | 22 | 203.0.113.10/32 |
203.0.113.10 是這篇舉例用的 IP,實際設定 SSH 來源時,要換成公司對外連線使用的公有 IP;網站那一行的 0.0.0.0/0 則表示所有 IPv4 來源
第一行是在說:「允許任何 IPv4 來源連到 TCP 443。」第二行則是:「只有來源 IP 是 203.0.113.10,才能連到 TCP 22。」(可以看下 AWS 規則範例)
前幾篇我們看過 /16、/24,這裡的 /32 就是只指定一個 IPv4 位址。而 0.0.0.0/0 的範圍包含所有 IPv4 位址
如果整間辦公室共用一個對外 IP,那符合 /32 的可能有好幾台電腦,不是只認得你這個人。SSH 登入時需要的金鑰等驗證,也還是要照常處理
所以 Port 是允許連哪個服務,來源是允許誰來連。想限制哪些來源可以用 SSH 連進來,要改的是來源才是。如果把規則的 22 改成 443,不會讓 SSH 自動變安全,也不會讓主機上的 SSH 服務跟著換 Port 哦
回到剛剛的情境,假設公司對外連線使用的公有 IP 是 203.0.113.10,家裡的是 198.51.100.20,而 EC2 使用的 SG 只有前面那條 SSH 規則
白天從公司連,來源符合 203.0.113.10/32。晚上換成家裡直接連,來源就不符合了
同一個人、同一台筆電、同一把 SSH 金鑰,也會因為來源 IP 不同,被 SG 擋住
那公司限制這麼嚴,人在家遇到問題,要怎麼處理?
假設公司原本就有一套透過 VPN 與遠端桌面,讓工程師遠端處理主機問題的流程,你在家使用的是公司核准、符合設備要求的筆電
VPN 可以讓你透過加密連線,連到公司允許你使用的內部主機或服務。在這個例子裡,公司只開放你連到需要的管理電腦,沒有把整個內網都開給你
那流程就可以整理成:
公司核准的筆電 → 公司 VPN+MFA → 遠端操作公司管理電腦 → SSH 到 EC2
你先登入公司 VPN,完成 MFA 多因素驗證,例如密碼加上驗證器,再透過遠端桌面操作公司管理電腦。接下來,是在公司那台電腦上執行 SSH,連到 EC2
如果公司電腦是透過公司的網路連到 EC2,EC2 看到的來源就是公司的公有 IP,所以會符合規則
所以雖然你人還坐在家裡,送到 EC2 的這段 SSH,已經是從公司電腦發出去了。SG 檢查的是連線來源,不是工程師現在坐在哪裡~
注意,這裡限制的是「SSH 連進這台 EC2」,不是說整個 AWS 網站都只能在公司登入。AWS Console(你用瀏覽器操作 AWS 的管理頁面)的登入與權限,是另外一件事
也不能這樣想勒,圖裡綠色的勾勾,只代表來源符合 SG 規則,不代表 SSH 已經登入成功。公司核准的設備與流程、MFA、操作權限和紀錄仍然要做得 ok
如果公司電腦被入侵,也可能從同一個 IP 發出連線,所以不能只看公司 IP 就認定安全、合規,這裡也可以看(AWS 遠端存取說明)
我覺得也不一定,還是看公司的技術長決定要怎麼規劃
前面是公司已經有這套流程的例子。如果是重新規劃工程師要怎麼遠端管理 EC2,也可以評估 AWS Systems Manager Session Manager:透過 IAM 控制誰能連哪台主機,不必先繞回公司電腦
也不用為這種連線開放 SSH 的連入 Port。就提供給讀者另一個選項(官方介紹)
如果改成筆電連上 VPN 後直接 SSH,EC2 看到的來源,要看這段 SSH 是走家裡的網路,還是透過 VPN 走公司的網路,不一定會變成公司 IP 哩。前面圖裡則是由公司電腦發出 SSH,兩種情況就也不一樣(AWS 說明:哪些連線會走 VPN)
那直接增加家裡的 IP 呢?如果公司政策允許,而且經過核准,可以新增家裡的 /32 規則;原本辦公室還要用,就保留原本那條。臨時開放的來源,用完也要依流程移除
但不要為了救急,把 SSH 來源直接改成 0.0.0.0/0,或把一個 IP 的 /32 放大成整段 /24。那會把不需要的來源一起放進來
從上面分享的系列,你就發現要連進 ec2 主機有很多種方式,你也能從上面所提到的關鍵字來評估,究竟公司要採取哪種方式可以既嚴謹又保持彈性空間勒 :D
剛剛看的是工程師從外面連 EC2,接下來回到第一張全貌圖,把網站再往後接一段:網站上的後端程式要查資料,所以會主動連到資料庫
下面用 Web 代表網站主機,DB 代表資料庫主機。兩台都在同一個 VPC,透過私有 IP 直接連線
這裡以 PostgreSQL 資料庫常用的 TCP 5432 為例
我們把網站使用的 SG 叫 web-sg,資料庫使用的叫 db-sg。如果 DB 只需要給網站主機查資料,可以在 db-sg 的 Inbound 放這一行:
| 協定 | Port | 來源 Source |
|---|---|---|
| TCP | 5432 | web-sg 對應的 SG ID |
這意思是 允許使用這個 web-sg 的來源主機,連到 DB 的 TCP 5432。AWS 實際用來辨認 SG
這張圖先假設路由、Web 的出站規則,以及其他網路與服務設定都正常,DB 也沒有其他允許規則。我們只看「新的連線能不能通過 DB 的 Inbound」
你會發現,兩邊都要連 TCP 5432,但只有上面使用 web-sg 的主機符合來源條件,下面那台不符合
例如網站的私有 IP 從 10.0.1.10 換成 10.0.1.30,只要新的網站主機仍然使用這個 web-sg,DB 就不必為這次 IP 變動修改來源
相對來說,另一台主機就算也在同一個 Subnet,沒有使用 web-sg,也不會符合這條規則
這裡再來換個條件,假如 IP 沒變,但 Web 改成只使用另一個 new-web-sg 呢?這時就不符合原本的來源了,因為 DB 規則的來源,填的還是舊的 web-sg
所以要看的是「Web 現在實際使用哪個 SG」,不能只看主機的 IP 有沒有變
那 web-sg 裡如果有開網站的 443,會不會也複製到 DB?
不會喔,這裡只是拿 web-sg 辨認哪些來源符合規則,沒有把它整份規則搬過來。DB 允許的仍然是這一行寫的 TCP 5432
不過,網站主機的 Outbound 也要允許它連到資料庫的 TCP 5432。你在 DB 設定「允許網站主機連進來」,不會連網站主機那邊的規則也一起改好,兩邊都要確認喔
最後把今天的內容串起來看
假設資料庫原本給報表主機使用,它的 Inbound 只有這條:
| 協定 | Port | 來源 Source |
|---|---|---|
| TCP | 5432 | report-sg |
現在網站也要查同一個資料庫。網站只使用 web-sg,但 DB 的規則允許的是 report-sg,所以雖然 Port 一樣,網站發起的新連線還是不符合來源條件
這時候如果報表主機也還要用,就新增一條 web-sg 的規則:
| 協定 | Port | 來源 Source |
|---|---|---|
| TCP | 5432 | report-sg,保留報表用途 |
| TCP | 5432 | web-sg,新增網站用途 |
不用為了網站,把原本的報表來源換掉,也不用把資料庫開給所有 IP
檢查的順序也可以照這個順序看:
| 檢查的地方 | 要確認什麼? |
|---|---|
| 路由表 | 到對方的 IP 有沒有可用的路徑? |
| Web 的 Outbound | 有沒有允許連到 DB 的 TCP 5432? |
| DB 的 Inbound | TCP 5432 有允許嗎?來源是不是 Web 實際使用的 SG? |
| 主機上的服務 | 主機的防火牆有允許嗎?資料庫程式有在對應的 IP 與 Port 接收連線嗎? |
| 重點 | 詳細節使 |
|---|---|
| Port 跟來源 | 一個是連哪個服務,一個是誰可以來連 |
| SSH 的來源 | 看實際連線從哪個 IP 來,/32 是一個 IPv4 位址 |
| 在家處理主機問題 | 依公司核准的流程連線,來源符合不代表全部安全條件都滿足 |
| 來源填 SG | 辨認使用該 SG 的來源,不會複製對方的規則 |
| 多一個使用者或用途 | 原本還需要的規則保留,再增加需要的來源 |
回頭看第一張全貌圖,紫色路由表管資料往哪裡送,橘色 SG 則要繼續確認方向、Port 跟來源
下次如果你聽到工程師問「我明明已經開 Port 了,怎麼還是連不上」,就可以接著問:
這樣就比較知道要查哪一段出了問題,不用看到連不上,就把所有設定亂改一通.. 冏
希望這篇有讓你對 SG 的規則更有概念,我們下篇見 :D