Registrazione SSH e gestione delle sessioni tramite AWS SSM

Pubblicato: 2022-03-11

La configurazione di strumenti o script personalizzati per mantenere un registro SSH su Linux può essere noiosa e soggetta a errori.

Gli ingegneri possono utilizzare rootsh , screen o un'altra utilità per registrare l'attività dell'utente, ma se le autorizzazioni utente non sono impostate correttamente, un utente esperto può cancellare i registri di controllo per coprire le proprie tracce. Un'altra opzione sarebbe quella di impostare la registrazione a livello di kernel, ma l'esperienza necessaria per questo non è così comune.

Per fortuna, c'è un modo per registrare l'attività dell'utente senza scrivere nemmeno un singolo comando Linux! Avremo bisogno di questi servizi:

  • EC2
  • IAM (Gestione identità e accessi)
  • Servizio di gestione delle chiavi (KMS)
  • Log di CloudWatch (e/o S3)
  • AWS Systems Manager (precedentemente noto come SSM)

Vediamo come impostare ciascuno di essi.

EC2 e IAM

L'avvio di un'istanza EC2 è normalmente abbastanza semplice, ma c'è un'attività chiave che deve essere eseguita durante l'avvio: dobbiamo allegare un ruolo IAM alla nostra istanza, altrimenti non saremo in grado di ottenere i risultati attesi dettagliati alla fine di questo articolo.

Il ruolo IAM che associamo alla nostra istanza EC2 deve avere la policy AmazonSSMManagedInstanceCore integrata , oltre a questa policy (allegata come inline o gestita dal cliente):

 { "Version": "2012-10-17", "Statement": [ { "Action": [ "logs:CreateLogStream", "logs:DescribeLogStreams", "logs:DescribeLogGroups", "logs:PutLogEvents" ], "Effect": "Allow", "Resource": "*" } ] }

A parte il ruolo IAM, generalmente utilizziamo questa configurazione dell'istanza EC2:

  • Il sistema operativo è Amazon Linux 2, perché per impostazione predefinita viene fornito con AWS Systems Manager Agent (SSM Agent) installato. (Anche le distribuzioni Ubuntu, che sono anche un'opzione.)
  • Il tipo di istanza è t3.micro (ma va bene qualsiasi tipo).
  • Il gruppo di sicurezza predefinito assegnato da AWS al VPC funzionerà, poiché non è necessaria una porta SSH aperta per questo esercizio.

Possiamo iniziare a configurare KMS senza attendere l'avvio dell'istanza EC2.

KMS

Abbiamo bisogno di una chiave KMS se vogliamo che tutti i log di sessione consegnati a CloudWatch vengano archiviati crittografati. Andiamo al servizio KMS e creiamo una chiave.

Uno screenshot di AWS con breadcrumb "KMS", "Chiavi gestite dal cliente" e "Crea chiave", attualmente al passaggio 1: "Configura chiave". Il "Tipo di chiave" può essere impostato su "Simmetrico" (selezionato) o "Asimmetrico". In "Opzioni avanzate", l'impostazione "Origine materiale chiave" può essere "KMS" (selezionato), "Esterno" o "Archivio chiavi personalizzato (CloudHSM)."
Passaggio 1: scelta di un tipo di chiave simmetrica.

Uno screenshot di AWS con gli stessi breadcrumb, ora al passaggio 2: "Aggiungi etichette". Un campo Alias ​​è impostato su "cwlg", un campo Descrizione facoltativo viene lasciato vuoto e un campo Tag facoltativo non ha tag aggiunti.
Passaggio 2: assegnare un nome alla nostra chiave.

Uno screenshot di AWS con gli stessi breadcrumb, ora al passaggio 3: "Definire le autorizzazioni amministrative chiave". Il primo campo, "Amministratori chiave", ha una casella di ricerca vuota con 10 righe di risultati (pagina 1 di 3) con colonne Nome, Percorso e Tipo. Solo la prima riga (con i rispettivi valori di colonna "admin", "/" e "Utente") ha la casella di controllo corrispondente selezionata. L'altro campo, "Eliminazione chiave", ha un'unica opzione, "Consenti agli amministratori chiave di eliminare questa chiave", che ha anche la sua casella di controllo selezionata.
Passaggio 3 (facoltativo): assegnazione di un amministratore.

Ti consigliamo di assegnare un amministratore in modo che la chiave possa essere gestita da utenti diversi dall'utente root dell'account AWS, ma se altri non avranno bisogno dell'accesso, possiamo saltare il passaggio 3.

Qui abbiamo scelto l'utente IAM "admin" come amministratore chiave, ma siamo liberi di scegliere qualsiasi utente o ruolo. Possiamo anche scegliere di disabilitare l'autorizzazione all'eliminazione della chiave per l'amministratore.

Uno screenshot di AWS con gli stessi breadcrumb, ora al passaggio 4: "Definisci i permessi di utilizzo delle chiavi". Il primo campo, "Questo account", ha gli stessi risultati di ricerca del passaggio 3, ma nessuno di essi è selezionato. L'altro campo, "Altri account AWS", non ha aggiunto nulla.
Passaggio 4: saltare la pagina di assegnazione dell'utente.

Non assegneremo alcun utente a questa chiave perché vogliamo che questa chiave venga utilizzata solo dal servizio CloudWatch Logs per le operazioni di crittografia e decrittografia dei log SSH.

Uno screenshot di AWS con gli stessi breadcrumb, ora al passaggio 5: "Revisione". Il primo campo, "Configurazione chiave", elenca il "Tipo di chiave" come "Simmetrico", le "Specifiche chiave" come "SYMMETRIC_DEFAULT", l'"Utilizzo chiave" come "Crittografa e decrittografa" e "Origin" come "AWS_KMS ." Il campo successivo, "Alias ​​e descrizione", elenca un alias, "cwlg", senza descrizione. Il campo successivo, "Tag", non mostra dati. L'ultimo campo, "Politica chiave", include una casella di testo precompilata con una norma in formato JSON.
Passaggio 5: esamina la nostra configurazione e scambia la politica della chiave predefinita.

Nella pagina Revisione, dovremo modificare la policy della chiave generata dal servizio di gestione delle chiavi perché non include le autorizzazioni per CloudWatch Logs per utilizzare la chiave. Lo sostituiremo con questa politica:

 { "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:*" } } } ] }

Assicurati di sostituire tutti i segnaposto:

  • ACCOUNT_ID diventa il nostro ID account AWS.
  • USERNAME diventa il nome utente dell'amministratore selezionato nel passaggio 3. Se abbiamo rinunciato a tale passaggio, qui rimuoviamo il secondo blocco di istruzioni (quello con "Sid": "Allow access for Key Administrators" ).
  • REGION diventa il codice identificativo regionale a cui stiamo distribuendo i servizi (ad esempio, us-west-1 ).

Con ciò, KMS è pronto per l'uso.

Gruppo di log CloudWatch

Successivamente abbiamo bisogno di un gruppo CloudWatch Log (e/o un bucket S3, vedi sotto) in cui l'agente SSM può inviare i log di sessione SSH. Creiamolo.

Uno screenshot di AWS con breadcrumb "CloudWatch", "CloudWatch Logs", "Gruppi di log" e "Crea gruppo di log". Non è presente una barra laterale multistep. Il primo campo, "Dettagli gruppo registro", ha tre sottocampi: "Nome gruppo registro" (impostato su "ssm-session-demo"), "Impostazioni di conservazione" (impostato su "Non scadere" da un menu a discesa) e "ARN chiave KMS - facoltativo" (impostato su un valore troncato che inizia con "arn:aws:kms"). Il secondo campo, "Tag", non ha tag.
Creazione di un gruppo di log "CloudWatch Logs".

Nota il campo ARN della chiave del servizio di gestione delle chiavi: AWS ci fornisce il valore necessario qui dopo la creazione della chiave nel passaggio 5 della sezione del servizio di gestione delle chiavi.

(Se in precedenza non abbiamo associato la policy corretta alla nostra chiave KMS, consentendo al servizio CloudWatch Logs di utilizzare la chiave, a questo punto riceveremo un errore relativo alla chiave KMS.)

Memorizzazione dei registri SSH in un bucket S3

Per archiviare i log delle attività con S3 anziché, o in aggiunta a, CloudWatch Logs, dobbiamo aggiungere queste autorizzazioni al nostro profilo di istanza EC2 come policy separata (o combinarle manualmente con altre autorizzazioni che potrebbero essere necessarie associate):

 { "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": "*" } ] }

Nello snippet sopra, assicurati di sostituire il segnaposto BUCKET_NAME .

Ora che abbiamo configurato un punto in cui archiviare i log, CloudWatch Logs, un bucket S3 o entrambi, siamo pronti per attingere alle sessioni SSH.

Gestore di sessione di AWS Systems Manager

Questo è il passaggio chiave finale, in cui configuriamo l'accesso sicuro alla nostra macchina Linux per il monitoraggio e la registrazione delle sessioni SSH. Inizieremo dalla dashboard di Session Manager.

Uno screenshot della dashboard di AWS Session Manager con le sezioni "Come funziona", "Perché utilizzare Session Manager?", "Introduzione", "Altre risorse" e nell'angolo in alto a destra "Avvia una sessione". Quest'ultima sezione ha un pulsante arancione "Avvia sessione" e un pulsante bianco "Configura preferenze".
Passaggio 1: iniziare con la dashboard.

Nella dashboard, fai clic sul pulsante bianco "Configura preferenze" nella casella in alto a destra "Avvia una sessione" per abilitare la registrazione della sessione.

Nella pagina Preferenze, troveremo più sezioni che potremmo esplorare, ma il nostro obiettivo sarà lo streaming dei log di sessione SSH su CloudWatch o S3 per consentirci di vedere rapidamente cosa sta succedendo all'interno della nostra macchina Linux.

Uno screenshot di una sezione AWS intitolata "Registrazione di CloudWatch". La sua prima impostazione, chiamata anche "Registrazione di CloudWatch", ha una casella di controllo denominata Abilita che è selezionata. L'impostazione successiva, "Scegli l'opzione di registrazione preferita", ha selezionato "Registri sessioni di streaming (consigliato)" anziché "Carica registri sessioni". L'impostazione successiva, "Applica crittografia", ha una casella di controllo denominata "Consenti solo gruppi di log CloudWatch crittografati" che è selezionata. L'impostazione finale, "Gruppo di log di CloudWatch", ha selezionato "Scegli un nome di gruppo di log dall'elenco" invece di "Inserisci un gruppo di log nella casella di testo". Sotto c'è un elenco, "Gruppi di log di CloudWatch", con "ssm-session-demo" selezionato. Ha le colonne corrispondenti "Crittografia" (impostata su "Crittografata"), "Eventi scaduti dopo" (impostata su "Non scadere mai"), "Filtri metrici" (impostata su 0), "Byte archiviati" (impostata su 0) e un timestamp "Ora di creazione".
Passaggio 2a: abilitazione della registrazione CloudWatch.

Subito dopo la sezione "Registrazione di CloudWatch", c'è una sezione "Registrazione S3" in cui possiamo selezionare il bucket.

Uno screenshot di una sezione AWS intitolata "Registrazione S3". La sua prima impostazione, "Invia registri di sessione a S3", ha una casella di controllo denominata "Abilita" che è selezionata. L'impostazione successiva, "Applica crittografia", ha una casella di controllo denominata "Consenti solo bucket S3 crittografati" che è selezionata. L'impostazione successiva, "Scegli bucket S3", ha selezionato "Scegli un nome di bucket dall'elenco" anziché "Inserisci un nome di bucket nella casella di testo". Al di sotto, "ssm-session-demo" viene selezionato da un elenco a discesa. L'ultimo campo, "Prefisso chiave S3 - facoltativo", è vuoto.
Passaggio 2b: abilitazione della registrazione S3.

Una volta configurata la registrazione SSH, possiamo eseguire SSH nella nostra macchina Linux ed eseguire alcuni comandi per vedere se l'attività viene acquisita o meno.

Quindi, iniziamo una sessione. Nella stessa pagina, troveremo una scheda "Sessioni" in cui possiamo iniziare una sessione. Facendo clic sul pulsante "Avvia sessione" verrà visualizzato un elenco di macchine EC2 su cui è possibile avviare una sessione:

Uno screenshot di AWS con breadcrumb AWS Systems Manager, Session Manager e Avvia una sessione. Una casella di ricerca "Istanze di destinazione" non ha una query compilata e un solo risultato, con "Nome istanza" impostato su "Demo SSM".
Passaggio 3: selezione della nostra istanza EC2 con cui avviare una sessione SSH.

Se non vediamo la nostra istanza EC2 Linux nell'elenco, dovremmo controllare se è in uno stato di esecuzione e ha le autorizzazioni IAM associate che abbiamo descritto in precedenza.

Gestione di un agente SSM Errore "Non supporta lo streaming dei registri".

Nel caso in cui riceviamo un errore che dice che la versione dell'agente SSM installata sulla nostra macchina EC2 non supporta lo streaming dei log CloudWatch, non preoccuparti. C'è un modo indolore per risolvere questo problema.

Uno screenshot di un messaggio di errore AWS con testo bianco su sfondo rosso. Una X cerchiata è accanto al messaggio "La versione dell'agente SSM installata su questa istanza non supporta lo streaming dei log in CloudWatch. Aggiorna l'agente SSM all'ultima versione o disabilita l'opzione dei log in streaming nelle tue preferenze".
Un potenziale errore di "versione dell'agente SSM obsoleta".

Per aggiornare l'agente SSM, dobbiamo passare a Run Command nel pannello di sinistra del servizio AWS Systems Manager .

Uno screenshot della dashboard di AWS Systems Manager Run Command con le sezioni "Come funziona", "Caratteristiche e vantaggi", "Casi d'uso e post di blog", "Documentazione" e nell'angolo in alto a destra "Gestisci le tue istanze". Quella sezione contiene solo un pulsante arancione "Esegui un comando".
Passaggio 1: a partire dalla dashboard "Esegui comando".

Una volta che siamo lì, possiamo fare clic sul pulsante arancione "Esegui un comando", che porta a una nuova pagina in cui possiamo inserire alcuni parametri.

Uno screenshot di AWS con breadcrumb AWS Systems Manager, Run Command ed Run a command. Una casella di ricerca denominata "Documento di comando" elenca 10 righe (pagina 4 di più di 5), con una denominata "AWS-UpdateSSMAgent" selezionata. Ha "Amazon" nella colonna "Proprietario" e "Windows, Linux" nella colonna "Tipi di piattaforma". Un campo in basso, "Versione documento", ha "1 (predefinito)" selezionato da un elenco a discesa.
Passaggio 2: selezione di un documento di comando.

Inizieremo selezionando AWS-UpdateSSMAgent dall'elenco.

Uno screenshot di una sezione AWS intitolata "Obiettivi". Il primo campo, chiamato anche "Target", ha le opzioni "Specifica tag di istanza", "Scegli istanze manualmente" (selezionato) e "Scegli un gruppo di risorse". Nella parte inferiore c'è una casella di ricerca "Istanze" senza query, con il suo unico risultato, "Demo SSM", selezionato. L'ID istanza corrispondente nella riga viene copiato in una casella appena sopra "Istanze" con una X.
Passaggio 3: selezione dell'istanza EC2 che dispone di un agente SSM che necessita di un aggiornamento.

Una volta selezionato, scorreremo verso il basso fino a visualizzare la sezione "Obiettivi". Lì dobbiamo selezionare l'istanza EC2 su cui vogliamo aggiornare l'agente SSM, quindi premere il pulsante "Esegui" alla fine. Questo ci invierà a una pagina in cui possiamo monitorare lo stato di avanzamento dell'aggiornamento.

Uno screenshot di AWS con breadcrumb "AWS Systems Manager", "Run Command" e "Command ID" (seguiti da un GUID). La prima sezione, "Stato del comando", mostra gli indicatori di successo, così come l'unica riga della sezione successiva, "Obiettivi e output", che elenca la singola istanza di prima. Ci sono anche due sezioni non espanse in fondo, "Descrizione comando" e "Parametri comando".
Passaggio 4: monitoraggio dell'avanzamento dell'aggiornamento.

L'aggiornamento dell'agente non dovrebbe richiedere più di cinque minuti. Una volta fatto, dovremmo essere in grado di creare una sessione di nuovo in Session Manager.

A questo punto, dovremmo avviare una sessione SSH.

Uno screenshot di AWS con un ID sessione e un ID istanza sopra un terminale. Il prompt è "sh-4.2$" e sono stati inseriti i comandi "whoami" e "pwd", rispettivamente con le uscite "ssm-user" e "/usr/bin".
Una sessione SSH che utilizza l'agente SSM tramite AWS Systems Manager Session Manager.

Dopo aver eseguito alcuni comandi, andiamo al gruppo di log di CloudWatch Logs (o al nostro bucket S3, non mostrato) e confermiamo che l'attività è in corso di registrazione.

Uno screenshot di AWS con breadcrumb "CloudWatch", "CloudWatch Logs", "Gruppi di log", "ssm-session-demo" e l'ID sessione del passaggio precedente. L'unica sezione è una casella di ricerca, "Registra eventi", con righe che hanno ciascuna un timestamp e un messaggio in formato JSON. Uno di questi viene ampliato per rivelare il suo JSON ben stampato e con un pulsante bianco a destra etichettato "Copia".
Eventi di log SSH registrati in CloudWatch Logs.

Ora abbiamo una configurazione, con la crittografia a riposo abilitata, che registra ogni comando eseguito nella nostra macchina Linux.

Ogni comando, infatti, potrebbe essere più di quello che vogliamo: eventuali secret forniti o generati durante la sessione verranno registrati in CloudWatch o S3 e potranno essere visti da chiunque abbia i permessi richiesti. Per evitarlo, possiamo usare stty -echo; read passwd; stty echo; stty -echo; read passwd; stty echo; per ogni segreto che dobbiamo fornire durante la sessione.

Un'ottima soluzione di registrazione AWS SSM/SSH con piccoli avvertimenti

Session Manager è uno strumento utile per ottenere l'accesso remoto alle nostre macchine virtuali in AWS senza dover aprire la porta 22. Infatti, non possiamo generare log SSH in questo modo se utilizziamo il port forwarding o una connessione SSH diretta, come Session Manager note di documentazione.

Tuttavia, la combinazione di Session Manager con la registrazione delle sessioni è una soluzione affidabile per il controllo e il monitoraggio dell'attività all'interno delle macchine virtuali. Inoltre, non ci viene addebitato l'utilizzo del servizio Session Manager. Paghiamo solo per la nostra istanza EC2 e CloudWatch Logs o un bucket S3 per l'archiviazione dei log.

Per i lettori che preferiscono i tutorial video, ho trattato un po' più a fondo una procedura molto simile su YouTube.


Ulteriori letture sul blog di Toptal Engineering:

  • Caso di studio: perché utilizzo l'infrastruttura cloud AWS per i miei prodotti