😀

制限付きAWSコンソールアクセスを提供する方法

2024/11/30に公開

はじめに

AWSでは、IAMロールとSTS(Security Token Service)を利用して、一時的なAWSコンソールアクセスを提供できます。この機能を活用すると、リソースや操作の範囲を制限し、期限付きでAWSコンソールにアクセスさせることが可能です。

この記事では、AWS公式ドキュメント「AWS コンソールへのカスタム ID ブローカーアクセスを有効にする」を参考に、Pythonコードを使用してカスタムAWSコンソールアクセスURLを生成する方法を紹介します。

事前準備

  1. 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
  1. 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. コードの説明

  1. get_temporary_credentials関数

    • AWS STSのAssumeRole APIを使用して、一時的なセッションの認証情報を取得
  2. get_signin_token関数

    • 取得したセッション情報をJSON形式に変換し、AWSのgetSigninToken APIにリクエストを送信
  3. 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