[PYTHON] Einmaliges Anmelden bei der Django-Anwendung mit AWS SSO

Einführung

AWS SSO ist endlich in der Region Tokio verfügbar, daher habe ich Single Sign-On mit Django versucht.

Quellcode-GitHub

Voraussetzungen und Betriebsumgebung

Überblick

Erstellen Sie eine benutzerdefinierte SAML 2.0-Anwendung mit AWS SSO.

Richtlinien usw. - Verwenden Sie "AWS SSO ID Store" als ID-Quelle von AWS SSO - Wählen Sie "Python" als Entwicklungssprache - Verwenden Sie "Django" für das Webanwendungs-Framework - Kommunikation durch HTTPS auch während der Entwicklung Setup zulassen

#Erstellen einer virtuellen Umgebung
$ python -m venv ~/envs/example-awssso

#Anlaufen
$ source ~/envs/example-awssso/bin/activate

Installation, Projekterstellung

#Django Installation
(example-awssso) $ python -m pip install Django

#Versionsbestätigung
(example-awssso) $ python -m django --version
3.1.1

#Projekterstellung
(example-awssso) $ django-admin startproject webapp .

Installieren (ssl)

Es ist "für die Entwicklung". SSL-Kommunikation zulassen. Bitte verwenden Sie es nicht in einer Produktionsumgebung. Ich werde die Erstellung eines Selbstzertifikats unterlassen.

(example-awssso) $ pip install django-sslserver

Installation (python3-saml)

Es gab viel Unterstützung für die SAML-Authentifizierung, aber ich entschied mich für python3-saml. </ br> Lösen Sie die Abhängigkeit von "xmlsec", bevor Sie "python3-saml" installieren.

https://github.com/onelogin/python3-saml https://pypi.org/project/xmlsec/

#xmlsec-Abhängigkeitsauflösung
(example-awssso) $ brew install libxml2 libxmlsec1 pkg-config

#Installation
(example-awssso) $ pip install python3-saml

AWS SSO

Richten Sie eine benutzerdefinierte Anwendung in der AWS Management Console ein.

  1. Wählen Sie unter "Anwendungen" die Option [Neue Anwendung hinzufügen].
  2. Wählen Sie im "AWS SSO-Anwendungskatalog" die Option [Benutzerdefinierte SAML 2.0-Anwendung hinzufügen].
  3. Wählen Sie [Download] von "AWS SSO SAML-Metadatendatei", um die Metadatendatei herunterzuladen.
  4. Geben Sie "https: // localhost: 8000 / sso /" in [Anwendungsstart-URL] unter "Anwendungseigenschaften" ein.
  5. Unter Anwendungsmetadaten können Sie Metadatenwerte manuell eingeben, wenn Sie keine Metadatendatei haben. ] Ist ausgewählt
  6. Geben Sie in [Application ACS URL] "https: // localhost: 8000 / acs /" ein.
  7. Geben Sie in [Application SAML Target] "https: // localhost: 8000 / metadata /" ein.
  8. Wählen Sie die registrierte Anwendung und das Tag [Attributzuordnung] aus.
  9. Geben Sie "$ (Benutzer: Betreff}", "beständig" in "Betreff" ein
  10. Geben Sie in den Attributen "Benutzername", "$ {Benutzer: Name}", "nicht angegeben" ein
  11. Wählen Sie Änderungen speichern
  12. Wählen Sie unter "Benutzer" die Option [Benutzer hinzufügen], um einen beliebigen Benutzer hinzuzufügen.
  13. Wählen Sie unter [Anwendungen] die Registerkarte [Zugewiesene Benutzer] und fügen Sie den unter [Benutzer zuweisen] erstellten Benutzer hinzu.

※6

image.png

Anwendungssetup

Es gibt einen Beispielcode von Django auf GitHub von python3-saml. Bitte beachten Sie auch diesen.

(example-awssso) $ mkdir saml

#Erstellen Sie eine leere Datei zur Konfiguration
(example-awssso) $ touch saml/settings.json
(example-awssso) $ touch saml/advanced_settings.json

advanced_settings.json

{
  "security": {
    "nameIdEncrypted": false,
    "authnRequestsSigned": false,
    "logoutRequestSigned": false,
    "logoutResponseSigned": false,
    "signMetadata": false,
    "wantMessagesSigned": false,
    "wantAssertionsSigned": false,
    "wantNameId": true,
    "wantNameIdEncrypted": false,
    "signatureAlgorithm": "http://www.w3.org/2001/04/xmldsig-more#rsa-sha256",
    "digestAlgorithm": "http://www.w3.org/2001/04/xmlenc#sha256"
  },
  "contactPerson": {
    "technical": {
      "givenName": "technical_name",
      "emailAddress": "[email protected]"
    },
    "support": {
      "givenName": "support_name",
      "emailAddress": "[email protected]"
    }
  },
  "organization": {
    "en-US": {
      "name": "sp_test",
      "displayname": "SP test",
      "url": "https://localhost:8000"
    }
  }
}

settings.json

Bearbeiten und speichern Sie die folgenden Einstellungen aus dem Inhalt der "AWS SSO SAML-Metadatendatei".

sp

idp

Bitte setzen Sie aus dem Inhalt der "AWS SSO SAML Metadatendatei". Die Werte in () sind die Attributwerte der Metadatendatei.

{
  "strict": true,
  "debug": true,
  "sp": {
    "entityId": "https://localhost:8000/metadata/",
    "assertionConsumerService": {
      "url": "https://localhost:8000/acs/",
      "binding": "urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST"
    },
    "singleLogoutService": {
      "url": "https://localhost:8000/sls/",
      "binding": "urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect"
    },
    "NameIDFormat": "urn:oasis:names:tc:SAML:2.0:nameid-format:persistent",
    "x509cert": "",
    "privateKey": ""
  },
  "idp": {
    "entityId": "https://portal.sso.ap-northeast-1.amazonaws.com/saml/assertion/<AWS SSO ID>",
    "singleSignOnService": {
      "url": "https://portal.sso.ap-northeast-1.amazonaws.com/saml/assertion/<AWS SSO ID>",
      "binding": "urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect"
    },
    "singleLogoutService": {
      "url": "https://portal.sso.ap-northeast-1.amazonaws.com/saml/logout/<AWS SSO ID>",
      "binding": "urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect"
    },
    "x509cert": "<AWS SSO-Zertifikat>"
  }
}

webapp/settings.py

Fügen Sie die Einstellungen des Vorlagenverzeichnisses hinzu.

  TEMPLATES = [
      {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
-       'DIRS': [],
+       'DIRS': [
+           os.path.join(BASE_DIR, 'templates')
+       ],

Fügen Sie der Datei weitere Einstellungen hinzu

+ INSTALLED_APPS += ['sslserver']
+
+ # session
+ SESSION_ENGINE = 'django.contrib.sessions.backends.file'
+
+ # ssl
+ SECURE_SSL_REDIRECT = True
+ SESSION_COOKIE_SECURE = True
+ CSRF_COOKIE_SECURE = True
+
+ # python3-saml
+ SAML_FOLDER = os.path.join(BASE_DIR, 'saml')
+
+ # login, logout
+ LOGIN_REDIRECT_URL = '/'
+ LOGOUT_REDIRECT_URL = '/'

webapp/urls.py

Definieren Sie die für SSO erforderliche URL. views.py wird danach neu erstellt.

  from django.contrib import admin
  from django.urls import path
+ from django.contrib.auth.views import LogoutView
+ from .views import index, sso, acs, metadata

  urlpatterns = [
      path('admin/', admin.site.urls),
+     path('', index, name='index'),
+     path('sso/', sso, name='sso'),
+     path('acs/', acs, name='acs'),
+     path('logout/', LogoutView.as_view(), name='logout'),
+     path('metadata/', metadata),
  ]

webapp/views.py

Erstellen Sie, wie im Quellkommentar erwähnt, die folgende Ansicht.

(example-awssso) $ touch webapp/views.py
from django.conf import settings
from django.http import HttpResponse, HttpResponseRedirect, HttpResponseServerError
from django.shortcuts import render
from django.views.decorators.csrf import csrf_exempt
from onelogin.saml2.auth import OneLogin_Saml2_Auth
from onelogin.saml2.settings import OneLogin_Saml2_Settings
from onelogin.saml2.utils import OneLogin_Saml2_Utils


def init_saml_auth(params):
    """SAML-Client-Initialisierung

Client-Initialisierungsparameter, saml/settings.json ・ saml/advanced_settings.Mit json-Datei initialisieren
    """
    auth = OneLogin_Saml2_Auth(params, custom_base_path=settings.SAML_FOLDER)
    return auth


def prepare_django_request(request):
    """Abrufen der SAML-Client-Initialisierungsparameter

Generieren Sie SAML-Client-Initialisierungsparameter aus dem HTTP-Anforderungsobjekt
    """
    params = {
        'https': 'on' if request.is_secure() else 'off',
        'http_host': request.META['HTTP_HOST'],
        'script_name': request.META['PATH_INFO'],
        'server_port': request.META['SERVER_PORT'],
        'get_data': request.GET.copy(),
        'post_data': request.POST.copy()
    }
    return params


def index(request):
    """TOP-Seitenanzeige

Rendern Sie die TOP-Seite
    """

    #Initialisierung der Kontextparameter
    attributes = False

    if 'samlUserdata' in request.session:
        if len(request.session['samlUserdata']) > 0:
            attributes = request.session['samlUserdata'].items()

    return render(request, 'index.html', { 'attributes': attributes, })


@csrf_exempt
def sso(request):
    """AWS SSO-Umleitung

Weiterleiten an AWS SSO
    """

    #Initialisierungsparameter abrufen
    prepare_params = prepare_django_request(request)
    #Initialisieren
    auth = init_saml_auth(prepare_params)

    return HttpResponseRedirect(auth.login())


@csrf_exempt
def acs(request):
    """Überprüfung der Behauptung

Stellen Sie sicher, dass der Benutzer berechtigt ist, auf die Anwendung zuzugreifen
    """

    #Initialisierungsparameter abrufen
    prepare_params = prepare_django_request(request)
    #Initialisieren
    auth = init_saml_auth(prepare_params)

    request_id = None
    if 'AuthNRequestID' in request.session:
        request_id = request.session['AuthNRequestID']

    auth.process_response(request_id=request_id)
    errors = auth.get_errors()

    if not errors:
        if 'AuthNRequestID' in request.session:
            del request.session['AuthNRequestID']
        request.session['samlUserdata'] = auth.get_attributes()
        request.session['samlNameId'] = auth.get_nameid()
        request.session['samlNameIdFormat'] = auth.get_nameid_format()
        request.session['samlNameIdNameQualifier'] = auth.get_nameid_nq()
        request.session['samlNameIdSPNameQualifier'] = auth.get_nameid_spnq()
        request.session['samlSessionIndex'] = auth.get_session_index()

    return HttpResponseRedirect(auth.redirect_to('/'))


def metadata(request):
    """SP-Metadatenanzeige

Metadaten ausgeben
    """
    saml_settings = OneLogin_Saml2_Settings(settings=None, custom_base_path=settings.SAML_FOLDER, sp_validation_only=True)
    metadata = saml_settings.get_sp_metadata()
    errors = saml_settings.validate_metadata(metadata)

    if len(errors) == 0:
        return HttpResponse(content=metadata, content_type='text/xml')
    else:
        return HttpResponseServerError(content=', '.join(errors))

Funktionsprüfung

# SECRET_KEY-Einstellung
(example-awssso) $ export DJANGO_SECRET_KEY='01234567890123456789012345678901234567890123456789'
#Starten Sie Django
(example-awssso) $ python ./manage runsslserver 0.0.0.0:8000 --certificate ./certs/localhost.crt.pem --key ./certs/localhost.key.pem

Gehen Sie zu https: // localhost: 8000 /.

image.png

Wählen Sie [Login]. Melden Sie sich als der im ID-Speicher erstellte Benutzer an, da er in AWS SSO redigiert wird.

image.png

Die in der Sitzung aus der SAML-Antwort aufgezeichneten Benutzerinformationen werden auf dem Bildschirm angezeigt.

schließlich

Es ist möglich, zentral zu verwalten, welche IAM-Benutzer für den Zugriff auf die AWS Management Console verwendet haben, und den Zugriff und die Benutzer für alle Konten, die in AWS-Organisationen hängen, einfach zu verwalten.

Darüber hinaus wurden neulich die AWS SSO-Kontierungszuweisungs-API und die CloudFormation-Unterstützung hinzugefügt, sodass die Automatisierung anscheinend flexibel unterstützt werden kann.

Recommended Posts

Einmaliges Anmelden bei der Django-Anwendung mit AWS SSO
Schritte zur Entwicklung von Django mit VSCode
Messen Sie die Abdeckung der Django-Anwendung mit Coverage.py
Registrieren Sie die Django-Anwendung im Projekt
Stellen Sie die Django-Anwendung mit Docker bereit
Standardisieren Sie HTML, um mit Django gemietet zu werden
Stellen Sie die Django-Anwendung auf Heroku bereit
Wie fange ich mit Django an?
Erstellen Sie eine Webanwendung mit Django
Startete eine Webanwendung auf AWS mit Django und wechselte Jobs
Verwalten Sie Ihre Daten mit AWS RDS
Erstellen Sie eine Django-App auf Docker und stellen Sie sie in AWS Fargate bereit
Bis die Django-Anwendung (+ MySQL) auf AWS EC2 veröffentlicht wird (+ RDS (+ S3))
So führen Sie eine arithmetische Verarbeitung mit der Django-Vorlage durch
Schritt Notizen, um mit Django zu beginnen
Ihr eigener Twitter-Client mit Django
Ich möchte mit aws mit Python spielen
So importieren Sie Ihr eigenes Modul mit jupyter
App-Entwicklung mit SQLite mit Django (PTVS)
Erstellen der ersten App mit Django Startprojekt
Stellen Sie mit AWS Lambda Python eine Verbindung zu s3 her
Ich habe eine WEB-Bewerbung bei Django gemacht
[Python] Führen Sie UIKit3 in das Django-Projekt ein
Versuchen Sie, Ihr eigenes AWS-SDK mit bash zu erstellen
Der einfachste Weg, um mit Django zu beginnen
Teilen Sie Daten mit Django (3) in projektähnliche Einheiten.
So entwickeln Sie eine Cart-App mit Django
Erwecken Sie Ihr Leben mit Blender-Skripten prozedural zum Leben
So implementieren Sie "named_scope" von RubyOnRails mit Django
Melden Sie sich einfach mit mehreren Konten bei AWS an
Teilen Sie Daten mit Django in projektähnliche Einheiten
Erstellen Sie mit Django eine Hallo-Welt-Anwendung mit nur einer Datei
AWS-Schrittfunktionen zum Lernen anhand eines Beispiels
[Einführung in die Udemy Python3 + -Anwendung] 9. Drucken Sie zunächst mit print
Schritte zum Installieren Ihrer eigenen Bibliothek mit pip
Anfänger versuchen mit Django + React + Bootstrap (1) eine Online-Webanwendung für Othello zu erstellen.
[Lernnotiz] So erstellen Sie eine App mit Django ~ Bis Hello World angezeigt wird ~
[Lernnotiz] So erstellen Sie eine Anwendung mit Django ~ Von der virtuellen Umgebung bis zum Pushing zu Github ~