Kihagyás

Tanúsítvány alapú elérés

Amennyiben szeretnénk limitálni, hogy ki érheti el az AWS környezetet (pl.: projekt csapattagok, ügyfél alkalmazottjai stb.), akkor ezt megtehetjük oly módon, hogy az EC2 Instance security groupjában definiáljuk azokat az IP címeket amelyekről elérhető a környezet.

Ez nehézkes, ráadásul a dinamikus IP címek miatt sok esetben csak rövidtávú megoldás.

Egy másik megoldás, hogy egy tanúsítvány birtokában tudják elérni a megfelelő személyek a környezetet.

Ezzel a megoldással a megfelelő embereknek elegendő a böngészőjükbe importálni egy tanúsítványt és ennek birtokában elérhető lesz számukra a környezet. A tanúsítvány hiányában azonban a nagyvilág számára továbbra is elérhetetlen lesz a környezetünk.

1. Portok kinyítása az Instance-on

Amennyiben nem úgy hoztuk létre a VM-et, hogy automatikusan kinyitottuk mindenki számára a 80-as és 443-as portokat akkor ahhoz, hogy a tanúsítvány alapú elérés működjön először ezt kell megtennünk.

  1. Jelentkezzünk be Amazonra és a baloldali menüsorban az Instances szekcióban válasszuk ki az Instances menüpontot.
  2. A megjelenő listából keressük ki az instance-unkat, majd kattintsunk az Instance ID-ra:

    InstancesList

  3. A megnyíló képernyőn alul válasszuk ki a Security fület és a Security groups szekcióban kattintsunk a security group ID-jára.

    SecurityGroups

  4. A megnyíló képernyőn az Inbound rules doboz jobb felső sarkában kattintsunk az Edit inbound rules gombra.

    InboundRules

  5. Az így megnyíló Edit inbound rules képernyőn az Add rule gomb megnyomásával adjuk hozzá az alábbi szabályokat.

    1. 443-as port kinyitása mindenkinek:
      • Type: HTTPS
      • Protocol: TCP
      • Port range: 443
      • Source: Anywhere-IPv4
      • Description: tetszőleges szöveg
    2. 80-as port kinyitása mindenkinek:
      • Type: HTTP
      • Protocol: TCP
      • Port range: 80
      • Source: Anywhere-IPv4
      • Description: tetszőleges szöveg
  6. Végül a jobb alsó sarokban található Save rules gomb megnyomásával mentsük el a módosításainkat.

2. Tanúsítvány generálása

  1. SSH-n keresztül lépjünk be a VM-re.
  2. Az alábbi lépéseket a root felhasználóval végezzük.
  3. Lépjünk be az /etc/haproxy könyvtárba az alábbi paranccsal:

    cd /etc/haproxy
    
  4. Amennyiben még nem létezik, hozzuk létre a certs mappát az /etc/haproxy mappába:

    mkdir certs
    
  5. Lépjünk be az újonnan létrehozott certs könyvtárba:

    cd certs
    
  6. Az alábbi parancsokkal generáljuk le a ca.key-t:

    openssl genrsa -des3 -out ca.key 4096
    
    1. Az Enter PEM pass phrase: promptnál adjunk meg jelszót.
    2. Az Verifying - Enter PEM pass phrase: promptnál adjuk meg újra az előző jelszót.
  7. Az alábbi paranccsal állítsuk elő a ca.crt fájlt:

    openssl req -new -x509 -days 3650 -key ca.key -out ca.crt
    
    1. Az Enter pass phrase for ca.key: promptnál adjuk meg a ca.key-hez létrehozásnál megadott jelszót.
    2. Az Country Name (2 letter code) [AU]: promptnál adjuk meg hogy HU.
    3. Az State or Province Name (full name) [Some-State]: promptnál adjuk meg hogy Pest.
    4. Az Locality Name (eg, city) []: promptnál adjuk meg hogy Budapest.
    5. Az Organization Name (eg, company) [Internet Widgits Pty Ltd]: promptnál adjuk meg hogy Intuitech.
    6. Az Organizational Unit Name (eg, section) []: promptnál adjuk meg a projekt nevét. Pl.: Semi Product.
    7. A Common Name (e.g. server FQDN or YOUR name) []: promptnál adjuk meg a projekt domain nevét: ${projekt}.${ügyfél}.${környezet}.dev.gbsolutions.io. (Pl.: semiproduct.intuitech.develop.dev.gbsolutions.io.)
    8. Az Email Address []: promptnál adjuk meg a projekt mail group-ját: semiproduct@gbsolutions.io
  8. Generáljuk le a client.key-t az alábbi paranccsal:

    openssl genrsa -des3 -out client.key 4096
    
    1. Az Enter PEM pass phrase: promptnál adjunk meg jelszót.
    2. Az Verifying - Enter PEM pass phrase: promptnál adjuk meg újra az előző jelszót.
  9. Generáljuk le a client.csr-t az alábbi paranccsal:

    openssl req -new -key client.key -out client.csr
    
    1. Az Country Name (2 letter code) [AU]: promptnál adjuk meg hogy HU.
    2. Az State or Province Name (full name) [Some-State]: promptnál adjuk meg hogy Pest.
    3. Az Locality Name (eg, city) []: promptnál adjuk meg hogy Budapest.
    4. Az Organization Name (eg, company) [Internet Widgits Pty Ltd]: promptnál adjuk meg hogy Intuitech.
    5. Az Organizational Unit Name (eg, section) []: promptnál adjuk meg a projekt nevét. Pl.: Semi Product.
    6. A Common Name (e.g. server FQDN or YOUR name) []: promptnál adjuk meg a projekt domain nevét: ${projekt}.${ügyfél}.${környezet}.dev.gbsolutions.io. (Pl.: semiproduct.intuitech.develop.dev.gbsolutions.io.)
    7. Az Email Address []: promptnál adjuk meg a projekt mail group-ját: semiproduct@gbsolutions.io

    8. Az A challenge password []: promptnál csak üssünk Enter -t.

    9. Az An optional company name []: promptnál csak üssünk Enter -t.
  10. Generáljuk le a client.crt fájlt az alábbi paranccsal:

    openssl x509 -req -days 3650 -in client.csr -CA ca.crt -CAkey ca.key -set_serial 01 -out client.crt
    

    1. Az Enter pass phrase for ca.key: promptnál írjuk be a ca.key létrehozásnál megadott jelszót.
  11. Generáljuk le a kliensoldali tanúsítványt (client_certificate.pfx) az alábbi paranccsal:

    openssl pkcs12 -export -legacy -out client_certificate.pfx -inkey client.key -in client.crt -certfile ca.crt
    
    1. Az Enter pass phrase for client.key: promptnál adjuk meg a client.key létrehozásnál megadott jelszót.
    2. Az Enter Export Password: promptnál adjuk meg a kliensoldali tanúsítvány jelszavát. Ez lesz az a jelszó, amit a felhasználóknak meg kell adni, amikor importálják a kliensoldali tanúsítványt a böngészőjükbe.
    3. A Verifying - Enter Export Password: promptnál adjuk meg újra a kliensoldali tanúsítvány jelszavát.

3. Tanúsítvány konfigurálása a HAProxyban

  1. Nyissuk meg az /etc/haproxy mappában található haproxy.cfg fájlt és bővítsük ki a bind sort:

    bind *:443 ssl crt /etc/ssl/${projekt}.${ügyfél}.${környezet}.dev.gbsolutions.io/${projekt}.${ügyfél}.${környezet}.dev.gbsolutions.io.pem
    

    az alábbi konfigurációval:

    ca-file /etc/haproxy/certs/ca.crt verify optional crt-ignore-err all
    

    Az így módosítótt bind sornak így kell kinéznie:

    bind *:443 ssl crt /etc/ssl/${projekt}.${ügyfél}.${környezet}.dev.gbsolutions.io/${projekt}.${ügyfél}.${környezet}.dev.gbsolutions.io.pem ca-file /etc/haproxy/certs/ca.crt verify optional crt-ignore-err all
    

    • A ${projekt} placeholder helyére a domain létrehozásakor megadott projekt azonosítót kell behelyettesíteni.
    • Az ${ügyfél} placeholder helyére az ügyfél nevét kell behelyettesíteni (Pl.: granit-bank, erste, vodafone).
    • A ${környezet} placeholder helyére a domain létrehozásakor megadott környezet azonosítót kell behelyettesíteni.
  2. Adjuk hozzá a megfelelő use_backend szabályokhoz az { ssl_c_used } feltételt.

    Bizonyos szervizek esetén nem szeretnénk a kliens cert alapú elérést, pl.: Keycloak és Teams Bot. Emiatt a HAProxy configban definiálnunk kell, hogy mely esetbek várjuk el kötelezően a kliensoldali tanúsítványt. Ezt a use_backend szabályoknál tudunk megtenni a { ssl_c_used } feltétel hozzáadásával.

    Példa

    Például, ha a Teams Bot kivételével minden más alkalmazás/szolgáltatás esetén elvárjuk a kliensoldali tanúsítványt, akkor a use_backend szabályoknak az alábbi módon kell kinéznie:

    use_backend bot if host_bot
    use_backend backend-service if is-backend { ssl_c_used }
    use_backend client-spa if host_client { ssl_c_used }
    use_backend admin-spa if host_admin { ssl_c_used }
    use_backend partner-spa if host_partner { ssl_c_used }
    use_backend wiki if host_wiki { ssl_c_used }
    use_backend maildev if host_maildev { ssl_c_used }
    use_backend keycloak if host_keycloak
    
  3. Végül az alábbi paranccsal frissítsük a HAProxy-t hogy érvényre lépjen az új konfiguráció:

    service haproxy reload
    

4. Tanúsítvány letöltése

A client_certificate.pfx fájlt az alábbi lépésekkel tudjuk a saját számítógépünkre letölteni:

Az alábbi parancsokat az AWS DEV gépen, root felhasználóként kell végrehajtani.

cp /etc/haproxy/certs/client_certificate.pfx /home/${user}/
cd /home/${user}/
chown ${user}:${user} client_certificate.pfx

Az alábbi parancsokat számítógépünk termináljából kell kiadni.

scp -i /Users/${user-folder}/.ssh/id_ed25519 ${user}@${ip}:/home/${user}/client_certificate.pfx /Users/${user-folder}/${target-folder}
  • A ${user} placeholder helyére értelemszerűen az AWS DEV EC2 instance-on létrehozott felhasználónk nevét kell behelyettesíteni.
  • Az ${ip} placeholder helyére az AWS DEV EC2 instance IPv4-es címét kell behelyettesíteni.
  • A ${user-folder} placeholder helyére a számítógépünk felhasználójának mappáját kell megadni.
  • A ${target-folder} annak a mappának az útvonalát kell megadni, ahová szeretnénk letölteni a client_certificate.pfx fájlt. (Ennek a mappának léteznie kell, hogy sikeres legyen a letöltés)

5. Tanúsítvány betöltése a böngészőbe

Az erre felhatalmazott személyeknek a tanúsítvány generálása során előállt client_certificate.pfx fájlt kell átadnunk és ezt kell nekik is a személyes tanúsítványtárukhoz hozzáadniuk.

A tanúsítvány importálásának lépéseiről részletesen itt olvashatsz. Értelemszerűen a linkelt oldalon a projekt tanúsítványával (és nem a Semi Product tanúsítványával) kell elvégezni a lépéseket.