亚马逊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资源:

  • 适用于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在发生海外黑名单登录时第一时间通知管理员, 管理员再进行调查, 或向用户发送电子邮件通知用户,告知用户并确认用户是否在黑名单国家/地区进行登录活动。

本篇作者

徐欣蕾

Amazon Web Services公司专业服务团队WorkSpaces顾问。