pondělí 22. prosince 2014

Nevědomě k plnému disku

Člověk se pořád učí. A když se neučí, tak je následně poučen. Stalo se mi toto - pracovali jsme na komunikačním modulu, který pro  komunikaci s cizím serverem používá podepsané zprávy. Uživatel modulu nejprve do systému nahraje certifikát i s privátním klíčem a modul pak s jeho pomocí podepisuje odesílané zprávy.
Certifikát je uložen mimo program v zabezpečené databázi a pokud je potřeba, vytvoří se vlastní objekt certifikátu v paměti asi takhle:

var  certificate  =  new  X509Certificate2(content,  password,  X509KeyStorageFlags.PersistKeySet  |  X509KeyStorageFlags.MachineKeySet);

Tenhle postup fungoval, ale pak byl celý systém rozšířen o automatické pravidelné zasílání zpráv a toto vytváření certifikátu se začalo odehrávat častěji. Neočekával jsem ale, že Windows si vytvářejí při každém vytvoření certifikátu výše uvedeným postupem na disku malý soubor s klíčem a tento soubor následně neodstraňují a tento tak zůstává na disku. Kdysi dávno to byla dokonce reportované chyba a pro starší OS vyšel i fix, ale v novějších OS to zůstalo a žádný fix už nebyl.

Výsledkem kombinace častější kombinace a výše uvedeného chování byl dramatický úbytek volného místa na systémovém disku a  neuvěřitelně mnoho souborů  v adresáři C:\ProgramData\Microsoft\Crypto\RSA\MachineKeys. Naštěstí se na to přišlo poměrně brzy a byl tedy čas příslušná místa opravit - ale pár dnů provozu navíc mohlo znamenat pád serverů z důvodu vyčerpání diskového místa.

Oprava spočívala v tom, že certifikáty se po dobu běhu modulu ukládaly jak do paměťové keše, tak i do dedikovaného X509Store objektu a v případě ukončování práce modulu byly v destruktoru postupně volána metoda Reset() pro všechny certifikáty - teprve zavoláním této metody dojde k odstranění souboru z disku. Vyřešil se tak problém s místem (každý certifikát se během běhu modulu vytvořil právě jen jednou), tak se zlepšil i výkon - certifikáty jsou k dispozici okamžitě. Navíc při ukončení činnosti modulu jsou certifikáty zcela odstraněny ze systému. Pokud dojde k pádu modulu a destruktor není zavolán, jsou certifikáty při obnovení činnosti získány z X509Store a při následujícím korektním zakončení činnosti modulu odstraněny.

Pokud někomu vrtá hlavou, proč není X509Store použit od začátku a výhradně, tak proto, že  modul neběží na jednom učitém serveru a nejsou tak dopředu známé možnosti prostředí - certifikáty s klíči jsou bezpečně uložené zvlášť a přístup k nim je zabezpečen dle jiných pravidel.

Asi to musí někomu, kdo v této oblasti pracuje denně, přijít zábavné. Můj pracovní záběr se ale pohybuje od mobilních aplikací, přes weby, databáze až k win službám a tak pochopitelně nemám detailní znalosti a jsem občas nucen se učit z podobných chyb..... Mimo vyřešení příčiny problému se pak navíc musel najít způsob, jak bezpečně odstranit všechny ty malé soubory, které mezitím zahltili disk  :-)




Žádné komentáře:

Okomentovat