All posts by Filip

Fronta požadavků v případě nedostupnosti spravovaného systému

CzechIdM jako integrační nástroj ve středu infrastruktury, se musí často vypořádat s neduhy spravovaných systémů. Co však dělat v případě, kdy daný systém neodpovídá? Uživatel si například může měnit heslo, operace selže a uživateli se zobrazí hláška “Spojení se systémem selhalo, zkuste to prosím za 10 minut” která určitě každého potěší. A nebo ještě hůře: provede se aktualizace na základě jednorázového automatického procesu a ta je pak nenávratně ztracena. Následují hodiny času prohledávání logů a hledání příčiny. Tyto problémy k identity managementu neodmyslitelně patří a IdM se s nimi musí nějak vypořádat. My jsme vyvinuli řešení, určené pro tyto situace.
Continue reading

CzechPAM: Schvalovací úkoly a úprava dat

Náš nový produkt CzechPAM pomáhá při správě privilegovaných účtů. Má mnoho skvělých vlastností. Jednou z nich je možnost, aby vytvořené úkoly, například přidání uživatele do nějaké skupiny, schvalovali určení uživatelé. Tato vlastnost CzechPAM přidává důležitou kostičku do promyšleného bezpečnostního mechanismu našeho produktu. O tom, jak jsme schvalovací úkoly přenesli do CzechPAM, se dozvíte dále v článku.

Continue reading

CzechPAM: Jak bezpečně ukládat data

Naším cílem bylo udělat CzechPAM jakožto bezpečnostní aplikaci. To samozřejmě zahrnuje držení všech důležitých dat v zašifrované podobě. Bohužel i v dnešní době je stále běžné u aplikačních serverů ukládat spojení k databázi (Datasource) v plaintextové podobě. O tom, jak jsme se s tímto úkolem poprali a jak je realizované bezpečné ukládání dat v CzechPAMu, se dozvíte dále v článku.

czechpam_lock

Continue reading

Archiv v CzechIdM

Potřebovali jste si někdy něco zazálohovat? Případně potřebovali jste si udržovat změny ohledně nějakého objektu v průběhu času? Jestli ano, nyní je to v CzechIdM možné. V CzechIdM vznikl nový modul — archiv, který zvládá tyto úkony a ne jenom to. Vše o principu a správném použití archivu si můžete přečíst právě v tomto článku.

Funkčnost a GUI Archivu

Mezi primární funkci archivu patří samozřejmě archivování různých objektů. Také je možné jej prohledávat na základě zvolených kritérií či exportovat vybraná data do csv souboru. Tyto funkce jsou snadno přístupné administrátorovi přímo z administrátorského rozhranní CzechIdM pod záložkou uživatelé a podzáložkou archiv. Takto vypadá hlavní stránka archivu:

archiveMain

V hlavičce stránky je možné definovat kritéria, podle kterých si přejeme vyhledávat archivované objekty. Mezi možnosti patří hledání podle názvu, datum archivace, typu, či hodnoty atributu. Strukturu samotných objektů vysvětlím dále v článku. Po vyhledání se zobrazí seznam objektů odpovídajících výše uvedeným kritériím. V případě, že bychom si chtěli vyhledané objekty vyexportovat a dále s nimi pracovat, stačí pouze kliknout na tlačítko export a jen si uložit výsledný soubor.

archiveExport

Volání metod archivu z Java kódu

Nyní se zaměřím více na technickou stránku věci, aneb jak je možné obsluhovat archiv přes java kód. Pro obsluhu archivu vznikly nové statické metody na třídě data, které je možné volat kdekoliv z kódu. Protože automaticky se v CzechIdM nic nearchivuje, je nutné tuto akci vždy vyvolat explicitně. Například můžeme upravit workflow smazání uživatele, kde před samotným vykonáním smazání tohoto uživatele zaarchivujeme.

Archivování

Archivované objekty sice musí splňovat předepsanou strukturu vyžadovanou archivem, ale de facto je možné archivovat jakýkoliv serializovatelný objekt. Pro zaarchivování objektu musíme předat archivu meta informace jako jsou jméno a typ objektu a dále seznam jeho atributů, které si přejeme uložit. Každý ukládaný atribut se skládá ze jména a serializovatelné hodnoty. Při ukládání se tato hodnota uloží i v podobě řetězce z důvodů vyhledávání. Přesně s těmito atributy zavoláme metodu Data.archive a CzechIdM se postará o zbytek.

Vyhledávání v archivu

Pro prohledávání archivem používáme metodu Data.archiveSearch, které předáme kritéria vyhledávání. Ta nám vrátí iterátor, přes který můžeme procházet archivovanými objekty. Z důvodu rychlosti a optimalizace vrací iterátor pouze základní meta informace o archivovaném objektu, pro vytáhnutí celého objektu včetně jeho atributů musíme zavolat metodu Data.archiveGetElement, které předáme ID daného objektu. Zde je krátká ukázka jak definovat kritéria, které vyhledají objekt typu “IDENTITY”, zaarchivovaný před týdnem mající atribut manager nastavený na “Doe”:

Criteria criteria = new eu.bcvsolutions.idm.data.dto.Criteria();
criteria.add("type", "IDENTITY", Relation.EQ);
Calendar cal = Calendar.getInstance();
cal.setTime(new Date());
cal.add(Calendar.DAY_OF_YEAR, -7);
criteria.add("archiveDate", cal.getTime(), Relation.GT);
criteria.createAlias("attributes", "attrs");
criteria.add("attrs.attrName", "manager", Relation.EQ);
criteria.add("attrs.attrValueAsString", "Doe", Relation.EQ);

Export

Export z archivu funguje podobně jako prohledávání. Na vstupu se mu předají kritéria a on vyexportuje všechny objekty odpovídající těmto kritériím do csv souboru. Ovšem protože každý objekt může mít k sobě napárovaný neomezený počet atributů a nás může zajímat pouze nějaká jejich podmnožina, je možné specifikovat pouze ty atributy, které se mají k daným objektům vyexportovat. Tyto atributy definujeme v mapě, které funkci exportu předáme. Jako klíče jsou názvy atributů, které chceme vyexportovat. Můžeme definovat i jejich hodnoty, které slouží pro přejmenování sloupce pro účely exportu. V případě, že chceme vyexportovat všechny atributy, předáme místo mapy null. Zde je názorná ukázka, jak vyexportovat všechny objekty archivu a k nim pouze atributy “MANAGER” a “ROLES” u kterých budeme ale chtít, aby se v exportu objevily jako “manažer” a “role”.

Criteria criteria = new eu.bcvsolutions.idm.data.dto.Criteria();
Map<String> attributes = new HashMap<String>();
attributes.put("MANAGER", "manažer");
attributes.put("ROLES", "role");
File file = Data.archiveExport(criteria, attributes, "archiv_export");

Závěr

Po přečtení tohoto článku by jste měli být schopni sami umět ovládat archiv přes Java kód. Kdyby jste měli nějaké dotazy ohledně archivu či potřebovali poradit, kontaktujte mě přes info@bcvsolutions.eu.

CzechIdM na Windows? Není problém!

Windows-supportPři příležitosti vydání nového releasu CzechIdM a jeho zveřejnění jsme řešili, jak udělat instalaci CzechIdM co nejjednodušší a tím nejvíce dostupnou.

Vznikl instalační návod a několik instalačních skriptů, které automaticky konfigurovaly potřebné aplikační prostředí. Protože ale vývoj CzechIdM probíhá na Linuxu a zároveň všechny dosavadní instalace jsou na Linuxu, vznikly tyto skripty právě jen pro Linux. Jak CzechIdM, tak i aplikační server na kterém CzechIdM běží jsou napsané v Javě, proto není problém ho spustit na všech systémech.

Jako cíl jsme si tedy dali zprovoznění CzechIdM i pro Windows o kterém budu právě pojednávat v tomto článku. Celkově se instalace na Windows liší pouze v odlišné konfiguraci specifické pro Windows. Pokud by vás zajímalo více obecně o instalaci a jejích detailech, přečtěte si článek Zjednodušení instalace CzechIdM.

Stažení balíčku CzechIdM

Nejprve si stáhneme distribuční balíček CzechIdM z http://www.czechidm.com/getstarted/. Ten obsahuje aplikační server, potřebné sql skripty na úvodní naplnění dat a uploader. Nejprve si zkopírujeme složku jboss-5.1.0.GA tam, kde chceme mít CzechIdM nainstalované. Zde je třeba dát pozor na příslušná oprávnění – je dobré zkopírovat tuto složku do nějaké uživatelem vlastněné složky. Kdybychom ji zkopírovali například do Program files, je možné, že by CzechIdM nenaběhlo z důvodu výších nároků na práva.

Zprovoznění aplikačního prostředí

Nejprve je třeba stáhnout a nainstalovat MySQL server a databázi. Najdeme ho na adrese http://dev.mysql.com/downloads/. Podporované jsou verze 5 a vyšší. Spustíme MySQL server (nachází se ve složce bin/mysqld.exe). Nyní je třeba založit databázi a nakonfigurovat uživatele, přes kterého se CzechIdM do MySQL připojuje. Na to naštěstí máme skripty, které vše udělají za nás. Překopírujeme všechny sql skripty do lokace, kam jsme nainstalovali MySQL do složky bin. Přesměrujeme skript initial_import.sql na standartní vstup mysql přes CMD.

mysql -u root < create_repository.sql

Dále stáhneme MySQL JDBC connector z http://search.maven.org/remotecontent?filepath=mysql/mysql-connector-java/5.1.8/mysql-connector-java-5.1.8.jar. To je konektor, který umožnuje CzechIdM se připojit právě do MySQL databáze kam si ukládá svoje vlastní data. Tento konektor musíme nakopírovat do složky, kde máme překopírovaný jboss do server/default/lib/ a server/default/deploy/CzechIdM-ear.ear/lib/. Zároveň ho musíme zkopírovat do složky, kam jsme stáhli distribuci CzechIdM do IdmUploader/IdmUploader_lib/.

Jako poslední bude třeba stáhnout a nainstalovat aplikační prostředí Javy. Najdeme ho na http://www.oracle.com/technetwork/java/javase/downloads a stáhneme JDK 1.7. Úspěšnou instalaci můžeme zkontrolovat v CMD zadáním

java -version

Instalace CzechIdM

V této fázi máme již vše potřebné připravené. Zbývá již jen spustit aplikační server JBoss a nahrát počáteční import dat do databáze. Server spustíme tak, že půjdeme na umístění, kam jsme ho zkopírovali do složky bin, kde spustíme run.bat. Tím by se měl začít server spouštět. Počkáme, než kompletně naběhne. To poznáme, že poslední věta v konzoli bude vypadat jako JNDI InitialContext properties:{}

Teď potřebujeme importovat počáteční data do databáze. Ty nám vytvoří výchozí uživatele v CzechIdM. Jdeme do složky MySQL/bin a zde zadáme do CMD

mysql -u root < initial_import.sql

Jako poslední úkol je nahrání aplikační logiky do CzechIdM. K tomu slouží program IdmUploader, který je ve složce distribuce, kterou jsme stáhli na začátku článku. Zde je třeba spustit runIdmUploader.bat. Import dat trvá obecně okolo 30 sekund.

Dokončení instalace

Jakmile máme AS JBoss spuštěný, MySQL máme připojený do CzechIdM a zároveň jsme provedli počáteční import, můžeme se přihlásit do administrátorského rozhraní. To se typicky nachází na adrese http://localhost:8080/idm. Pro přihlášení použijeme účet superadministrátora, která má login “admin” a počáteční heslo je stejné. Nezapomeňte si toto heslo v konfiguraci změnit jako první!

Závěr

Tímto by měla být instalace CzechIdM hotová a můžete se k němu připojit přes http://localhost:8080/idm, kde se příhlásíte jako admin s heslem admin. Kdyby jste měli nějaké otázky či problémy s instalací CzechIdM na Windows, neváhejte se obrátit na info@bcvsolutions.eu.

Database interface of HR system Vema

Human resources system Vema is very popular in Czech Republic and is used by a number of governmental institutions and commercial companies. We often encounter it by our customers as a part of our integrations projects. Vema is a typical source of informations about employees for our identity manager. Vema cannot usually provide real-time access to data, one usually gets a regular night export to CSV files. But there is a way, how to access data in real-time. The developer of Vema system developed a module that can export personal data in real time to the Oracle relational database. And this is the content of this article.

vema-logo

Vema versions

Module HE0064, which enables exports to the SQL database, works in live operations at several our customers. I know certainly, that it works for Vema versions 28.03.02 and newer. If you are using an older version, please contact the Vema provider. I believe, you have a chance to succeed.

Oracle XE

Export module HE0064 can communicate only with Oracle databases. Don’t be disappointed, you do not need to pay big money for licences, Oracles provides a basic Oracle database Express Edition for free. You won’t create a GeoCluster with that, but for communication with Vema it’s more than enough.

Database structure

Vema exports the data into eleven database tables. You can easily prepare them with an SQL script, which i will not describe here, but i want, i can send it on request by email (vojtech.matocha@bcvsolutions.eu).

The tables contains all the data with which the HR system works – data on employees, contracts, organization structures, … This is all accompanied by several useful columns with timestamps – you can easily recognize, which records were modified.

Online and full export

The module offers two types of exports – online exports, which react to changes in real-time a update only the data, which were changed. And full exports, which perform a complete export of all data in personal system.

We usually use a combination of both at our customers – once a week a full export as a control of continuously running online exports.

Conclusions

In the article i responded to a question that i ma so often asked: yes, there is a way to easily export data from Vema into the database in real time. It is the HE0064 module and it runs at several our customers. We have excellent experience with it. If you want to know more about it, feel free to ask me at vojtech.matocha@bcvsolutions.eu.

Upcoming changes to CzechIdM

I will summarize forthcoming changes and improvements for next version of CzechIdM in this article.

Hiding the splash image

Each time, you log into CzechIdM, it displays generic image outlining the general structure. Are you tired of it? From this time, you will be immediately redirected to another page where you can instantly begin administrating CzechIdM.

main page

Removing schemas from systems

Each system had the possibility to work with multiple schemas. However, this option was not used in practice and every time we used single “default” schema. Therefore, we have removed this possibility from CzechIdM and administrator will no longer be bothered by it. This will simplify the process of connecting new systems.

Editation of extended attributes

 

CzechIdM retains informations for each basic information such as login name or email. Of course it is necessary to store more attributes depending on connected end systems in practice. Therefore, every CzechIdM entity contains list of “Extended attributes”, which store these additional informations. These attributes are defined by their name and a single value. Previously, it was possible to edit through web interface only attributes, whose value was a String. Now we allow editing of the most basic data types, so you can change things like Date or Boolean values directly from the internet environment. In the past, such a change had to be carried out by a script.

 

ext_att

The most interesting case involves modification of List of Strings. This is done in one input box, where the character ‘|’ is used as the separator between each String. If we want to use the character ‘|’ itself, we have to escape it with ‘\’. And if we want to use the character ‘\’, we have to write it in pair ‘\\’ like in Java.

Separation of rights for user and admin roles

To improve the safety of CzechIdM, we have divided the rights for admin and user roles. Previously, the rights for admin and user roles were set together. That was not very good approach, because we set sometimes too strong rights to administrators. This change will allow to separate administrators, who manage CzechIdM as such from managers, who manage only ordinary users.

Conclusion

If you have any comments or questions about these changes, please contact me at filip.mestanek@bcvsolutions.eu.

Optimalizace jBPM enginu – uchovávání informací o workflow v databázi

jbpm

V CzechIdM využíváme workflow pro vykonávání aplikační logiky systému. Všechna tato workflow běží na enginu jBPM. O každém běžícím workflow si jBPM v standardně uchovává spousty informací jako jsou proměnné, aktuální stav apod. Tyto informace si ukládá do databáze a zůstávají v ní i poté, co dané workflow skončí, což v určitých případech způsobuje nárůst velikosti databáze. Proto jsme hledali způsob optimalizace jBPM.

Dosud jsme v případě velkého nárůstu databáze řešili ručním promazáním příslušných jBPM tabulek. Nyní jsme ho ale vyřešili sofistikovanějším způsobem, o kterém se právě dozvíte v tomto článku.

Řešení – správce workflow

Vytvořili jsme správce, který eviduje všechna spuštěná workflow a průběžne maže ta nepotřebná.

Každé workflow beží pod uživatelem a každý uživatel má přiděleno svoje unikátní sessionId – to identifikuje relaci jeho připojení k CzechIdM. Když dojde ke spuštění nového workflow, tak se toto workflow zaregistruje u správce pod sessionId uživatele, který ho spustil. Jakmile workflow doběhne, předá zprávu správci a ten ho rovnou smaže.

V CzechIdM používáme ale i workflow, která sama od sebe nikdy neskončí. To jsou zpravidla workflow, která zobrazují nějakou stránku. Takováto workflow jsou mazána poté, co skončí session uživatele (odhlásí se sám, nebo je automaticky odhlášen). Správce probere všechna workflow, která byla pod daným uživatelem spuštěna, a všechny je smaže.

jBPMDiagram komunikace komponent

Jediná výjimka je v případě workflow, která generují schvalovací požadavek. V tomto případě chceme, aby se workflow uchovávala i po skončení session uživatele, který daný požadavek vytvořil.

Abychom rozlišili smazatelná workflow od těch, které smazat nemůžeme, rozšířili jsme jejich definici o nový atribut – killable. Při nastavení killable=false říkáme správci, že takové workflow je potřeba uchovat v databázi i po skončení session uživatele a on ho tím pádem ignoruje.

<!-- definice smazatelneho WF-->
<process-definition  xmlns="urn:jbpm.org:bcv_jpdl-3.2"  name="user.edit" killable="true">

Promazání starých workflow

Výše popsaný správce ale řeší pouze nově spouštěná workflow a ne ta, co již déle leží v databázi. Bylo tedy zapotřebí projít databázi a smazat z ní nepotřebná workflow.

Instance workflow je v jBPM reprezentována objektem ProcessInstance. Ten se ukládá do tabulky databáze JBPM_PROCESSINSTANCE. Co zpravidla zabírá nejvíc místa v databázi, jsou tabulky obsahující proměnné použité ve workflow. Ty jsou uloženy v tabulkách JBPM_BYTEARRAY, JBPM_BYTEBLOCK a JBPM_VARIABLEINSTANCE. JBPM_VARIABLEINSTANCE obsahuje seznam použitých proměnných pro každé workflow a jejich hodnoty. V případě nestandardních typů proměnných jsou jejich hodnoty uloženy až v tabulkách JBPM_BYTEARRAY či JBPM_BYTEBLOCK.

Vytvořili jsme pravidlo clearCompletedProcessInstancesFromRepository, které postupně prochází databázi a maže z ní stará workflow. Každé workflow se načte z databáze do aplikace, kde se z něho zrekonstruuje objekt ProcessInstance, ten se korektně ukončí metodou instance.end() a smaže se z databáze metodou context.getGraphSession().deleteProcessInstance(instance).

Takhle smažeme všechna workflow, která v sobě nenesou nedokončený schvalovací úkol.

// Strucny vytah pravidla mazajici stare WF
public Object execute(JbpmContext context) {
    Session session = context.getSession();	
    List result = session.createSQLQuery("select ID_ as id from JBPM_PROCESSINSTANCE;")
        .addScalar("id", new org.hibernate.type.LongType()).list();

    for (int i = 0; i < result.size(); i++) {
        ProcessInstance instance = context.loadProcessInstance(Long.valueOf(result.get(i)));
        if (!canBeDeleted(instance)) continue;

        instance.end();
        context.save(processInstance);
        context.getGraphSession().deleteProcessInstance(processInstance);
    }
}

V případě, že se vůbec schvalovací workflow nepoužívají, je možné kompletně smazat všechny jBPM tabulky (TRUNCATE), což je ostatně mnohem rychlejší.

Na co jsme narazili

Během testování funkčnosti naší opravy jBPM jsme narazili na několik záludností, u nichž jsme dále zvážili, jaký dopad mohou mít na uživatele a následně se rozhodli pro způsob řešení.

  • Workflow spuštěné samotným CzechIdM, např. naplánovaná úloha, má přiřazené umělé sessionId; neexistuje žádná session, na jejímž konci by se mohlo workflow smazat z databáze. Pokud nedoběhne, zůstane v databázi natrvalo.
    Řešení: Plánované procesy by měly vždy doběhnout bez chyby.
  • Pokud uživateli expiruje session a klikne např. na záložku Uživatelé, spustí se workflow user.list, které neprojde přes kontrolu oprávnění. CzechIdM pak uživatele přesměruje na přihlašovací stránku. Nicméně ProcessInstance se ještě zapsalo do repository (START_=null) a už tam zůstane navždy.
    Řešení: Nevytvářet v tomto případě ProcessInstance vůbec, zkontrolovat ještě před spuštěním workflow, že je uživatel přihlášen.
  • Smazáním rodičovského workflow se vyvolá smazání jeho potomků. Při mazání procesů je tedy vhodné kontrolovat, jestli dané workflow už náhodou nebylo smazáno, aby se zbytečně nevyhazovaly výjimky. Na to lze použít JbpmContext.getProcessInstance (JbpmContext.loadProcessInstance vyhodí rovnou výjimku, když proces neexistuje – snaží se ho načíst).
    Řešení: Vyřešeno obecně. Při skončení session se ve správci projde nejprve celý seznam spuštěných workflow a odeberou se z něj všechny non-killable workflow a jejich předci. Zbylá workflow ze seznamu se mohou smazat z databáze. Přičemž u každého prvku seznamu se nejprve ověří, že pořád ještě v databázi existuje a může být tedy smazán.
  • Pokud rodičovský proces není killable, potomek je killable a nedoběhnul, pak po vypršení session správce vyvolá ukončení procesu potomka. Při ukončení potomka jBPM notifikuje rodiče, že může pokračovat ve výpočtu. Nicméně v té chvíli už neexistuje session, což může vést k výjimce “No application context active”. Potomek se z tedy repository nesmaže, jen mu zůstane příznak “ukončen”. Ovšem toto je velmi nepravděpodné a u nás v praxi nenastane.

Závěr

CzechIdM stále vylepšujeme, doplňujeme a rozšiřujeme jeho možnosti. Úkolů ko zlepšení máme stovky, klíčovým rozhodovacím faktorem je pro nás názor našich zákazníků. Ve stručnosti, pracujeme na těch vylepšení, které chtějí zákazníci.

Optimalizace jBPM byl poměrně hluboký zásah do klíčové části CzechIdM, proto jsme postupovali velmi obezřetně. Po týdnu vývoje jsme vytvořili hot-fix produktu a  vylepšení nasadili i u prvního zákazníka. Samotné nasazení do produkčního provozu u zákazníka i s otestováním zabere kolem 1-2MD dle velikosti zákaznického řešení. Nejvíce je věnováno přetestování.

Tímto jsem zde probral všechna vylepšení, které jsme provedli nad enginem jBPM. Kdybyste řešili podobné záludnosti s jBPM nebo jen měli nějaké dotazy, neváhejte mě kontaktovat na info@bcvsolutions.eu.