亚马逊AWS官方博客
Amazon WorkSpaces 自动检测来自黑名单国家的登录
Amazon WorkSpaces 是一种托管的、安全的桌面即服务 (DaaS) 解决方案。默认情况下,Amazon WorkSpaces允许用户从任何国家登录, 不提供地理限制功能。 这可能并不适用于一些有安全考量的客户。当用户从未经批准的国家连接时,顾客希望被告知或者限制用户登录,这个概念称为地理封锁。
Amazon Workspaces当前不支持地理封锁/阻止黑名单连接。此博客文章提供了一个示例, 我们将创建一个黑名单规则,该规则将拒绝访问位于澳大利亚的IP地址。而此解决方案涉及一个Amazon Cloudwatch事件,该事件触发Amazon Lambda函数。函数检查IP位置来源,如果源IP位置来自黑名单区域,则该Amazon Lambda执立即关闭WorkSpace。
下面说明如何部署解决方案:
当用户成功登录到WorkSpaces时, WorkSpaces登录事件发送到CloudWatch Events
此CloudWatch Event可用于触发Lambda函数(用Python编写),该Lambda函数执行以下操作:
- 使用公共API执行源IP地址的IP查找,以获取源IP地址的位置
- 如果返回的位置在“列入黑名单”的区域中,则该Lambda函数尝试停止WorkSpace
- 适用于AWS WorkSpaces登录的CloudWatch事件
- 由CloudWatch事件触发的Lambda函数
- IAM执行角色来向函数提供运行所需的权限
我们可以利用Amazon CloudFormation部署Lambda函数:
AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Description: Lambda function to validate Workspaces client connections
Resources:
ValidateWorkspaceSource:
Type: AWS::Serverless::Function
Properties:
Handler: validate_workspace_source.lambda_handler
Runtime: python3.7
Description: Validate source connections of Workspace launches
MemorySize: 256
Timeout: 600
Environment:
Variables:
IP_LOOKUP_URL: https://extreme-ip-lookup.com/json/
BLACKLISTED_REGIONS: Australia
SLEEP_DURATION: '30'
RETRY_LIMIT: '10'
Events:
WorkSpacesAccessEvent:
Type: CloudWatchEvent
Properties:
Pattern:
source:
- aws.workspaces
detail-type:
- WorkSpaces Access
Policies:
- ReadOnlyAccess
- Version: '2012-10-17'
Statement:
- Effect: Allow
Action:
- logs:CreateLogGroup
- logs:CreateLogStream
- logs:PutLogEvents
- workspaces:StopWorkspaces
- sns:Publish
Resource: '*'
Outputs:
LambdaArn:
Description: Lambda Arn
Value:
Ref: ValidateWorkspaceSource
Export:
Name: validate-workspace-source-lambda-arn
以下是Lambda函数:
首先导入json, boto3, requests, time, OS。
Lambda函数具有以下环境变量:
环境变量 | 说明 |
IP_LOOKUP_URL | 用于检索有关源IP地址的信息 |
BLACKLISTED_REGIONS | 用逗号隔开的黑名单国家列表(例如,澳大利亚,新西兰) |
SLEEP_DURATION | Lambda函数在尝试再次关闭WorkSpaces之前应休眠的秒数 |
RETRY_LIMIT | Lambda函数应尝试关闭工作区的次数 |
确保SLEEP_DURATION和RETRY_LIMIT值在Lambda函数的超时值之内。
import json
import boto3
import requests
import time
import os
workspaces_client = boto3.client('workspaces')
ip_lookup_url = os.environ['IP_LOOKUP_URL']
blacklisted_regions = list(os.environ['BLACKLISTED_REGIONS'].split(","))
workspace_stop_success = False
sleep_duration = int(os.environ['SLEEP_DURATION'])
retry_limit = int(os.environ['RETRY_LIMIT'])
以下代码获取WorkSpaces启动事件和WorkSpaces IP地址。然后查找API以获取源IP地址的位置, 如果源IP地址的位置在黑名单国家中, Lambda函数自动关闭用户的WorkSpaces。
def lambda_handler(event, context):
source_ip_address = (event['detail']['clientIpAddress'])
complete_ip_lookup_url = ip_lookup_url + str(source_ip_address)
# Get Workspace launch event
workspaces_response = workspaces_client.describe_workspaces(
WorkspaceIds=[event['detail']['workspaceId']
])
print ("Cloudwatch Event triggered....")
print (event)
print ("Workspace Information....")
print (workspaces_response)
print ("Source ip address:",source_ip_address)
# Lookup API to obtain the location of the source ip address
print ("Invoking API:",complete_ip_lookup_url)
ip_lookup = requests.get(complete_ip_lookup_url)
ip_lookup_result = ip_lookup.json()
source_ip_country = ip_lookup_result['country']
print ("Source ip country:",source_ip_country)
# If the location of the source ip address is in a blacklisted region
if source_ip_country in blacklisted_regions:
stop_workspace(event)
else:
print ("User has logged in from a safe region")
print (ip_lookup_result)
return 'End Function'
以下函数将尝试关闭WorkSpaces,尝试直到成功停止或达到重试限制为止。
def stop_workspace(event):
print ("Warning! User is logging in from blacklisted region")
# Try to stop the Workspace until either the stop attempt is succesfull or until the retry limit specified
for i in range (retry_limit):
print ("Attempting to stop Workspace attempt", i)
stop_workspace_response = workspaces_client.stop_workspaces(
StopWorkspaceRequests=[
{
'WorkspaceId': event['detail']['workspaceId']
}])
# if workspace stop attempt is succesfull, exit the loop
if (stop_workspace_response["FailedRequests"]) == []:
workspace_stop_success = True
print (stop_workspace_response)
break
# else if the workspace stop attempt is not succesfull
else:
print ("Stop Request Failed")
print (stop_workspace_response)
# pause the function for the duration specified before attempting to stop the Workspace again
time.sleep(sleep_duration)
if workspace_stop_success:
print ("Succesfully stopped Workspace")
elif not workspace_stop_success:
print ("Stop request failed after",retry_limit*sleep_duration,"seconds")
return workspace_stop_success
最后总结
入侵检测可以采取多种形式。通过IP地理位置数据检测,可以识别用户和计算机的地理位置。
自动检测来自黑名单国家的登录,最主要的目的是帮助客户降低安全风险。 关闭Workspaces是阻止用户登录的一种方法。客户可以利用其他选择,例如 利用Amazon CloudWatch Alarm在发生海外黑名单登录时第一时间通知管理员, 管理员再进行调查, 或向用户发送电子邮件通知用户,告知用户并确认用户是否在黑名单国家/地区进行登录活动。