Obtenez une authentification de base avec CloudFront Lambda @ Edge avec Python 3.8

introduction

J'ai essayé d'utiliser Lambda @ Edge pour appliquer l'authentification de base au site, mais lorsque je recherche en japonais, je trouve généralement de nombreux articles tels que Node 6 et 8. Cependant, cette limitation était juste après la sortie générale de Lambda @ Edge, et j'ai senti que les informations étaient trop anciennes, j'ai donc vérifié à nouveau le statut de support actuel de Lambda @ Edge. À ce stade (8 octobre 2020), Lambda @ Edge peut être utilisé jusqu'à Python 3.8, j'ai donc décidé de l'utiliser pour l'authentification de base, ce qui est le but de cette fois.

REMARQUE: un environnement Lambda viable

L'environnement qui peut être exécuté au moment de la rédaction de l'article (8 octobre 2020) est le suivant.

Source: https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/lambda-requirements-limits.html#lambda-requirements-lambda-function-configuration

Il pourrait être exécuté en Python ainsi que Node.js. En regardant quand ce changement est intervenu, il semble que Python 3.7 était disponible en août 2019, et Python 3.8 et Node 12 étaient aux alentours de mars 2020.

Qu'est-ce que Lambda @ Edge

En exécutant AWS Lambda entre des requêtes Amazon CloudFront, le traitement requis peut être inséré séparément de l'application. Voir ci-dessous pour les cas d'utilisation officiellement introduits.

https://aws.amazon.com/jp/lambda/edge/

Cette fois, le but est d'effectuer l'authentification de base indépendamment du contenu d'origine en insérant le processus d'authentification de base avant que l'utilisateur (spectateur) n'accède à CloudFront et accède à son cache et à son origine. ..

Créer une fonction Lambda pour Lambda @ Edge

Créer une fonction Lambda dans la région du nord de la Virginie (us-east-1)

CloudFront est un service global qui peut être utilisé dans n'importe quelle région, mais les ressources utilisées ici (comme le certificat utilisé par SSL Certificate Manager) doivent être créées dans la région us-east-1. Créez également la fonction Lambda dans cette région.

La procédure de création avec la console de gestion est illustrée ci-dessous. En tant que conditions préalables, il est supposé que vous avez le droit de créer un rôle Lambda ou IAM approprié et que vous avez déjà défini les paramètres pour CloudFront qui utilise l'authentification de base.

--Ouvrez la page Lambda et appuyez sur le bouton "Créer une fonction" pour commencer à créer la fonction --Effectuez les réglages initiaux conformément à la figure ci-dessous. --Lors de la création d'un nouveau rôle d'exécution

SnapCrab_NoName_2020-10-8_22-24-48_No-00.png SnapCrab_NoName_2020-10-8_22-25-11_No-00.png

#!/usr/bin/python
# -*- coding: utf-8 -*-

"""
Lambda pour l'authentification de base@La version Python d'Edge.
"""

import base64


def authenticate(user, password):
    """Authentification"""
    return user == 'cloudfront' and password == 'CL0UDFR0NT'


def lambda_handler(event, context):
    request = event['Records'][0]['cf']['request']
    headers = request['headers']

    error_response = {
        'status': '401',
        'statusDescription': 'Unauthorized',
        'body': 'Authentication Failed',
        'headers': {
            'www-authenticate': [
                {
                    'key': 'WWW-Authenticate',
                    'value': 'Basic realm="Basic Authentication"'
                }
            ]
        }
    }

    if 'authorization' not in headers:
        return error_response

    try:
        auth_values = headers['authorization'][0]['value'].split(" ")
        auth = base64.b64decode(auth_values[1]).decode().split(":")
        (user, password) = (auth[0], auth[1])
        return request if authenticate(user, password) else error_response
    except Exception:
        #Format illégal, etc.
        return error_response

SnapCrab_NoName_2020-10-8_22-39-6_No-00.png

--Lorsque CloudFront est sélectionné dans les paramètres de déclenchement, l'élément pour définir Lambda @ Edge pour le CloudFront déjà défini s'affiche. ――Vous choisissez la distribution que vous souhaitez --Dans "Sélectionner le comportement du cache", il apparaîtra dans l'unité de chemin spécifiée dans Comportement de CloudFront, sélectionnez donc le comportement auquel Lambda @ Edge est appliqué.

SnapCrab_NoName_2020-10-8_22-42-28_No-00.png

Une fois le processus ci-dessus terminé et appliqué à CloudFront, une authentification de base sera requise pour l'accès.

Remarque: dépannage

Ce que j'ai vraiment fait.

--Lambda @ Edge ne renvoie pas les résultats attendus --Parce que la version n'a pas été corrigée. La version doit être corrigée correctement

Résumé

Dans les premiers articles, j'avais l'impression que les paramètres initiaux étaient difficiles en raison de divers paramètres de rôle IAM, mais à ce stade, j'ai trouvé que l'utilisation de l'assistant facilite la réalisation de Lambda @ Edge sans avoir à réfléchir sérieusement. Il peut ne pas être disponible lors de la protection du site de développement contre l'accès général, de l'application de l'authentification de base au site en tant que service entièrement interne, ou de l'ajout de l'authentification de base au chemin racine de l'écran de gestion du site, etc. C'est ça?

référence

Recommended Posts

Obtenez une authentification de base avec CloudFront Lambda @ Edge avec Python 3.8
Configuration de l'authentification de base à l'aide de Python @Lambda
Envoyer HTTP avec l'en-tête d'authentification de base en Python
Exploitez TwitterBot avec Lambda, Python
[Python] Utilisation d'OpenCV avec Python (basique)
[Python] [SQLite3] Exploiter SQLite avec Python (basique)
Authentification de base avec mot de passe crypté (.htpasswd) avec bouteille en python
Scraping avec Selenium en Python (Basic)
Détection de visage avec Lambda (Python) + Rekognition
[Python] Utilisation d'OpenCV avec Python (détection des bords)
Authentification de base, authentification Digest avec Flask
1. Statistiques apprises avec Python 1-1. Statistiques de base (Pandas)
Notifier HipChat avec AWS Lambda (Python)
Utiliser PostgreSQL avec Lambda (Python + psycopg2)
Etude de base d'OpenCV avec Python
[AWS] Utilisation de fichiers ini avec Lambda [Python]
Premiers pas avec python3 # 1 Apprenez les connaissances de base
Authentification sans mot de passe avec RDS et IAM (Python)
Manipulation des données DynamoDB avec Lambda (Node et Python)
Apprendre Python! Comparaison avec Java (fonction de base)
Connectez-vous à s3 avec AWS Lambda Python
Essayez d'attribuer ou de changer avec Python: lambda
Point addictif lors du passage par proxy http avec authentification de base en python
Configuration de l'authentification Digest à l'aide de Python @Lambda
Exécutez régulièrement le scraping WEB avec AWS-Lambda + Python + Cron
Extraction de bords avec python + OpenCV (filtre Sobel, filtre laplacien)
LINE BOT avec Python + AWS Lambda + API Gateway
Application sans serveur avec AWS SAM! (APIGATEWAY + Lambda (Python))
Exemple de notification Slack avec python lambda
Réalisez le scraping avec le sélecteur Python et CSS en 1 minute
Exporter un instantané RDS vers S3 avec Lambda (Python)
Télécharger des fichiers sur Google Drive avec Lambda (Python)
Flux pour terminer l'authentification Slack avec Flask (Python)
[Introduction à Python] Utilisation de base des expressions lambda
FizzBuzz en Python3
Grattage avec Python
RF Python Basic_01
Grattage avec Python
Python avec Go
Twilio avec Python
Intégrer avec Python
Jouez avec 2016-Python
AES256 avec python
Testé avec Python
Écriture de base Python
python commence par ()
avec syntaxe (Python)
Grammaire de base Python3
Bingo avec python
Zundokokiyoshi avec python
RF Python Basic_02
Authentification Python Https
Excel avec Python
Certification Flask Basic
Micro-ordinateur avec Python
Cast avec python
Créer une fonction Lambda de version Python (+ couche Lambda) avec Serverless Framework