Journalisation SSH et gestion des sessions à l'aide d'AWS SSM
Publié: 2022-03-11La configuration d'outils ou de scripts personnalisés pour conserver un journal SSH sous Linux peut être fastidieuse et sujette aux erreurs.
Les ingénieurs peuvent utiliser rootsh , screen ou un autre utilitaire pour enregistrer l'activité de l'utilisateur, mais si les autorisations de l'utilisateur ne sont pas définies correctement, un utilisateur expérimenté peut effacer les journaux d'audit pour couvrir ses traces. Une autre option serait de configurer la journalisation au niveau du noyau, mais l'expertise nécessaire pour cela n'est pas si courante.
Heureusement, il existe un moyen de consigner l'activité des utilisateurs sans même écrire une seule commande Linux ! Nous aurons besoin de ces services :
- EC2
- IAM (gestion des identités et des accès)
- KMS (Service de gestion des clés)
- CloudWatch Logs (et/ou S3)
- AWS Systems Manager (anciennement connu sous le nom de SSM)
Voyons comment configurer chacun d'eux.
EC2 et IAM
Le lancement d'une instance EC2 est normalement assez facile, mais il y a une tâche clé qui doit être effectuée lors du lancement : nous devons attacher un rôle IAM à notre instance, sinon nous ne pourrons pas obtenir les résultats attendus détaillés à la fin de ce document. article.
Le rôle IAM que nous associons à notre instance EC2 doit avoir la stratégie intégrée AmazonSSMManagedInstanceCore , plus cette stratégie (attachée en ligne ou gérée par le client) :
{ "Version": "2012-10-17", "Statement": [ { "Action": [ "logs:CreateLogStream", "logs:DescribeLogStreams", "logs:DescribeLogGroups", "logs:PutLogEvents" ], "Effect": "Allow", "Resource": "*" } ] }Outre le rôle IAM, nous utilisons généralement cette configuration d'instance EC2 :
- Le système d'exploitation est Amazon Linux 2, car par défaut, il est fourni avec AWS Systems Manager Agent (SSM Agent) installé. (Il en va de même pour les distributions Ubuntu, qui sont également une option.)
- Le type d'instance est t3.micro (mais n'importe quel type fera l'affaire).
- Le groupe de sécurité par défaut qu'AWS attribue au VPC fonctionnera, car nous n'avons pas besoin d'un port SSH ouvert pour cet exercice.
Nous pouvons commencer à configurer KMS sans attendre le démarrage de l'instance EC2.
KMS
Nous avons besoin d'une clé KMS si nous voulons que tous les journaux de session livrés à CloudWatch soient stockés chiffrés. Passons au service KMS et créons une clé.
Nous vous recommandons d'affecter un administrateur afin que la clé puisse être gérée par des utilisateurs autres que l'utilisateur racine du compte AWS, mais si d'autres n'ont pas besoin d'un accès, nous pouvons ignorer l'étape 3.
Ici, nous avons choisi l'utilisateur IAM "admin" comme administrateur clé, mais nous sommes libres de choisir n'importe quel utilisateur ou rôle. Nous pouvons également choisir de désactiver l'autorisation de suppression de clé pour l'administrateur.
Nous n'attribuerons aucun utilisateur à cette clé, car nous voulons que cette clé soit utilisée uniquement par le service CloudWatch Logs pour les opérations de chiffrement et de déchiffrement des journaux SSH.
Sur la page Review, nous devrons modifier la stratégie de clé générée par KMS, car elle n'inclut pas les autorisations permettant à CloudWatch Logs d'utiliser la clé. Nous allons la remplacer par cette règle :
{ "Version": "2012-10-17", "Statement": [ { "Sid": "Enable IAM User Permissions", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::ACCOUNT_ID:root" }, "Action": "kms:*", "Resource": "*" }, { "Sid": "Allow access for Key Administrators", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::ACCOUNT_ID:user/USERNAME" }, "Action": [ "kms:Create*", "kms:Describe*", "kms:Enable*", "kms:List*", "kms:Put*", "kms:Update*", "kms:Revoke*", "kms:Disable*", "kms:Get*", "kms:Delete*", "kms:TagResource", "kms:UntagResource", "kms:ScheduleKeyDeletion", "kms:CancelKeyDeletion" ], "Resource": "*" }, { "Sid": "Allow access to CloudWatch Log", "Effect": "Allow", "Principal": { "Service": "logs.REGION.amazonaws.com" }, "Action": [ "kms:Encrypt", "kms:Decrypt", "kms:ReEncrypt*", "kms:GenerateDataKey*", "kms:DescribeKey" ], "Resource": "*", "Condition": { "ArnLike": { "kms:EncryptionContext:aws:logs:arn": "arn:aws:logs:REGION:ACCOUNT_ID:*" } } } ] }Assurez-vous de remplacer tous les espaces réservés :
-
ACCOUNT_IDdevient notre ID de compte AWS. -
USERNAMEdevient le nom d'utilisateur de l'administrateur sélectionné à l'étape 3. Si nous avons choisi de ne pas participer à cette étape, nous supprimons ici le deuxième bloc de déclaration (celui avec"Sid": "Allow access for Key Administrators"). -
REGIONdevient le code d'identification régional vers lequel nous déployons des services (par exemple,us-west-1).
Avec cela, KMS est prêt à fonctionner.
Groupe de journaux CloudWatch
Ensuite, nous avons besoin d'un groupe CloudWatch Log (et/ou d'un compartiment S3, voir ci-dessous) où l'agent SSM peut envoyer des journaux de session SSH. Créons-le.
Notez le champ ARN de la clé KMS : AWS nous fournit la valeur nécessaire ici après la création de la clé à l'étape 5 de la section KMS.
(Si nous n'avons pas associé la stratégie correcte à notre clé KMS plus tôt, permettant au service CloudWatch Logs d'utiliser la clé, nous recevrons une erreur liée à la clé KMS à ce stade.)
Stockage des journaux SSH dans un compartiment S3
Pour stocker les journaux d'activité avec S3 au lieu ou en plus de CloudWatch Logs, nous devons ajouter ces autorisations à notre profil d'instance EC2 en tant que stratégie distincte (ou les combiner manuellement avec d'autres autorisations dont nous pourrions avoir besoin :
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "s3:PutObject" ], "Resource": "arn:aws:s3:::BUCKET_NAME/*" }, { "Effect": "Allow", "Action": [ "s3:GetEncryptionConfiguration" ], "Resource": "*" }, { "Effect": "Allow", "Action": "kms:GenerateDataKey", "Resource": "*" } ] } Dans l'extrait ci-dessus, veillez à remplacer l'espace réservé BUCKET_NAME .
Maintenant que nous avons configuré un endroit pour stocker les journaux (CloudWatch Logs, un compartiment S3 ou les deux), nous sommes prêts à exploiter les sessions SSH.
Gestionnaire de sessions AWS Systems Manager
Il s'agit de la dernière étape clé, où nous configurons un accès sécurisé à notre machine Linux pour la surveillance et la journalisation des sessions SSH. Nous allons commencer par le tableau de bord Session Manager.

Sur le tableau de bord, cliquez sur le bouton blanc "Configurer les préférences" dans la case "Démarrer une session" en haut à droite pour activer la journalisation de session.
Sur la page Préférences, nous trouverons plusieurs sections que nous pourrions explorer, mais notre objectif sera de diffuser les journaux de session SSH vers CloudWatch ou S3 pour nous permettre de voir rapidement ce qui se passe dans notre machine Linux.
Juste après la section "CloudWatch logging", il y a une section "S3 logging" où nous pouvons sélectionner le bucket.
Une fois la journalisation SSH configurée, nous pouvons nous connecter en SSH à notre machine Linux et exécuter certaines commandes pour voir si l'activité est capturée ou non.
Alors, commençons une session. Sur la même page, nous trouverons un onglet "Sessions" où nous pourrons démarrer une session. Cliquer sur le bouton "Démarrer la session" nous donnera une liste des machines EC2 sur lesquelles nous pouvons initier une session :
Si nous ne voyons pas notre instance EC2 Linux dans la liste, nous devons vérifier si elle est en cours d'exécution et si elle est associée aux autorisations IAM que nous avons décrites précédemment.
Gestion d'une erreur de l'agent SSM "Ne prend pas en charge les journaux de diffusion"
Si nous recevons une erreur indiquant que la version de l'agent SSM installée sur notre machine EC2 ne prend pas en charge la diffusion des journaux CloudWatch, ne vous inquiétez pas. Il existe un moyen indolore de résoudre ce problème.
Pour mettre à jour l'agent SSM, nous devons accéder à Exécuter la commande dans le panneau de gauche du service AWS Systems Manager .
Une fois que nous y sommes, nous pouvons cliquer sur le bouton orange "Exécuter une commande", menant à une nouvelle page où nous pouvons remplir certains paramètres.
Nous commencerons par sélectionner AWS-UpdateSSMAgent dans la liste.
Une fois que cela est sélectionné, nous allons faire défiler jusqu'à ce que nous voyions la section "Cibles". Là, nous devons sélectionner l'instance EC2 sur laquelle nous voulons mettre à jour l'agent SSM, puis appuyer sur le bouton "Exécuter" à la fin. Cela nous enverra vers une page où nous pourrons suivre la progression de la mise à jour.
La mise à jour de l'agent ne devrait pas prendre plus de cinq minutes. Une fois cela fait, nous devrions pouvoir recréer une session dans le gestionnaire de session.
À ce stade, nous devrions avoir démarré une session SSH.
Après avoir exécuté quelques commandes, naviguons vers le groupe de journaux CloudWatch Logs (ou notre compartiment S3, non affiché) et confirmons que l'activité est en cours d'enregistrement.
Nous avons maintenant une configuration, avec le chiffrement au repos activé, enregistrant chaque commande lancée dans notre machine Linux.
En fait, chaque commande peut être plus que ce que nous voulons : tous les secrets fournis ou générés pendant la session seront enregistrés dans CloudWatch ou S3 et peuvent être vus par toute personne disposant des autorisations requises. Pour éviter cela, nous pouvons utiliser stty -echo; read passwd; stty echo; stty -echo; read passwd; stty echo; pour chaque secret que nous devons fournir pendant la session.
Une excellente solution de journalisation AWS SSM/SSH avec des mises en garde mineures
Session Manager est un outil utile pour accéder à distance à nos machines virtuelles dans AWS sans avoir à ouvrir le port 22. En fait, nous ne pouvons pas générer de journaux SSH de cette façon si nous utilisons la redirection de port ou une connexion SSH directe, comme le Session Manager notices documentaires.
Néanmoins, la combinaison de Session Manager avec la journalisation de session est une solution robuste pour contrôler et surveiller l'activité au sein des machines virtuelles. De plus, nous ne sommes pas facturés pour l'utilisation du service Session Manager. Nous ne payons que pour notre instance EC2 et CloudWatch Logs ou un compartiment S3 pour le stockage des journaux.
Pour les lecteurs qui préfèrent les didacticiels vidéo, j'ai couvert un peu plus en détail une procédure très similaire sur YouTube.
Lectures complémentaires sur le blog Toptal Engineering :
- Étude de cas : Pourquoi j'utilise AWS Cloud Infrastructure pour mes produits
