前言
在不断发展的云计算环境中,在确保合规性的同时维护强大的安全性是各种规模的组织面临的关键挑战。随着企业越来越多地采用云,跨各种平台管理和保护数据的复杂性呈指数级增长。
Amazon Bedrock 凭借其强大的机器学习和 AI 服务基础,为组织开发和部署智能应用程序提供了可扩展、安全的环境。但是,为了充分利用这些创新的潜力,必须实施一种简化的安全和合规方法。
将 Elastic 与 Amazon Bedrock 集成可以显著增强云环境中的安全监控和合规性管理。此集成利用 Elastic 的搜索、可观测性和安全功能来优化您管理和保护托管在 Amazon Bedrock 上的应用程序和数据的方式。
Elastic 的安全信息和事件管理 (SIEM) 功能 可用于分析日志并监控在 Amazon Bedrock 上运行的应用程序生成的事件。这允许实时检测潜在的安全威胁并采取自动响应措施来降低风险。
本文将指导您完成设置 Amazon Bedrock 集成并启用我们预构建的检测规则的过程,以简化您的安全运营。我们将涵盖以下关键方面
- Elastic Amazon Bedrock 集成的先决条件: 了解设置 Elastic Amazon Bedrock 集成以实现云安全的核心要求。
- 设置 Amazon Bedrock 集成:在您现有的 AWS 基础设施中设置 Amazon Bedrock 的分步说明。
- 启用预构建的安全规则:如何利用预构建的规则来检测高置信度的策略违规和其他安全威胁。
- 探索高置信度不当行为阻止检测: 深入了解一个特定的预构建规则,该规则旨在检测 Amazon Bedrock 日志中的高置信度不当行为阻止。
- 演示 Amazon Bedrock 的漏洞利用案例: 使用示例 Python 脚本来模拟与 Amazon Bedrock 模型的交互,以测试可能触发 Elastic 预构建检测规则的漏洞利用场景。
Elastic Amazon Bedrock 集成的先决条件
Amazon Bedrock 的 Elastic 集成
Amazon Bedrock 集成通过 Elastic Agent 收集 Amazon Bedrock 模型调用日志和运行时指标。有关集成的更深入了解,请参阅我们的文档。
以下是完成 Amazon Bedrock Elastic 集成的完整配置所需的先决条件列表
- AWS 账户设置
- Elastic Cloud 要求
- Terraform(可选)
AWS 账户设置
- 有效的 AWS 账户:确保您拥有一个有效的 AWS 账户,该账户具有在 Amazon Bedrock 上部署和管理资源的适当权限。
- Amazon Bedrock 设置:确认 Amazon Bedrock 在您的 AWS 环境中已正确配置并运行。这包括设置 AI 模型、数据集和您的应用程序所需的其他资源。有关设置的更多信息,请参阅Amazon Bedrock 入门。
- IAM 角色和权限:创建或配置身份和访问管理 (IAM) 角色,这些角色具有允许 Elastic 访问 Amazon Bedrock 资源的必要权限。这些角色应具有足够的权限来读取 AWS 服务的日志、指标和跟踪。有关要求的更多详细信息,请参阅我们的AWS 文档。
Elastic Cloud 要求
版本 | 0.7.0(测试版) |
---|---|
兼容的 Kibana 版本 | 集成版本 0.2.0 及更高版本为 8.13.0 或更高版本。最低 Kibana 版本 8.12.0 |
支持的无服务器项目类型 | 安全可观测性 |
订阅级别 | 基本 |
支持级别 | Elastic |
注意: 由于集成处于测试版发布阶段,请在 Elastic 堆栈的管理窗格的浏览集成部分启用显示测试版集成。
Terraform
Terraform 是 HashiCorp 创建的一个开源基础设施即代码 (IaC) 工具,允许您以一致且可重复的方式定义、配置和管理云和本地基础设施。
这是一个可选步骤,但最好具备,因为在本文的下一部分中,我们将使用此工具来设置所需的 AWS 基础设施。有关安装和文档的深入了解,请参见此处。
设置 Amazon Bedrock 集成
在本文的这一部分中,我们将分两部分介绍使用 Elastic 设置 Amazon Bedrock 集成的步骤
- 使用 Terraform 设置 AWS 基础设施:在本节中,我们将逐步介绍使用 Terraform 设置 AWS 基础设施的步骤。我们将创建一个 S3 存储桶、一个具有访问 S3 存储桶的必要 IAM 角色和策略的 EC2 实例,并配置安全组以允许 SSH 访问。此设置非常适合需要 EC2 实例与 S3 交互的场景,例如数据处理或存储。
- Elastic Agent 和集成设置:在本节中,我们将逐步介绍在 AWS EC2 实例上安装 Elastic Agent 并配置 Amazon Bedrock 集成的步骤。
使用 Terraform 设置 AWS 基础设施
高级配置过程将涉及以下步骤
- 配置
providers.tf
- 配置
variables.tf
- 配置
outputs.tf
- 配置
main.tf
providers.tf
文件通常包含您在项目中使用的任何 Terraform 提供程序的配置。在我们的示例中,它包括 AWS 提供程序的配置。这是我们的 providers.tf
文件的示例内容。 providers.tf
中提到的 profile
应在 AWS 凭证文件 (~/.aws/credentials)
的用户空间中进行配置。 请参阅配置和凭证文件设置 - AWS 命令行界面,该设置也在 Elastic 的AWS 文档的凭证部分中突出显示。
variables.tf
文件包含您的 Terraform 配置中使用的变量定义。在我们的场景中,它包括 aws_region 和 resource_labels 的定义。这是我们 variables.tf
文件的示例内容。
outputs.tf
文件通常包含您的 Terraform 配置的输出定义。这些输出可用于在您的基础设施配置完成后显示有用的信息。这是我们 outputs.tf
文件的示例内容。
main.tf
文件通常包含所有这些资源的集合,例如数据源、S3 存储桶和存储桶策略、Amazon Bedrock 模型调用日志配置、SQS 队列配置、EC2 实例所需的 IAM 角色和策略(该实例将安装 Elastic Agent 并流式传输日志)以及 Amazon Bedrock Guardrail 配置。这是我们 main.tf
文件的示例内容。
一旦根据要求配置了 main.tf
,我们就可以初始化、计划和应用 Terraform 配置。
terraform init // initializes the directory and sets up state files in backend
terraform plan // command creates an execution plan
terraform apply // command applies the configuration aka execution step
要拆除 Terraform 之前创建的基础设施,可以使用 terraform destroy
命令。
基础设施设置完成后,必要的资源标识符将通过 outputs.tf
提供。我们可以使用以下步骤对创建的基础设施进行基本验证
- 验证从 Terraform 创建的 S3 存储桶,可以使用 aws cli 命令参考 list-buckets — AWS CLI 1.34.10 命令参考或通过 AWS 控制台导航来验证。 2. 验证从 Terraform 创建的 SQS 队列,可以使用 aws cli 命令参考 list-queues — AWS CLI 1.34.10 命令参考或通过 AWS 控制台导航来验证。
- 从 AWS 控制台验证创建的 EC2 实例,并通过 使用 EC2 Instance Connect 连接 - Amazon Elastic Compute Cloud 连接到 ec2-instance,并运行
aws s3 ls example-bucket-name
以检查实例是否具有访问创建的 S3 存储桶的权限。 - 验证从 Terraform 创建的 Amazon Bedrock Guardrail,可以使用 Amazon Bedrock API ListGuardrails - Amazon Bedrock 或通过 AWS 控制台导航来验证。
设置 Elastic Agent 和集成设置
要在 AWS EC2 实例上安装 Elastic Agent 并配置 Amazon Bedrock 集成,请使用 Elastic Agent 策略 | Fleet 和 Elastic Agent 指南 [8.15] 中的引导步骤创建代理策略。然后,通过 使用 EC2 Instance Connect 连接 - Amazon Elastic Compute Cloud 登录到在基础设施设置步骤中创建的 ec2-instance,并使用 安装 Elastic Agents | Fleet 和 Elastic Agent 指南 [8.15] 中的引导步骤安装 Elastic Agent。在代理安装期间,请记住选择在此设置过程开始时创建的代理策略,并根据创建的实例使用相关的代理安装方法。最后,确保代理已正确配置,并且有来自代理的传入数据。
要在新创建的策略中配置 Amazon Bedrock 集成,请使用引导步骤添加 Amazon Bedrock 集成:将 Elastic Agent 集成添加到策略。启用 Beta 集成以使用 Amazon Bedrock 集成,如下图所示。
使用 AWS 访问密钥配置集成,以访问配置了 Amazon Bedrock 的 AWS 账户。使用从 S3 存储桶收集日志,并指定在设置步骤中创建的存储桶 ARN。请注意,在设置期间使用 S3 存储桶或 SQS 队列 URL,两者不能同时使用。将此集成添加到配置了 ec2-instance 的现有策略中。
验证 Amazon Bedrock 模型调用日志摄取
完成 Elastic Agent 和集成设置后,我们可以使用以下示例 API 调用对集成进行基本验证,以确定日志是否按预期摄取。
aws bedrock-runtime converse \
--model-id "anthropic.claude-3-5-sonnet-20240620-v1:0" \
--messages '[{"role":"user","content":[{"text":"Hello "}]}]' \
--inference-config '{"maxTokens":2000,"stopSequences":[],"temperature":1,"topP":0.999}' \
--additional-model-request-fields '{"top_k":250}' \
--region us-east-1
示例 API 调用假设使用 aws cli 的工作设置,并且可以访问基础模型 Anthropic Claude Messages API - Amazon Bedrock。如果用户无权访问该模型,可以按照 访问 Amazon Bedrock 基础模型 中建议的从模型访问页面请求模型访问权限,或者我们可以选择将 API 调用更改为用户可以访问的任何现有模型。
成功执行上述 API 调用后,将填充 Amazon Bedrock 模型调用日志,并且在 Kibana 中,logs-aws_bedrock.invocation-default
应填充这些调用日志。我们可以使用以下简单的 ES|QL 查询来返回最近摄取的事件。
from logs-aws_bedrock.invocation-* | LIMIT 10
启用预构建检测规则
要启用预构建检测规则,请首先登录到 Elastic 实例,并从左侧窗格导航到“安全”→“规则”→“检测规则 (SIEM)”。从“标签”部分筛选“数据源:Amazon Bedrock”。
启用可用的预构建规则。对于预构建规则,“设置”信息包含一个辅助指南,用于设置 Amazon Bedrock 的 AWS Guardrails,如果正确遵循示例并且 Terraform 具有 Amazon Bedrock Guardrail 配置,则将在使用 Terraform 设置 AWS 基础设施步骤中完成。请注意,此设置对于某些规则生成警报至关重要——如果基础设施设置阶段跳过了此设置,我们需要确保相应地设置 Guardrail。
探索高置信度不当行为阻止检测
让我们模拟一个真实场景,其中用户查询了 Amazon Bedrock 模型拒绝的主题。在 Amazon UI 控制台中导航到 Amazon Bedrock 部分,并使用左侧导航窗格导航到“保护措施”下的“Guardrails”子部分。使用我们在本练习的设置说明期间创建的示例 Guardrail,并使用测试选项运行带有 Guardrails 的模型调用,并查询配置的拒绝主题。
至少重复该查询 6 次,因为预构建规则旨在对大于 5 个高置信度阻止发出警报。当警报计划运行时,我们可以看到 检测到异常的高置信度不当行为阻止。
的警报弹出。
演示 Amazon Bedrock 的利用案例场景
要模拟 Amazon Bedrock 安全绕过,我们需要一个利用模拟脚本来与 Amazon Bedrock 模型交互。我们提供的利用脚本示例模拟以下攻击模式
- 尝试多次连续请求使用 AWS Bedrock 中拒绝的模型资源
- 在 Amazon Bedrock 中生成多次连续的验证异常错误
- 用户始终生成高输入令牌计数,提交大量请求并接收模仿资源耗尽模式的大量响应
- 将重复的高置信度“已阻止”操作与特定的违规代码(如“不当行为”)结合使用,表明持续滥用或试图探测模型的道德界限
class BedrockModelSimulator:
def __init__(self, profile_name, region_name):
// Create a Boto3 Session Client for Ineration
def generate_args_invoke_model(self, model_id, user_message, tokens): // Generate Model Invocation parameters
guardrail_id = <<GUARDRAIL_ID>>
guardrail_version = <<GUARDRAIL_VERSION>>
guardrail_config = {
"guardrailIdentifier": guardrail_id,
"guardrailVersion": guardrail_version,
"trace": "enabled"
}
conversation = [
{
"role": "user",
"content": [{"text": user_message}],
}
]
inference_config = {"maxTokens": tokens, "temperature": 0.7, "topP": 1}
additional_model_request_fields = {}
kwargs = {
"modelId": model_id,
"messages": conversation,
"inferenceConfig": inference_config,
"additionalModelRequestFields": additional_model_request_fields
"guardrailConfig" : guardrail_config
}
return kwargs
def invoke_model(self, invocation_arguments):
for _ in range(count):
try:
// Invoke Model With right invocation_arguments
except ClientError as e:
// Error meesage
def main():
profile_name = <<AWS Profile>>
region_name = 'us-east-1'
denied_model_id = // Use a denied model
denied_model_user_message = // Sample Message
available_model_id = // Use an available model
validation_exception_user_message = // Sample Message
resource_exploit_user_message = // A very big message for resource exhuastion
denied_topic_user_message = // Sample Message that can query denied topic configured
simulator = BedrockModelSimulator(profile_name, region_name)
denied_model_invocation_arguments = simulator.generate_args_invoke_model(denied_model_id, denied_model_user_message, 200)
simulator.invoke_model(denied_model_invocation_arguments)
validation_exception_invocation_arguments = simulator.generate_args_invoke_model(available_model_id, validation_exception_user_message, 6000)
simulator.invoke_model(validation_exception_invocation_arguments)
resource_exhaustion_invocation_arguments = simulator.generate_args_invoke_available_model(available_model_id, resource_exploit_user_message, 4096)
simulator.invoke_model(resource_exhaustion_invocation_arguments)
denied_topic_invocation_arguments = simulator.generate_args_invoke_available_model_guardrail(available_model_id, denied_topic_user_message, 4096)
simulator.invoke_model(denied_topic_invocation_arguments)
if __name__ == "__main__":
main()
注意: GUARDRAIL_ID 和 GUARDRAIL_VERSION 可以在 outputs.tf
中找到
在受控环境中执行时,提供的脚本会模拟一个利用场景,该场景将在 Elastic Security 中生成检测警报。当使用 Elastic Attack Discovery 功能分析这些警报时,该脚本会创建攻击链,显示各种警报之间的关系,使分析人员清楚地了解多个警报如何成为更大攻击的一部分。
结论
将 Elastic 与 Amazon Bedrock 集成使组织能够在最大限度地利用 AI 和机器学习优势的同时,维护安全合规的云环境。通过利用 Elastic 的高级安全性和可观察性工具,企业可以主动检测威胁,自动化合规性报告,并更深入地了解其云运营。越来越多的企业依赖不透明的数据源和技术来揭示最严重的威胁 - 我们对透明安全性的承诺在我们开放的工件、集成和源代码中显而易见。