使用应用负载均衡器自动轮换OIDC客户端密钥

本文详细介绍了如何利用AWS Secrets Manager、Lambda和EventBridge实现OIDC客户端密钥的自动轮换,通过应用负载均衡器简化身份验证流程,提升系统安全性和运维效率。

使用应用负载均衡器自动轮换OIDC客户端密钥

弹性负载均衡通过将身份验证卸载到OpenID Connect(OIDC)兼容的身份提供商(IdPs)来简化身份验证。这让开发人员能够专注于应用程序逻辑,同时使用强大的身份管理功能。

OIDC客户端密钥是OAuth 2.0和OIDC协议中用于验证客户端(应用程序)的机密凭据。然而,手动管理OIDC客户端密钥会带来安全风险和运维负担。如图1所示,OIDC客户端密钥的手动管理从通过第三方IdP进行身份验证开始。

图1:手动管理OIDC客户端密钥

手动管理OIDC客户端密钥的风险包括:

  • 明文凭据暴露
  • 需要手动干预调整应用负载均衡器(ALB)配置
  • 缺乏对凭据更改的主动监控
  • 缺乏对身份验证凭据的持续验证
  • 对于具有多个监听器规则的ALB配置不可扩展

在这篇博客文章中,我将向您展示如何使用AWS Secrets Manager、AWS Lambda和Amazon EventBridge自动化OIDC客户端密钥轮换,帮助增强安全性并简化运维。自动化密钥轮换是一种关键的安全实践,可以最小化凭据泄露的风险,并有助于促进持续合规。

有关ALB-OIDC身份验证设置,请参阅使用应用负载均衡器对用户进行身份验证

解决方案概述

该解决方案提供了一个灵活的框架,用于跨各种OIDC提供商(以Auth0为例)进行自动化凭据管理,并通过具体实施演示了与AWS服务的集成。核心架构支持自动化凭据轮换、安全密钥存储、提供商无关设计以及跨不同身份验证工作流的可扩展实施。关键组件包括:

  • Secrets Manager:安全存储和管理OIDC(Auth0)客户端凭据。
  • Lambda:按计划执行密钥轮换逻辑。
  • 弹性负载均衡:使用OIDC监听器规则卸载身份验证。
  • EventBridge(计划):根据定义的计划触发Lambda函数。
  • 自定义AWS CloudFormation资源:自动化本文中使用的整个堆栈和架构。

图2:自动化OIDC客户端密钥轮换

如图2所示,身份验证工作流程如下:

  1. EventBridge每15分钟触发一次Auth0CredentialHandler Lambda处理程序

  2. Auth0CredentialHandler Lambda处理程序连接到Auth0管理域并获取当前客户端凭据——auth0_current

  3. Auth0CredentialHandler Lambda处理程序从Secrets Manager获取现有凭据auth0/credentials/${Auth0-dev-domain},并将其与上一步中检索到的凭据auth0_current进行比较

    • 如果未找到密钥,处理程序将在30分钟内重试三次,然后记录AWS CloudWatch警报
    • 假设密钥Amazon资源名称(ARN)已存在于Secrets Manager中
  4. 如果凭据不同,Auth0CredentialHandler将使用新值更新auth0/credentials/${Auth0-dev-domain}。如果凭据相同,则不执行任何操作。CloudWatch警报配置为在成功和失败的密钥更新时触发

  5. ALB监听器规则配置为从Secrets Manager中的auth0/credentials/${Auth0-dev-domain}资源ARN动态拉取客户端凭据

安全建议

您可以采取以下几项措施来提高身份验证系统的安全性,首先是实施集中式密钥管理并启用静态数据加密。您还可以配置具有最小权限的Lambda函数,限制仅访问必需的Secrets Manager和ALB监听器资源,这可以减少安全爆炸半径。

使用CloudWatch警报监控关键操作事件,包括密钥更新、更新失败和ALB凭据问题,并使用AWS Config跟踪规则配置并执行定期安全审计。

通过为每个ALB监听器规则创建单独的密钥,您可以启用细粒度访问控制并缩小权限范围,有助于增强整体系统安全性。

通过遵循这些实践,您可以为应用程序建立强大的安全框架,并提供适当的数据保护和访问管理。

先决条件

该解决方案假设在开始实施之前满足以下先决条件:

  • 现有的ALB配置有监听器和目标组,用作CloudFormation模板中的Listenerarn和targetarn
  • OIDC IdP(例如Auth0)帐户和客户端应用程序
  • Auth0 IdP应用程序客户端凭据存储在Secrets Manager中
1
2
3
4
5
{
  "domain": "your-tenant.auth0.com",
  "client_id": "your-client-id",
  "client_secret": "your-client-secret"
}

实施细节

注意:此解决方案使用Auth0作为IdP演示OIDC客户端密钥轮换。虽然核心原则和架构模式通常适用,但具体的实施细节可能因不同的身份提供商而异。建议用户查阅其特定IdP的文档以获取精确的配置步骤、API交互和AWS兼容的身份验证机制。

这是一种使用CloudFormation自定义资源创建架构图中提到的资源的自动化、简单且可扩展的方法。CloudFormation模板和AWS Lambda实现托管在demo-stack中。

核心组件

在本节中,我将解释解决方案的关键组件。

凭据刷新规则

计划EventBridge规则使用LambdaInvokePermission AWS身份和访问管理(IAM)角色每15分钟触发一次Auth0CredentialHandler Lambda函数。

Auth0CredentialHandler Lambda函数

Auth0CredentialHandler Lambda函数负责安全地管理客户端凭据。它从Secrets Manager资源auth0/credentials/${Auth0-dev-domain}检索Auth0配置,向Auth0域进行API调用以获取新令牌,并管理这些凭据在Secrets Manager中的更新。它需要通过其执行角色获得与Secrets Manager交互的权限。

Lambda使用的IAM角色有两个主要权限集:

  • AWS托管策略AWSLambdaBasicExecutionRole,允许Lambda函数创建CloudWatch日志
  • 自定义策略,授予对auth0/credentials/${Auth0-dev-domain}路径下密钥的特定Secrets Manager权限(GetSecretValue、CreateSecret、UpdateSecret)

Lambda将在30分钟内重试三次。如果所有尝试都失败,则将记录CloudWatch警告并创建警报。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
ManagedPolicyArns:
  - arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole
Policies:
  - PolicyName: SecretsManagerAccess
    PolicyDocument:
      Version: '2012-10-17'
      Statement:
        - Effect: Allow
          Action:
            - secretsmanager:GetSecretValue
            - secretsmanager:CreateSecret
            - secretsmanager:UpdateSecret
          Resource:
            - !Sub arn:aws:secretsmanager:${AWS::Region}:${AWS::AccountId}:secret:auth0/*

# Amazon EventBridge调用Lambda的权限
LambdaInvokePermission:
  Type: AWS::Lambda::Permission
  Properties:
    Action: lambda:InvokeFunction
    FunctionName: !Ref Auth0CredentialHandler
    Principal: events.amazonaws.com
    SourceArn: !GetAtt CredentialRefreshRule.Arn

ALB监听器规则

CloudFormation中的弹性负载均衡监听器规则资源配置为从Secrets Manager动态解析客户端凭据,并将经过身份验证的请求转发到特定目标组。它与由Auth0CredentialHandler定期刷新的Auth0凭据集成。此配置需要读取访问Secrets Manager以获取用于身份验证的Auth0客户端凭据。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
# ALB监听器规则 - 将Oidc配置替换为您的端点。只有客户端凭据存储在SecretsManager中
ListenerRule1:
  Type: AWS::ElasticLoadBalancingV2::ListenerRule
  Properties:
    ListenerArn: arn:aws:elasticloadbalancing:region:account-id:listener/app/my-load-balancer/1234567890/abcdef
    Priority: 1
    Actions:
      - Type: authenticate-oidc
        AuthenticateOidcConfig:
          ClientId: '{{resolve:secretsmanager:auth0/credentials/your-tenant.auth0.com:SecretString:client_id}}'
          ClientSecret: '{{resolve:secretsmanager:auth0/credentials/your-tenant.auth0.com:SecretString:client_secret}}'

          AuthorizationEndpoint: https://idp1.example.com/auth
          TokenEndpoint: https://idp1.example.com/token
          UserInfoEndpoint: https://idp1.example.com/userinfo
          OnUnauthenticatedRequest: authenticate
      - Type: forward
        TargetGroupArn: arn:aws:elasticloadbalancing:region:account-id:targetgroup/target-group-1/1234567890abc
    Conditions:
      - Field: path-pattern
        Values:
          - /app1/*

CloudWatch监控和警报

提供的CloudFormation模板配置为建立密钥更新的安全监控。该模板为成功和失败的密钥更新配置警报。该模板使用AWS CloudTrail日志创建CloudWatch指标过滤器,设置具有定义阈值的相应警报,并建立Amazon简单通知服务(Amazon SNS)主题以进行统一警报传递。部署后,这种基础设施即代码解决方案能够自动检测和通知与密钥管理和未经授权的访问尝试相关的潜在安全事件。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
# CloudWatch日志组
CloudTrailLogGroup:
  Type: AWS::Logs::LogGroup
  Properties:
    LogGroupName: secrets-manager-monitoring
    RetentionInDays: 14

# 成功和失败更新的组合指标过滤器
SecretUpdateMetricFilter:
  Type: AWS::Logs::MetricFilter
  Properties:
    LogGroupName: !Ref CloudTrailLogGroup
    FilterPattern: !Sub '{ $.eventSource = secretsmanager.amazonaws.com && ($.eventName = UpdateSecret || $.eventName = PutSecretValue) && $.responseElements.ARN = "${MyCustomResource.SecretArn}" }'
    MetricTransformations:
      - MetricNamespace: 'SecretsManager/Updates'
        MetricName: 'SecretUpdates'
        MetricValue: '1'
        DefaultValue: 0

# 成功和失败更新的组合警报
SecretUpdateAlarm:
  Type: AWS::CloudWatch::Alarm
  Properties:
    AlarmName: !Sub '${AWS::StackName}-secret-update'
    AlarmDescription: !Sub 'Alarm for any updates (success or failure) to secret ${MyCustomResource.SecretArn}'
    MetricName: SecretUpdates
    Namespace: SecretsManager/Updates
    Statistic: Sum
    Period: 300
    EvaluationPeriods: 1
    Threshold: 0
    ComparisonOperator: GreaterThanThreshold
    TreatMissingData: notBreaching
    AlarmActions:
      - !Ref SecretMonitoringTopic

为了增强密钥轮换过程的可靠性,通过创建CloudWatch警报来实施全面监控,以检测超出阈值的Lambda轮换失败和高身份验证失败率,来自ALB的不寻常HTTP 4xx和5xx错误率峰值,并使用CloudTrail跟踪与Secrets Manager中的密钥和负载均衡器设置相关的API调用和配置更改。通过将这些自定义警报与标准配置一起实施,可以快速检测AWS资源中的潜在安全事件和未经授权的访问尝试。这种多层方法有助于保持对轮换过程的可见性,并有助于快速识别和响应潜在问题。

有关详细指导,请参阅为CloudTrail事件创建CloudWatch警报:示例

部署过程

使用AWS命令行界面(AWS CLI)或AWS管理控制台部署CloudFormation模板。将替换为您要部署解决方案的AWS区域。

1
2
3
4
5
aws cloudformation deploy \
  --template-file template.yaml \
  --stack-name oidc-credential-manager-stack \
  --capabilities CAPABILITY_IAM \
  --region <your-region>

注意:如果您的IdP配置需要,可以添加其他参数。

测试和验证

免责声明:建议在单独的非关键环境中进行测试,以确保在部署到生产环境之前完全验证任何客户特定设置。

对于密钥更新,验证配置的CloudWatch警报是否被触发。对于ALB身份验证,检查ALB访问日志中的authentication_success条目和OIDC身份令牌的存在。

设置CloudWatch指标和警报以监控轮换过程和身份验证成功率。通过手动编辑ALB规则配置指向不同的密钥ARN来验证故障情况,并确认CloudWatch警报被触发。以下是成功的Secrets Manager更新的示例CloudTrail事件:

1
2
3
4
5
6
7
8
9
{
  "source": ["aws.secretsmanager"],
  "detail-type": ["AWS API Call via CloudTrail"],
  "detail": {
    "eventSource": ["secretsmanager.amazonaws.com"],
    "eventName": ["UpdateSecret"],
    "responseElements": {"status": "Success"}
  }
}

以下是ALB访问日志的示例:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
/aws/alb/<your-alb-name>:
- 查找包含以下内容的条目:
  "authentication_success"
  "id_token_authentication_successful"
  "x-amzn-oidc-identity"
  HTTP状态码200
- 示例日志模式:
  时间戳 elb_name 客户端:端口 目标:端口 request_processing_time 
  target_processing_time response_processing_time 状态码 
  "authentication_success" "x-amzn-oidc-identity: [token]"

高级场景

在本节中,您将学习如何减少等待时间并使Secrets Manager更新几乎同步。

  • 优化Secrets Manager同步:使用EventBridge合作伙伴集成配置EventBridge,根据从第三方IdP接收的事件调用Lambda函数。有关详细指导,请参阅使用Amazon EventBridge从SaaS合作伙伴接收事件

  • 轮换客户端ID:虽然轮换客户端密钥是最常见的场景,但在某些情况下也可能需要轮换客户端ID。在大多数身份提供商中,这意味着创建新的应用程序客户端并迁移资源。为此,Auth0CredentialHandler需要修改ALB监听器规则的权限(elasticloadbalancing:ModifyRule、elasticloadbalancing:DescribeListeners、elasticloadbalancing:DescribeRules)。客户端ID轮换可能导致临时身份验证中断,因此彻底测试至关重要。使用AWS Config监控ALB规则配置的意外更改。此功能支持更全面的安全态势,尽管它可能增加解决方案的复杂性并可能需要手动干预。

  • 多提供商策略:如果您的组织处理多个IdP,请实施集中式轮换框架,抽象提供商特定的细微差别,专注于本文中概述的核心安全原则。关键考虑因素包括创建提供商无关接口以支持全面监控并最小化配置开销。

结论

在本文中,您探索了使用AWS服务自动化OIDC客户端密钥轮换的全面方法。通过实施此解决方案,您可以增强应用程序的安全性,减少手动管理开销,并维护强大的身份验证策略。

考虑探索高级身份管理技术或将多因素身份验证与您的OIDC实施集成。如果您是自动化密钥轮换的新手,请访问回到基础:密钥管理

如果您对本文有疑问或反馈,请联系AWS支持

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计