AWS SSO ist endlich in der Region Tokio verfügbar, daher habe ich Single Sign-On mit Django versucht.
Erstellen Sie eine benutzerdefinierte SAML 2.0-Anwendung mit AWS SSO.
#Erstellen einer virtuellen Umgebung
$ python -m venv ~/envs/example-awssso
#Anlaufen
$ source ~/envs/example-awssso/bin/activate
#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 .
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
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.
※6
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))
# 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 /.
Wählen Sie [Login]. Melden Sie sich als der im ID-Speicher erstellte Benutzer an, da er in AWS SSO redigiert wird.
Die in der Sitzung aus der SAML-Antwort aufgezeichneten Benutzerinformationen werden auf dem Bildschirm angezeigt.
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