Logowanie SSH i zarządzanie sesją za pomocą AWS SSM
Opublikowany: 2022-03-11Konfigurowanie niestandardowych narzędzi lub skryptów do przechowywania dziennika SSH w systemie Linux może być żmudne i podatne na błędy.
Inżynierowie mogą używać rootsh , screen lub innego narzędzia do rejestrowania aktywności użytkowników, ale jeśli uprawnienia użytkownika nie są ustawione prawidłowo, doświadczony użytkownik może usunąć dzienniki audytu, aby zatrzeć ślady. Inną opcją byłoby skonfigurowanie logowania na poziomie jądra, ale wiedza potrzebna do tego nie jest tak powszechna.
Na szczęście istnieje sposób na rejestrowanie aktywności użytkowników bez pisania nawet jednego polecenia Linuksa! Będziemy potrzebować tych usług:
- EC2
- IAM (zarządzanie tożsamością i dostępem)
- KMS (usługa zarządzania kluczami)
- Dzienniki CloudWatch (i/lub S3)
- Menedżer systemów AWS (wcześniej znany jako SSM)
Zobaczmy, jak skonfigurować każdy z nich.
EC2 i IAM
Uruchamianie instancji EC2 jest zwykle dość łatwe, ale jest jedno kluczowe zadanie, które należy wykonać podczas uruchamiania: musimy przypisać rolę IAM do naszej instancji, w przeciwnym razie nie będziemy w stanie osiągnąć oczekiwanych wyników wyszczególnionych na końcu tego artykuł.
Rola uprawnień, którą powiążemy z naszą instancją EC2, musi mieć wbudowaną zasadę AmazonSSMManagedInstanceCore oraz tę zasadę (dołączoną jako wbudowane lub zarządzane przez klienta):
{ "Version": "2012-10-17", "Statement": [ { "Action": [ "logs:CreateLogStream", "logs:DescribeLogStreams", "logs:DescribeLogGroups", "logs:PutLogEvents" ], "Effect": "Allow", "Resource": "*" } ] }Oprócz roli IAM zazwyczaj używamy tej konfiguracji instancji EC2:
- System operacyjny to Amazon Linux 2, ponieważ domyślnie jest dostarczany z zainstalowanym AWS Systems Manager Agent (SSM Agent). (Podobnie jak dystrybucje Ubuntu, które również są opcją).
- Typ instancji to t3.micro (ale każdy typ będzie odpowiedni).
- Domyślna grupa zabezpieczeń , którą AWS przypisuje do VPC, będzie działać, ponieważ do tego ćwiczenia nie potrzebujemy otwartego portu SSH.
Możemy zacząć konfigurować KMS bez czekania na uruchomienie instancji EC2.
KMS
Potrzebujemy klucza KMS, jeśli chcemy, aby wszystkie logi sesji dostarczane do CloudWatch były przechowywane w postaci zaszyfrowanej. Przejdźmy do usługi KMS i utwórzmy klucz.
Zalecamy przypisanie administratora, aby kluczem mogli zarządzać użytkownicy inni niż użytkownik root konta AWS, ale jeśli inni nie będą potrzebować dostępu, możemy pominąć krok 3.
Tutaj wybraliśmy użytkownika IAM „admin” jako administratora klucza, ale możemy wybrać dowolnego użytkownika lub rolę. Możemy również zdecydować się na wyłączenie uprawnień administratora do usuwania kluczy.
Nie będziemy przypisywać żadnych użytkowników do tego klucza, ponieważ chcemy, aby ten klucz był używany tylko przez usługę CloudWatch Logs do operacji szyfrowania i odszyfrowywania dzienników SSH.
Na stronie Przejrzyj będziemy musieli zmienić zasady dotyczące kluczy wygenerowanych przez KMS, ponieważ nie obejmują one uprawnień CloudWatch Logs do korzystania z klucza. Zastąpimy je następującymi zasadami:
{ "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:*" } } } ] }Pamiętaj, aby zastąpić wszystkie symbole zastępcze:
-
ACCOUNT_IDstaje się naszym identyfikatorem konta AWS. -
USERNAMEstaje się nazwą użytkownika administratora wybraną w kroku 3. Jeśli zrezygnowaliśmy z tego kroku, tutaj usuwamy drugi blok instrukcji (ten z"Sid": "Allow access for Key Administrators"). -
REGIONstaje się regionalnym kodem identyfikacyjnym, dla którego wdrażamy usługi (np.us-west-1).
Dzięki temu KMS jest gotowy do pracy.
CloudWatch Log Group
Następnie potrzebujemy grupy CloudWatch Log (i/lub zasobnika S3 — patrz poniżej), gdzie Agent SSM może wysyłać logi sesji SSH. Stwórzmy to.
Zwróć uwagę na pole ARN klucza KMS: AWS udostępnia nam wartość potrzebną w tym miejscu po utworzeniu klucza w kroku 5 sekcji KMS.
(Jeśli wcześniej nie powiązaliśmy prawidłowej polityki z naszym kluczem KMS, umożliwiając usłudze CloudWatch Logs użycie klucza, w tym momencie otrzymamy błąd związany z kluczem KMS.)
Przechowywanie dzienników SSH w zasobniku S3
Aby przechowywać dzienniki aktywności za pomocą S3 zamiast — lub oprócz — CloudWatch Logs, musimy dodać te uprawnienia do naszego profilu instancji EC2 jako oddzielną politykę (lub ręcznie połączyć je z innymi uprawnieniami, które mogą być nam potrzebne):
{ "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": "*" } ] } W powyższym fragmencie pamiętaj, aby zastąpić symbol zastępczy BUCKET_NAME .
Teraz, gdy mamy skonfigurowane miejsce do przechowywania dzienników — logi CloudWatch, zasobnik S3 lub oba te elementy — jesteśmy gotowi do korzystania z sesji SSH.
Menedżer sesji AWS Systems Manager
To jest ostatni kluczowy krok, w którym konfigurujemy bezpieczny dostęp do naszej maszyny z systemem Linux w celu monitorowania i rejestrowania sesji SSH. Zaczniemy od pulpitu Menedżera sesji.

Na pulpicie kliknij biały przycisk „Konfiguruj preferencje” w prawym górnym polu „Rozpocznij sesję”, aby włączyć rejestrowanie sesji.
Na stronie Preferencje znajdziemy wiele sekcji, które moglibyśmy zbadać, ale skupimy się na przesyłaniu strumieniowym dzienników sesji SSH do CloudWatch lub S3, aby umożliwić nam szybkie sprawdzenie, co dzieje się na naszej maszynie z systemem Linux.
Tuż za sekcją „Logowanie CloudWatch” znajduje się sekcja „Logowanie S3”, w której możemy wybrać zasobnik.
Po skonfigurowaniu rejestrowania SSH możemy SSH do naszego komputera z systemem Linux i wykonać kilka poleceń, aby sprawdzić, czy aktywność jest przechwytywana, czy nie.
Zacznijmy więc sesję. Na tej samej stronie znajdziemy zakładkę „Sesje”, w której możemy rozpocząć sesję. Kliknięcie przycisku „Rozpocznij sesję” da nam listę maszyn EC2, na których możemy zainicjować sesję:
Jeśli nie widzimy na liście naszej instancji EC2 Linux, powinniśmy sprawdzić, czy jest ona uruchomiona i ma powiązane z nią uprawnienia IAM, które opisaliśmy wcześniej.
Obsługa błędu agenta SSM „Nie obsługuje dzienników przesyłania strumieniowego”
W przypadku, gdy otrzymamy błąd mówiący, że wersja agenta SSM zainstalowana na naszym komputerze EC2 nie obsługuje przesyłania strumieniowego logów CloudWatch, nie martw się. Jest bezbolesny sposób na naprawienie tego.
Aby zaktualizować agenta SSM, musimy przejść do opcji Uruchom polecenie w lewym panelu usługi AWS Systems Manager .
Gdy już tam jesteśmy, możemy kliknąć pomarańczowy przycisk „Uruchom polecenie”, co prowadzi do nowej strony, na której możemy wypełnić niektóre parametry.
Zaczniemy od wybrania z listy AWS-UpdateSSMAgent .
Po wybraniu będziemy przewijać w dół, aż zobaczymy sekcję „Cele”. Tam musimy wybrać instancję EC2, na której chcemy zaktualizować Agenta SSM, a następnie nacisnąć przycisk „Uruchom” na końcu. To przeniesie nas na stronę, na której możemy monitorować postęp aktualizacji.
Aktualizacja agenta nie powinna zająć więcej niż pięć minut. Po wykonaniu tej czynności powinniśmy móc ponownie utworzyć sesję w Menedżerze sesji.
W tym momencie powinniśmy mieć rozpoczętą sesję SSH.
Po wykonaniu kilku poleceń przejdźmy do grupy logów CloudWatch Logs (lub naszego wiadra S3, nie pokazanego) i potwierdźmy, że aktywność jest rejestrowana.
Mamy teraz konfigurację z włączonym szyfrowaniem w spoczynku, która rejestruje każde polecenie uruchomione na naszym komputerze z systemem Linux.
W rzeczywistości każdej komendy może być więcej niż byśmy chcieli: wszelkie sekrety dostarczone lub wygenerowane podczas sesji zostaną zapisane w CloudWatch lub S3 i będą widoczne dla każdego, kto ma wymagane uprawnienia. Aby temu zapobiec, możemy użyć stty -echo; read passwd; stty echo; stty -echo; read passwd; stty echo; za każdy sekret, który musimy podać podczas sesji.
Świetne rozwiązanie do rejestrowania SSM/SSH AWS z drobnymi zastrzeżeniami
Menedżer sesji to przydatne narzędzie do uzyskania zdalnego dostępu do naszych maszyn wirtualnych w AWS bez konieczności otwierania portu 22. W rzeczywistości nie możemy w ten sposób generować logów SSH, jeśli jako Menedżer sesji korzystamy z przekierowania portów lub bezpośredniego połączenia SSH notatki dotyczące dokumentacji.
Niemniej jednak połączenie Menedżera sesji z rejestrowaniem sesji jest niezawodnym rozwiązaniem do kontrolowania i monitorowania aktywności na maszynach wirtualnych. Ponadto nie pobieramy opłat za korzystanie z usługi Menedżera sesji. Płacimy tylko za naszą instancję EC2 i CloudWatch Logs lub wiadro S3 do przechowywania logów.
Dla czytelników, którzy preferują samouczki wideo, nieco dokładniej omówiłem bardzo podobną procedurę na YouTube.
Dalsza lektura na blogu Toptal Engineering:
- Studium przypadku: Dlaczego korzystam z infrastruktury chmury AWS dla moich produktów
