Alkalmazások beállítása

Egy alkalmazás egy apps.yaml-bejegyzéssel kerül az ISG-belépés mögé minden brókeren, vagy — dinamikus alkalmazás-domain mellett — egy adminisztrátor veszi fel a webUI-n. Ez a lap mindkét utat leírja, a három módot, ahogy egy alkalmazás megtudja, ki a felhasználó, és hogy mit kell az ügyfél oldalán biztosítani. A teljes kulcslista a konfigurációs referenciában áll; a forrásfa apps.example.yaml fájlja minden kulcsot kommenttel hordoz.

Hiányzó apps.yaml mellett a Web Access ki van kapcsolva, és a démon úgy indul, mint eddig. Egy meglévő, de be nem töltő apps.yaml mellett a démon nem indul el, és a hiba megnevezi a fájlt és a mezőt; az isg system check ugyanazt a betöltőt futtatja (az apps.yaml sor). A Web Access-hez a webUI jelszavas belépése kell egy identitás-forrással szemben: anélkül a démon ezzel a fájllal nem indul.

A szállított Ansible-lel

A kapcsoló a környezet változói közt az isg_cfg_apps: alkalmazásonként egy bejegyzés, az apps.example.yaml mezőivel. Üresen a Web Access ki van kapcsolva, és nem íródik apps.yaml. Minden bejegyzéshez egy APP-2026-000001 alakú id kell, egyedi, és soha nem adható másik alkalmazásnak: a jóváhagyások, a munkamenetek, a zárak, a ticketek és az auditnapló (app_id) mind ezzel hivatkoznak az alkalmazásra, a name pedig a technikai név marad (a JWT audience és az OpenBao-út). Beállítva egy futás ezt teszi:

Egy alkalmazás változása konfiguráció-változás: a config-src.yml megírja az új apps.yaml-t, és a gördülő frissítés viszi ki brókerenként. Önmagában a bináris cseréje nem.

A listener és a tanúsítványa

Kulcs Mi az
listen A TLS-listener címe, minden alkalmazáshoz
tls_cert_file, tls_key_file A listener lánca és kulcsa (a kulcs 0600 vagy 0400); a levélnek minden host-ot le kell fednie
webui_url A webUI címe: ide küldi a proxy a böngészőt belépni, és ide tér vissza kilépéskor
idle_timeout_seconds, max_duration_seconds Az alkalmazás-munkamenet tétlenségi (1800 s) és abszolút határa (28800 s), a webUI-étól függetlenül
reserved_usernames Nevek, amik sosem érnek el egy alkalmazást (alapból admin, root, administrator)
credential_kv_prefix Hol élnek a közös fiókok OpenBao-ban (alapból isg/apps)
dynamic_apps_domain A webUI-n felvett alkalmazások domainje; üres = nincs

Amit az ISG nem végez el helyetted: a DNS. Minden alkalmazás-hosztnévnek a brókerek közös címére kell feloldódnia, és a webUI-jal azonos site-on kell lennie — a webUI munkamenet-sütije SameSite=Strict. A kliens az alkalmazások tanúsítványában ugyanúgy bízik, mint a webUI-éban.

Egy alkalmazás

- id: APP-2026-000002
  name: prometheus
  display_name: Prometheus
  host: prometheus.apps.example.internal
  upstream: http://monitor1.example.internal:9090
  identity: none
  allow_groups: [sysadmins]

Mit tud meg az alkalmazás a felhasználóról

identity: none

Az ISG kapuz és auditál; az alkalmazás semmit nem tud meg. Saját felhasználó-fogalom nélküli konzolhoz (Prometheus, egy levélgyűjtő), vagy olyanhoz, aminek egyetlen közös nézet is megfelel.

identity: jwt

Minden kérés egy friss assertiont visz az assertion_header-ben (alapból X-ISG-Assertion), ES256-tal aláírva (assertion_key_file, egy ECDSA P-256 kulcs): sub, email, name, groups, aud (az audience, alapból a name), iss (az assertion_issuer, alapból isg), és a role a role_map-ből (az első egyező csoport nyer), különben a default_role. assertion_ttl_seconds ideig érvényes (alapból 60, 10–300). A nyilvános kulcs minden alkalmazás-hoszton a /.well-known/isg/jwks.json címen van. Az alkalmazás a sub-ot a saját, azonos nevű helyi fiókjára képezi — ezért vannak a tiltott nevek: a Grafanán mérve a sub: admin a beépített szuperadmin lett.

identity: credential

Az ISG egy közös fiók titkát teszi a kérésbe; a felhasználó sosem látja, és a saját neve az ISG auditjában és transcriptjében marad (account). A credentials lista: az első olyan elem kerül használatba, amelynek groups-a metszi a felhasználó csoportjait, és ha egyik sem, a válasz 403 — csendes alapértelmezett fiók nincs. A titkot az ISG OpenBao-ból olvassa a <kv_mount>/data/<prefix>/<app>/<name> úton, ahol a <prefix> a credential_kv_prefix, ezért egy ilyen alkalmazás mellett a vault.yaml kötelező. Ha nem olvasható, a kérés nem megy fel (503).

kind Mi megy fel OpenBao-mezők
basic Authorization: Basic username, password
header a bejegyzésen megnevezett header (pl. X-Api-Key) value
form egy olyan fiók upstream munkamenet-sütijei, amivel az ISG maga lépett be username, password, opcionális totp_secret

A böngésző saját Authorization fejléce és a megnevezett fejlécek minden kérésből törlődnek, és az upstream WWW-Authenticate válaszfejléce is, így a böngésző sosem nyit saját jelszó-ablakot.

Űrlappal belépő konzol (kind: form)

A fiók form receptje a konzol saját belépése, lépésről lépésre: steps (egy GET csak tokent nyer ki; legalább egy POST; encoding: form vagy json; a mezők értéke literál vagy {{username}}, {{password}}, {{totp}}, {{token.<name>}}), success (a megadott status, cookie, redirect_prefix mindegyikének teljesülnie kell az utolsó lépés válaszán) és logged_out (mikor jelenti egy válasz, hogy az upstream munkamenet véget ért: status, vagy egy 3xx, amelynek a Location-je redirect_prefix-szel kezdődik).

credentials:
  - name: admin
    groups: [sysadmins]
    kind: form
    form:
      steps:
        - method: POST
          path: /login
          encoding: json
          fields: {user: '{{username}}', password: '{{password}}'}
      success: {status: [200], cookie: grafana_session}
      logged_out:
        status: [401]
        redirect_prefix: /login
        unless_body_contains: [session.token.rotate]

A webUI-n felvett alkalmazások

Ha az apps.yaml-ben a dynamic_apps_domain be van állítva, egy adminisztrátor a webUI Appok kezelése oldalán (/apps/manage) vesz fel, módosít és töröl alkalmazásokat a fájlbeliek mellett; minden bróker kb. 5 s alatt, újraindítás nélkül kiszolgálja a változást. Minden ilyen alkalmazás hosztja egy címke e domain alatt, ezért két dolog egyszeri beállítás az ügyfél oldalán: a listener tanúsítványának wildcard SAN kell a domainre (csillag-pont-domain; az apps.yaml betöltésekor ellenőrizzük, a hiánya megtagadja az indulást), és egy wildcard DNS-rekordnak kell a domaint a brókerek közös címére mutatnia. A fájlbeli alkalmazások úgy maradnak, ahogy vannak, és a webUI-n nem szerkeszthetők. Ansible-lel a domain az isg_cfg_apps_dynamic_domain; ha a role adja ki az alkalmazás-tanúsítványt, a wildcard SAN-t maga hozzáadja. Az ISG minden ilyen alkalmazás azonosítóját a rekord-tár sorszámából adja; egy törlés és azonos néven újrafelvétel új alkalmazás, így a régi jóváhagyásai közül egy sem száll át. Egy dinamikus alkalmazás nem kapcsolhatja be a record_body-t.