Published on

AWS Okta SSO 方案

Authors
  • avatar
    Name
    Guming
    Twitter

AWS Okta SSO 集成方案

方案概述

本方案实现了基于 Okta 的 AWS 单点登录(SSO)解决方案,允许企业员工通过 Okta 统一身份认证平台访问 AWS Console 和使用 AWS CLI,无需管理独立的 AWS IAM 用户凭证。

核心原理

1. SAML 2.0 联合身份认证

本方案采用 SAML 2.0(Security Assertion Markup Language)协议实现身份联合:

用户 → Okta (IdP)AWS (SP)

工作流程:

  1. 用户发起登录: 用户在 Okta Dashboard 点击 AWS 应用
  2. 身份认证: Okta 验证用户身份(用户名/密码 + MFA)
  3. 生成 SAML Assertion: Okta 生成包含用户身份和角色信息的 SAML 断言
  4. 传递到 AWS: 浏览器将 SAML Response POST 到 AWS
  5. 验证和授权: AWS 验证 SAML 签名,提取角色信息
  6. 临时凭证: AWS STS 生成临时访问凭证
  7. 访问资源: 用户使用临时凭证访问 AWS 资源

2. AWS IAM SAML Provider

SAML Identity Provider 是 AWS IAM 中的一个资源,用于:

  • 存储 Okta 的 SAML 元数据(公钥证书)
  • 验证来自 Okta 的 SAML 断言签名
  • 建立 AWS 与 Okta 之间的信任关系
resource "aws_iam_saml_provider" "okta" {
  name                   = "Okta"
  saml_metadata_document = data.http.okta_metadata.response_body
}

3. IAM 角色信任策略

IAM 角色通过 Trust Policy 允许 Okta SAML Provider 假设角色:

{
  "Effect": "Allow",
  "Principal": {
    "Federated": "arn:aws:iam::ACCOUNT_ID:saml-provider/Okta"
  },
  "Action": "sts:AssumeRoleWithSAML",
  "Condition": {
    "StringEquals": {
      "SAML:aud": "https://signin.aws.amazon.com/saml"
    }
  }
}

4. SAML Attribute Mapping

Okta 在 SAML Response 中传递关键属性:

SAML Attribute用途
https://aws.amazon.com/SAML/Attributes/Rolerole-arn,saml-provider-arn指定用户可以假设的角色
https://aws.amazon.com/SAML/Attributes/RoleSessionNameuser.email会话标识,用于审计
https://aws.amazon.com/SAML/Attributes/SessionDuration43200会话持续时间(秒)

技术架构

架构图

┌──────────────────────────────────────────────────────────────┐
│                        用户层                                  │
│  ┌──────────────┐              ┌──────────────┐              │
│  │ Web Browser  │              │  AWS CLI     │              │
  (Console)   │              │ + aws-okta   │              │
│  └──────┬───────┘              └──────┬───────┘              │
└─────────┼──────────────────────────────┼──────────────────────┘
          │                              │
HTTPSHTTPS
          ▼                              ▼
┌──────────────────────────────────────────────────────────────┐
Okta (Identity Provider)│  ┌────────────────────────────────────────────────────────┐  │
│  │ • 用户认证 (Username/Password)                          │  │
│  │ • MFA 验证 (Push/TOTP/SMS)                             │  │
│  │ • 用户组管理                                            │  │
│  │ • SAML Assertion 生成                                  │  │
│  └────────────────────────────────────────────────────────┘  │
└─────────┬────────────────────────────────────────────────────┘
SAML 2.0 POST Binding
┌──────────────────────────────────────────────────────────────┐
AWS (Service Provider)│  ┌────────────────────────────────────────────────────────┐  │
│  │ IAM SAML Provider (Okta)                               │  │
│  │  • 验证 SAML 签名                                       │  │
│  │  • 提取用户属性                                         │  │
│  └────────────┬───────────────────────────────────────────┘  │
│               ▼                                               │
│  ┌────────────────────────────────────────────────────────┐  │
│  │ IAM Roles                                              │  │
│  │  ┌──────────────┐  ┌──────────────┐                   │  │
│  │  │ Developer    │  │ DevOps       │                   │  │
│  │   (PowerUser) (Admin)      │                   │  │
│  │  └──────────────┘  └──────────────┘                   │  │
│  │  ┌──────────────┐  ┌──────────────┐                   │  │
│  │  │ Tester       │  │ Auditor      │                   │  │
│  │   (ReadOnly+) (SecurityAudit)                  │  │
│  │  └──────────────┘  └──────────────┘                   │  │
│  └────────────┬───────────────────────────────────────────┘  │
│               ▼                                               │
│  ┌────────────────────────────────────────────────────────┐  │
│  │ AWS STS (Security Token Service)                       │  │
│  │  • AssumeRoleWithSAML                                  │  │
│  │  • 生成临时凭证 (Access Key, Secret, Token)             │  │
│  │  • 有效期: 最长 12 小时                                 │  │
│  └────────────┬───────────────────────────────────────────┘  │
│               ▼                                               │
│  ┌────────────────────────────────────────────────────────┐  │
│  │ AWS Services                                           │  │
│  │  • EC2, S3, RDS, Lambda...                            │  │
│  │  • 基于 IAM 角色权限访问                               │  │
│  └────────────────────────────────────────────────────────┘  │
│               │                                               │
│               ▼                                               │
│  ┌────────────────────────────────────────────────────────┐  │
│  │ CloudTrail + CloudWatch                                │  │
│  │  • 记录所有 AssumeRoleWithSAML 事件                    │  │
│  │  • 登录失败告警                                         │  │
│  │  • 审计日志存储 (S3)                                    │  │
│  └────────────────────────────────────────────────────────┘  │
└──────────────────────────────────────────────────────────────┘

使用的技术栈

1. 基础设施即代码 (IaC)

Terraform - 自动化部署和管理 AWS 资源

  • 版本: >= 1.0
  • Provider: AWS Provider ~> 5.0
  • 用途:
    • 创建 IAM SAML Provider
    • 定义 IAM Roles 和 Policies
    • 配置 CloudTrail 和 CloudWatch
    • 管理 S3 存储桶

核心资源:

- aws_iam_saml_provider       # SAML 身份提供商
- aws_iam_role                # IAM 角色
- aws_iam_role_policy         # 内联策略
- aws_iam_role_policy_attachment  # 托管策略附加
- aws_cloudtrail              # 审计追踪
- aws_cloudwatch_log_group    # 日志组
- aws_s3_bucket               # 日志存储

2. 身份和访问管理

Okta - 企业身份管理平台

  • 角色: Identity Provider (IdP)
  • 协议: SAML 2.0
  • 功能:
    • 集中式用户管理
    • 多因素认证 (MFA)
    • 用户组和应用分配
    • SAML Assertion 生成

AWS IAM - AWS 身份和访问管理

  • 组件:
    • SAML Identity Provider
    • IAM Roles (基于角色的访问控制)
    • Trust Policies (信任策略)
    • Permission Policies (权限策略)

AWS STS - Security Token Service

  • API: AssumeRoleWithSAML
  • 功能: 基于 SAML 断言颁发临时安全凭证
  • 凭证组成:
    • AccessKeyId
    • SecretAccessKey
    • SessionToken
    • Expiration

3. CLI 工具

aws-okta (推荐用于日常使用)

  • 语言: Go
  • 原理:
    1. 调用 Okta API 进行认证
    2. 获取 SAML Response
    3. 调用 AWS STS AssumeRoleWithSAML
    4. 将临时凭证注入环境变量
    5. 执行 AWS CLI 命令

使用示例:

aws-okta exec developer -- aws s3 ls

saml2aws (功能更丰富)

  • 语言: Go
  • 特点:
    • 支持多种 IdP (Okta, OneLogin, Azure AD 等)
    • 凭证缓存
    • 多 Profile 管理
    • 角色选择

使用示例:

saml2aws login --profile=developer
aws s3 ls --profile developer

4. 审计和监控

CloudTrail - AWS 审计服务

  • 功能:
    • 记录所有 API 调用
    • 特别关注 AssumeRoleWithSAML 事件
    • 多区域追踪
    • 日志文件完整性验证

CloudWatch - AWS 监控服务

  • 组件:
    • Log Groups: 存储 CloudTrail 日志
    • Metric Filters: 提取登录失败事件
    • Alarms: 失败次数阈值告警
    • Retention: 90 天日志保留

S3 - 日志持久化存储

  • 配置:
    • 版本控制启用
    • 公共访问阻止
    • 生命周期策略 (90 天删除)
    • Bucket Policy (CloudTrail 写入权限)

认证流程详解

Console 登录流程 (Browser-based)

┌────────┐         ┌────────┐         ┌────────┐
User   │         │ Okta   │         │  AWS└───┬────┘         └───┬────┘         └───┬────┘
    │                  │                  │
1. Click AWS App │                  │
    ├─────────────────>│                  │
    │                  │                  │
2. Login + MFA   │                  │
<────────────────>│                  │
    │                  │                  │
3. SAML Response │                  │
<─────────────────┤                  │
    │                  │                  │
4. POST SAML to AWS    ├────────────────────────────────────>    │                  │                  │
    │                  │ 5. Verify SAML    │                  │     signature    │
    │                  │                  │
    │                  │ 6. Extract Role    │                  │                  │
    │                  │ 7. Generate    │                  │    temp creds    │
    │                  │                  │
8. Console Session (with cookies)<────────────────────────────────────┤
    │                  │                  │
9. Access AWS Resources<───────────────────────────────────>    │                  │                  │

详细步骤:

  1. 用户在 Okta Dashboard 点击 AWS Account Federation 应用
  2. Okta 验证用户身份 (如果未登录)
  3. Okta 生成 SAML Response,包含:
    <saml:Attribute Name="https://aws.amazon.com/SAML/Attributes/Role">
      <saml:AttributeValue>
        arn:aws:iam::123456789012:role/Developer,
        arn:aws:iam::123456789012:saml-provider/Okta
      </saml:AttributeValue>
    </saml:Attribute>
    
  4. 浏览器 POST SAML Response 到 https://signin.aws.amazon.com/saml
  5. AWS 使用 SAML Provider 中的公钥验证签名
  6. AWS 提取 Role ARN 和 Session Name
  7. AWS STS 调用 AssumeRoleWithSAML 生成临时凭证
  8. AWS Console 设置 session cookies
  9. 用户访问 AWS Console,cookies 携带临时凭证

CLI 登录流程 (Programmatic)

┌─────────┐      ┌──────────┐      ┌────────┐      ┌────────┐
│aws-okta │      │   Okta   │      │AWS STS │      │AWS API└────┬────┘      └────┬─────┘      └───┬────┘      └───┬────┘
     │                │                │               │
1. Login       │                │               │
     ├───────────────>│                │               │
     │                │                │               │
2. Username    │                │               │
Password    │                │               │
+ MFA       │                │               │
<──────────────>│                │               │
     │                │                │               │
3. Session     │                │               │
Token       │                │               │
<───────────────┤                │               │
     │                │                │               │
4. Get SAML    │                │               │
Response    │                │               │
     ├───────────────>│                │               │
     │                │                │               │
5. SAML        │                │               │
Assertion   │                │               │
<───────────────┤                │               │
     │                │                │               │
6. AssumeRoleWithSAML(SAML)     │               │
     ├────────────────────────────────>│               │
     │                │                │               │
     │                │ 7. Verify SAML │               │
     │                │    Extract Role│     │                │                │               │
8. Temporary Credentials        │               │
         (AccessKey, SecretKey, Token)│               │
<────────────────────────────────┤               │
     │                │                │               │
9. Set ENV     │                │               │
     │    variables   │                │               │
     │                │                │               │
10. AWS CLI Command (with temp creds)     ├────────────────────────────────────────────────>     │                │                │               │
11. Response   │                │               │
<────────────────────────────────────────────────┤
     │                │                │               │

关键 API 调用:

# aws-okta 内部实现逻辑 (伪代码)

# 1. Okta 认证
okta_session = okta_api.authenticate(username, password, mfa_code)

# 2. 获取 SAML Response
saml_response = okta_api.get_saml_response(
    session_token=okta_session.token,
    app_url=aws_app_url
)

# 3. AWS STS AssumeRoleWithSAML
credentials = sts_client.assume_role_with_saml(
    RoleArn='arn:aws:iam::123456789012:role/Developer',
    PrincipalArn='arn:aws:iam::123456789012:saml-provider/Okta',
    SAMLAssertion=base64.b64encode(saml_response),
    DurationSeconds=43200
)

# 4. 设置环境变量
os.environ['AWS_ACCESS_KEY_ID'] = credentials['AccessKeyId']
os.environ['AWS_SECRET_ACCESS_KEY'] = credentials['SecretAccessKey']
os.environ['AWS_SESSION_TOKEN'] = credentials['SessionToken']

# 5. 执行 AWS 命令
subprocess.run(['aws', 's3', 'ls'])

安全机制

1. 多层身份验证

用户凭证 → Okta MFASAML 签名验证 → IAM 权限检查
  • Okta 层: 用户名/密码 + MFA (Push/TOTP)
  • 传输层: HTTPS/TLS 加密
  • 验证层: SAML 签名验证 (RSA-SHA256)
  • 授权层: IAM Policy 权限控制

2. 临时凭证机制

优势:

  • 凭证自动过期 (最长 12 小时)
  • 无需管理长期访问密钥
  • 减少凭证泄露风险
  • 凭证无法续期,必须重新认证

3. 最小权限原则

每个角色只分配必要的权限:

角色权限模型限制
DeveloperPowerUserAccess + Deny IAM不能管理用户和组织
DevOpsAdministratorAccess完全权限
TesterReadOnlyAccess + 条件写入只能操作测试环境
AuditorSecurityAudit只读,用于合规审计

4. 审计追踪

CloudTrail 记录:

{
  "eventName": "AssumeRoleWithSAML",
  "userIdentity": {
    "type": "SAMLUser",
    "principalId": "arn:aws:iam::123456789012:saml-provider/Okta:user@company.com",
    "userName": "user@company.com"
  },
  "requestParameters": {
    "roleArn": "arn:aws:iam::123456789012:role/Developer",
    "principalArn": "arn:aws:iam::123456789012:saml-provider/Okta",
    "durationSeconds": 43200
  },
  "responseElements": {
    "credentials": {
      "expiration": "2024-01-01T12:00:00Z"
    }
  },
  "sourceIPAddress": "1.2.3.4",
  "userAgent": "aws-cli/2.x"
}

技术限制与考虑

1. 会话时长限制

  • 最长 12 小时 (43200 秒)
  • 过期需要重新认证
  • 不支持无限期会话

2. SAML 断言大小

  • SAML Response 有大小限制 (~100KB)
  • 不适合传递大量自定义属性
  • 角色数量建议 < 10 个/用户

3. 网络依赖

  • 需要访问 Okta 和 AWS 服务
  • 离线环境无法使用
  • 网络中断会影响认证

4. 成本考虑

  • Okta 按用户收费
  • CloudTrail 存储成本
  • 数据传输成本

相关标准和协议

  • SAML 2.0: OASIS 标准身份联合协议
  • OAuth 2.0: 授权框架 (Okta API 使用)
  • OpenID Connect: 身份层 (可选替代方案)
  • HTTPS/TLS 1.2+: 传输层安全
  • JSON Web Token (JWT): Okta session token 格式