10. prosince 2018

Maskování textových řetězců v konfiguraci JBoss / WildFly


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