Hatókörök
Mit tehet egy kulcs.
A szókészlet
Zárt halmaz, resource:action formában. Elég kicsi ahhoz, hogy egy embernek jelölőnégyzet-listán megmutassuk, és elég stabil ahhoz, hogy egy tárolt hozzáférés egy év múlva is ugyanazt jelentse. Ugyanebben a szókészletben íródnak a munkaterületi SZEREPKÖRÖK, és ez szabályozza az MCP eszközöket is, így egy csak olvasási jogú kliens egy küldő eszközt még látni sem lát. Egy ábécé, három felület.
| Hatókör | Mit enged |
|---|---|
| emails:send | E-mail küldése |
| emails:read | Elküldött üzenetek és kézbesítési állapotuk olvasása |
| drafts:read | Piszkozatok olvasása |
| drafts:write | Piszkozatok létrehozása és szerkesztése |
| threads:read | Beszélgetések és üzenetek olvasása |
| threads:write | Beszélgetések címkézése, olvasottá tétele és archiválása |
| labels:read | Címkék olvasása |
| labels:write | Címkék létrehozása és szerkesztése |
| contacts:read | Névjegyek olvasása |
| contacts:write | Névjegyek hozzáadása, szerkesztése és eltávolítása |
| audiences:read | Közönségek olvasása, és hogy kik tartoznak hozzájuk |
| audiences:write | Közönségek létrehozása és szerkesztése, valamint tagságuk módosítása |
| calendar:read | Naptáresemények és meghívók olvasása |
| calendar:write | Naptáresemények létrehozása, módosítása és megválaszolása |
| templates:read | E-mail sablonok olvasása és előnézete |
| templates:write | E-mail sablonok létrehozása, szerkesztése és küldése |
| domains:read | Domainek és DNS állapotuk olvasása |
| domains:write | Domainek ellenőrzése és konfigurálása |
| webhooks:read | Webhook végpontok és kézbesítések olvasása |
| webhooks:write | Webhookok létrehozása, szerkesztése és tesztelése |
| rules:read | Levelezési szabályok olvasása és tesztelése |
| rules:write | Levelezési szabályok létrehozása, szerkesztése és átrendezése |
| connections:read | Annak olvasása, mely postafiókok vannak csatlakoztatva |
| members:read | Annak megtekintése, kik vannak a munkaterületen, és mivel rendelkeznek |
| members:write | Emberek hozzáadása és eltávolítása, és annak módosítása, mit érhetnek el |
| roles:read | A munkaterület által meghatározott szerepkörök olvasása |
| roles:write | Szerepkörök létrehozása, szerkesztése és törlése |
| settings:read | Postafiók-beállítások olvasása, az aláírást is beleértve |
| settings:write | Postafiók-beállítások és az aláírás módosítása |
| keys:write | A saját titkos kulcsának cseréje anélkül, hogy bárki megnyitná a konzolt |
A megfontolt hatókörlista nélkül létrehozott kulcs az emails:send jogot kapja meg, és semmi mást. Egy hitelesítő adat biztonságos alapértelmezése a legszűkebb olyan jogkör, amely még hasznossá teszi.
A kulcsot a mögötte álló szerepkör korlátozza
Egy kulcs kiadható egy SZEREPKÖRRE, és a szerepkör nem második jogosultságcsomag, hanem felső korlát. Amit a kulcs ténylegesen megtehet, az a saját hatóköreinek és az adott szerepkör jogosultságainak a METSZETE (key.scopes ∩ role.permissions), amelyet a rendszer minden kérésnél egyszer, a határon, még bármelyik végpont elérése előtt kiszámít. A lánc további részében semmi nem tud a szerepkörök létezéséről: egy olyan hatókör, amellyel a szerepkör nem rendelkezik, egyszerűen nincs benne abban a listában, amelyet a hatókör-ellenőrzések olvasnak.
A két listát tehát együtt kell olvasni, és önmagában egyik sem dönt. Az a kulcs, amely emails:send joggal rendelkezik, de olyan szerepkör alatt áll, amely nem, nem küldhet; az a szerepkör pedig, amely rendelkezik az emails:send joggal, semmit nem ad annak a kulcsnak, amely soha nem kérte. Egy hatókör bejelölése jogosultság kérése, és a szerepkör dönti el, hogy a kértből mennyit kapsz meg.
A szerepkör NÉLKÜLI kulcsnak nincs felső korlátja, ezért pontosan olyan széles, mint az a munkaterület, amelyre kiadták. Minden olyan kulcs ilyen, amely még a szerepkörök bevezetése előtt készült, és ilyet kap a tulajdonos is, ha érintetlenül hagyja a mezőt: a null szerepkör tehát a LEGSZÉLESEBB, nem pedig a legszűkebb állapot, amelyben egy kulcs lehet. Ezért is kell megadnod egy szerepkör törlésekor, hogy hová kerüljenek a kulcsai: árván hagyni őket csendben mindegyiket előléptetné.
A metszet kérésenként dől el, nem pedig a kiadáskor íródik rá a kulcsra. Ettől lesz egy szerepkör szűkítése azonnali visszavonás, amely a hívó következő hívásánál már érvényben van, a kulcs cseréje nélkül – és ugyanígy azonnali a bővítése is, ami a fontosabbik fele.
A GET /ping és a GET /keys/self a grantedScopes és a roleId mellett a scopes mezőt is visszaadja, elsősorban egyetlen hibaeset miatt. A scopes a tényleges lista, és egyedül ez jogosít fel bármire; a grantedScopes az, amivel a kulcsot kiadták. Ami a másodikban szerepel, de az elsőből hiányzik, azt a szerepkör vette el, és ez a különbség a teljes válasz arra, hogy „a kulcsomon rajta van az emails:send, mégis insufficient_scope hibát kapok”. A megoldás a szerepkör módosítása, nem egy újabb kulcs.
curl "$OE/ping" -H "$AUTH" { "ok": true, "keyId": "4c1b257a66287fd113bd89d0", "mode": "live", "scopes": ["emails:read", "threads:read"], "roleId": "role_c40a95f21cc65d31c2a89e07", "grantedScopes": ["emails:send", "emails:read", "threads:read"], "workspaceId": "10417196-e324-4283-af98-66ec62167c47"}Öt jogosultság soha nem juthat el egy kulcsig: api-keys:read, api-keys:write, billing:read, billing:write és workspace:manage. Ezek jogosultságok, de nem hatókörök, így semelyik szerepkör – legyen bármilyen bőkezű – nem teheti őket egy tokenre: újabb kulcs kiállítása, egy másik kulcs jogainak módosítása vagy a csomag megváltoztatása kizárólag bejelentkezett személy dolga. Az egyetlen dolog, amit egy kulcs önmagával tehet, a saját titkos kulcsának cseréje, a keys:write hatókör mögött. A GET /roles/permissions az öt jogosultságot scope: false jelöléssel adja vissza, és ez teszi lehetővé, hogy ugyanaz a komponens rajzolja ki a szerepkörmátrixot és a kulcslétrehozás jelölőnégyzet-listáját is.
A roles:write gyakorlatilag a teljes szókészletet jelenti, és az ellenkezőjét állítani veszélyesebb dokumentáció volna. Az a kulcs, amely rendelkezik vele, PATCH-elheti pontosan azt a szerepkört, amely korlátozza, és minden mást odaadhat magának – mivel pedig a felső korlát kérésenként dől el, a szélesebb már a következő hívásnál érvényes. Ezt nem befoltozni kell, hiszen egy szerepkör-szerkesztő, amely nem tud szerepkört szerkeszteni, nem szerepkör-szerkesztő. Ez inkább ok arra, hogy ne tedd rá a roles:write jogot egy olyan kulcsra, amelynek csak a tagok listáját kellett volna olvasnia.
Küldési hatókör
A hatóköröktől függetlenül a kulcs abban is szűkíthető, hogy milyen néven küldhet. Két listát hordoz. A domainAllowlist teljes domaineket tartalmaz, és az a kulcs, amely egy domaint birtokol, bármelyik rajta lévő címről küldhet, beleértve a kulcs létrehozása után létrejött címeket is. Az addressAllowlist egyedi címeket tartalmaz. Ha mindkettőt üresen hagyod, a kulcs olyan széles, mint a munkaterület – szélesebb soha. A GET /keys/self mindkét listát megmutatja, a GET /addresses pedig azt jelenti, hogy egy adott kulcs ténylegesen mit használhat, és ez a válasz a megmagyarázhatatlan from_address_forbidden hibákra.
Ugyanez a beállítás szűkíti azt is, amit a kulcs olvashat. Az elküldött levelek, a követés és a naptár csak azokra a címekre válaszol, amelyek nevében a kulcs küldhet, így egy domainre korlátozott kulcs sem küldeni, sem olvasni nem tud egy másik nevében. A teljes domain azt is lehetővé teszi, hogy a kulcs beállítsa az adott domain követési hosztját, amire az egyedi címekre korlátozott kulcs nem képes.
Három szűkítés van tehát, és ezek nem felülírják, hanem egymásra rakódnak: a kulcs hatókörei, a fölötte álló szerepkör jogosultságai, valamint azok a domainek és címek, amelyeket From fejlécbe tehet. Egy küldéshez mind a három kell, és az elutasítás csak az elsőt nevezi meg, amelybe belefutott.