Analizuj zaawansowaną inteligencję bezpieczeństwa Amazon Cognito, aby poprawić widoczność i ochronę
Ze względu na to, że Twoja grupa stara się poprawić stan i działania dotyczące bezpieczeństwa, wczesne wykrywanie i zapobieganie nieautoryzowanej aktywności szybko staje się jednym z głównych priorytetów. Zachowania związane z nieautoryzowanym działaniem zwykle są zgodne z wzorcami, które można analizować w celu stworzenia określonych środków łagodzących lub wprowadzenia danych do systemów monitorowania bezpieczeństwa.
Poniższy artykuł obrazuje, w jaki sposób możesz analizować informacje dotyczące bezpieczeństwa z dzienników zaawansowanych funkcji bezpieczeństwa Amazon Cognito za pomocą natywnych usług AWS. Możesz użyć danych analitycznych dostarczonych przez dzienniki, aby zwiększyć widoczność działań związanych z logowaniem i rejestracją przez użytkowników, co może pomóc w monitorowaniu, podejmowaniu decyzji i dostarczaniu innych usług bezpieczeństwa w Twojej organizacji, takich jak zapora aplikacji sieci lub narzędzie do zarządzania informacjami o zabezpieczeniach i zdarzeniami (SIEM). Dane mogą również wzbogacić dostępne źródła bezpieczeństwa, takie jak systemy wykrywania oszustw, zwiększając ochronę obciążeń uruchamianych w AWS.
Przegląd zaawansowanych funkcji bezpieczeństwa Amazon Cognito
Amazon Cognito zapewnia uwierzytelnianie, autoryzację i zarządzanie użytkownikami aplikacji internetowych i mobilnych. Użytkownicy mogą logować się do aplikacji bezpośrednio przy użyciu nazwy użytkownika i hasła lub za pośrednictwem innej firmy, takiej jak dostawcy usług społecznościowych lub standardowi dostawcy dla przedsiębiorstw za pośrednictwem SAML 2.0/OpenID Connect Connect (OIDC). Amazon Cognito zawiera dodatkowe zabezpieczenia dla użytkowników, którymi zarządzasz w pulach użytkowników Amazon Cognito. W szczególności Amazon Cognito może dodać uwierzytelnianie adaptacyjne oparte na ryzyku, a także oznaczać użycie zhakowanych danych uwierzytelniających. Aby uzyskać więcej informacji, sprawdź „Checking for compromised credentials” w Przewodniku dla programistów Amazon Cognito.
Dzięki uwierzytelnianiu adaptacyjnemu Amazon Cognito analizuje każdą próbę logowania do puli użytkowników i generuje wynik ryzyka określający prawdopodobieństwo, że żądanie logowania pochodzi od nieautoryzowanego użytkownika. Amazon Cognito analizuje szereg czynników, w tym to, czy użytkownik korzystał wcześniej z tego samego urządzenia, czy też zalogował się z tej samej lokalizacji lub adresu IP. Wykryte ryzyko jest oceniane jako niskie, średnie lub wysokie i można określić, jakie działania należy podjąć na każdym poziomie ryzyka. Możesz zezwolić lub zablokować żądanie, wymagać drugiego czynnika uwierzytelniania lub powiadomić użytkownika o ryzyku pocztą elektroniczną. Zespoły ds. bezpieczeństwa i administratorzy mogą również przesyłać opinie na temat ryzyka za pośrednictwem interfejsu API, a użytkownicy mogą przesyłać opinie za pomocą łącza wysyłanego na adres e-mail użytkownika. Ta informacja zwrotna może usprawnić obliczanie ryzyka dla przyszłych prób.
Aby dodać zaawansowane funkcje zabezpieczeń do istniejącej konfiguracji Amazon Cognito, możesz rozpocząć od wykonania instrukcji Adding advanced security to a user pool w Przewodniku programisty Amazon Cognito. Pamiętaj, że za zaawansowane funkcje bezpieczeństwa pobierana jest dodatkowa opłata, zgodnie z opisem na stronie AWS, wraz z cennikiem. Te funkcje mają zastosowanie tylko do rodzimych użytkowników Amazon Cognito; nie mają zastosowania do użytkowników federacyjnych, którzy logują się za pomocą dostawcy zewnętrznego.
Architektura rozwiązania
Rysunek nr 1 przedstawia architekturę wysokiego poziomu zaawansowanego rozwiązania zabezpieczającego. Gdy zdarzenie logowania do Amazon Cognito jest rejestrowane przez AWS CloudTrail, rozwiązanie wykorzystuje regułę Amazon EventBridge do wysłania zdarzenia do kolejki Amazon Simple Queue Service (Amazon SQS) i grupowania, a następnie przetworzenia przez funkcję AWS Lambda. Funkcja Lambda wykorzystuje informacje o zdarzeniu do pobierania informacji o bezpieczeństwie logowania i wysyłania ich jako dzienników do zasobnika Amazon Simple Storage Service (Amazon S3) i dzienników Amazon CloudWatch.
Warunki wstępne i uwagi dotyczące tego rozwiązania
To rozwiązanie zakłada, że używasz Amazon Cognito z już włączonymi zaawansowanymi funkcjami bezpieczeństwa, rozwiązanie nie tworzy więc puli użytkowników i nie aktywuje zaawansowanych funkcji bezpieczeństwa na istniejącej.
Poniższa lista zawiera opis niektórych ograniczeń, o których należy pamiętać w przypadku tego rozwiązania:
- To rozwiązanie nie dotyczy zdarzeń w hostowanym interfejsie użytkownika, ale tę samą architekturę można dostosować do tego środowiska, z pewnymi zmianami w procesorze zdarzeń.
- Zaawansowane funkcje bezpieczeństwa Amazon Cognito obsługują tylko rodzimych użytkowników. To rozwiązanie nie dotyczy użytkowników federacyjnych.
- Interfejs API administratora używany w tym rozwiązaniu posiada domyślny limit szybkości 30 żądań na sekundę (RPS). Jeśli masz wyższy wskaźnik prób uwierzytelnienia, to wywołanie interfejsu API może zostać ograniczone i będziesz musiał zaimplementować wzorzec ponownej próby, aby potwierdzić, że Twoje żądania są przetwarzane.
Wdrażanie rozwiązania
Możesz wdrożyć rozwiązanie automatycznie, korzystając z następującego szablonu AWS CloudFormation.
Wybierz następujący przycisk Uruchom Stos, aby uruchomić stos CloudFormation na swoim koncie i wdrożyć rozwiązanie.
Nastąpi przekierowanie do usługi CloudFormation w regionie wschodnie stany USA (płn. Wirginia), który jest domyślnym regionem AWS, w celu wdrożenia tego rozwiązania. Możesz zmienić region, aby dopasować go do miejsca, w którym działa Twoja pula użytkowników Cognito.
Ten szablon utworzy wiele zasobów w chmurze, w tym między innymi:
- Reguła EventBridge do wysyłania zdarzeń Amazon Cognito;
- Kolejka Amazon SQS do wysyłania zdarzeń do Lambda;
- Funkcja Lambda do uzyskiwania zaawansowanych informacji o bezpieczeństwie na podstawie zdarzeń uwierzytelniania z CloudTrail;
- Zasobnik S3 do przechowywania logów.
W kreatorze zostaniesz poproszony o zmodyfikowanie lub podanie jednego parametru, istniejącego identyfikatora puli użytkowników Cognito. Możesz uzyskać tę wartość z konsoli Amazon Cognito lub Cognito API.
Pora szczegółowo przeanalizować każdy element rozwiązania.
Wysyłanie zdarzeń uwierzytelniania z CloudTrail do Lambda
Zaawansowane funkcje bezpieczeństwa Cognito obsługują zdarzenia CloudTrail: SignUp, ConfirmSignUp, ForgotPassword, ResendConfirmationCode, InitiateAuth i RespondToAuthChallenge. To rozwiązanie będzie koncentrować się na zdarzeniu logowania InitiateAuth jako przykładzie.
Rozwiązanie tworzy regułę EventBridge, która zostanie uruchomiona po zidentyfikowaniu zdarzenia w CloudTrail i wyśle zdarzenie do kolejki SQS. Jest to przydatne, ponieważ zdarzenia mogą być grupowane i rozdzielone, aby Lambda mogła je przetworzyć.
Reguła EventBridge wykorzystuje jako cel Amazon SQS. Kolejka jest tworzona przez rozwiązanie i używa ustawień domyślnych, z wyjątkiem tego, że czas oczekiwania na odbieranie wiadomości jest ustawiony na 20 sekund dla long polling. Aby uzyskać więcej informacji na temat long polling i ręcznego konfigurowania kolejki SQS, zobacz „Consuming messages using long polling” w Przewodniku programisty Amazon SQS.
Gdy kolejka SQS odbiera komunikaty z EventBridge, są one wysyłane do Lambda w celu przetworzenia. Pora skupić się na zrozumieniu, w jaki sposób informacje są przetwarzane przez funkcję Lambda.
Wykorzystanie Lambda do przetwarzania informacji o zaawansowanych funkcjach bezpieczeństwa Amazon Cognito
Aby uzyskać informacje dotyczące oceny zaawansowanych funkcji zabezpieczeń, potrzebne są dane uwierzytelniające, które można uzyskać wyłącznie za pomocą wywołania API dostawcy tożsamości Amazon Cognito (IdP) admin_list_user_auth_events. To wywołanie interfejsu API wymaga nazwy użytkownika, aby pobrać wszystkie szczegóły zdarzenia uwierzytelniania dla określonego użytkownika. Ze względów bezpieczeństwa nazwa użytkownika nie jest zalogowana w CloudTrail i musi zostać uzyskana przy użyciu innych informacji o zdarzeniach.
Możesz użyć funkcji Lambda w przykładowym rozwiązaniu, aby uzyskać te informacje. Składa się to z trzech głównych działań sekwencyjnych:
- Funkcja Lambda pobiera sub identyfikatory ze zdarzeń uwierzytelniania zarejestrowanych przez CloudTrail.
- Każdy sub identyfikator jest używany do uzyskania nazwy użytkownika poprzez wywołanie API do list_users.
- Funkcja sample pobiera ostatnie pięć szczegółów zdarzenia uwierzytelniania z zaawansowanych funkcji zabezpieczeń dla każdego z tych użytkowników za pomocą wywołania API admin_list_user_auth_events. Możesz zmodyfikować funkcję, aby pobrać inną liczbę zdarzeń lub użyć innych kryteriów, takich jak znacznik czasu lub określony przedział czasu.
Pobieranie informacji o nazwie użytkownika ze zdarzenia CloudTrail
Poniższe przykładowe zdarzenie uwierzytelniania pokazuje identyfikator podrzędny w informacjach o zdarzeniu CloudTrail, pokazany jako sub w obszarze AdditionalEventData. Za pomocą tego identyfikatora podrzędnego możesz użyć wywołania interfejsu API ListUsers z zestawu Cognito IdP SDK, aby uzyskać szczegółowe informacje o nazwie użytkownika.
{
"eventVersion": "1.XX",
"userIdentity": {
"type": "Unknown",
"principalId": "Anonymous"
},
"eventTime": "2022-01-01T11:11:11Z",
"eventSource": "cognito-idp.amazonaws.com",
"eventName": "InitiateAuth",
"awsRegion": "us-east-1",
"sourceIPAddress": "xx.xx.xx.xx",
"userAgent": "Mozilla/5.0 (xxxx)",
"requestParameters": {
"authFlow": "USER_SRP_AUTH",
"authParameters": "HIDDEN_DUE_TO_SECURITY_REASONS",
"clientMetadata": {},
"clientId": "iiiiiiiii"
},
"responseElements": {
"challengeName": "PASSWORD_VERIFIER",
"challengeParameters": {
"SALT": "HIDDEN_DUE_TO_SECURITY_REASONS",
"SECRET_BLOCK": "HIDDEN_DUE_TO_SECURITY_REASONS",
"USER_ID_FOR_SRP": "HIDDEN_DUE_TO_SECURITY_REASONS",
"USERNAME": "HIDDEN_DUE_TO_SECURITY_REASONS",
"SRP_B": "HIDDEN_DUE_TO_SECURITY_REASONS"
}
},
"additionalEventData": {
"sub": "11110b4c-1f4264cd111"
},
"requestID": "xxxxxxxx",
"eventID": "xxxxxxxxxx",
"readOnly": false,
"eventType": "AwsApiCall",
"managementEvent": true,
"recipientAccountId": "xxxxxxxxxxxxx",
"eventCategory": "Management"
}
Wyświetlanie informacji o zdarzeniach uwierzytelniania
Gdy funkcja Lambda uzyska nazwę użytkownika, może następnie użyć wywołania interfejsu API Cognito IdP admin_list_user_auth_events, aby uzyskać informacje o zaawansowanej ocenie ryzyka funkcji zabezpieczeń dla każdego zdarzenia uwierzytelniania dla tego użytkownika. Przyjrzyj się szczegółom tej oceny.
Informacje o zdarzeniach uwierzytelniania z zaawansowanych zabezpieczeń Amazon Cognito dostarczają informacji dla każdej z ocenianych kategorii i rejestrują wyniki. Wyniki te można następnie wykorzystać do podjęcia decyzji, czy informacje dotyczące próby uwierzytelnienia są przydatne dla zespołu ds. bezpieczeństwa, który ma zostać powiadomiony lub podjąć działania. Zaleca się ograniczenie liczby zwracanych zdarzeń w celu optymalizacji wydajności.
Poniższe przykładowe zdarzenie przedstawia niektóre informacje o ryzyku dostarczane przez zaawansowane funkcje zabezpieczeń; opcje składni odpowiedzi można znaleźć w dokumentacji interfejsu API CognitoIdentityProvider.
}
]
at the bottom, so
"AuthEvents": [
{
"EventId": "1111111”,
"EventType": "SignIn",
"CreationDate": 111111.111,
"EventResponse": "Pass",
"EventRisk": {
"RiskDecision": "NoRisk",
"CompromisedCredentialsDetected": false
},
"ChallengeResponses": [
{
"ChallengeName": "Password",
"ChallengeResponse": "Success"
}
],
"EventContextData": {
"IpAddress": "72.xx.xx.xx",
"DeviceName": "Firefox xx
"City": "Axxx",
"Country": "United States"
}
}
]
Zwracane informacje o zdarzeniu obejmują szczegóły wyróżnione w tym przykładowym zdarzeniu, takie jak CompromisedCredentialsDetected, RiskDecision i RiskLevel, które można ocenić, aby zdecydować, czy informacje mogą zostać użyte do wzbogacenia innych usług monitorowania zabezpieczeń.
Rejestrowanie informacji o zdarzeniach uwierzytelniania
Możesz użyć warstwy rozszerzeń Lambda, aby wysłać logi do zasobnika S3. Lambda nadal wysyła logi do Amazon CloudWatch Logs, ale możesz wyłączyć tę aktywność, usuwając wymagane uprawnienia do CloudWatch w roli wykonania Lambda. Aby uzyskać więcej informacji o tym, jak to skonfigurować, zobacz „Using AWS Lambda extensions to send logs to custom destinations”.
Rysunek nr 2 pokazuje przykład loga wysłanego przez Lambdę. Zawiera informacje o wykonaniu, które są rejestrowane przez rozszerzenie, a także informacje zwrócone z oceny uwierzytelniania przez zaawansowane funkcje zabezpieczeń.
Należy zauważyć, że szczegółowe informacje dotyczące uwierzytelniania w dzienniku wykonania Lambda są takie same, jak w poprzednim przykładowym zdarzeniu. Możesz dodatkowo ulepszyć informacje dostarczane przez funkcję Lambda, modyfikując kod funkcji i rejestrując więcej informacji podczas wykonywania lub filtrując dzienniki i skupiając się tylko na próbach logowania wysokiego ryzyka lub uszkodzonych.
Gdy dzienniki znajdą się w zasobniku S3, różne aplikacje i narzędzia mogą używać tych informacji do wykonywania zautomatyzowanych działań związanych z bezpieczeństwem i aktualizacji konfiguracji lub zapewniania dodatkowego wglądu. Możesz wysyłać zapytania do danych z Amazon S3 za pomocą Amazon Athena, przesyłać dane do innych usług, takich jak Amazon Fraud Detector, jak opisano w tym artykule, wydobywać dane za pomocą narzędzi zarządzanych przez sztuczną inteligencję/uczenie maszynowe (AI/ML), takich jak AWS Lookout dla metryk lub zwiększania widoczności dzięki AWS WAF.
Przykładowe scenariusze
Możesz zacząć uzyskiwać wgląd w informacje o bezpieczeństwie dostarczane przez to rozwiązanie w istniejącym środowisku, kwestionując i wizualizując dane dziennika bezpośrednio za pomocą CloudWatch Logs Insights. Szczegółowe informacje o tym, jak korzystać z CloudWatch Logs Insights z logami Lambda, znajdziesz w poście na blogu Operating Lambda: Using CloudWatch Logs Insights.
Szablon CloudFormation wdraża zapytania CloudWatch Logs Insights. Możesz wyświetlić zapytania dotyczące przykładowego rozwiązania w konsoli Amazon CloudWatch, w obszarze Zapytania.
Aby uzyskać dostęp do zapytań w konsoli CloudWatch:
- W konsoli CloudWatch, pod Logs, wybierz Insights.
- Wybierz Wybierz grupy dzienników. Z rozwijanej listy wybierz grupę logów Lambda.
- W polu zapytania powinno pojawić się wstępnie utworzone zapytanie. Wybierz Uruchom zapytanie. Powinieneś zobaczyć wyniki zapytania w prawym dolnym panelu.
- (Opcjonalnie) Wybierz Dodaj do pulpitu nawigacyjnego, aby dodać widżet do pulpitu nawigacyjnego.
CloudWatch Logs Insights automatycznie wykrywa pola w dzienniku zdarzeń uwierzytelniania. Jak pokazano na rysunku nr 3, możesz zobaczyć dostępne pola po prawej stronie panelu Odkryte obszary, który zawiera informacje Amazon Cognito w zdarzeniu.
Pierwsze zapytanie, pokazane w poniższym fragmencie kodu, pomoże Ci uzyskać widok liczby żądań na adres IP, gdzie zaawansowane funkcje zabezpieczeń określiły decyzję dotyczącą ryzyka jako Przejęcie konta i CompromisedCredentialsDetected jako prawdziwe.
fields @message
| filter @message like /INFO/
| filter AuthEvents.0.EventType like 'SignIn'
| filter AuthEvents.0.EventRisk.RiskDecision like "AccountTakeover" and
AuthEvents.0.EventRisk.CompromisedCredentialsDetected =! "false"
| stats count(*) as RequestsperIP by AuthEvents.2.EventContextData.IpAddress as IP
| sort desc
Wyniki zapytania można wyświetlić w postaci tabeli lub wykresu, jak pokazano na rysunku nr 4.
Korzystając z tego samego podejścia i wygodnego dostępu do pól dla zapytania, możesz zbadać inny przypadek użycia, używając następującego zapytania, aby wyświetlić liczbę żądań na IP dla każdego typu zdarzenia (SignIn, SignUp i zapomniane hasło), gdzie poziom ryzyka był wysoki.
fields @message
| filter @message like /INFO/
| filter AuthEvents.0.EventRisk.RiskLevel like "High"
| stats count(*) as RequestsperIP by AuthEvents.0.EventContextData.IpAddress as IP,
AuthEvents.0.EventType as EventType
| sort desc
Rysunek nr 5 przedstawia wyniki dla tego zapytania EventType.
W końcowym przykładowym scenariuszu można spojrzeć na dane kontekstu zdarzenia i zapytanie o źródło zdarzeń, dla których poziom ryzyka był wysoki.
fields @message
| filter @message like /INFO/
| filter AuthEvents.0.EventRisk.RiskLevel like 'High'
| stats count(*) as RequestsperCountry by AuthEvents.0.EventContextData.Country as Country
| sort desc
Rysunek nr 6 przedstawia wyniki dla tego zapytania poziomu ryzyka.
Jak możesz zauważyć, istnieje wiele sposobów na mieszanie i dopasowywanie filtrów w celu wydobycia zaawansowanych spostrzeżeń, w zależności od konkretnych potrzeb. Możesz użyć tych przykładów jako podstawy do budowania własnych zapytań.
Wnioski
W tym artykule dowiedziałeś się, jak korzystać z informacji wywiadowczych dotyczących bezpieczeństwa dostarczonych przez Amazon Cognito za pomocą zaawansowanych funkcji bezpieczeństwa, aby poprawić swoje praktyki bezpieczeństwa. Użyłeś zaawansowanego rozwiązania bezpieczeństwa do pobierania cennych informacji uwierzytelniających za pomocą logów CloudTrail jako źródła i funkcji Lambda do przetwarzania zdarzeń. Wyślij te informacje oceny w formie logu do CloudWatch Logs i S3 do wykorzystania jako dodatkowy kanał bezpieczeństwa dla szerszego monitorowania i widoczności organizacji. W zestawie przykładowych przypadków użycia zbadałeś, jak korzystać z CloudWatch Logs Insights, aby szybko i wygodnie uzyskiwać dostęp do tych informacji, łączyć je, uzyskiwać szczegółowe informacje i wykorzystywać je do podejmowania działań.
Aby uzyskać więcej informacji, sprawdź artykuł: How to Use New Advanced Security Features for Amazon Cognito User Pools.
Źródło: AWS