- Published on
AWS Okta SSO 方案
- Authors

- Name
- Guming
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)
工作流程:
- 用户发起登录: 用户在 Okta Dashboard 点击 AWS 应用
- 身份认证: Okta 验证用户身份(用户名/密码 + MFA)
- 生成 SAML Assertion: Okta 生成包含用户身份和角色信息的 SAML 断言
- 传递到 AWS: 浏览器将 SAML Response POST 到 AWS
- 验证和授权: AWS 验证 SAML 签名,提取角色信息
- 临时凭证: AWS STS 生成临时访问凭证
- 访问资源: 用户使用临时凭证访问 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/Role | role-arn,saml-provider-arn | 指定用户可以假设的角色 |
https://aws.amazon.com/SAML/Attributes/RoleSessionName | user.email | 会话标识,用于审计 |
https://aws.amazon.com/SAML/Attributes/SessionDuration | 43200 | 会话持续时间(秒) |
技术架构
架构图
┌──────────────────────────────────────────────────────────────┐
│ 用户层 │
│ ┌──────────────┐ ┌──────────────┐ │
│ │ Web Browser │ │ AWS CLI │ │
│ │ (Console) │ │ + aws-okta │ │
│ └──────┬───────┘ └──────┬───────┘ │
└─────────┼──────────────────────────────┼──────────────────────┘
│ │
│ HTTPS │ HTTPS
▼ ▼
┌──────────────────────────────────────────────────────────────┐
│ 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 断言颁发临时安全凭证
- 凭证组成:
AccessKeyIdSecretAccessKeySessionTokenExpiration
3. CLI 工具
aws-okta (推荐用于日常使用)
- 语言: Go
- 原理:
- 调用 Okta API 进行认证
- 获取 SAML Response
- 调用 AWS STS
AssumeRoleWithSAML - 将临时凭证注入环境变量
- 执行 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 │
│<───────────────────────────────────>│
│ │ │
详细步骤:
- 用户在 Okta Dashboard 点击 AWS Account Federation 应用
- Okta 验证用户身份 (如果未登录)
- 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> - 浏览器 POST SAML Response 到
https://signin.aws.amazon.com/saml - AWS 使用 SAML Provider 中的公钥验证签名
- AWS 提取 Role ARN 和 Session Name
- AWS STS 调用
AssumeRoleWithSAML生成临时凭证 - AWS Console 设置 session cookies
- 用户访问 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 MFA → SAML 签名验证 → IAM 权限检查
- Okta 层: 用户名/密码 + MFA (Push/TOTP)
- 传输层: HTTPS/TLS 加密
- 验证层: SAML 签名验证 (RSA-SHA256)
- 授权层: IAM Policy 权限控制
2. 临时凭证机制
优势:
- 凭证自动过期 (最长 12 小时)
- 无需管理长期访问密钥
- 减少凭证泄露风险
- 凭证无法续期,必须重新认证
3. 最小权限原则
每个角色只分配必要的权限:
| 角色 | 权限模型 | 限制 |
|---|---|---|
| Developer | PowerUserAccess + Deny IAM | 不能管理用户和组织 |
| DevOps | AdministratorAccess | 完全权限 |
| Tester | ReadOnlyAccess + 条件写入 | 只能操作测试环境 |
| Auditor | SecurityAudit | 只读,用于合规审计 |
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 格式