😀
制限付きAWSコンソールアクセスを提供する方法
はじめに
AWSでは、IAMロールとSTS(Security Token Service)を利用して、一時的なAWSコンソールアクセスを提供できます。この機能を活用すると、リソースや操作の範囲を制限し、期限付きでAWSコンソールにアクセスさせることが可能です。
この記事では、AWS公式ドキュメント「AWS コンソールへのカスタム ID ブローカーアクセスを有効にする」を参考に、Pythonコードを使用してカスタムAWSコンソールアクセスURLを生成する方法を紹介します。
事前準備
-
IAMロールの作成
- アクセスしたいAWSアカウントに、制限付きのポリシーを設定したIAMロールを作成します。
- 以下は、S3バケットのリストのみ許可するCloudFormationの例です。
iam_role.yml
AWSTemplateFormatVersion: "2010-09-09"
Description: iam role
Parameters:
RoleName:
Type: String
Default: "DemoRole"
Resources:
SampleRole:
Type: AWS::IAM::Role
Properties:
RoleName: !Ref RoleName
AssumeRolePolicyDocument:
Version: "2012-10-17"
Statement:
- Effect: Allow
Principal:
AWS: !Sub "arn:aws:iam::${AWS::AccountId}:root"
Action: "sts:AssumeRole"
Policies:
- PolicyName: "SamplePolicy"
PolicyDocument:
Version: "2012-10-17"
Statement:
- Effect: Allow
Action: "s3:ListAllMyBuckets"
Resource: "*"
Outputs:
SampleRoleARN:
Value: !GetAtt SampleRole.Arn
-
Python環境のセットアップ
- 必要なライブラリ(
boto3
,requests
)をインストールします。
- 必要なライブラリ(
pip install boto3 requests
Python実装
以下のPythonコードを使用して、カスタムAWSコンソールURLを生成します。
1. Pythonコード
awsurl.py
import boto3
import requests
import json
import urllib.parse
# AWSリソースとセッションの設定
ROLE_ARN = "arn:aws:iam::123456789012:role/DemoRole" # IAMロールARN
ROLE_SESSION_NAME = "DemoSession" # セッション名
# AWS STSで一時的な認証情報を取得
def get_temporary_credentials(role_arn, session_name):
sts_client = boto3.client("sts")
response = sts_client.assume_role(
RoleArn=role_arn,
RoleSessionName=session_name
)
credentials = response["Credentials"]
return {
"sessionId": credentials["AccessKeyId"],
"sessionKey": credentials["SecretAccessKey"],
"sessionToken": credentials["SessionToken"]
}
# SigninTokenを取得
def get_signin_token(credentials):
url = "https://signin.aws.amazon.com/federation"
session_json = json.dumps(credentials)
request_parameters = {
"Action": "getSigninToken",
"Session": session_json
}
response = requests.get(url, params=request_parameters)
return response.json()["SigninToken"]
# カスタムAWSコンソールURLを生成
def generate_console_url(signin_token, destination="https://console.aws.amazon.com/"):
url = "https://signin.aws.amazon.com/federation"
request_parameters = {
"Action": "login",
"Issuer": "ExampleIssuer",
"Destination": destination,
"SigninToken": signin_token
}
return f"{url}?{urllib.parse.urlencode(request_parameters)}"
# メインロジック
if __name__ == "__main__":
# 一時的な認証情報を取得
credentials = get_temporary_credentials(ROLE_ARN, ROLE_SESSION_NAME)
# SigninTokenを取得
signin_token = get_signin_token(credentials)
# カスタムAWSコンソールURLを生成
console_url = generate_console_url(signin_token)
print("Generated AWS Management Console URL:")
print(console_url)
2. コードの説明
-
get_temporary_credentials
関数- AWS STSの
AssumeRole
APIを使用して、一時的なセッションの認証情報を取得
- AWS STSの
-
get_signin_token
関数- 取得したセッション情報をJSON形式に変換し、AWSの
getSigninToken
APIにリクエストを送信
- 取得したセッション情報をJSON形式に変換し、AWSの
-
generate_console_url
関数- 取得したSigninTokenを使用してカスタムAWSコンソールURLを生成
実行結果
pythonコードを実行すると、次のようなURLが生成されます。私はadmin権限のIAMユーザーを使用して実行しました。
$ python awsurl.py
Generated AWS Management Console URL:
https://signin.aws.amazon.com/federation?Action=login&Issuer=ExampleIssuer&Destination=https%3A%2F%2Fconsole.aws.amazon.com%2F&SigninToken=example-signin-token
このURLをブラウザで開くと、IAMロールのアクセス権限に基づいたAWSコンソールが開きます。
前述のIAMロールの権限だと、S3バケットのリストは表示できます。
オブジェクトのリストは、権限がないので表示できません。
EC2も同様に、表示できません。
注意事項
-
有効期限: 一時的な認証情報の有効期限は最大12時間(デフォルトは1時間)。必要に応じてget_signin_token()のrequest_parametersに
SessionDuration
を追加して、有効期限(秒数)を指定してください。 - 最小権限の実践: IAMロールに付与するポリシーは、必要最小限のアクセス権限に絞ってください。
- URLの安全な取り扱い: 生成したURLを共有する際は、安全な手段を使用してください。
まとめ
AWS STSとPythonを活用することで、特定の操作やリソースに限定したAWSコンソールアクセスを簡単に提供できます。この方法は、外部パートナーや一時的なユーザーの管理に特に有用です。ぜひこの手法を活用して、安全で柔軟なアクセス管理を実現してください。
Discussion