• Ogólne
  • Dla Architektów
  • Bezpieczeństwo

Kto utworzył ten serwer?!

13 lipca 2017Tomasz StachlewskiDla Architektów

Jednym z częstszych pytań na szkoleniach wprowadzających do chmury AWS jakie otrzymuję od uczestników jest pytanie czy istnieje możliwość łatwego zidentyfikowania osób, które faktycznie utworzyły dany serwer. Wyobraźmy sobie bowiem sytuację, że do naszego konta (subskrypcji chmurowej) ma dostęp kilka osób – i każda z nich ma uprawnienia do tworzenia nowych instancji serwerów wirtualnych. Po pewnym czasie widzimy kilka, kilkanaście serwerów – pojawia się zatem pytanie: kto był ich autorem? Czy Paweł? Janek? Ania? Franek?

Serwery wirtualne, które tworzymy w ramach chmury nie należą do ‘pojedynczej osoby’ – należą one do konta AWS w ramach którego zostały utworzone i nie mają natywnej wbudowanej funkcjonalności identyfikacji, kto je uruchomił. Istnieją oczywiście możliwości znalezienia takiej informacji, z pomocą przychodzi tutaj usługa AWS CloudTrail – która loguje całą interakcję z chmurą – w tym również kto jest inicjatorem poszczególnych akcji API. Znalezienie jednak twórcy poszczególnych serwerów może być jednak czasochłonne. Pojawia się zatem pytanie czy istnieje łatwiejszy sposób? Okazuje się bowiem, że w prosty sposób możemy sami zaimplementować mechanizm, który będzie tagował serwery (lub nawet inne byty chmurowe) informacją o twórcy, który je uruchomił. W niniejszym poście przedstawimy jak w ciągu 30 minut zbudować taki mechanizm – zatem do dzieła!

Przyjrzymy się procesowi, który zaimplementujemy:

  1. Nowy serwer wirtualny zostaje uruchomiony przez użytkownika
  2. Usługa CloudWatch Events zostaje skonfigurowana do wykrywania informacji o powstawaniu nowych serwerów. W ramach zdarzenia otrzymuje ona również informacje o użytkowniku, który wywołał akcję tworzenia nowego serwera.
  3. Po wykryciu zdarzenia tworzenia nowego serwera, informacja ta zostaje przesłana do usługi Lambda (mikrousługi). W ramach informacji wejściowych zostają przesłane m.in. identyfikator nowego serwera oraz dane użytkownika.
  4. Zostaje uruchomiona Lambda, w której zostaje wgrany skrypt, który na taguje (czyli nadaje atrybut) nowemu serwerowi. Atrybut ten wskazuje użytkownika, który go uruchomił. Nowy serwer uzyskuje automatycznie nowy tag, który jest widoczny z konsoli WWW i umożliwia łatwą identyfikację jego twórcy.

Krok 1: Utworzenie roli IAM i nadanie uprawnień

Skrypt, który będzie tagował nasze serwery musi mieć do tego uprawnienia. W tym celu z ramach usługi IAM należy utworzyć nową rolę, którą będziemy przyporządkowywać do Lambdy. Aby ją utworzyć należy wykonać następujące kroki:

  1. Przechodzimy do usługi IAM
  2. Przechodzimy od zakładki „Roles” gdzie wybieramy opcję „Create new role”
  3. W pierwszym kroku wizarda przyporządkowujemy funkcję do usługi „AWS Lambda”
  4. W drugim kroku wizarda wybieramy uprawnienie. W celu uproszczenie całego procesu wybierzmy politykę o nazwie ‘AmazonEC2FullAccess’ (w rzeczywistości należało by stworzyć własną politykę z uprawnieniem jedynie do tagowania serwerów).
  5. Nazwimy nową rolę „TaggingLambdaRole”

Jeśli wszystko przebiegło pomyślnie, powinieneś otrzymać następujący widok:

Krok 2: Utworzenie funkcji Lambda

Kolejnym krokiem będzie utworzenie funkcji Lambda, której zadaniem będzie tagowanie nowo tworzonych serwerów. W tym celu przejdź do usługi Lambda i utwórz nową funkcję, skonfiguruj ją w następujący sposób:

  1. Pamiętaj o zweryfikowaniu regionu w którym tworzysz swoją funkcję.
  2. Nie konfiguruj żadnego triggera (wyzwalacza) funkcji
  3. Nazwij swoją funkcję „InstanceCreatorTagger”
  4. Środowisko: Python 2.7
  5. Rola funkcji: wybierz rolę, którą utworzyliśmy w kroku pierwszym („TaggingLambdaRole”)
  6. W ustawieniach zaawansowanych zwiększ limit czasu do 5 minut.
  7. W ramach kodu funkcji wpisz następujący skrypt:
import boto3

ec2 = boto3.client('ec2')

def lambda_handler(event, context):
    
    userType = event['detail']['userIdentity']['type']
    
    if userType == 'IAMUser':
        user = event['detail']['userIdentity']['userName']
    elif userType == 'Root':   
        user = "Root"
    elif userType == 'AssumedRole': 
        user = "Role (" + event['detail']['userIdentity']['sessionContext']['sessionIssuer']['userName'] + ")"
    else:
        user = "N/A"
        
    items = event['detail']['responseElements']['instancesSet']['items']
    
    for item in items:
        instanceId = item['instanceId']
        
        ec2.create_tags(
            Resources=[instanceId],
            Tags=[{
                'Key': 'Creator',
                'Value': user
            }]
        )
        
        print 'Tagging instance = ' + instanceId + ", with Creator tag (" + user + ")"
        
    return 'OK'

Ostatecznie cała konfiguracja powinna wyglądać następująco:

Krok 3: Konfiguracja usługi CloudWatch

Ostatnim krokiem, który musimy wykonać jest konfiguracja usługi CloudWatch. Wbrew powszechnej opinie, CloudWatch to nie tylko monitoring. W ramach tej usługi istnieje funkcjonalność ‘Events’ – która służy do ‘przechwytywania różnego rodzaju zdarzeń w ramach naszego konta chmurowego. W tym kroku skonfigurujemy CloudWatch aby przechwytywał zdarzenia o tworzeniu nowych serwerów wirtualnych a następnie wysyłał tę informację do funkcji Lambda, którą utworzyliśmy w poprzednim kroku. W tym celu:

  1. Przejdź do usług Amazon CloudWatch
  2. Z menu (po lewej stronie) wybierz funkcję „Events” a następnie „Create Rule”
  3. Pojawi się wizard, który należy uzupełnić następująco:
    • Service Name = EC2
    • Event Type = AWS API Call via CloudTrail
    • Specific operations = RunInstances
  4. W ramach wizarda dodajemy również tzw. ‘target’ – do którego będą wysyłane informacje o danym zdarzeniu. W naszym wypadku będzie to funkcja Lambdy o nazwie „InstaneCreatorTagger”

Po skonfigurowaniu całości powinniśmy otrzymać następujący widok

Po utworzeniu konfiguracji (będziemy również poproszeni o nadanie jej nazwy), całość będzie gotowa. Teraz za każdym razem, gdy ktoś utworzy nowy serwer zostanie on odpowiednio otagowany. Poniższy screen prezentuje listę serwerów na moim koncie po wykonaniu powyższych kroków i utworzeniu trzech serwerów przez różnych użytkowników (listę wyświetlanych kolumn można zmodyfikować wybierając koło zębate nad tabelą).

: CloudTrail, CloudWatch, IAM, Lambda, Roles
Tomasz Stachlewski
Architekt systemów IT na Polskę dla Amazon Web Services. Na co dzień doradza klientom w tworzeniu architektur systemów, które mają zostać zmigrowane lub utworzone w chmurze AWS i w pełni wykorzystywać możliwości jakie niesie ze sobą chmura. Doradza wielu wiodącym firmom (począwszy od startupów po korporacje) z różnych branż m.in. IT, telekomunikacja, finanse. Prowadzi szkolenia dla polskich i zagranicznych partnerów podczas których przekazuje w jaki sposób firmy powinny korzystać z chmury, jak powinna wyglądać ich droga z tradycyjnej infrastruktury do infrastruktury chmurowej, aby zmaksymalizować korzyści z tego płynące. Absolwent informatyki na Politechnice Łódzkiej oraz studiów podyplomowych z zarządzania projektami na SGH.

Related Articles

Jak przełączać się pomiędzy różnymi kontami AWS

20 kwietnia 2017Tomasz Stachlewski

Wprowadzenie do usługi Cognito User Pool w Amazon Web Services

24 marca 2017Robert Senktas

Wprowadzenie do AWS Cognito – konfiguracja środowiska programistycznego dla .NET

4 kwietnia 2017Robert Senktas

Najnowsze wpisy

  • Wiosenne porządki z AWS Glue cz.3 4 września 2018
  • Jak przyśpieszyć ładowanie zawartości stron WWW? 28 czerwca 2018
  • Wiosenne porządki z AWS Glue cz.2 22 czerwca 2018

Szkolenia AWS

  • Kursy wprowadzające
  • Dla Architektów
  • Dla Developerów
  • SysOps
  • DevOps
  • Big Data
  • Bezpieczeństwo

ACTION Centrum Edukacyjne

Znajdź nas na:

Facebook
LinkedIn
YouTube
RSS

Copyright by ACTION Centrum Edukacyjne Sp. z o.o.