目次
- 初心者から実務者向けの包括的解説
- 概要
- STS が解決する課題 {#課題}
- 主な特徴 {#特徴}
- アーキテクチャ {#アーキテクチャ}
- AssumeRole(クロスアカウント) {#assumerole}
- AssumeRoleWithWebIdentity(OIDC Federation) {#oidc}
- AssumeRoleWithSAML(SAML Federation) {#saml}
- GetSessionToken(MFA) {#getsessiontoken}
- GetFederationToken(ユーザーベース) {#getfederationtoken}
- Source Identity・Session Tags {#sourceid}
- Session Policies {#sessionpolicies}
- External ID・信頼ポリシー {#externalid}
- 主要ユースケース {#usecases}
- 設定・操作の具体例 {#cli}
- Workload Identity Federation {#workload}
- IAM Identity Center {#identitycenter}
- 類似サービス比較 {#comparison}
- ベストプラクティス {#bestpractices}
- トラブルシューティング {#troubleshooting}
- 2025-2026 最新動向 {#latest}
- 学習リソース・参考文献 {#resources}
- 実装例・ロードマップ {#roadmap}
- 実装チェックリスト {#checklist}
- まとめ
AWS STS 完全ガイド v2.0
初心者から実務者向けの包括的解説
AWS STS(Security Token Service) は、一時的なセキュリティ認証情報 を発行するマネージド認証サービスです。AssumeRole・AssumeRoleWithWebIdentity・AssumeRoleWithSAML・GetSessionToken・GetFederationToken API により、短期間(15 分~12 時間)有効な AccessKeyId・SecretAccessKey・SessionToken を発行。クロスアカウントアクセス・フェデレーション・CI/CD・コンテナワークロード・Lambda 実行ロールなど、あらゆる IAM 認証基盤を支える核心サービスです。本ドキュメントは、STS の仕組み・API・ユースケース・ベストプラクティスを体系的に解説する完全ガイドです。
ドキュメントの目的
本ガイドは以下を対象としています:
- セキュリティ初心者向け:一時認証情報とは何か、なぜ必要か
- クラウドアーキテクト向け:クロスアカウント・フェデレーション設計
- DevOps・SRE 向け:OIDC Workload Identity・CI/CD 認証
- 開発者向け:SDK での STS 活用(Python・Node.js・Java)
- セキュリティ管理者向け:長期キー廃止・一時認証情報ポリシー
2025-2026 年の STS エコシステム
- OIDC Federation 強化:Google・GitHub・CircleCI・OCI クレーム検証
- IAM Identity Center 統合:企業 SSO と STS ネイティブ統合
- Source Identity ラベリング:監査ログでのアクショントレーサビリティ向上
- Session Policies 動的生成:AI ベース権限絞り込み
- Workload Identity Federation:EC2・Lambda 外の汎用 OIDC サポート
定義
AWS 公式による定義:
“AWS Security Token Service (AWS STS) is a service that provides temporary security credentials.”
長期的な IAM ユーザーキーより、一時認証情報による Just-In-Time Access Control を実現。
目次
- 概要
- STS が解決する課題
- 主な特徴
- アーキテクチャ
- AssumeRole(クロスアカウント)
- AssumeRoleWithWebIdentity(OIDC Federation)
- AssumeRoleWithSAML(SAML Federation)
- GetSessionToken(MFA)
- GetFederationToken(ユーザーベース)
- Source Identity・Session Tags
- Session Policies
- External ID・信頼ポリシー
- 主要ユースケース
- 設定・操作の具体例
- Workload Identity Federation
- IAM Identity Center
- 類似サービス比較
- ベストプラクティス
- トラブルシューティング
- 2025-2026 最新動向
- 学習リソース
- 実装例・ロードマップ
- 実装チェックリスト
- まとめ
概要
初心者向けメモ: STS は「AWS の一時通行証 発行機構」です。「Alice が Bob というロールを 1 時間使いたい」という要求に対し、STS が「この 1 時間有効な通行証(AccessKey + Token)を使いなさい」と発行。時間経過で自動無効化され、長期キー管理の手間を排除します。
STS は、以下を実現する統合認証・認可プラットフォームです:
| 機能 | 説明 |
|---|---|
| AssumeRole | ロール引き受け、クロスアカウントアクセス |
| AssumeRoleWithWebIdentity | OIDC トークン(GitHub・Google)で AWS アクセス |
| AssumeRoleWithSAML | SAML アサーション(企業 IdP)で AWS アクセス |
| GetSessionToken | MFA 確認下での一時トークン発行 |
| GetFederationToken | ユーザーベース・無期限カスタムポリシー |
| 一時認証情報の自動失効 | トークン有効期限自動管理 |
STS が解決する課題 {#課題}
1. 長期 IAM キーの漏洩・管理困難
課題:IAM ユーザーキー漏洩 → 無期限アクセス可能 → 侵害被害拡大 STS の解決:短期トークン(1~12 時間)で自動失効、キーローテーション不要
2. クロスアカウント・複雑な権限委譲
課題:Account A のユーザーが Account B のリソース アクセス → IAM ユーザー複製 STS の解決:AssumeRole で Account A からアクセス、Account B ロール経由で委譲
3. 企業 SSO・フェデレーション構築困難
課題:AWS ネイティブ認証だけでは不足、企業 Active Directory・SAML 連携必要 STS の解決:SAML Federation で企業 IdP から直接 AWS アクセス
4. CI/CD・マイクロサービス認証
課題:CI/CD パイプラインに長期キー埋め込み → セキュリティリスク STS の解決:OIDC Federation で GitHub Actions・GitLab CI から一時トークン取得
主な特徴 {#特徴}
1. 複数の発行メカニズム
【AssumeRole】
├─ クロスアカウント + ロール引き受け
└─ 最も一般的
【OIDC Federation】
├─ GitHub Actions・Google Cloud・CircleCI
└─ クレデンシャル埋め込み不要
【SAML Federation】
├─ 企業 IdP(Active Directory・Okta)
└─ 企業 SSO 統合
【MFA ベース】
├─ GetSessionToken + MFA 確認
└─ デバイスセキュリティ層
【ユーザーベース】
└─ GetFederationToken で細粒度制御
2. トークン有効期限自動管理
トークン発行
├─ 有効期限: 発行時に指定(15 分~12 時間)
└─ 例:2026-04-26T16:00:00Z に無効化
自動失効: プロセスが失効トークン使用 → AccessDenied
→ 新トークン要求 → 再発行
3. Session Token の 3 つの構成要素
AccessKeyId: AKIA... (20 文字)
└─ 一時的なアクセスキー ID
SecretAccessKey: ...(40 文字)
└─ 一時的なシークレットキー
SessionToken: AQoDY... (バイナリ Base64 エンコード)
└─ セッションの証明、署名確認用
アーキテクチャ {#アーキテクチャ}
【図1】STS フロー全体図
graph LR
subgraph "Account A"
User["IAM User/Role"]
App["Application"]
end
subgraph "STS Service"
Assume["AssumeRole API"]
OIDC["OIDC Federation"]
SAML["SAML Federation"]
MFA["MFA + GetSessionToken"]
end
subgraph "Account B"
Role["Target Role"]
Resource["S3/RDS/EC2"]
end
subgraph "External IdP"
GitHub["GitHub Actions<br/>OIDC Provider"]
Okta["Okta<br/>SAML IdP"]
end
User -->|AssumeRole| Assume
App -->|OIDC Token| OIDC
GitHub -->|ID Token| OIDC
User -->|SAML Assertion| SAML
Okta -->|SAML Response| SAML
User -->|MFA| MFA
Assume -->|Temporary Credentials| Role
OIDC -->|Temporary Credentials| Role
SAML -->|Temporary Credentials| Role
MFA -->|Temporary Credentials| User
Role -->|API Call| Resource
【図2】AssumeRole フロー詳細
sequenceDiagram
participant AccountA as Account A<br/>IAM User
participant STS as AWS STS
participant AccountB as Account B<br/>Target Role
participant Resource as Resource<br/>S3/RDS/EC2
AccountA->>STS: 1. AssumeRole Request<br/>(RoleArn, DurationSeconds)
STS->>AccountB: 2. Validate Trust Policy<br/>Can AccountA assume?
AccountB-->>STS: OK
STS-->>AccountA: 3. Return Temporary Credentials<br/>(AccessKeyId, SecretAccessKey, SessionToken)
AccountA->>Resource: 4. API Call with SessionToken<br/>s3:GetObject
Resource->>Resource: 5. Validate SessionToken<br/>Signature Check
Resource-->>AccountA: 6. Response 200 OK
AssumeRole(クロスアカウント) {#assumerole}
仕組み
Account A のユーザーが、Account B のロール を引き受け、Account B リソースにアクセス。
【Account A 側】
IAM User
└─ AssumeRole 権限: Account B の特定ロール
【Account B 側】
Target Role
└─ Trust Policy で Account A を信頼
"Principal": { "AWS": "arn:aws:iam::AccountA:root" }
実装例
# Account A から Account B ロール引き受け
aws sts assume-role \
--role-arn arn:aws:iam::AccountB:role/CrossAccountRole \
--role-session-name alice-session \
--duration-seconds 3600
# 出力:
# {
# "Credentials": {
# "AccessKeyId": "AKIAIOSFODNN7EXAMPLE",
# "SecretAccessKey": "wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY",
# "SessionToken": "AQoDYXdzEJr...",
# "Expiration": "2026-04-26T17:00:00Z"
# }
# }
# 取得した認証情報を環境変数に設定
export AWS_ACCESS_KEY_ID="AKIAIOSFODNN7EXAMPLE"
export AWS_SECRET_ACCESS_KEY="wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY"
export AWS_SESSION_TOKEN="AQoDYXdzEJr..."
# Account B リソースにアクセス
aws s3 ls --region us-east-1
AssumeRoleWithWebIdentity(OIDC Federation) {#oidc}
仕組み
外部 OIDC プロバイダー(GitHub・Google・CircleCI)から ID トークンを取得し、STS に提示して AWS 認証情報を取得。
【フロー】
GitHub Actions
├─ ワークフロー実行
└─ GitHub OIDC プロバイダーから ID トークン取得
AWS
├─ STS に ID トークン提示
└─ trust-policy で GitHub を信頼 → OK
└─ 一時認証情報発行
GitHub Actions での実装
name: AWS S3 Upload with OIDC
on:
push:
branches: [main]
permissions:
id-token: write # OIDC トークン要求権限
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Configure AWS credentials
uses: aws-actions/configure-aws-credentials@v2
with:
role-to-assume: arn:aws:iam::123456789012:role/GitHubActionsRole
aws-region: us-east-1
- name: Upload to S3
run: |
aws s3 cp ./artifact.zip s3://my-bucket/
信頼ポリシー(AWS 側)
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Federated": "arn:aws:iam::123456789012:oidc-provider/token.actions.githubusercontent.com"
},
"Action": "sts:AssumeRoleWithWebIdentity",
"Condition": {
"StringEquals": {
"token.actions.githubusercontent.com:aud": "sts.amazonaws.com"
},
"StringLike": {
"token.actions.githubusercontent.com:sub": "repo:myorg/myrepo:ref:refs/heads/main"
}
}
}
]
}
2025 年新機能:ID プロバイダー特定クレーム検証
{
"Condition": {
"StringEquals": {
"github.com:aud": "sts.amazonaws.com",
"google.com:sub": "user@example.com",
"circleci.com:org_id": "12345678"
}
}
}
Google・GitHub・CircleCI・OCI 各プロバイダーの特定クレーム(aud・sub・org_id 等)で細粒度検証。
AssumeRoleWithSAML(SAML Federation) {#saml}
仕組み
企業 IdP(Active Directory・Okta・PingFederate)が SAML Assertion を発行し、STS に提示。
【フロー】
ユーザー
└─ 企業 IdP にログイン
企業 IdP
└─ SAML Assertion 生成(ユーザー情報・グループ含む)
AWS STS
├─ SAML Assertion 検証(署名確認)
└─ ロール・セッション生成
Okta との統合例
# Okta から SAML Assertion 取得(オフライン)
curl -X POST https://tenant.okta.com/api/v1/authn \
-H "Accept: application/json" \
-H "Content-Type: application/json" \
-d '{
"username": "user@example.com",
"password": "password",
"options": {
"warnBeforePasswordExpired": true
}
}'
# SAML Assertion → STS に提示
aws sts assume-role-with-saml \
--role-arn arn:aws:iam::123456789012:role/OktaSAMLRole \
--principal-arn arn:aws:iam::123456789012:saml-provider/Okta \
--saml-assertion <base64-encoded-assertion>
GetSessionToken(MFA) {#getsessiontoken}
仕組み
MFA デバイスで認証後、一時トークン発行。高権限オペレーションの追加セキュリティ層。
# MFA シリアル番号を指定して一時トークン要求
aws sts get-session-token \
--serial-number arn:aws:iam::123456789012:mfa/alice \
--token-code 123456 \
--duration-seconds 3600
# 出力:一時認証情報(MFA 確認済み)
ユースケース
【長期キーの代わり】
IAM User で長期キーを生成しない
└─ GetSessionToken で MFA 確認後のトークン のみ使用
【高権限操作の保護】
ルートアカウント操作
└─ MFA + GetSessionToken で強化
【監査ログの分かりやすさ】
CloudTrail で「mfa_authenticated: true」のマーク
└─ MFA を経た操作を明確区別
GetFederationToken(ユーザーベース) {#getfederationtoken}
仕組み
IAM ユーザーが、カスタムセッションポリシー付きの一時トークンを生成。
# カスタムポリシー付きトークン生成
aws sts get-federation-token \
--name alice-session \
--policy file://session-policy.json \
--duration-seconds 3600
# session-policy.json(S3 読み取り限定)
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::my-bucket/*"
}
]
}
AssumeRole との違い
【GetFederationToken】
└─ IAM ユーザー自身が権限制限したトークン生成
└─ アプリケーションに配布(一時的)
【AssumeRole】
└─ ロール を引き受け、別アカウント・リソース アクセス
└─ クロスアカウント・権限昇格用
Source Identity・Session Tags {#sourceid}
Source Identity
一時認証情報を誰が生成したかを CloudTrail ログに記録。
aws sts assume-role \
--role-arn arn:aws:iam::AccountB:role/CrossAccountRole \
--role-session-name alice-session \
--source-identity alice \
--duration-seconds 3600
# CloudTrail ログに記録
# "sourceIdentity": "alice"
Session Tags
セッションにメタデータ付与。ポリシーで条件付け制御可能。
aws sts assume-role \
--role-arn arn:aws:iam::AccountB:role/CrossAccountRole \
--role-session-name alice-session \
--tags Key=Department,Value=Engineering Key=CostCenter,Value=1234
Session Policies {#sessionpolicies}
概要
AssumeRole・AssumeRoleWithWebIdentity 時に、ロールの権限を さらに絞り込む ポリシーを指定。
aws sts assume-role \
--role-arn arn:aws:iam::AccountB:role/FullAccessRole \
--role-session-name alice-limited \
--policy file://session-policy.json
# session-policy.json(S3・特定バケットのみ)
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": ["s3:GetObject", "s3:PutObject"],
"Resource": "arn:aws:s3:::restricted-bucket/*"
}
]
}
ポリシー評価ロジック
AssumeRole → Role Trust Policy OK
↓
Session Policy との AND 条件(AND Logic)
↓
最終的な権限: Role Policy ∩ Session Policy
External ID・信頼ポリシー {#externalid}
External ID とは
クロスアカウントアクセス時、Account A が外部パーティー(第三者)を信頼する場合、盗まれた認証情報からのアクセスを防ぐための 追加認証鍵。
【シナリオ】
Account A(顧客)が
Account B(SaaS ベンダー)にアクセス権を委譲
盗まれた Account B 認証情報 × Account A リソース不正アクセス防止
→ External ID として秘密鍵を指定
→ Account B から AssumeRole 時に External ID も提示(マッチ必須)
実装例
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::123456789012:role/SaaS-Provider-Role"
},
"Action": "sts:AssumeRole",
"Condition": {
"StringEquals": {
"sts:ExternalId": "7a1d5-3b9c-4f2e" # 秘密の External ID
}
}
}
]
}
SaaS ベンダーが AssumeRole 時:
aws sts assume-role \
--role-arn arn:aws:iam::AccountA:role/SaaSProviderRole \
--role-session-name saas-session \
--external-id "7a1d5-3b9c-4f2e" # External ID 提示
主要ユースケース {#usecases}
- クロスアカウント監査:スタンドアロン監査アカウントから全メンバーアカウント監査
- GitHub Actions CI/CD:OIDC Federation で長期キー埋め込み排除
- 企業 SSO:Active Directory・Okta から AWS コンソール・API アクセス
- ハイブリッド環境:オンプレミス + AWS リソース統一認証
- マイクロサービス:ECS/Lambda ロール で自動トークン取得
- パートナー統合:第三者アプリケーション (SaaS)への安全な委譲
- Lambda 実行ロール:Lambda が S3・DynamoDB にアクセス(自動トークン)
設定・操作の具体例 {#cli}
1. クロスアカウント AssumeRole
# Account B でロール作成・信頼ポリシー設定
aws iam create-role \
--role-name CrossAccountRole \
--assume-role-policy-document '{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {"AWS": "arn:aws:iam::AccountA:root"},
"Action": "sts:AssumeRole"
}
]
}' \
--region us-east-1
# Account A ユーザーに AssumeRole 権限付与
aws iam put-user-policy \
--user-name alice \
--policy-name AssumeRolePolicy \
--policy-document '{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "sts:AssumeRole",
"Resource": "arn:aws:iam::AccountB:role/CrossAccountRole"
}
]
}'
# Account A から AssumeRole
aws sts assume-role \
--role-arn arn:aws:iam::AccountB:role/CrossAccountRole \
--role-session-name alice-session
2. OIDC Provider 設定(GitHub)
# OIDC Provider 作成
aws iam create-open-id-connect-provider \
--url https://token.actions.githubusercontent.com \
--client-id-list sts.amazonaws.com \
--thumbprint-list 6938fd4d98bab03faadb97b34396831e3780aea1
# ロール作成(GitHub OIDC 信頼)
aws iam create-role \
--role-name GitHubActionsRole \
--assume-role-policy-document file://github-trust-policy.json
3. Lambda 実行ロール自動トークン取得
import boto3
# Lambda 実行ロール で自動的にトークン取得
# 環境変数から認証情報読み込み
s3 = boto3.client('s3')
response = s3.list_buckets()
print(response)
Workload Identity Federation {#workload}
概要
従来は EC2 IAM Role だけだったが、Kubernetes・GitHub Actions・Google Cloud 等の外部ワークロードから、OIDC Federation で AWS リソースアクセス可能に。
【従来】
EC2 Instance Profile
└─ EC2 のみ IAM Role 自動取得
【Workload Identity Federation】
GitHub Actions / GitLab CI / Google Cloud / Kubernetes
└─ OIDC Token → STS AssumeRoleWithWebIdentity
└─ 一時認証情報取得
└─ AWS リソースアクセス
IAM Identity Center {#identitycenter}
概能
IAM Identity Center は STS を内部で活用し、企業 SSO からの AWS アクセスを簡素化。
【従来】
Active Directory
→ SAML → STS AssumeRoleWithSAML
→ 設定複雑
【IAM Identity Center】
Active Directory
→ SCIM 統期
→ 自動ロール割り当て
→ SSO ポータル
→ 内部で STS AssumeRole
類似サービス比較 {#comparison}
| 特性 | AWS STS | HashiCorp Vault | Azure AD | GCP Workload Identity |
|---|---|---|---|---|
| 形態 | AWS マネージド | OSS/Commercial | クラウド SSO | Google ネイティブ |
| OIDC | ◎ | ◎ | ◎ | ◎ |
| SAML | ◎ | △ | ◎ | △ |
| クロスアカウント | ◎◎ | △ | △ | △ |
| AWS 統合 | ◎◎ | △ | △ | × |
| 価格 | 無料 | 無料/有料 | 無料/有料 | 無料 |
ベストプラクティス {#bestpractices}
✅ 推奨
✓ 長期 IAM キー廃止、STS トークンに統一
✓ AssumeRole は External ID と共に使用
✓ Session Policy で権限最小化
✓ MFA + GetSessionToken で高権限操作保護
✓ CloudTrail で STS API すべて ログ記録
✓ Source Identity でトレーサビリティ確保
✓ OIDC Federation で CI/CD にキー埋め込み排除
❌ アンチパターン
× 長期 IAM キーを CI/CD パイプラインに埋め込み
× AssumeRole を External ID なしで信頼
× Session Policy なしの無制限委譲
× トークン有効期限を上限(12 時間)に設定
× CloudTrail ロギングなし
トラブルシューティング {#troubleshooting}
| 症状 | 原因 | 解決策 |
|---|---|---|
| AssumeRole エラー | 信頼ポリシー不一致 | arn・Principal 確認 |
| OIDC Federation 失敗 | Thumbprint 誤り | OIDC Provider thumbprint 再設定 |
| Session Token 失効 | 有効期限切れ | 新トークン要求 |
| Permission Denied | Session Policy で権限制限 | Policy 確認・ロール権限追加 |
2025-2026 最新動向 {#latest}
- OIDC Federation マルチプロバイダー対応:Google・GitHub・CircleCI・OCI クレーム検証統一
- IAM Identity Center 統合深化:STS AssumeRole が完全に IAM Identity Center に統合
- AI ベース Session Policy 生成:操作パターン分析で権限自動提案
- CloudTrail Insights で異常検知:STS トークン乱用検出
- Workload Identity Federation 拡張:Kubernetes・OpenShift・Nomad ネイティブサポート
学習リソース・参考文献 {#resources}
公式ドキュメント
- AWS STS API Reference
- AWS STS User Guide
- Assuming an IAM Role
- Web Identity Federation
- SAML Federation
- AWS CloudTrail User Guide
- IAM Identity Center
- OIDC Specification
OSS・ベンダー資料
実装例・ロードマップ {#roadmap}
Week 1-2:セットアップ
- Day 1-3: OIDC Provider 設定(GitHub)
- Day 4-7: AssumeRole・信頼ポリシー構築
- Day 8-10: Session Policy テスト
- Day 11-14: IAM Identity Center 統合(オプション)
Week 3-4:本運用
- Day 15-17: 既存長期キー廃止計画
- Day 18-21: CI/CD パイプライン OIDC 統合
- Day 22-28: CloudTrail 監視・アラート設定
実装チェックリスト {#checklist}
【基本セットアップ】
☐ OIDC Provider 作成(GitHub・Google・等)
☐ IAM ロール作成・信頼ポリシー設定
☐ Session Policy テンプレート準備
☐ CloudTrail ロギング有効化
【クロスアカウント】
☐ Account B ロール作成
☐ Account A ユーザー AssumeRole 権限
☐ External ID 設定・共有
【OIDC Federation】
☐ OIDC Provider Thumbprint 確認
☐ GitHub Actions 設定
☐ CI/CD パイプライン テスト
【本運用】
☐ 長期キー廃止スケジュール
☐ CloudTrail Alert 設定
☐ MFA + GetSessionToken 運用開始
☐ 監視ダッシュボード構築
まとめ
AWS STS は、短期認証情報による Just-In-Time Access Control の核心サービスです。AssumeRole・OIDC Federation・MFA・Session Policies により、長期キーのセキュリティ課題を解決し、クロスアカウント・企業 SSO・CI/CD・マイクロサービスにおける柔軟で安全な認証基盤を構築。IAM セキュリティポスチャーの最重要ピースです。
核心ポイント
- 短期トークン:15 分~12 時間の自動失効で漏洩リスク低減
- 複数発行メカニズム:AssumeRole・OIDC・SAML で多様なシーン対応
- 権限最小化:Session Policy で権限さらに絞り込み
- External ID:クロスアカウント時の追加セキュリティ層
- CI/CD 統合:OIDC Federation でキー埋め込み排除
最終更新:2026-04-26
バージョン:v2.0