如何通过命令行获取AWS联合访问的SAML Response以生成临时凭证
自动化获取GSuite SAML Response生成AWS临时凭证
我完全懂你的痛点——既然已经靠GSuite SAML实现了AWS控制台的SSO,还要手动维护IAM用户密钥来用API/CLI,确实完全违背了单点登录的初衷。下面我会分享几种靠谱的自动化获取SAML Response的方法,帮你把整个凭证生成流程彻底脚本化:
方法1:用Selenium自动化浏览器捕获SAML Response
这是最直观的方案,完全模拟用户手动登录的流程来抓取SAML断言,兼容性最好:
步骤与示例脚本:
先安装依赖:
# 安装Python的Selenium库 pip install selenium # 下载对应浏览器的驱动(比如ChromeDriver),确保版本和你的浏览器完全匹配编写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
相关产品推荐
相关产品推荐

