本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
使用 AWS Config 部署公有子網路的偵測屬性型存取控制
由 Alberto Menendez 建立 (AWS)
環境:PoC 或試行 | 技術:安全、身分、合規;聯網 | AWS 服務:AWSConfig;Amazon SNS |
Summary
分散式邊緣網路架構依賴於與虛擬私有雲端 () 中的工作負載一起執行的網路邊緣安全性VPCs。相較於更常見、集中的方法,這提供了前所未有的可擴展性。雖然在工作負載帳戶中部署公有子網路可以帶來好處,但它也會帶來新的安全風險,因為它會增加攻擊面。建議您僅部署 Elastic Load Balancing (ELB) 資源,例如 Application Load Balancer 或這些 公有子網路中的NAT閘道VPCs。在專用公有子網路中使用負載平衡器和NAT閘道,可協助您針對傳入和傳出流量實作精細的控制。
建議您同時實作預防性和偵測性控制項,以限制可部署在公有子網路中的資源類型。如需使用屬性型存取控制 (ABAC) 部署公有子網路的預防性控制項的詳細資訊,請參閱部署公有子網路的預防性屬性型存取控制 。雖然對大多數情況有效,但這些預防性控制可能無法解決所有可能的使用案例。因此,此模式以 ABAC方法為基礎,可協助您設定有關部署在公有子網路中不合規資源的提醒。解決方案會檢查彈性網路介面是否屬於公有子網路中不允許的資源。
為了達成此目標,此模式使用 AWSConfig 自訂規則 和 ABAC
若要判斷網路介面是否在規則範圍內,規則會檢查子網路是否具有表示其為公有子網路的特定AWS標籤。例如,此標籤可能是
IsPublicFacing=True
。如果網路介面部署在公有子網路中,規則會檢查建立此資源AWS的服務。如果資源不是ELB資源或NAT閘道,則會將該資源標記為不合規。
先決條件和限制
先決條件
作用中AWS帳戶
AWS 設定,在工作負載帳戶中設定
在工作負載帳戶中部署所需資源的許可
VPC 具有公有子網路的
正確套用標籤以識別目標公有子網路
(選用) Organizations 中的AWS組織
(選用) 作為 Config 和 AWS Security Hub AWS 委派管理員的中央安全帳戶
架構
目標架構
此圖展示了以下要點:
部署或修改彈性網路介面資源 (
AWS::EC2::NetworkInterface
) 時,Config AWS 會擷取事件和組態。AWS 組態會將此事件與用於評估組態的自訂規則相符。
與此自訂規則相關聯的 AWS Lambda 函數會叫用。函數會評估資源,並套用指定的邏輯,以判斷資源組態是
COMPLIANT
、NON_COMPLIANT
還是NOT_APPLICABLE
。如果資源確定為
NON_COMPLIANT
,Config AWS 會透過 Amazon Simple Notification Service (Amazon ) 傳送警示SNS。注意:如果此帳戶是 AWS Organizations 中的成員帳戶,您可以透過 Config 或 AWS Security Hub AWS 將合規資料傳送至中央安全帳戶。
Lambda 函數評估邏輯
下圖顯示 Lambda 函數套用的邏輯,以評估彈性網路介面的合規性。
自動化和擴展
此模式是一種偵測性解決方案。您也可以使用修復規則來補充它,以自動解決任何不合規的資源。如需詳細資訊,請參閱使用 Config Rules AWS 修復不合規資源。
您可以透過以下方式擴展此解決方案:
強制執行您建立的對應AWS標籤,以識別面向公有的子網路。如需詳細資訊,請參閱 AWS Organizations 文件中的標籤政策。
設定中央安全帳戶,將 Config AWS 自訂規則套用至組織中的每個工作負載帳戶。如需詳細資訊,請參閱 (AWS 部落格文章) 中的大規模自動化組態合規AWS
。 將 AWS Config 與 AWS Security Hub 整合,以大規模擷取、集中和通知。如需詳細資訊,請參閱 AWS Security Hub 文件中的設定AWS組態。
工具
AWS Config 提供AWS帳戶中資源的詳細檢視,以及其設定方式。它可協助您識別資源彼此之間的關係,以及其組態如何隨著時間而改變。
Elastic Load Balancing (ELB) 會將傳入的應用程式或網路流量分散到多個目標。例如,您可以在一或多個可用區域中跨 Amazon Elastic Compute Cloud (Amazon EC2) 執行個體、容器和 IP 地址分配流量。
AWS Lambda 是一種運算服務,可協助您執行程式碼,而不需要佈建或管理伺服器。它只會在需要時執行程式碼並自動擴展,因此您只需支付您使用的運算時間。
Amazon Simple Notification Service (Amazon SNS) 可協助您協調和管理發佈者和用戶端之間的訊息交換,包括 Web 伺服器和電子郵件地址。
Amazon Virtual Private Cloud (Amazon VPC) 可協助您將AWS資源啟動至您定義的虛擬網路。此虛擬網路類似於傳統網路,您會在自己的資料中心中運作,並享有使用 可擴展基礎設施的好處AWS。
最佳實務
如需開發自訂 Config AWS 規則的更多範例和最佳實務,請參閱 上的官方 AWS Config 規則儲存庫
史詩
任務 | 描述 | 所需的技能 |
---|---|---|
建立 Lambda 函數。 |
| 一般 AWS |
將許可新增至 Lambda 函數的執行角色。 |
| 一般 AWS |
擷取 Lambda 函數 Amazon Resource Name (ARN)。 |
| 一般 AWS |
建立 Config AWS 自訂規則。 |
| 一般 AWS |
設定通知。 |
| 一般 AWS |
任務 | 描述 | 所需的技能 |
---|---|---|
建立合規資源。 |
| 一般 AWS |
建立不合規的資源。 |
| 一般 AWS |
建立不適用的資源。 |
| 一般 AWS |
相關資源
AWS 文件
其他AWS資源
其他資訊
以下是為示範目的而提供的 Lambda 函數範例。
import boto3 import json import os # Init clients config_client = boto3.client('config') ec2_client = boto3.client('ec2') def lambda_handler(event, context): # Init values compliance_value = 'NOT_APPLICABLE' invoking_event = json.loads(event['invokingEvent']) configuration_item = invoking_event['configurationItem'] status = configuration_item['configurationItemStatus'] eventLeftScope = event['eventLeftScope'] # First check if the event configuration applies. Ex. resource event is not delete if (status == 'OK' or status == 'ResourceDiscovered') and not eventLeftScope: compliance_value = evaluate_change_notification_compliance(configuration_item) config_client.put_evaluations( Evaluations=[ { 'ComplianceResourceType': invoking_event['configurationItem']['resourceType'], 'ComplianceResourceId': invoking_event['configurationItem']['resourceId'], 'ComplianceType': compliance_value, 'OrderingTimestamp': invoking_event['configurationItem']['configurationItemCaptureTime'] }, ], ResultToken=event['resultToken']) # Function with the logs to evaluate the resource def evaluate_change_notification_compliance(configuration_item): is_in_scope = is_in_scope_subnet(configuration_item['configuration']['subnetId']) if (configuration_item['resourceType'] != 'AWS::EC2::NetworkInterface') or not is_in_scope: return 'NOT_APPLICABLE' else: alb_condition = configuration_item['configuration']['requesterId'] in ['amazon-elb'] nlb_condition = configuration_item['configuration']['interfaceType'] in ['network_load_balancer'] nat_gateway_condition = configuration_item['configuration']['interfaceType'] in ['nat_gateway'] if alb_condition or nlb_condition or nat_gateway_condition: return 'COMPLIANT' return 'NON_COMPLIANT' # Function to check if elastic network interface is in public subnet def is_in_scope_subnet(eni_subnet): subnet_description = ec2_client.describe_subnets( SubnetIds=[eni_subnet] ) for subnet in subnet_description['Subnets']: for tag in subnet['Tags']: if tag['Key'] == os.environ.get('TAG_KEY') and tag['Value'] == os.environ.get('TAG_VALUE'): return True return False