Azure keyvault secret elérése Azure function app-ból
Ugyan régi megoldás, de még mindig rendszeresen előkerül, így gyorsan le is írom, hogy hogyan lehet Azure function app-ból elérni az Azure keyvault-ban tárolt secret-eket. A megoldás lényege, hogy a function app-ban bekapcsoljuk a Managed Identity-t és a keyvault-ban, a function app-ban létrehozott identity-t hozzáadjuk a keyvault access policy-jéhez. Természetesen működik private endpoint-os keyvault-al is, de ebben az esetben a Function app-nak vnet integráltnak kell lennie és persze a DNS feloldásra is ügyeljünk, viszont most a legegyszerűbb megoldást mutatom be.
Előfeltételek
Az egyszerűbb részeket már kihagyom, hiszen az előző leírásaimban már sok ilyet hoztunk létre, de azért a leglényegesebbeket leírom. Ami kell:
- Azure előfizetés
- Magas jogosultság az Azure-ban (pl.: Owner)
- Azure function app (Consumption plan-t a próba alatt nem javaslom, mert ott nem elérhető az SSH fukció)
- Azure keyvault
Function app Managed Identity bekapcsolása
Első lépésként a function app-ban a Settings > Identity menüpontban kapcsoljuk be a Managed Identity-t. Két lehetőségünk van itt kapásból, system és user assign managed identity. A system assign managed identity az a function app-hoz létrehozott identity, a user pedig egy külön identity, amit külön tudunk létrehozni. A legfontosabb itt az életút és a felhasználás. Systemnél a function-nal együtt létezik és ha töröljük ezt az erőforrást, az Identity is eltűnik vele. A User-nél ezek külön utakat járnak. Ebben az esetben a system identity-t használjuk, majd ezt az identity-t fogjuk hozzáadni a keyvault access policy-hez. De ne siessünk ennyire előre.
Nyissuk meg a function-t és az Identity menüpontban kapcsoljuk be a system identity-t.
Bekapcsolás után a function app-ban létrejön egy új identity. Másoljuk ki az Object ID-jét, mert ezt kell majd a keyvault access policy-hoz hozzáadni.
Következik a KeyVault
Keyvault
A KeyVault-ban két féle access policy-t tudunk használni, az egyik a vault access policy, a másik pedig az RBAC. Ebben a leírásban a vault access policy-t használom.
Adjunk hozzáférést akkor a function app-nak a keyvault-hoz.
Elegendő a Secret Get és List jogosultság, de ha szeretnénk, akkor a Secret Set jogosultságot is megadhatjuk akár, így a function app-ból is tudunk secret-et létrehozni a keyvault-ban.
A jogosultság hozzáadása kész is, most jöhet maga a secret. A keyvault-ban a Secrets menüpontban hozzunk létre egy új secret-et.
Ezzel kész is vagyunk. Van jogoosultságunk a function app-hoz és van secret is a keyvault-ban. Most jöhet a function app-ban a kód, de előtte még egy fontos dolog. Ha nem ilyen erőforráson keresztül akarunk hozzáférni, hanem az adott nyelven akarunk bekérdezni, akkor előre generált példa kódok itt érhetőek el.
Na de térjünk vissza a function app-hoz.
Function app
Configuration alatt adjuk hozzá a keyvault-ban létrehozott secret-et.
Name mezőbe a secret nevét, Value mezőbe pedig a secret URI-jét kell beírni. A secret URI-t a keyvault-ban a secret részleteiben találjuk meg.
1
@Microsoft.KeyVault(VaultName=gudszentkeyvault;SecretName=testkey)
A VaultName a keyvault neve, a SecretName pedig a secret neve.
Mentés után pedig valami ilyesmit kell látnunk.
1-2 oldal frissítés után ki is fog zöldülni a secret sora.
Teszt
Nézzük is meg, hogyan érhető el az adott secret a function app-ból. Részemről egy python function-t használtam, tehát SSH-n keresztül beléptem a function app-ba és a python shell-ben megnéztem, hogy elérhető-e a secret. Egyszerűen csak írassuk ki a helyi változót, amin keresztül elérjük a secret-et.
Konklúzió
Ez egy beépített megoldás, ami nagyon jól működik. A function app-ban létrehozott identity-t hozzáadjuk a keyvault access policy-jéhez, és már is elérhető a secret. Nem kell technikai felhasználó, hogy elérjuk a secret-et és ha több app-ból is ugyanazt a secret-et akarjuk használni, akkor akár használhatjuk a user assign managed identity-t is, így nem kell minden app-hoz külön identity-t létrehozni és elég egy helyen változtatni a secret-et is.