JSON-RPC API v systému FreeIPA v4

FreeIPA je software vyvýjený pod záštitou společnosti RedHat, který má za úkol poskytovat snadnou správu identit, politik a auditů (IPA). S příchodem zatím poslední verze FreeIPA bylo představeno nové lightweight API, využívající formátu JSON. V článku se podíváme na nové API a úskalí, na která lze narazit při jeho používání, potažmo i při integraci se systémem FreeIPA.

FreeIPA je open source software vyvíjený společností RedHat, který slouží primárně ke správě identit. FreeIPA používá pro ukládání dat adresářovou službu 389 Directory server. Interakce se systémem je možná buď pomocí webového rozhraní, nebo příkazové řádky.

Před vydáním verze 4, bylo nutné pro vzdálenou komunikaci s FreeIPA použít buď poměrně neohrabané XML-RPC API, nebo přistupovat přímo k adresářovému serveru, na kterém FreeIPA běží. První zmíněný přístup vyžadoval generování složitého klienta a posílání objemných dat po síti, zatímco druhý způsob byl založený na kompletním ignorování FreeIPA a přistupování přímo k directory serveru. Zkrátka integrace s FreeIPA do verze 4 byla možná, ale zároveň byla časově mnohem náročnější, než je tomu po příchodu verze 4.

JSON-RPC API to the rescue!

Nové API představené spolu s verzí 4, do značné míry řeší problémy s integrací zmíněné výše. Bohužel si zároveň spoustu neduhů zachovává. Přesto, že se jedná ze strany RedHat o krok správným směrem, zdaleka nejsou neřešeny všechny problémy. V rámci napojení systému FreeIPA u jednoho z našich zákazníků jsme vyvinuli OpenICF konektor, který komunikuje právě s novým rozhraním. Dále rozeberu některé postřehy, které jsme během integrace nasbírali.

{
    "id": 0,
    "method": "user_show",
    "params": [
        [
            "admin"
        ],
        {
            "all": false,
            "no_members": false,
            "raw": true,
            "rights": false,
            "version": "2.117"
        }
    ]
}

Ukázka JSON volání operace user_show

Co ale vlastně je JSON-RPC API? V podstatě se jedná o přepracování původního XML-RPC API. V praxi to znamená, že namísto posílání dlouhých xml zpráv budete posílat o něco kratší JSON zprávy. Nejedná se tedy o RESTful rozhraní, jak by se mohlo na první pohled zdát. Zda je tento přístup správný, si netroufám hodnotit.

Zachování RPC modelu komunikace je sice vhodné například z hlediska zpětné kompatibility, ale zároveň si s sebou oproti RESTu nese stavové chování. To se pak projeví například ve chvíli, kdy systém odešle do FreeIPA dva shodné požadavky na update. Pokud bychom použili RESTful rozhraní, ve kterém musí být update idempotentní operace, tak vše proběhne bez problému. V případě JSON-RPC API však FreeIPA vyhodí chybu, protože se snažíme zavolat update operaci, která nic nemění. Ve chvíli, kdy by aplikace reagovala na chybu rollbackem celé operace, nastává značný problém.

CzechIdM posílá na systémy pouze skutečné změny, bylo tak možné se s tímto chováním vypořádat bez větších potíží. Při integraci s jinými systémy je však třeba mít toto na paměti.

Změna hesla uživatele

Velice častým úkolem CzechIdM je správa hesel uživatelů. I zdánlivě jednoduchý úkol, kterým je nastavení nového hesla uživateli, se ve FreeeIPA může proměnit na hodiny strávené nad nefunkčním řešením. FreeIPA totiž pod záminkou vyšší bezpečnosti automaticky nastavuje příznak vynucené změny hesla u každého uživatele, kterému heslo nastaví někdo jiný.

Toto opatření dává smysl ve chvíli, kdy heslo skutečně nastaví jiná osoba. Existují však případy, kdy takové chování není žádoucí (pokud je autoritou pro správu hesel jiný systém než FreeIPA). Za tímto účelem existují ve FreeIPA takzvaní „Password synchronization agents“. Tito uživatelé mohou nastavovat ostatním uživatelům v IdM hesla, která nevyžadují okamžitou změnu po přihlášení.

Pro vytvoření uživatele s tímto oprávněním je třeba v adresářovém serveru běžícím pod FreeIPA editovat záznam cn=ipa_pwd_extop,cn=plugins,cn=config. Tomu je potřeba přidat vícehodnotový atribut passSyncManagersDNs, který bude obsahovat výčet sync agentů (dn uživatelů). Poté stačí změny hesel provádět pod některým z těchto uživatelů.

Závěrem

V článku jsme si představili nové API systému FreeIPA, které jsme použili pro integraci CzechIdM s tímto systémem. Protože není možné v jednom článku popsat všechna zákoutí integrace s FreeIPA, neváhejte se nám ozvat s případnými dotazy, nebo připomínkami.