Egy webes konzol előkészítése
Mi kell egy webes konzolnak, mielőtt az ISG brókerezheti — a célgép-előkészítés Web Access-párja. Magát a konzolt a legtöbb esetben nem kell módosítani: azt kell eldönteni, hogyan tudja meg, ki a felhasználó, és hol él a közös fiókjának a titka.
A hálózat
- A konzol portjának a brókerekről elérhetőnek kell lennie (minden bróker saját címéről, nem a közös címről).
- A böngésző a konzolt csak az ISG-n át éri el: ha a Web Access a helyén van, az adminok hálózatáról vezető
közvetlen út a konzol gépén lezárható. A szállított Ansible-lel a monitoring-gép és a levélgyűjtő ezt a saját
app-forrás- és admin-forrás-listáival teszi, például az
isg_monitoring_firewall_app_sourcesés azisg_monitoring_firewall_admin_sourceslistával (lásd alkalmazások beállítása). - Az alkalmazás nyilvános neve (
host) a brókerek közös címére oldódik fel, nem a konzolra.
Hogyan tudja meg a konzol, ki a felhasználó
| A konzol… | identity |
Mit kell előkészíteni |
|---|---|---|
| nem ismer saját felhasználókat (Prometheus, egy levélgyűjtő) | none |
semmit |
elfogad egy aláírt tokent egy fejlécben (a Grafana [auth.jwt]-je) |
jwt |
a konzol megbízik a listener nyilvános kulcsában; role_map a szerepköreihez |
| HTTP Basicet vagy egy fejlécben küldött API-kulcsot fogad (egy BMC Redfish API-ja) | credential, kind: basic vagy header |
egy közös fiók, a titka OpenBao-ban |
| űrlappal és munkamenet-sütivel léptet be (a legtöbb webes GUI) | credential, kind: form |
egy közös fiók, a titka OpenBao-ban, és a belépési recept |
Aláírt tokent elfogadó konzol
Példaként a Grafana, a konfigurációs fájljában (vagy a megfelelő környezeti változókkal):
[auth.jwt]
enabled = true
header_name = X-ISG-Assertion
jwk_set_url = https://grafana.apps.example.internal:8444/.well-known/isg/jwks.json
expect_claims = {"aud": "grafana", "iss": "isg"}
username_claim = sub
email_claim = email
role_attribute_path = role
A szállított Ansible ezt a csomagolt Grafanának beállítja, az URL helyett jwk_set_file-lal (a config-forrás
JWKS-fájljával), így a Grafana sem a brókerektől, sem a névfeloldástól nem függ. A reserved_usernames-t hagyd úgy,
ahogy van: a token sub-ja a konzol azonos nevű helyi fiókjára kerül.
Egy közös fiók
A fiókot a konzolon a konzol saját adminisztrátora hozza létre, azokkal a jogokkal, amik az adott credentials
elem felhasználóinak járnak — csak olvasó fiók egy csak olvasó csoportnak, adminisztrátori fiók az
adminisztrátoroknak. A titka OpenBao-ba kerül, az operátor írja; az ISG csak olvassa:
bao kv put secret/isg/apps/<app name>/<account name> username=<account> password=<password>
bao kv put secret/isg/apps/<app name>/<account name> value=<api key>
Az út <kv_mount>/data/<prefix>/<app>/<name>; a brókerek OpenBao-tokenjének olvasási jog kell erre a prefixre (az
isg_bao_init role bróker-policyja ezt adja). Egy brókeren az isg system check megmondja, minden fiók olvasható-e:
a Web Access credentials sor. Egy második faktorral védett űrlapos belépéshez add hozzá a totp_secret-et (a
base32 seedet), és használd a {{totp}}-t a receptben.
Egy űrlapos belépési recept
A recept azt ismétli meg, amit a konzol saját belépő oldala tesz. Így írhatsz egyet:
- Nyisd meg közvetlenül a konzol belépő oldalát, a böngésző fejlesztői eszközeiben a Network fülön, és lépj be.
- Keresd meg a kérést, ami a felhasználónevet és a jelszót viszi: a metódusát, az útvonalát, és hogy a törzse űrlap
(
encoding: form) vagy JSON (encoding: json). Ha az oldal előbb egy tokent tölt (egy CSRF-mezőt a HTML-ben, egy fejlécet, egy sütit), tegyél elé egyGETlépést egyextractszabállyal (from: body,header:<Name>vagycookie:<name>, és egy RE2regexegy rögzítő csoporttal), és használd{{token.<name>}}-ként. - Siker: hogyan néz ki a válasz a belépésre — a státusza, a munkamenet-süti, amit beállít, vagy hová irányít. Legalább egyet nevezz meg.
- Kiléptetve: hogyan néz ki egy válasz, ha a konzol munkamenete véget ért — többnyire egy 401 az API-jától, vagy
egy átirányítás a belépő oldalra. Ha a konzol olyasmire is 401-et ad, ami nem kiléptetés (egy token-forgatás,
amit a saját szkriptje intéz), nevezd meg a válasz törzsének egy szövegét az
unless_body_contains-ban. - Azok a sütik, amiket az oldal szkriptjének magának kell olvasnia (egy fejlécbe tükrözött CSRF-süti), a
browser_cookies-ba kerülnek; minden más süti a brókernél marad.
Valódi konzolokon látott viselkedések
- Egy kérés eredete (Grafana). A Grafana elutasítja a sütivel hitelesített API-hívást, ha az
Origin-je nem a saját címe („origin not allowed”, 403). Az ISG egykind: formalkalmazásnál azOrigin-t és aReferer-t az upstream címére írja, ha azok az alkalmazás nyilvános címe, így a Grafanának nem kellcsrf_trusted_origins(Grafana 13-on mérve). Egy idegen origin továbbra is változatlanul megy fel. - Token-forgatás (Grafana). Kb. 10 percenként a Grafana a saját front-endjének 401-gyel válaszol, egy olyan
törzzsel, ami azt mondja: „session.token.rotate”; a front-end ezután maga forgatja a tokent. Ha ez a szöveg a
logged_outunless_body_contains-ában áll (mint a példában az alkalmazások beállítása lapon), az ISG ezeket a válaszokat továbbadja a böngészőnek, és nem lép be újra — enélkül az ISG újra belép, és egy épp úton lévő módosító kérés a 409-es oldalt kapja. - Az oldalban tartott token (egyes BMC-k webes felülete). Egy konzol, amelynek a szkriptje egy válasz-törzsben
kapja a munkamenet-tokenjét, és az oldal tárában tartja, űrlap-recepttel nem brókerezhető: a bróker sosem látja a
token használatát. Az API-ja Basic hitelesítéssel (
kind: basic) általában igen. - A konzol saját kilépés-gombja. Tedd az útvonalát a
logout_paths-ba, hogy megnyomása az ISG alkalmazás-munkamenetét zárja le, ne a konzol saját belépő oldalát mutassa.