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.
Jako většina serverových aplikací, CzechPAM využívá technologii JPA pro ukládání běžných dat. Ty jsou uloženy v databázi (v našem případě MySQL). Avšak takováto databáze není z bezpečnostního hlediska vhodná pro ukládání důvěryhodných dat. Některé informace, jako například hesla k napojeným systémům, musejí být uloženy v nezměněné podobě. Právě tato data je vhodnější držet uvnitř šifrované databáze.
Napojení šifrovaného úložiště
Jako první část bylo nutné vybrat a napojit šifrovanou databázi. Rozhodli jsme se pro H2 databázi, která předchází ostatní kandidáty – je šifrovaná pomocí AES-128, nabízí JDBC spojení a nejedná se pouze o proxy rozhraní. Abychom umožnili administrátorům spravovat data uložená v šifrované databázi, vznikla jednoduchá konzolová aplikace, která toto umožňuje. Pomocí té mohou měnit data jako serverový klíč (při napojení více serverů v clusteru), hesla k datové databázi či připojeným systémům. CzechPAM si nikde nedrží heslo pro připojení do šifrované databáze a administrátor ho musí vždy ručně zadat při každém startu aplikace.
Startování CzechPAMu
U běžných aplikací běžících na aplikačním serveru využívajících technologii JPA je typické mít definovaný datasource soubor, ve kterém jsou uloženy údaje o připojení do databáze. Jedná se o data jako host, driver, uživatel či heslo – ty jsou bohužel v plaintextové podobě a tím jednoduše dostupné pro každého, kdo má přístup k danému souboru.
Tomuto způsobu jsme se samozřejmě museli v CzechPAMu vyhnout. Využili jsme fakt, že místo uživatelského jména a hesla u datasource je možné definovat takzvanou security domain. Jedná se o bezpečnostní doménu, kde definujeme přihlašovací modul – jakákoliv třída implementující rozhraní javax.security.auth.spi.LoginModule. Nyní, vždy když se datasource pokusí připojit do databáze, půjde přihlášení přes tento modul – ten pomocí metod rozhraní musí vystavit správné přihlašovací jméno a heslo. Běžně jsou tyto login moduly používány pro přihlašování uživatelů do aplikací, avšak lze to využít i pro jiné prostředky jako v našem případě.
Nastavení datasourcu:
<datasource jndi-name="java:jboss/datasources/CzechPAM" enabled="true" use-java-context="true" pool-name="CzechPAM"> ... <security> <security-domain>PAM-auth</security-domain> </security> </datasource>
Definice security domény v konfiguračním souboru JBosse standalone.xml:
<security-domain name="PAM-auth" cache-type="default"> <authentication> <login-module code="eu.bcvsolutions.czechpam.core.application.loginModule.PamLoginModuleProxy" flag="required" module="PamLoginModule"> <module-option name="userName" value="root"/> <module-option name="managedConnectionFactoryName" value="jboss.jca:name=java:jboss/datasources/CzechPAM,service=LocalTxCM"/> </login-module> </authentication> </security-domain>
V praxi je start CzechPAMu rozdělen na 2 části. To je z toho důvodu, že JPA musí být inicializováno již od startu – to avšak není možné, protože těsně po startu nemá CzechPAM heslo do šifrovaného úložiště a tím pádem nemá ani heslo do datové databáze. Při startu aplikačního serveru se spustí pouze jádro, které představuje funkční základ aplikace. Administrátor nyní musí zadat heslo k rozšifrování šifrovaného úložiště. CzechPAM se k němu připojí, načte z něho nezbytné informace jako heslo k datové databázi a poté automaticky spustí deploy zbytku aplikace.
Závěr
V článku jsme si vysvětlili, jak bezpečně ukládat důvěryhodná data a jak se vyhnout ukládání přihlašovacích údajů do konfiguračních souborů. V případě dotazů či připomínek se určitě neváhejte na mě obrátit na mailu info@bcvsolutions.eu.