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

本文將繼續安全組的介紹,本篇涉及到下面的幾個內容:

  • 授權和撤銷安全組規則
  • 加入安全組和離開安全組

阿里雲的網絡類型分爲經典網絡和VPC,他們對安全組支持不同的設置規則。對於經典網絡你可以設置下面的幾個規則: 內網入方向、內網出方向、公網入方向、公網出方向。對於VPC網絡可以設置: 內網入方向、內網出方向。

在開始本篇之前描述幾個安全組內網通訊的概念:

  • 默認情況下只有同一個安全組的機器可以網絡互通,即便同一個用戶的兩個安全組的機器內網網絡也不通。這個對於經典網絡和VPC網絡都適用。所以經典網絡的雲服務器也是內網安全的。
  • 如果您的非同一個安全組的兩臺雲服務網絡內網可以互通而這又不符合您的預期,請檢查您的安全組內網規則設置。如果內網協議存在下面的協議,建議您重新設置。如果是經典網絡這樣會導致您的內網暴漏給其它的訪問。
    • 允許所有端口
    • 授權對象爲CIDR網段 (SourceCidrIp): 0.0.0.0/0 或者 10.0.0.0/8的規則
  • 如果資源創建在不同的安全組內,想實現網絡互通就需要通過安全組進行授權。對於內網訪問,我們建議您使用源安全組授權不要使用CIDR網段。

安全規則主要是描述不同的訪問權限,主要有下面的屬性:

  • Policy: 授權策略 accept or drop
  • Priority: 優先級根據創建的時間降序排序匹配。規則優先級可選範圍爲1-100,默認值爲1,即最高優先級。數字越大,代表優先級越低。
  • NicType:當對安全組進行相互授權時(即指定了SourceGroupId且沒有指定SourceCidrIp),必須指定NicType爲intranet。
  • 規則描述,通過安全組授權,NicType只能選擇intranet,和通過CIDR授權只能二選一
    • SourceGroupId: 通過安全組,默認對SourceCidrIp授權
    • IpProtocol: tcp | udp | icmp | gre | all
    • PortRange: 例如 80/80
    • SourceGroupOwnerAccount 非可選,僅爲跨帳號授權的時候
  • 通過CIDR授權規則:
    • SourceCidrIp: CIDR的網段
    • IpProtocol: tcp | udp | icmp | gre | all
    • PortRange: 例如 80/80
    • SourceGroupOwnerAccount 非可選,僅爲跨帳號授權的時候

授權一條入網請求規則

當在控制檯或者API創建一個安全組,是不存在任何的安全規則,意味着默認情況下您的入網請求全部是拒絕的。所以您要適度的配置您的入網規則。

如果需要開啓公網的80端口對外提供HTTP服務,由於公網訪問,我們期望的是入網儘可能多訪問,所以在IP網段上不做限制,設置爲 0.0.0.0/0。可以參考下面的屬性,括號外爲控制檯參數,括號內爲OpenApi參數,兩者相同就不做區分。

  • 網卡類型(NicType):公網(internet)如果是VPC類型的只需要填寫intranet, 通過EIP實現
  • 授權策略(Policy):允許(accept)
  • 規則方向(NicType):入網
  • 協議類型(IpProtocol):TCP(tcp)
  • 端口範圍(PortRange):80/80
  • 授權對象(SourceCidrIp): 0.0.0.0/0
  • 優先級(Priority): 1

上面的建議僅對公網有效,內網請求嚴格不建議使用CIDR網段,請參加下文

禁止一個入網請求規則

禁止一條規則就比較簡單。只需要配置一條拒絕策略,但是同時設置較低的優先級即可,這樣當需要的時候您可以通過配置其它的高優先級的規則覆蓋這條規則即可。例如下面就設置了拒絕6379端口被訪問。

  • 網卡類型(NicType):內網(intranet)
  • 授權策略(Policy):拒絕(drop)
  • 規則方向(NicType):入網
  • 協議類型(IpProtocol):TCP(tcp)
  • 端口範圍(PortRange):6379/6379
  • 授權對象(SourceCidrIp): 0.0.0.0/0
  • 優先級(Priority): 100

經典網絡的內網安全組規則不要使用CIDR或者IP授權

對於經典網絡的服務器,阿里雲默認不開啓任何內網的入規則。內網的授權一定要謹慎。爲了安全考慮,非常不建議開啓任何基於CIDR網段的授權,對於彈性計算來說內網的IP經常變化的,其次這個IP的網段是沒有規律的,所以對於經典網絡的內網我們只建議您通過安全組授權內網的訪問。

例如您在安全組 sg-redis上構建了一個redis的集羣,爲了只允許特定的機器訪問這個redis的服務器編組,例如 sg-web,您不需要配置任何的CIDR,只需要添加一條入規則即可,指定相關的安全組id即可。

  • 網卡類型(NicType):內網(intranet)
  • 授權策略(Policy):允許(accept)
  • 規則方向(NicType):入網
  • 協議類型(IpProtocol):TCP(tcp)
  • 端口範圍(PortRange):6379/6379
  • 授權對象(SourceGroupId): sg-web
  • 優先級(Priority): 1

對於VPC類型的如果您已經通過多個VSwitch規劃好了自己IP範圍設置,您可以通過CIDR設置,但是如果您的VPC網段不夠清晰的話也建議優先考慮使用安全組作爲入規則。

將需要互相通信的雲服務器加入同一個安全組

在上一篇中我們提到,一個雲服務器最多可以屬於5個安全組。還有一條原則是同一安全組之間的雲服務器是網絡互通的,如果您在規劃的時候已經有多個安全組,而直接設置多個安全規則過於複雜的話,您可以選擇需要內網通信的機器,將它們加入同一個安全組即可。

安全組是區分網絡類型的,對於一個經典類型的雲服務器只可以選擇加入經典網絡的安全組,對於VPC類型的雲服務器只可以加入本VPC的安全組。

這裏也不建議您將所有的雲服務器都加入一個安全組,將會使得您的安全組規則設置變成夢魘。對於一箇中大型應用來說,每個服務器編組的角色不同,要合理的規劃自己的入方向請求和出方向請求是非常有必要的。

加入一個安全組非常簡單,您可以在控制檯選擇一個雲服務器,然後點擊更多->選擇安全組管理即可,或者選擇實例詳情,進入本實例安全組查看進行操作。

如果您對阿里雲的OpenApi非常熟悉,您可以通過OpenApi方便的進行批量操作, 對應的python片段如下:

def join_sg(sg_id, instance_id):
    request = JoinSecurityGroupRequest()
    request.set_InstanceId(instance_id)
    request.set_SecurityGroupId(sg_id)
    response = _send_request(request)
    return response
    
    # send open api request

def _send_request(request):
    request.set_accept_format('json')
    try:
        response_str = clt.do_action(request)
        logging.info(response_str)
        response_detail = json.loads(response_str)
                return response_detail
    except Exception as e:
        logging.error(e)

將雲服務器移除安全組

如果雲服務器加入不合適的安全組,將會導致暴漏或者Block您的服務,這個時候你可以選擇將服務器從這個安全組中移除。由於雲服務器必須屬於一個安全組,您需要另外一個安全組。

加入一個安全組非常簡單,您可以在控制檯選擇一個雲服務器,然後更多->選擇安全組管理即可,或者選擇實例詳情,進入本實例安全組查看進行操作。

將雲服務器從安全組移出,將會導致這個雲服務器和當前安全組內的網絡不通,建議您做好充分的測試。

對應的python片段如下

def leave_sg(sg_id, instance_id):
    request = LeaveSecurityGroupRequest()
    request.set_InstanceId(instance_id)
    request.set_SecurityGroupId(sg_id)
    response = _send_request(request)
    return response
    # send open api request

def _send_request(request):
    request.set_accept_format('json')
    try:
        response_str = clt.do_action(request)
        logging.info(response_str)
        response_detail = json.loads(response_str)
            return response_detail
    except Exception as e:
        logging.error(e)

定義合理的安全組名稱和TAG

合理的安全組名稱和描述非常有助於您快速的識別當前的複雜的規則的組合含義。所以您可以在通過修改名稱和描述來,同時安全組也支持TAG標籤來設置。您可以通過TAG來分組管理自己的安全組。您可以在控制檯直接設置,或者通過API來設置TAG。

刪除不需要的安全組

我們提到,安全組中的安全規則類似於一條條的白名單和黑名單。對於不需要的安全組請不要保留,以免錯誤的加入某個雲服務器而造成不必要的麻煩。

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