You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过命令行获取AWS联合访问的SAML Response以生成临时凭证

自动化获取GSuite SAML Response生成AWS临时凭证

我完全懂你的痛点——既然已经靠GSuite SAML实现了AWS控制台的SSO,还要手动维护IAM用户密钥来用API/CLI,确实完全违背了单点登录的初衷。下面我会分享几种靠谱的自动化获取SAML Response的方法,帮你把整个凭证生成流程彻底脚本化:

方法1:用Selenium自动化浏览器捕获SAML Response

这是最直观的方案,完全模拟用户手动登录的流程来抓取SAML断言,兼容性最好:

步骤与示例脚本:

  1. 先安装依赖:

    # 安装Python的Selenium库
    pip install selenium
    # 下载对应浏览器的驱动(比如ChromeDriver),确保版本和你的浏览器完全匹配
    
  2. 编写Python脚本(以Chrome为例):

    from selenium import webdriver
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.support import expected_conditions as EC
    import time
    import subprocess
    import json
    
    # 配置参数(建议用环境变量存储敏感信息,不要硬编码)
    GSUITE_SSO_URL = "你的GSuite SAML登录AWS的专属URL"
    USERNAME = "你的GSuite邮箱账号"
    PASSWORD = "你的GSuite密码"
    AWS_ROLE_ARN = "arn:aws:iam::000000000000:role/saml-role"
    AWS_PROVIDER_ARN = "arn:aws:iam::000000000000:saml-provider/GoogleApps"
    
    # 初始化浏览器驱动
    driver = webdriver.Chrome()
    driver.get(GSUITE_SSO_URL)
    
    # 输入用户名并提交
    username_field = WebDriverWait(driver, 10).until(
        EC.presence_of_element_located((By.ID, "identifierId"))
    )
    username_field.send_keys(USERNAME)
    driver.find_element(By.ID, "identifierNext").click()
    
    # 输入密码并提交
    password_field = WebDriverWait(driver, 10).until(
        EC.presence_of_element_located((By.NAME, "Passwd"))
    )
    password_field.send_keys(PASSWORD)
    driver.find_element(By.ID, "passwordNext").click()
    
    # 处理MFA(如果启用了TOTP,需要额外安装pyotp库)
    # import pyotp
    # totp = pyotp.TOTP("你的MFA密钥")
    # mfa_code = totp.now()
    # mfa_field = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.NAME, "Pin")))
    # mfa_field.send_keys(mfa_code)
    # driver.find_element(By.ID, "totpNext").click()
    
    # 等待页面跳转并加载完成
    time.sleep(5)
    
    # 提取隐藏表单中的SAML Response(base64编码格式)
    saml_response = driver.find_element(By.NAME, "SAMLResponse").get_attribute("value")
    
    # 关闭浏览器
    driver.quit()
    
    # 调用AWS CLI生成临时凭证
    cmd = [
        "aws", "sts", "assume-role-with-saml",
        "--role-arn", AWS_ROLE_ARN,
        "--principal-arn", AWS_PROVIDER_ARN,
        "--saml-assertion", saml_response,
        "--policy", '{"Version":"2012-10-17","Statement":[{"Effect":"Allow","Action":"*","Resource":"*"}]}',
        "--output", "json",
        "--duration-seconds", "28800"
    ]
    
    result = subprocess.run(cmd, capture_output=True, text=True)
    credentials = json.loads(result.stdout)["Credentials"]
    
    # 可以把凭证写入~/.aws/credentials或者输出到环境变量
    print("生成的临时凭证:")
    print(f"AccessKeyId: {credentials['AccessKeyId']}")
    print(f"SecretAccessKey: {credentials['SecretAccessKey']}")
    print(f"SessionToken: {credentials['SessionToken']}")
    print(f"过期时间: {credentials['Expiration']}")
    

方法2:用curl模拟HTTP请求捕获SAML Response

如果不想依赖浏览器,可以直接模拟GSuite登录的HTTP请求流程,这种方法更轻量,但需要先抓包分析登录参数:

bash脚本示例(无MFA简化版):

#!/bin/bash

# 配置参数
GSUITE_SSO_URL="你的GSuite SAML登录AWS的专属URL"
USERNAME="你的GSuite邮箱账号"
PASSWORD="你的GSuite密码"
AWS_ROLE_ARN="arn:aws:iam::000000000000:role/saml-role"
AWS_PROVIDER_ARN="arn:aws:iam::000000000000:saml-provider/GoogleApps"

# 第一步:获取登录页面的Cookie和GALX参数
LOGIN_PAGE=$(curl -c cookies.txt -s "$GSUITE_SSO_URL")
GALX=$(echo "$LOGIN_PAGE" | grep -o 'name="GALX" value="[^"]*"' | cut -d '"' -f 4)

# 第二步:提交用户名
curl -b cookies.txt -c cookies.txt -s -X POST \
  -d "identifier=$USERNAME&GALX=$GALX&continue=$GSUITE_SSO_URL" \
  "https://accounts.google.com/signin/v2/challenge/identifier"

# 第三步:提交密码
curl -b cookies.txt -c cookies.txt -s -X POST \
  -d "Passwd=$PASSWORD&GALX=$GALX&continue=$GSUITE_SSO_URL" \
  "https://accounts.google.com/signin/v2/challenge/password"

# 第四步:获取SAML Response页面并提取断言
SAML_PAGE=$(curl -b cookies.txt -s "$GSUITE_SSO_URL")
SAML_RESPONSE=$(echo "$SAML_PAGE" | grep -o 'name="SAMLResponse" value="[^"]*"' | cut -d '"' -f 4)

# 第五步:调用AWS CLI生成临时凭证
aws sts assume-role-with-saml \
  --role-arn "$AWS_ROLE_ARN" \
  --principal-arn "$AWS_PROVIDER_ARN" \
  --saml-assertion "$SAML_RESPONSE" \
  --policy '{"Version":"2012-10-17","Statement":[{"Effect":"Allow","Action":"*","Resource":"*"}]}' \
  --output json \
  --duration-seconds 28800

# 清理临时Cookie文件
rm cookies.txt

关键注意事项:

  • MFA处理:如果启用了MFA,TOTP可以用pyotp生成验证码;硬件令牌(如YubiKey)则需要额外工具模拟输入,流程会更复杂。
  • 安全规范:绝对不要在脚本中硬编码密码或MFA密钥,建议用环境变量、AWS Secrets Manager等工具存储敏感信息。
  • 参数更新:Google的登录端点或参数可能会不定期变化,需要定期用浏览器开发者工具验证请求参数。
  • 会话过期:GSuite的登录会话会过期,脚本需要处理自动重新登录的逻辑。

拿到SAML Response后,用你提到的aws sts assume-role-with-saml命令生成的临时凭证,完全可以替代IAM用户密钥,直接配置到AWS CLI或SDK中使用,彻底实现SSO下的API/CLI访问自动化。

内容的提问来源于stack exchange,提问作者Varun Chandak

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 08:41:18