Logo Zéphyrnet

Sécuriser les URL pré-signées d'Amazon SageMaker Studio Partie 2 : API privée avec authentification JWT

Date :

In partie 1 de cette série, nous avons montré comment résoudre un Amazon SageMakerStudio URL pré-signée à partir d'un réseau d'entreprise à l'aide de points de terminaison de VPC privés Amazon sans passer par Internet. Dans cet article, nous continuerons à nous appuyer sur la solution précédente pour montrer comment créer une passerelle API privée via Passerelle d'API Amazon en tant qu'interface proxy pour générer et accéder Amazon Sage Maker URL pré-signées. De plus, nous ajoutons une barrière de sécurité supplémentaire pour garantir que les URL pré-signées ne sont générées et accessibles que pour l'utilisateur final authentifié au sein du réseau d'entreprise.

Vue d'ensemble de la solution

Le diagramme suivant illustre l'architecture de la solution.

Le processus comprend les étapes suivantes:

  1. Dans le Amazon Cognito groupe d'utilisateurs, configurez d'abord un utilisateur dont le nom correspond à son profil utilisateur Studio et enregistrez Studio en tant que client d'application dans le groupe d'utilisateurs.
  2. L'utilisateur se fédère à partir de son fournisseur d'identité d'entreprise (IdP) et s'authentifie auprès du groupe d'utilisateurs Amazon Cognito pour accéder à Studio.
  3. Amazon Cognito renvoie un jeton à l'utilisateur autorisant l'accès à l'application Studio.
  4. L'utilisateur invoque createStudioPresignedUrl API sur API Gateway avec un jeton dans l'en-tête.
  5. API Gateway invoque un personnalisé AWS Lambda approbateur et valide le jeton.
  6. Lorsque le jeton est valide, Amazon Cognito renvoie une stratégie d'octroi d'accès avec l'ID de profil utilisateur du studio à API Gateway.
  7. API Gateway appelle le createStudioPresignedUrl Fonction Lambda pour créer l'URL pré-signée du studio.
  8. La createStudioPresignedUrl La fonction crée une URL pré-signée à l'aide du point de terminaison VPC de l'API SageMaker et renvoie à l'appelant.
  9. L'utilisateur accède à l'URL présignée à partir de son réseau d'entreprise qui se résout sur le point de terminaison du VPC Studio.
  10. Les fonctions Gestion des identités et des accès AWS (IAM) s'assure que la création et l'accès à l'URL pré-signée sont effectués via des points de terminaison de VPC.

Les sections suivantes vous guident tout au long du déploiement, de la configuration et de la validation de la solution pour l'API privée API Gateway pour la création et la résolution d'une URL pré-signée Studio à partir d'un réseau d'entreprise à l'aide de points de terminaison VPC.

  1. Déployez la solution
  2. Configurer l'utilisateur Amazon Cognito
  3. Authentification de l'API privée pour l'URL présignée à l'aide d'un jeton Web JSON
  4. Configurer le serveur DNS d'entreprise pour accéder à l'API privée
  5. Tester l'API privée API Gateway pour une URL pré-signée du réseau d'entreprise
  6. Stratégie d'authentification Lambda d'URL pré-signée
  7. Nettoyer

Déployez la solution

Vous pouvez déployer la solution via le Console de gestion AWS au sein de l’ Modèle d'application sans serveur AWS (AWS-SAM).

Pour déployer la solution via la console, lancez les éléments suivants AWS CloudFormation modèle dans votre compte en choisissant Lancer la pile. Il faut environ 10 minutes pour que la pile CloudFormation se termine.

Pour déployer la solution à l'aide d'AWS SAM, vous pouvez trouver le dernier code dans le Référentiel GitHub aws-samples, où vous pouvez également contribuer à l'exemple de code. Les commandes suivantes montrent comment déployer la solution à l'aide de l'interface de ligne de commande AWS SAM. S'il n'est pas actuellement installé, installer l'interface de ligne de commande AWS SAM.

  1. Clonez le référentiel sur https://github.com/aws-samples/secure-sagemaker-studio-presigned-url.
  2. Après avoir cloné le dépôt, accédez à la source et exécutez le code suivant :
    sam deploy –guided

Configurer l'utilisateur Amazon Cognito

Pour configurer votre utilisateur Amazon Cognito, procédez comme suit :

  1. Créez un utilisateur Amazon Cognito avec le même nom qu'un profil utilisateur SageMaker :
    aws cognito-idp admin-create-user --user-pool-id <user_pool_id> --username <sagemaker_username>

  2. Définissez le mot de passe utilisateur :
    aws cognito-idp admin-set-user-password --user-pool-id <user_pool_id> --username <sagemaker_username> --password <password> --permanent

  3. Obtenir un jeton d'accès:
    aws cognito-idp initiate-auth --auth-flow USER_PASSWORD_AUTH --client-id <cognito_app_client_id> --auth-parameters USERNAME=<sagemaker_username>,PASSWORD=<password>

Authentification de l'API privée pour l'URL présignée à l'aide d'un jeton Web JSON

Lorsque vous avez déployé une API privée pour créer une URL présignée SageMaker, vous avez ajouté une barrière de sécurité pour restreindre l'accès à l'URL présignée par toute personne extérieure au réseau d'entreprise et au point de terminaison VPC. Cependant, sans implémenter un autre contrôle sur l'API privée au sein du réseau d'entreprise, tout utilisateur interne au sein du réseau d'entreprise pourrait transmettre des paramètres non authentifiés pour le profil utilisateur SageMaker et accéder à n'importe quelle application SageMaker.

Pour atténuer ce problème, nous proposons de transmettre un jeton Web JSON (JWT) pour l'appelant authentifié à la passerelle API et de valider ce jeton avec un mécanisme d'autorisation JWT. Il existe plusieurs options pour implémenter un mécanisme d'autorisation pour la passerelle API privée, en utilisant soit un Autorisateur Lambda or Amazon Cognito.

Avec un mécanisme d'autorisation Lambda personnalisé, vous pouvez intégrer un nom de profil utilisateur SageMaker dans la stratégie renvoyée. Cela empêche tout utilisateur du réseau d'entreprise d'envoyer un nom de profil utilisateur SageMaker pour créer une URL présignée qu'il n'est pas autorisé à créer. Nous utilisons Amazon Cognito pour générer nos jetons et un mécanisme d'autorisation Lambda personnalisé pour valider et renvoyer la stratégie appropriée. Pour plus d'informations, reportez-vous à Création d'une autorisation précise à l'aide d'Amazon Cognito, d'API Gateway et d'IAM. L'autorisateur Lambda utilise le nom d'utilisateur Amazon Cognito comme nom de profil utilisateur.

Si vous ne parvenez pas à utiliser Amazon Cognito, vous pouvez développer une application personnalisée pour authentifier et transmettre les jetons d'utilisateur final à l'autorisateur Lambda. Pour plus d'informations, reportez-vous à Utiliser les mécanismes d'autorisation API Gateway Lambda.

Configurer le serveur DNS d'entreprise pour accéder à l'API privée

Pour configurer votre serveur DNS d'entreprise, procédez comme suit :

  1. Sur le Cloud de calcul élastique Amazon (Amazon EC2), choisissez votre instance DNSA EC2 sur site et connectez-vous via Gestionnaire de système Gestionnaire de session.
  2. Ajouter un enregistrement de zone dans le /etc/named.conf fichier pour résoudre le nom DNS de la passerelle API via votre Amazon Route 53 résolveur entrant, comme illustré dans le code suivant :
    zone "zxgua515ef.execute-api.<region>.amazonaws.com" {
      type forward;
      forward only;
      forwarders { 10.16.43.122; 10.16.102.163; };
    };

  3. Redémarrez le service nommé à l'aide de la commande suivante :
    sudo service named restart

Valider la demande d'une URL pré-signée à partir de l'API privée API Gateway pour les utilisateurs autorisés

Dans un scénario réel, vous implémenteriez une interface frontale qui transmettrait les en-têtes d'autorisation appropriés pour les ressources authentifiées et autorisées à l'aide d'une solution personnalisée ou d'un effet de levier. AWS Amplifier. Pour la brièveté de ce billet de blog, les étapes suivantes exploitent Postman pour valider rapidement la solution que nous avons déployée restreint en fait la demande de l'URL pré-signée pour un utilisateur interne, à moins d'y être autorisé.

Pour valider la solution avec Postman, procédez comme suit :

  1. Installez Postman sur l'instance WINAPP EC2. Voir les instructions ici
  2. Ouvrez Postman et ajoutez le jeton d'accès à votre Authorization en-tête:
    Authorization: Bearer <access token>

  3. Modifiez l'URL de la passerelle API pour y accéder depuis votre instance EC2 interne :
    1. Ajoutez le point de terminaison de VPC dans votre URL API Gateway :
      https://<API-G-ID>-<VPCE-ID>.execute-api.<region>.amazonaws.com/dev/EMPLOYEE_ID

    2. Ajoutez le Host en-tête avec une valeur de votre URL API Gateway :
      <API-G-ID>.execute-api.<region>.amazonaws.com

    3. Tout d'abord, changez le EMPLOYEE_ID à votre nom d'utilisateur Amazon Cognito et de profil d'utilisateur SageMaker. Assurez-vous de recevoir une URL présignée autorisée.
    4. Puis changez le EMPLOYEE_ID à un utilisateur qui n'est pas le vôtre et assurez-vous de recevoir un échec d'accès.
  4. Sur la console Amazon EC2, choisissez votre instance WINAPP sur site et connectez-vous via votre client RDP.
  5. Ouvrez un navigateur Chrome et accédez à votre URL présignée autorisée pour lancer Studio.

Studio est lancé sur le point de terminaison d'un VPC avec une adresse distante comme adresse IP du point de terminaison du VPC Studio.

Si l'URL présignée est accessible en dehors du réseau d'entreprise, la résolution échoue car la condition de stratégie IAM pour l'URL présignée applique la création et l'accès à partir d'un point de terminaison de VPC.

Stratégie d'authentification Lambda d'URL pré-signée

La solution ci-dessus a créé la stratégie d'authentification suivante pour Lambda qui a généré une URL pré-signée pour accéder à SageMaker Studio.

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Condition": {
                "IpAddress": {
                    "aws:VpcSourceIp": "10.16.0.0/16"
                }
            },
            "Action": "sagemaker:CreatePresignedDomainUrl",
            "Resource": "arn:aws:sagemaker:<region>:<account-id>:user-profile/*/*",
            "Effect": "Allow"
        },
        {
            "Condition": {
                "IpAddress": {
                    "aws:SourceIp": "192.168.10.0/24"
                }
            },
            "Action": "sagemaker:CreatePresignedDomainUrl",
            "Resource": "arn:aws:sagemaker:<region>:<account-id>:user-profile/*/*",
            "Effect": "Allow"
        },
        {
            "Condition": {
                "StringEquals": {
                    "aws:sourceVpce": [
                        "vpce-sm-api-xx",
                        "vpce-sm-api-yy"
                    ]
                }
            },
            "Action": "sagemaker:CreatePresignedDomainUrl",
            "Resource": "arn:aws:sagemaker:<region>:<account-id>:user-profile/*/*",
            "Effect": "Allow"
        }
    ]
}

La règle ci-dessus impose que l'URL pré-signée de Studio soit à la fois générée et accessible via l'un de ces trois points d'entrée :

  1. aws:VpcSourceIp en tant que votre CIDR AWS VPC
  2. aws:SourceIp comme votre réseau d'entreprise CIDR
  3. aws:sourceVpce en tant que vos points de terminaison VPC API SageMaker

Nettoyer

Pour éviter d'encourir des frais récurrents, supprimer les piles CloudFormation vous avez créé. Sinon, si vous avez déployé la solution à l'aide de SAM, vous devez vous authentifier auprès du compte AWS sur lequel la solution a été déployée et exécutée. sam supprimer.

Conclusion

Dans cet article, nous avons montré comment accéder à Studio à l'aide d'une passerelle API privée à partir d'un réseau d'entreprise à l'aide de points de terminaison de VPC privés Amazon, en empêchant l'accès aux URL pré-signées en dehors du réseau d'entreprise et en sécurisant la passerelle API avec un mécanisme d'autorisation JWT utilisant Amazon Cognito et Lambda personnalisé. les autorisateurs.

Essayez cette solution et expérimentez son intégration avec votre portail d'entreprise, et laissez vos commentaires dans les commentaires !


À propos des auteurs

Bélier Vittal est architecte de solutions d'apprentissage automatique chez AWS. Il a plus de 20 ans d'expérience dans l'architecture et la création d'applications distribuées, hybrides et cloud. Il est passionné par la création de solutions d'IA/ML et de Big Data sécurisées et évolutives pour aider les entreprises clientes dans leur parcours d'adoption et d'optimisation du cloud afin d'améliorer leurs résultats commerciaux. Dans ses temps libres, il aime le tennis, la photographie et les films d'action.

Jonathan Nguyen est consultant senior en sécurité de l'équipe de livraison partagée chez AWS. Son expérience est dans AWS Security avec un accent sur la détection des menaces et la réponse aux incidents. Aujourd'hui, il aide les entreprises clientes à développer une stratégie de sécurité AWS complète, à déployer des solutions de sécurité à grande échelle et à former les clients aux meilleures pratiques de sécurité AWS.

Chris Childer est architecte d'infrastructure cloud dans les services professionnels chez AWS. Il travaille avec les clients AWS pour concevoir et automatiser leur infrastructure cloud et améliorer leur adoption de la culture et des processus DevOps.

spot_img

Dernières informations

spot_img

Discutez avec nous

Salut! Comment puis-je t'aider?