Hogyan automatizáljuk könnyedén az SSL telepítést Lego és Kubernetes segítségével
Automatizáld az SSL tanúsítványok kezelését zökkenőmentesen a Lego és a Kubernetes segítségével. Ismerd meg a hatékony telepítési gyakorlatokat…
Manuális SSL tanúsítvány megújítás kihívásai a Kubernetes-ben Let's Encrypttel
Az egyik partnerünk egy hatalmas rendszert futtat Kubernetes-ben. A Let's Encrypt-et használva adtunk ki SSL tanúsítványokat. Ezek a tanúsítványok 90 napig érvényesek, utána meg kell őket újítani és újat kiadni. Ezek a tanúsítványok a front-end alkalmazásokhoz voltak csatolva a Kubernetes Secrets-be. Mivel ezek a tanúsítványok manuálisan lettek kiadva, előfordulhatott, hogy lejártak, mivel a kibocsátó elfelejtette újra kiadni őket.
A Kubernetes titkainkat a gitlab tárolja. 'Sops' titkosítja ezeket a titkokat. Ez a tároló tartalmazta az aktuális tanúsítványokat, és ha új tanúsítványt adtak ki, de a kibocsátó elfelejtette azokat lecserélni a klaszter titkában, miközben a GitLab tárolóban nem tette meg, akkor a régi tanúsítvány felülírta volna az újat, amikor a titkokat a tárolóból bevetették. Ennek eredményeként a weboldalak megbízhatatlanná váltak és SSLHandshakeError-okat kezdtek el dobni. Ez nem az, amit szeretnénk.
Tanúsítvány műveletek egyszerűsítése: automatizálás és rugalmasság elérése Kubernetes-ben
Olyan megoldást szerettünk volna találni, ami automatikusan kiadja, kezeli és megújítja a tanúsítványokat, hogy elkerüljük a fent említett problémákat. Egyszerűen tudtunk új domaineket hozzáadni a hozzájuk tartozó tanúsítványok kezelésére, az automatizmus mellett.
A megoldás
A megoldás fő eleme a Lego. Ez egy Let's Encrypt kliens és ACME könyvtár Go nyelven írva.
Legot használjuk Job-ként (tanúsítványok létrehozásához) és Cronjob-ként (a tanúsítványok megújításához) a Google GKE klaszterünkben. Tartós tárakat (Persistent Volumes) használunk, hogy a tanúsítványokat a szükséges Podokhoz csatoljuk. A tanúsítványok megszerzéséhez DNS szolgáltatót használunk. A Lego széles körben kompatibilis sok DNS szolgáltatóval. A munkafolyamat az, hogy ha új tanúsítványt vagy wildcard tanúsítványt kell kezelnünk, akkor először meghatározunk egy Kubernetes Job-ot, hogy a Lego futás parancssal létrehozza a tanúsítványt. A Lego DNS-01 kihívást old meg az adott szolgáltatóval. Ha pozitív eredmény születik, akkor a Lego létrehozza a tanúsítványt. Ezután csak meg kell adnunk egy Kubernetes Cronjob-ot a megújítási parancssal, hogy időszakosan ellenőrizze a tanúsítvány lejártát.
Az implementáció
Az implementáció a következő volt:
Először létre kell hozni egy Tartós Tárat (Persistent Volume) és egy Tartós Tár Igényt (Persistent Volume Claim), hogy jelezzük Legonak, hova helyezze el a tanúsítványokat.
Ezek után alkalmazzuk a PV-t és a PVC-t kubectl-lel.
Ha ezek készen vannak, akkor megírhatjuk a Feladatot (Job).
ttlSecondsAfterFinished: A Feladat befejezését követően 120 másodperc múlva törlésre kerül.
<LEGO_VERSION>: A Lego verzió, amit használni szeretnél a Legóval
Környezet (Env): A környezet részben egy titkot használunk, amit a klaszterre telepítettünk, amely tartalmazza a szükséges adatokat ahhoz, hogy a Lego kommunikálni tudjon a DNS szolgáltatóval. DNSMadeEasy-t használunk, de más szolgáltatók más adatokat igényelhetnek ahhoz, hogy API-jukkal kommunikálhassanak.
argumentumok: — accept-tos: Az aktuális Let's Encrypt szolgáltatási feltételek elfogadását jelző kapcsoló. (alapértelmezett: false) — domainek: A tanúsítványhoz szükséges domain. Több domain esetén csak meg kell adnod egy –domains argumentumot minden domainhez. Itt használhatsz wildcard tanúsítványt is. — e-mail: Az e-mail, amelyet a regisztrációhoz és a helyreállításhoz használnak a Let's Encryptnél. — elérési út: A tárolási könyvtár (alapértelmezett: “./.lego”). Ez **/lego **mivel a PV-t ebbe az útba csatoltuk a konténeren belül. — dns: Az általad használt DNS szolgáltató.
futtatás: Fiók regisztrálása, majd tanúsítvány létrehozása és telepítése.
A tanúsítvány megújítására szolgáló Cronjob hasonló a Feladathoz
Ütemezés (Schedule): Egy cron ütemezés. A feladatot minden hétfőn 7:01-kor futtatjuk.
Argumentumok: — megújítás (renew): Tanúsítvány megújítása. A Let's Encrypt tanúsítványok 90 napig érvényesek. Akkor újítja meg a tanúsítványt, ha az kevesebb mint 30 nap múlva lejár.
A Cronjob alkalmazása után is meg kell győződnünk arról, hogy szolgáltatásaink ezeket a tanúsítványokat használják. Ennek eredményeként, ha sandbox API kulcsot és titkot használtam, nem működött, ezért ha ezt a megoldást valósítod meg, valódi hitelesítő adatokat kell használnod.
Következtetés
Ennek a megoldásnak a használatával automatikusan létrehozhatjuk és karbantarthatjuk az SSL tanúsítványokat. A jövőben nem lesznek problémák a lejárt tanúsítványok miatt. A Lego nagyon könnyen használható és széles körben támogatja a DNS szolgáltatókat.
Szerző: Csaba Ujvári