[PYTHON] Benutzer ohne Konto greifen auf die AWS Management Console zu

Einführung

Wird AWS im Geschäftsleben eingesetzt? Es ist sehr praktisch, da es verschiedene Funktionen unterstützt, von AWS über den Aufbau der Infrastruktur bis hin zum Betrieb. Nicht nur für Infrastrukturpersonal, sondern auch Funktionen, die für alle mit der Umgebung verbundenen Parteien von Vorteil sind, wie CloudWatch und Session Manager, werden häufig freigegeben.

Übrigens (ein Problem aufwerfen)

Diese großartigen AWS-Funktionen profitieren nur von der Infrastruktur und erreichen Berater und Produktentwickler häufig nicht sehr oft. Der Grund ist, dass die Anzahl der Personen, die die "Verwaltungskonsole" verwenden können, begrenzt ist. AWS bietet immer bessere Funktionen, aber es ist eine Verschwendung, eine begrenzte Anzahl von Personen zu haben, die sie verwenden können. Auf der anderen Seite ist es schwierig, Schnittstellen so zu implementieren, dass sie von verschiedenen Personen verwendet werden können, und es ist auch umständlich, sich bei jeder Erweiterung von AWS damit befassen zu müssen.

Dann (Lösung)

Wäre es nicht schön, die "Management Console", die stärkste Schnittstelle, die auf alle Funktionen von AWS zugreifen kann, "Personen zur Verfügung zu stellen, denen keine AWS-Benutzer zugewiesen sind"? Dies ist das Hauptthema dieses Artikels.

Was diesmal zu verwenden

1.Amazon Cognito https://dev.classmethod.jp/cloud/aws/what-is-the-cognito/ Cognito ist ein Dienst zum Thema Benutzeridentität, der im Juli 2014 angekündigt wurde. Lesen Sie "Kogunito". Einfach ausgedrückt ist es eine Funktion, die Ressourcen in AWS für jeden Benutzer separat bereitstellen kann. Sie können beispielsweise einen Bereich zum Hochladen von Dateien erstellen, der Herrn A gewidmet ist.

2. Ermöglichen Sie benutzerdefinierten Identitätsbrokern den Zugriff auf die AWS-Konsole

https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/id_roles_providers_enable-console-custom-url.html#STSConsoleLink_programPython Um Benutzern, die sich im Netzwerk Ihres Unternehmens anmelden, einen sicheren Zugriff auf die AWS Management Console zu gewähren, können Sie Code schreiben und ausführen, der eine URL dafür generiert. Diese URL enthält das von AWS erhaltene Anmeldetoken und verwendet es zur Authentifizierung des Benutzers bei AWS.

3.Python(boto3) Verwenden Sie ein Modul namens boto3, um AWS-APIs mit Python zu betreiben. https://aws.amazon.com/jp/sdk-for-python/

Verwendung (Übersicht)

Sie können den Amazon Cognito ID Pool verwenden, um AWS-Benutzer mit Richtlinien mit eingeschränktem Zugriff zu identifizieren. Sie verfügen außerdem über einen Zugriffsschlüssel, mit dem Sie die Anmelde-URL generieren können, die unter Zulassen, dass benutzerdefinierte Identitätsbroker auf die AWS-Konsole zugreifen können. Dazu müssen wir einige Ressourcen für das AWS-Konto vorbereiten, damit wir sie auch erläutern können.

AWS-Ressourcen vorbereiten

1. Fügen Sie dem Benutzer Zugriff hinzu, der zum Betreiben von AWS-Ressourcen verwendet wird

Fügen Sie die AmazonCognitoPowerUser-Richtlinie und die AmazonCognitoDeveloperAuthenticatedIdentities-Richtlinie hinzu.

2. Erstellen eines ID-Pools

image.png

Erstellen Sie unter der folgenden URL einen Bereich namens IDPool, in dem Benutzerinformationen gespeichert werden. https://ap-northeast-1.console.aws.amazon.com/cognito/create/?region=ap-northeast-1# 1.Identity Pool Name = Geben Sie einen beliebigen Namen ein.

  1. Aktivieren Sie "Zugriff auf nicht authentifizierte Identitäten aktivieren", um anonyme Identitäten in nicht authentifizierten Identitäten zuzulassen. Da wir diesmal die Authentifizierungslogik nicht erläutern, geben wir einen Zugriffsschlüssel ohne Authentifizierung aus.

  2. Wenn Sie einen nicht authentifizierten Benutzer verwenden, können Sie die Verwendung der Verwaltungskonsole nicht autorisieren, ohne den Basisfluss (klassisch) zu verwenden. Aktivieren Sie daher "Basisfluss (klassisch) zulassen".

  3. Erstellen Sie einen Pool.

  4. Die Seite Identifizieren der IAM-Rollen, die mit Ihrem neuen Identitätspool verwendet werden sollen, wird angezeigt. Bitte zeigen Sie die Details an. (Übrigens ist oben die authentifizierte ID und unten die Gast-ID-Einstellung) image.png

  5. Erstellen Sie eine neue Rolle. Sie können die Berechtigungen für authentifiziert und nicht authentifiziert ändern. Erstellen Sie daher Unauth bzw. Authed. Übrigens habe ich diesmal nicht vor, Authed zu verwenden, daher spielt es keine Rolle, ob der Inhalt angemessen ist.

  6. Fügen Sie UnOh ReadOnlyAccess und Folgendes hinzu. Lassen Sie uns dieses Mal den Sitzungsmanager zu einer verfügbaren Gastrolle machen.



{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "Cognito",
            "Effect": "Allow",
            "Action": [
                "mobileanalytics:PutEvents",
                "cognito-sync:*",
                "sts:GetFederationToken"
            ],
            "Resource": [
                "*"
            ]
        },
        {
            "Sid": "Ssm",
            "Effect": "Allow",
            "Action": [
                "ssmmessages:CreateDataChannel",
                "s3:GetEncryptionConfiguration",
                "ssm:UpdateInstanceInformation",
                "ssmmessages:OpenDataChannel",
                "ssmmessages:OpenControlChannel",
                "ssmmessages:CreateControlChannel",
                "ssm:StartSession"
            ],
            "Resource": "*"
        }
    ]
}
		
  1. Notieren Sie sich die ID des ID-Pools, die im Beispielcode geschrieben ist. image.png

Python-Implementierung

1. Implementieren Sie login_test.py, indem Sie den Teil zur Einstellung der Anmeldeinformationen durch cognito aus dem folgenden Python-Code ersetzen.

https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/id_roles_providers_enable-console-custom-url.html#STSConsoleLink_programPython


#!/usr/bin/env python3
# -*- coding: utf-8 -*-

#Führen Sie wie folgt aus.
#python3 login_test.py user_name

import urllib, json, sys
import requests
import boto3
import datetime

_args = sys.argv
_USER                       = _args[1]
_AWS_ACCOUNT                = "123456789012"
_CONV_AWS_ACCESS_KEY_ID     = "ASIA*******:"
_CONV_AWS_SECRET_ACCESS_KEY = "**********"
_CONV_AWS_SESSION_TOKEN     = "*********"
_REGION_NAME                = "ap-northeast-1"
_ID_POOL_ID                 = "Verwenden Sie die in Schritt 8 notierte."
_ARN                        = "arn:aws:cognito-identity:ap-northeast-1:123456789012:identitypool/ap-northeast-1:*******"
_ROLE_ARN                   = "arn:aws:iam::123456789012:role/Unauth"

class TestClass():
    def cognito_auth(self):
        try:
            #Erstellen eines Clients für den Betrieb von cognit
            cognito_client = boto3.client('cognito-identity',
                region_name           = _REGION_NAME,
                aws_access_key_id     = _CONV_AWS_ACCESS_KEY_ID,
                aws_secret_access_key = _CONV_AWS_SECRET_ACCESS_KEY,
                aws_session_token     = _CONV_AWS_SESSION_TOKEN #Nicht erforderlich, wenn Sie MFA nicht verwenden
            )
            #ID-Erfassung
            user_id = cognito_client.get_id(
                AccountId      = _AWS_ACCOUNT,
                IdentityPoolId = _ID_POOL_ID
            )["IdentityId"]
            print("Cognito ID:"+user_id)
        except:
            raise Exception("get id faild.")

        try:
            #Überprüfung der Rolleneinstellung
            roles = cognito_client.get_identity_pool_roles(IdentityPoolId=_ID_POOL_ID)["Roles"]["unauthenticated"]
            print("Use role:"+roles)

            # GetOpenIdToken + AssumeRoleWithWebIdenity
            token = cognito_client.get_open_id_token(
                IdentityId=user_id
            )

            sts_client = boto3.client('sts',
                region_name           = _REGION_NAME,
                aws_access_key_id     = _CONV_AWS_ACCESS_KEY_ID,
                aws_secret_access_key = _CONV_AWS_SECRET_ACCESS_KEY,
                aws_session_token     = _CONV_AWS_SESSION_TOKEN #Nicht erforderlich, wenn Sie MFA nicht verwenden
            )

            d_today = str(datetime.date.today())
            credentials_for_identity = sts_client.assume_role_with_web_identity(
                RoleArn = _ROLE_ARN,
                RoleSessionName = _USER + "-" + d_today,#Zeichenfolge am Anfang des Protokolls Geben Sie Informationen ein, mit denen Sie feststellen können, wer die Sitzung ist.
                WebIdentityToken = token["Token"]
            )

            AccessKeyId = credentials_for_identity["Credentials"]["AccessKeyId"]
            SecretKey = credentials_for_identity["Credentials"]["SecretAccessKey"]
            SessionToken = credentials_for_identity["Credentials"]["SessionToken"]
        except:
            #ID löschen
            #Wenn Sie einen Fehler machen, löschen Sie die ID, die Sie vergeblich erstellt haben.
            del_response = cognito_client.delete_identities(
                IdentityIdsToDelete=[
                user_id
                ]
            )
            raise Exception("cognito_auth faild.","delete id :"+str(del_response["ResponseMetadata"]["RequestId"]))

        url_credentials = {}
        url_credentials['sessionId'] = AccessKeyId
        url_credentials['sessionKey'] = SecretKey
        url_credentials['sessionToken'] = SessionToken
        json_string_with_temp_credentials = json.dumps(url_credentials)

        request_parameters = "?Action=getSigninToken"
        request_parameters += "&SessionDuration=43200"
        if sys.version_info[0] < 3:
            def quote_plus_function(s):
                return urllib.quote_plus(s)
        else:
            def quote_plus_function(s):
                return urllib.parse.quote_plus(s)
        request_parameters += "&Session=" + quote_plus_function(json_string_with_temp_credentials)
        request_url = "https://signin.aws.amazon.com/federation" + request_parameters
        r = requests.get(request_url)
        # Returns a JSON document with a single element named SigninToken.
        signin_token = json.loads(r.text)

        # Step 5: Create URL where users can use the sign-in token to sign in to
        # the console. This URL must be used within 15 minutes after the
        # sign-in token was issued.
        request_parameters = "?Action=login"
        request_parameters += "&Issuer=Example.org"
        request_parameters += "&Destination=" + quote_plus_function("https://console.aws.amazon.com/")
        request_parameters += "&SigninToken=" + signin_token["SigninToken"]
        request_url = "https://signin.aws.amazon.com/federation" + request_parameters

        # Send final URL to stdout
        print (request_url)

    def main(self):
        print("success login! welcome "+_USER)
        self.cognito_auth()

if __name__ == "__main__":
    TC = TestClass()
    TC.main()

2. Führen Sie login_test.py aus.

image.png

image.png

login_test.py wird unter der Annahme implementiert, dass der Benutzer zum Zeitpunkt seiner Ausführung authentifiziert wurde. Wenn Sie es also selbst treffen, wird ein Konto und eine sehr lange Anmelde-URL ausgegeben. Wenn Sie auf diese URL zugreifen, werden Sie zum Bildschirm der Verwaltungskonsole weitergeleitet, und die Verbundanmeldung ist erfolgreich. Zusätzlich zu ReadOnly ermöglichen die Berechtigungen auch den Sitzungsmanager, sodass Sie sehen können, welche Instanz von EC2 stammt, und den Sitzungsmanager verwenden können, um auf die Umgebung zuzugreifen.

abschließend

Dieses Mal haben wir es Benutzern ermöglicht, denen keine AWS-Benutzer ausgestellt wurden, sich bei der AWS Management Console anzumelden. Mit diesem Mechanismus kann IAM Konten individuell verwalten und eine Verwaltungskonsole bereitstellen, ohne dass jedes Mal, wenn ein pensionierter Mitarbeiter das Unternehmen verlässt, Wartungsarbeiten erforderlich sind. Da AWS die Verwaltungskonsole ohne Erlaubnis stärken wird, können wir die Geschäftseffizienz weiter verbessern, ohne unseren Entwicklungsaufwand aufwenden zu müssen. Es ist sehr praktisch, also probieren Sie es bitte aus.

Da ich auch ein Anfänger von AWS (über Cloud Practitioner) bin, möchte ich mich bei Ihnen für Vorschläge, Fragen oder Eindrücke bedanken. Wenn Sie Fragen haben, hinterlassen Sie bitte einen Kommentar.

Danke für deine harte Arbeit.

Recommended Posts

Benutzer ohne Konto greifen auf die AWS Management Console zu
Holen Sie sich ein Zugriffstoken für die Pocket-API
Holen Sie sich AccessToken für das Dienstkonto mit dem Firebase Admin Python SDK