Snad v každém konfiguračním
souboru aplikačního serveru se nachází řetězec, u kterého bychom neradi, pokud
by se dostal k neoprávněným osobám. Nemusí jít nutně o heslo, ale samozřejmě
drtivá většina takových řetězců budou hesla, a to především produkčních systémů.
V případě aplikačních serverů JBoss a
WildFly, lze částečně problém vyřešit
použitím tzv. Vault. Proč vůbec a jak
ho použít, se dozvíte v dalších odstavcích.
Nešifrujeme, maskujeme
V trezoru lze uchovávat řetězce
libovolné, je tedy možné skrýt i např. hesla k tzv. keystore nebo řetězce v tzv.
system properties. V samotném trezoru
jsou řetězce samozřejmě šifrovány, ale server potřebuje mít způsob, jak řetězce
z trezoru dešifrovat. Jedna z možností by byla, že obsluha při startu serveru
zadá heslo. To je ovšem ve většině případů užití nereálné. Kde a jak obdržet žádaný
řetězec je tedy informace uložená přímo v konfiguračním souboru (tj. např. standalone.xml). Nabízí se tedy otázka,
proč použít „trezor“, když klíč k němu leží pod rohožkou.
Tento přístup k problematice je
znám pod pojmem „security through
obscurity“, nebo–li bezpečnost utajením. V první řadě jde samozřejmě o
způsob jak projít „jednoduššími“ bezpečnostními audity. Pro mě, jako
administrátora, jde hlavně o jasné oddělení citlivých dat od konfigurace a
snazší kontrolu nad tím, kde se hesla vyskytují. Nemusím se bát, že hesla
uniknou např. zálohováním nebo tím, že poskytnu k nahlédnutí konfigurační
soubor serveru. Mohu také nad adresářem, ve kterém jsou soubory trezoru,
uplatnit přísnější přístupová práva atd. V praxi se také poměrně často stává,
že na server nemá přístup jen administrátor, ale i například klíčový uživatel,
který by, pokud by bylo heslo v konfiguračním souboru pouze v textové formě,
heslo mohl snadno zneužít. Trezor už pro něj ale může představovat
nepřekonatelnou bariéru. Trezor rozhodně neochrání před cíleným útokem. Je
potřeba chránit citlivé informace kombinací ochran na jiných vrstvách dle
obecných bezpečnostních doporučení, jako je firewall, přístupová práva,
pravidelné záplatování OS a aplikačního serveru apod.
Vstupním bodem do trezoru je heslo
ke keystore, které ho chrání. Toto heslo není v konfiguračním souboru v textové
podobě, ale nějakým veřejně známým způsobem (jsou dostupné zdrojové kódy)
maskované. Když tedy útočník projde zdrojové kódy aplikačního serveru, může si
velice snadno vyrobit nástroj na odmaskování hesla. Samozřejmě takovéto
nástroje jsou již většinou k nalezení na Internetu.
Vytvoření trezoru
Prvním krokem je vytvoření tzv.
keystore ve formátu JCEKS (poznamenejte si alias a zadané heslo):
keytool
-genseckey -alias vault -storetype jceks -keyalg AES -keysize 256 -keystore
vault.keystore
Nyní můžeme vytvořit samotný
trezor pomocí skriptu vault.bat v bin složce aplikačního serveru:
C:\vault>C:\wildfly\bin\vault.bat
=========================================================================
JBoss Vault Tool
JBOSS_HOME: "c:\wildfly"
JAVA: "C:\Program
Files\java\jdk1.8.0_161_x64\bin\java"
JAVA_OPTS: ""
=========================================================================
**********************************
**** JBoss Vault
***************
**********************************
Please
enter a Digit:: 0: Start Interactive
Session 1: Remove Interactive
Session 2: Exit
0
Starting
an interactive session
Enter
directory to store encrypted files: C:\vault\
Enter
Keystore URL: C:\vault\vault.keystore
Enter
Keystore password: <zadáno heslo ke keystore>
Enter
Keystore password again: <zadáno heslo ke keystore>
Values
match
Enter
8 character salt: <zadána kryptografická sůl – náhodných 8 znaků>
Enter
iteration count as a number (e.g.: 44): <zadán počet opakování šifrovacího
algoritmu>
Enter
Keystore Alias: vault
WFLYSEC0056:
Initializing Vault
Kvý
25, 2018 9:15:43 DOP. org.picketbox.plugins.vault.PicketBoxSecurityVault init
INFO:
PBOX00361: Default Security Vault Implementation Initialized and Ready
WFLYSEC0048:
Vault Configuration commands in WildFly for CLI:
********************************************
For
standalone mode:
/core-service=vault:add(vault-options=[("KEYSTORE_URL"
=> "C:\vault\vault.keystore"),("KEYSTORE_PASSWORD" =>
"<vygenerovaná MASK hodnota>"),("KEYSTORE_ALIAS"
=> "vault"),("SALT" => "<zadaná
sůl>"),("ITERATION_COUNT" => "<zadané
číslo>"),("ENC_FILE_DIR" => "C:\vault\/")])
********************************************
For
domain mode:
/host=the_host/core-service=vault:add(vault-options=[("KEYSTORE_URL"
=> "C:\vault\vault.keystore"),("KEYSTORE_PASSWORD" =>
"<vygenerovaná MASK hodnota>"),("KEYSTORE_ALIAS" =>
"vault"),("SALT" => "<zadaná
sůl>"),("ITERATION_COUNT" => "<zadané
číslo>"),("ENC_FILE_DIR" => "C:\vault\/")])
********************************************
WFLYSEC0057:
Vault is initialized and ready for use
WFLYSEC0058:
Handshake with Vault complete
Please
enter a Digit:: 0: Store a secured
attribute 1: Check whether a secured
attribute exists 2: Remove secured att
ribute 3: Exit
0
Task:
Store a secured attribute
Please
enter secured attribute value (such as password) <zadané heslo>
Please
enter secured attribute value again <zadané heslo>
Values
match
Enter
Vault Block:keystores
Enter
Attribute Name:truststore-password
WFLYSEC0047:
Secured attribute value has been stored in Vault.
Please
make note of the following:
********************************************
Vault
Block:keystores
Attribute
Name:truststore-password
Configuration
should be done as follows:
VAULT::keystores::truststore-password::1
********************************************
Please
enter a Digit:: 0: Store a secured
attribute 1: Check whether a secured
attribute exists 2: Remove secured att
ribute 3: Exit
1
Task:
Verify whether a secured attribute exists
Enter
Vault Block:keystores
Enter
Attribute Name:truststore-password
A
value exists for [keystores::truststore-password]
Please
enter a Digit:: 0: Store a secured
attribute 1: Check whether a secured
attribute exists 2: Remove secured att
ribute 3: Exit
3
Tento nástroj vypíše i příkaz pro
JBoss CLI, který nastaví trezor v konfiguračním souboru:
/core-service=vault:add(vault-options=[("KEYSTORE_URL"
=> "C:\vault\vault.keystore"),("KEYSTORE_PASSWORD" =>
"<vygenerovaná MASK hodnota>"),("KEYSTORE_ALIAS"
=> "vault"),("SALT" => "<zadaná
sůl>"),("ITERATION_COUNT" => "<zadané
číslo>"),("ENC_FILE_DIR" => "C:\vault\/")])
Jedná se o tyto parametry (v sekci
<server
xmlns="urn:jboss:domain:6.0">, za </system-properties>):
<vault>
<vault-option
name="KEYSTORE_URL" value="C:\cesta\k\vault.keystore"/>
<vault-option
name="KEYSTORE_PASSWORD" value="<vygenerovaná MASK
hodnota>"/>
<vault-option
name="KEYSTORE_ALIAS" value="vault"/>
<vault-option name="SALT"
value="<kryptografická sůl>"/>
<vault-option
name="ITERATION_COUNT" value="<počet opakování šifrovacího
algoritmu>"/>
<vault-option name="ENC_FILE_DIR"
value="C:\cesta\k\vault\souborům/"/>
</vault>
A také hodnotu proměnné, pomocí
které se lze v konfiguračním souboru odkazovat do trezoru:
VAULT::keystores::truststore-password::1
Lze také použít neinteraktivní
režim:
.\vault.bat -k vault.keystore -p <heslo
k
vault.keystore> -e C:\cesta\k\vault.keystore -i <počet
iterací> -s <sůl> -v <alias> -b <blok> -a <atribut> -x <hodnota>
Použití hodnoty z trezoru
Na místo řetězce se vloží proměnná
s cestou v trezoru:
${VAULT::<blok v trezoru>::<název
atributu v trezoru>::1}
Autor článku: Michal Hrubý
Žádné komentáře:
Okomentovat