雲服務器ECS安全組實踐(一)

摘要: 應用上雲除了對資源生命週期管理和應用交付是一個轉變,更重要是思維方式的轉變。本篇文章就簡單介紹下上雲的一個重要概念安全組(Security Group)。本文是安全組系列的第一篇,主要介紹安全組的基本概念、約束和如何配置入網規則。

應用上雲除了對資源生命週期管理和應用交付是一個轉變,更重要是思維方式的轉變。本篇文章就簡單介紹下上雲的一個重要概念安全組(Security Group)。本文是安全組系列的第一篇,主要介紹安全組的基本概念、約束和如何配置入網規則。

安全組的基本概念和約束

安全組在雲端提供類似虛擬防火牆功能,用於設置單個或多個 ECS 實例的網絡訪問控制,它是重要的安全隔離手段。在創建 ECS 實例時,必須選擇一個安全組。您還可以添加安全組規則,對該安全組下的所有 ECS 實例的出方向和入方向進行網絡控制。

安全組有下面的限制:

  • 每個賬戶最多可以建立50個安全組,每個安全組最多100個安全組規則
  • 一個實例最多可以加入5個同種網絡類型的安全組
  • 同一個安全組之內的資源默認是網絡通的,不同安全組之間的資源默認是網絡不通
  • 安全組應該是白名單的性質的,所以需要儘量開通最小的權限,默認拒絕所有的訪問
  • 單個安全組最大支持1000個實例

當您創建一個安全組的時候,默認規則均爲出方向 accept all,入方向 deny all。安全組的出入規則,很多客戶在使用的時候並沒有按照自己的應用規範劃分。使得自己的應用加大了收到攻擊的風險。

安全組的出入規則可以參見下面的文檔:

  • 安全組In方向的訪問權限設置
  • 安全組Out方向的訪問權限設置

除了可以限制IP和CIDR網段之外,安全組的出入規則可以直接引用另外一個安全組,這樣就避免了有些時候CIDR或者IP的不靈活,直接對另外一個安全組中的資源授權。通過這樣間接的可以通過安全組對應用進行分層。

  • 安全組的入網規則,可以設置爲另外一個相同網絡類型(“專有網絡”或”經典網絡”)的安全組。屬性爲SourceGroupId
  • 安全組的出網規則,可以設置爲另外一個相同網絡類型(“專有網絡”或”經典網絡”)的安全組。屬性爲DestGroupId
  • 出入規則是可以設置Priority來設置權重,1爲最高,100爲最低
  • 安全組也支持跨帳號授權,這個屬於高級功能,我們在以後的文章介紹

在上雲的時候,很多的客戶沒有重視安全組的出入規則的設置和長遠的規劃,影響了自己的業務擴展性。合理的規劃安全組是能幫助應用降低被攻擊的風險,同時可以幫助應用之間的結構和層次更清晰。下面是安全組最佳實踐的第一篇。

最佳實踐

在開始安全組的實踐之前,下面有一些基本的建議。

  • 首先安全組應該作爲白名單使用, 這是最重要的規則。
  • 使用最小的原則開放自己的應用出入規則,例如可以選擇開放具體的端口例如80。
  • 使用一個安全組來管理所有的應用將會非常難以配置,因爲不同的分層一定有不同的需求。
  • 對於今天的常見的分佈式應用來說,不同的應用類型應該使用不同的安全組,例如我們對Web、Service、Database、Cache層使用不同的安全組暴漏不同的出入規則和權限。
  • 也沒有必要爲每個實例設置一個安全組,這樣管理起來的成本也非常高。
  • 優先考慮VPC網絡
  • 不需要公網訪問的資源不要提供公網IP
  • 因爲一個實例可以分配多個安全組,所以一個實例可能同時應用數百條規則。我們聚合所有分配的安全規則以判斷是否允許流入或留出,但龐大的安全組規則可能會增加您管理上的複雜程度。因此,我們建議您儘可能保持單個安全組的規則簡潔。

調整線上的安全組的出入規則是比較危險的動作,如果您不確定的情況下不要隨意的更新安全組的出入規則的設置。 阿里雲的控制檯提供了克隆安全組和安全組規則的功能,您在修改安全組和規則的時候建議Clone一個相同的安全組,然後進行調試,避免直接影響線上應用。

本文先介紹一些安全組的入網規則的實踐建議。

1. 不要使用0.0.0.0/0的入網規則

允許全部入網訪問是經常犯的錯誤。使用0.0.0.0/0意味着所有的端口都對外暴漏了訪問權限。這個是非常的不安全的。因此正確的做法是首先拒絕所有的端口對外開放。安全組應該是白名單訪問。如果您需要暴漏服務,如果是Web服務,默認情況下可以只開放 80、8080、443之類的常用TCP端口。其它的端口都關閉。

{ "IpProtocol" : "tcp", "FromPort" : "80", "ToPort" : "80", "SourceCidrIp" : "0.0.0.0/0", "Policy": "accept"} ,
{ "IpProtocol" : "tcp", "FromPort" : "8080", "ToPort" : "8080", "SourceCidrIp" : "0.0.0.0/0", "Policy": "accept"} ,
{ "IpProtocol" : "tcp", "FromPort" : "443", "ToPort" : "443", "SourceCidrIp" : "0.0.0.0/0", "Policy": "accept"} ,

2. 關閉不需要的入網規則

如果您當前使用的入規則已經包含了0.0.0.0/0。首先您要重新審視下自己的應用需要對外暴漏的端口和服務。在確定某些端口是不想直接對外提供服務的可以加一條拒絕的規則。如果您的服務器上也自己安裝了Mysql數據庫服務,默認情況下您是不應該暴漏3306到公網的。您可以添加一條拒絕規則如下所示,下面的規則添加了一條拒絕規則。先將其設置的優先級爲100,優先級最低。

{ "IpProtocol" : "tcp", "FromPort" : "3306", "ToPort" : "3306", "SourceCidrIp" : "0.0.0.0/0", "Policy": "drop", Priority: 100} ,

上面的調整直接將導致所有的端口都不能訪問3306。這樣非常有可能阻止您的正常的業務需求。您可以通過授權另外一個安全組的資源進行如規則訪問。

3. 授權另外一個安全組入網訪問

不同的安全組按照最小原則開放相應的出入規則。對於不同的應用分層應該使用不同的安全組,不同的安全組相應的出入規則。

例如對於常見的分佈式應用,我們都會區分不同的安全組,由於不同的安全組可能網絡是不能通訊的,這個時候直接授權IP或者CIDR網段就是非常痛苦的,我們可以直接授權另外一個安全組id的所有的資源都可以直接訪問。例如我們的應用對Web、Database創建了不同的安全組, sg-web, sg-databse。在sg-database中我們可以加一條下面的規則,授權所有的sg-web安全組的資源可以訪問我們的3306端口。

{ "IpProtocol" : "tcp", "FromPort" : "3306", "ToPort" : "3306", "SourceGroupId" : "sg-web", "Policy": "accept", Priority: 2} ,

4. 授權另外一個CIDR可以入網訪問

經典網絡中由於網段不太可控,我們建議您使用安全組ID來授信入網規則,但是VPC中我們的IP地址是可以自己規劃的,您可以通過不同的VSwitch來設置不同的IP域。

在VPC環境中,我們可以默認的拒絕所有的訪問。然後授信自己的專有網絡的網段可以訪問。通過直接授信可以相信的CIDR網段。

{ "IpProtocol" : "icmp", "FromPort" : "-1", "ToPort" : "-1", "SourceCidrIp" : "10.0.0.0/24", Priority: 2} ,
{ "IpProtocol" : "tcp", "FromPort" : "0", "ToPort" : "65535", "SourceCidrIp" : "10.0.0.0/24", Priority: 2} ,
{ "IpProtocol" : "udp", "FromPort" : "0", "ToPort" : "65535", "SourceCidrIp" : "10.0.0.0/24", Priority: 2} ,

5. 變更安全組規則步驟和說明

變更安全組規則可能會導致您的實例間網絡通信受到影響,爲避免必要的網絡通信受到影響,請嘗試以下方法先放行必要的實例,再執行安全組策略收緊變更。執行收緊變更後請觀察一段時間,確認業務應用無異常後再執行其它必要的變更

  • 將需要互通訪問的實例,加入同一個安全組再執行變更操作。您可以選擇新建一個安全組,將需要互通的實例加入這個新的安全組後,安全組內的實例內網即可互通。
  • 將需要互通訪問的對端實例所綁定的安全組ID,添加到實例安全組授權規則中;
  • 將需要互通訪問的對端實例內網IP,添加到實例安全組授權規則中;

具體操作指引請參見 安全組設置內網互通的方法

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章