在不断发展的云计算领域,保持强大的安全性并确保合规性对于各类组织来说都是一个关键挑战。随着企业越来越多地采用云技术,跨平台管理和保护数据的复杂性也在急剧增加。
Amazon Bedrock 以其强大的机器学习和人工智能服务为基础,为组织开发和部署智能应用程序提供了一个可扩展且安全的环境。然而,要充分利用这些创新成果,必须实施一种简化的安全和合规性方法。
将 Elastic 与 Amazon Bedrock 集成,可以显著增强您云环境中的安全监控和合规管理。这种集成利用 Elastic 的搜索、可观测性和安全功能,优化了您对 Amazon Bedrock 上托管的应用程序和数据的管理和保护方式。
Elastic 的 安全信息和事件管理 (SIEM) 功能 可用于分析日志和监控由在 Amazon Bedrock 上运行的应用程序生成的事件。这允许实时检测潜在的安全威胁,并自动采取响应措施来减轻风险。
本文将指导您设置 Amazon Bedrock 集成并启用预构建的检测规则,以简化您的安全操作。我们将涵盖以下关键方面:
Amazon Bedrock 集成通过 Elastic Agent 收集 Amazon Bedrock 模型调用日志和运行时指标。有关集成的更深入信息,请参阅我们的 文档。
以下是成功配置 Amazon Bedrock Elastic 集成的前提条件:
版本 | 0.7.0 (Beta) |
---|---|
兼容的 Kibana 版本 | 8.13.0 或更高版本用于集成版本 0.2.0 及以上。最低 Kibana 版本 8.12.0 |
支持的无服务器项目类型 | 安全性,可观测性 |
订阅级别 | 基本版 |
支持级别 | Elastic |
注意:由于该集成处于 Beta 发布阶段,请在 Elastic 堆栈的管理面板的浏览集成部分启用 显示 Beta 集成。
Terraform 是由 HashiCorp 创建的开源基础设施即代码 (IaC) 工具,允许您以一致且可重复的方式定义、配置和管理云和本地基础设施。
这是一个可选步骤,但在本文的后续部分中,我们将使用该工具来设置所需的 AWS 基础设施。有关安装和文档的详细信息,请参阅 这里。
在本文的这一部分中,我们将分两个部分介绍如何设置 Amazon Bedrock 与 Elastic 的集成:
高层次的配置过程将涉及以下步骤:
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 // 初始化目录并在后端设置状态文件
terraform plan // 创建执行计划
terraform apply // 应用配置,即执行步骤
要销毁 terraform 之前创建的基础设施,可以使用 terraform destroy
命令。
一旦基础设施设置完成,必要的资源标识符将通过 outputs.tf
提供。我们可以通过以下步骤对创建的基础设施进行基本验证:
aws s3 ls example-bucket-name
检查实例是否有权访问创建的 S3 存储桶。要在 AWS EC2 实例上安装 Elastic Agent 并配置 Amazon Bedrock 集成,请使用 Elastic Agent 策略 | Fleet 和 Elastic Agent 指南 [8.15] 中的引导步骤创建代理策略。然后通过 使用 EC2 实例连接 - Amazon Elastic Compute Cloud 连接到基础设施设置步骤中创建的 EC2 实例,并使用 安装 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 实例的现有策略中。
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 实例,从左侧导航栏导航到 Security → Rules → Detection rules (SIEM)。从标签部分过滤“数据源:Amazon Bedrock”。
启用可用的预构建规则。对于预构建规则,设置信息包含设置 AWS Guardrails for Amazon Bedrock 的帮助指南,如果按照示例正确执行并且 terraform 具有 Amazon Bedrock Guardrail 配置,则在 使用 Terraform 设置 AWS 基础设施 步骤中已完成。请注意,此设置对于某些规则生成警报至关重要 - 我们需要确保在基础设施设置阶段未跳过的情况下相应地设置防护栏。
让我们模拟一个真实世界的场景,其中用户查询一个被 Amazon Bedrock 模型拒绝的话题。在 Amazon UI 控制台中导航到 Amazon Bedrock 部分,并使用左侧导航栏导航到防护栏子部分。在我们的设置说明期间创建的示例防护栏中,使用测试选项运行带有防护栏的模型调用并查询配置的被拒绝话题。
重复查询至少 6 次,因为预构建规则设计用于警报高于 5 的高置信度阻止。当警报计划运行时,我们可以看到 检测到异常高置信度不当行为阻止
的警报。
要模拟一个 Amazon Bedrock 安全绕过,我们需要一个漏洞模拟脚本来与 Amazon Bedrock 模型交互。我们提供的漏洞脚本示例模拟以下攻击模式:
class BedrockModelSimulator:
def __init__(self, profile_name, region_name):
# 创建一个 Boto3 会话客户端用于交互
def generate_args_invoke_model(self, model_id, user_message, tokens):
# 生成模型调用参数
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```python
try:
# 使用正确的调用参数调用模型
except ClientError as e:
# 错误信息
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 exhaustion>>"
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 攻击发现功能分析这些警报时,脚本会创建攻击链,显示各种警报之间的关系,使分析人员清楚地了解多个警报可能是更大攻击的一部分。
将 Elastic 与 Amazon Bedrock 集成,使组织能够在最大限度地利用 AI 和机器学习的好处的同时,保持一个安全且合规的云环境。通过利用 Elastic 的先进安全和可观测性工具,企业可以主动检测威胁,自动生成合规报告,并深入了解其云操作。企业越来越依赖不透明的数据源和技术来揭示最严重的威胁——我们对透明安全的承诺在我们的开放工件、集成和源代码中得以体现。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。