Použití SCA6000 pro podepisování DNSSEC

Jak nainstalovat kartu SCA6000 pro DNSSEC

Karta SCA6000 je podporována výrobcem Sun Microsystems na systému Solaris 10 a starší verzi RHEL 4. Z hlediska údržby a výkonu se sdružení CZ.NIC rozhodlo pro provoz této karty na systému Solaris. Proto se následující návod bude zabývat pouze zprovozněním této karty pod systémem Solaris 10.

Provoz karty pod systémem RHEL 4 vyžaduje zprovoznění PKCS#11 opencryptoki frameworku. Některé části tohoto návodu jsou pak společné.

Pro provoz karty potřebujeme nejlépe server, který je certifikovaný pro provoz Solaris 10, ale není to nutná podmínka. Vše závisí na podpoře ostatních komponent (síťová karta, atp.). Server také musí disponovat alespoň jedním PCIe slotem pro zapojení karty.

Další návod předpokládá nainstalovaný Solaris 10. Návod na instalaci Solaris 10 nespadá do záběru tohoto dokumentu.

Instalace dalšího software

Pro provoz karty a hlavně software pro podepisování zóny budeme potřebovat kromě standardního software i další dodatečné komponenty pro práci s internetem a kompilaci zdrojových kódů.

Připojení CD/DVD

# mount -F hsfs /dev/dsk/c2t0d0p0 /mnt

Přidání zdrojů software z CD/DVD

# pkgadd -d /mnt/Solaris_10/Product/ SUNWdoc - Documentation Tools (program man)  
# pkgadd -d /mnt/Solaris_10/Product/ SUNWarc - Lint Libraries (usr)  
# pkgadd -d /mnt/Solaris_10/Product/ SUNWhea - SunOS Header Files  
# pkgadd -d /mnt/Solaris_10/Product/ SUNWtoo - Programming Tools

Přidání zdroje OpenSource programů

# pkgadd -d http://www.blastwave.org/pkg_get.pkg

Změna zdrojů z unstable na stable

# vi /opt/csw/etc/pkg-get.conf

Instalace balíčků

Obecné

|pkg-get -i wget  
pkg-get -i bash  
pkg-get -i vim  
pkg-get -i ssh  
pkg-get -i ssl|

Potřebné pro kompilaci

pkg-get -i gcc4core  
pkg-get -i gmake  
pkg-get -i libtool  
pkg-get -i pkgconfig

Sun Crypto Accelerator 6000 PCIe Card

Karta SCA 6000 je primárně určena jako kryptografický akcelerátor. Možné použití je například pro urychlení HTTPS provozu, kde práci s certifikáty přebírá karta a matematické výpočty potřebné pro ověřování a šifrování zabezpečeného provozu jsou přesunuty na externí kartu a nezatěžují hlavní procesor. Další výhodou je bezpečnost certifikátu. Ve chvíli, kdy dojde ke kompromitaci serveru, není možné získat soukromou část certifikátu a např. přesměrovat provoz na jiný server a útočník není schopný podvrhnout identitu serveru -- samozřejmě je zapotřebí dostatečně rychle zjistit, že došlo ke kompromitaci serveru.

Pro účely DNSSEC budeme využívat obě výhody této karty. Pro podepisování zóny se dnes používá algoritmus RSASHA1. Karta SCA6000 je schopná podepsat 15000 RSA 1024b signatur za sekundu. Vzhledem k velikosti zónového souboru (počet domén v zóně .cz je skoro 450 tisíc) je zrychlení, které tato karta umožňuje již velmi výrazné. (Pozn.: Do celkového času na podepsání zóny je zapotřebí započítat i další faktory jako je setřídění zónového souboru, výpočet SHA1 hašů atd.) Také je samozřejmě zapotřebí zajistit, aby v případě napadnutí server nebyl útočník schopen zcizit privátní část DNSSEC klíče.

Cryptographic Acceleration with PCI-Express Performance

Další informace o kartě a její dokumentaci nalezneme na stránkách výrobce: Dokumentace SCA6000

Instalace

Nejprve je potřeba stáhnout ovladače Accelerator 6000 1.1 General Availability

# mkdir sun_crypto_acc_6000_1_1  
# cd sun_crypto_acc_6000_1_1  
# unzip_crypto_acc_6000_1_1_solaris  
# ./install

Inicializace

Spuštění scamgr Více informací k inicializaci karty lze nalézt v dokumentaci.

Použití s PKCS11

SCA6000 karta je zaregistrována v Kryptografickém frameworku systému Solaris jako hardwarový poskytovatel. Kryptografický framework systému Solaris poskytuje sdílenou PKCS#11 knihovnu, přes kterou je možné na SCA6000 kartu přistupovat. Standardní místo této knihovny na systému Solaris SPARC je v /usr/lib/ pro 32-bitovou architekturu a /usr/lib/sparcv9/ pro 64-bitovou architekturu.

Nástroj scamgr váš při prvním spuštění požádá o vytvoření účtu pro bezpečnostního správce klíčenky (Keystore Security Office - KSO). Tento bezpečnostní správce klíčenky nemá nic společného s bezpečnostním správcem PKCS#11 a nemůže se vůči kartě autentizovat přes PKCS#11 rozhraní.

V průběhu inicializace klíčenky budete také požádáni o název klíčenky. Tento název klíčenky je použit jako popis slotu (slot description) a název tokenu (token label) pro slot klíčenky.

Bezpečnostní správce klíčenky může po inicializaci klíčenky vytvořit jednoho nebo více uživatelů pomocí nástroje scamgr. Uživatelé vytvoření bezpečnostním správcem klíčenky se můžou autentizovat vůči klíčence přes PKCS#11 rozhraní. Protože PKCS#11 bylo navrženo pro jednouživatelský systém, funkce C_Login nemá parametr uživatelské jméno. Pro odlišení uživatelů je zapotřebí v parametru PIN použít speciální tvar uživatelské_jméno:heslo. Například pokud je heslo uživatele webserv nastaveno na abc123, tak použitý pin pro PKCS#11 funkci C_Login bude vypadat takto: websrv:abc123.

Vytvoření nové klíčenky

# scamgr
Select Keystore:  
1. Create new keystore  
2. Load keystore from backup  

Selection (0 to exit)-> 1  
Non-FIPS Keystore Name: TEST  
Keystore type ([L]ocal/[C]entralized) [Local]:  
Initial Security Officer Name: admin01  
Initial Security Officer Password:  
Confirm password:  

Keystore creation parameters:  
----------------------------------------------------------------
Keystore Name: TEST  
Keystore Type: Local  
Initial Security Officer Name: admin01  
Run in FIPS 140-2 Mode: No  
----------------------------------------------------------------  

Is this correct? (Y/Yes/N/No) [No]: yes  
Creating keystore...  
TEST.601670.{d89f44fd} successfully created.  
Security Officer Login: admin01  
Security Officer Password:  
scamgr{mca0@localhost, admin01}> create user  
New user name: user1  
Enter new user password: pass1  
Confirm password: pass1  
User test created successfully.  

scamgr{mca0@localhost, admin01}> quit

Instalace OpenSC

Nástroje ldns vyžadují pro kompilaci a správnou funkci některé knihovny z projektu OpenSC. Proto jako předpoklad pro další práci musíme stáhnout, zkompilovat a nainstalovat tyto knihovny ze stránek projektu OpenSC.

Pozn.: Všechny externí instalované aplikace budeme instalovat do /root/apps/. Umístění, které si zvolíte na vašem systému, je čistě na vás. Instalace do /root/apps/ je pouze příklad.

Stáhnutí zdrojových kódů

# cd /root/apps  
# wget http://www.opensc-project.org/files/opensc/opensc-0.11.4.tar.gz  
# gtar xvfz opensc-0.11.4.tar.gz  
# cd opensc-0.11.4

Úprava zdrojových kódů

Důležité: Ve funkci static int gen_keypair(...) provest nahradu CK_ATTRIBUTE publicKeyTemplate[20] a CK_ATTRIBUTE privateKeyTemplate[20] Tato záměna umožní použít pkcs11-tool k vygenerování klíču v keystoru na Sun Crypto Accelerator 6000

# vim src/tools/pkcs11-tool.c  

        CK_ATTRIBUTE publicKeyTemplate[20] = {  
                {CKA_CLASS, &pubkey_class, sizeof(pubkey_class)},  
                {CKA_TOKEN, &_true, sizeof(_true)},  
                {CKA_ENCRYPT, &_true, sizeof(_true)},  
                {CKA_VERIFY, &_true, sizeof(_true)},  
                {CKA_WRAP, &_true, sizeof(_true)},  
                {CKA_MODULUS_BITS, &modulusBits, sizeof(modulusBits)},  
                {CKA_PUBLIC_EXPONENT, publicExponent, sizeof(publicExponent)}  
        };  
        int n_pubkey_attr = 7;  
        CK_ATTRIBUTE privateKeyTemplate[20] = {  
                {CKA_CLASS, &privkey_class, sizeof(privkey_class)},  
                {CKA_TOKEN, &_true, sizeof(_true)},  
                {CKA_PRIVATE, &_true, sizeof(_true)},  
                {CKA_SENSITIVE, &_true, sizeof(_true)},  
                {CKA_DECRYPT, &_true, sizeof(_true)},  
                {CKA_SIGN, &_true, sizeof(_true)},  
                {CKA_UNWRAP, &_true, sizeof(_true)}  
        };  
        int n_privkey_attr = 7;

Kompilace a instalace

Pozn.: Pro kompilaci většiny zdrojových kódů open source projektů je lepší použít GNU Make -- tedy místo příkazu make použít příkaz gmake.

# ./configure  
# gmake  
# gmake install

Použití

Pro podepisování zóny budeme potřebovat nejméně jeden RSA klíč vytvořený na kartě. V následujících příkladech si ukážeme základy používání PKCS#11.

Výpis slotů

Příkazem --list-slots je možné si vypsat všechny sloty na kartě. Teoreticky je možné kartu používat pro více účelů (např. v jednom slotu mít klíče pro podepisování zóny pomocí DNSSEC, ve druhém certifikáty pro provoz HTTPS serveru a ve třetím kvalifikovaný certifikát elektronické značky pro podpis emailových zpráv), prakticky je lépe mít tyto služby odděleně.

# pkcs11-tool --module /usr/lib/libpkcs11.so --list-slots  
Available slots:  
Slot 0           Sun Metaslot  
  token label:   Sun Metaslot  
  token manuf:   Sun Microsystems, Inc.  
  token model:   1.0  
  token flags:   rng, login required, PIN initialized, token initialized, other flags=0x80200  
  serial num  :  
Slot 1           TEST  
  token label:   TEST  
  token manuf:   SUNWmca  
  token model:   sca6000  
  token flags:   rng, login required, PIN initialized, token initialized, other flags=0x400000  
  serial num  :

Vygenerování klíče do nového keystore

Abychom mohli podepisovat zóny je zapotřebí vytvořit nový klíč. Následujícím příkaze vytvoříme ve slotu 1 RSA klíč o délce 1024 bitů, který bude mít ID 1 a název TEST_KEY. ID nebo název klíče je možné použít pro další identifikaci.

# pkcs11-tool --module /usr/lib/libpkcs11.so --login --keypairgen --key-type rsa:1024 --id 1 --label TEST_KEY --slot 1  
Key pair generated:  
Private Key Object; RSA  
  label:      TEST_KEY  
  ID:         01  
  Usage:      decrypt, sign, unwrap  
Public Key Object; RSA 1024 bits  
  label:      TEST_KEY  
  ID:         01  
  Usage:      encrypt, verify, wrap

Výpis objektů ve slotu

# pkcs11-tool --module /usr/lib/libpkcs11.so --login  --slot 1 --list-objects  
Please enter User PIN:  
Public Key Object; RSA 1024 bits  
  label:      TEST_KEY  
  ID:         01  
  Usage:      encrypt, verify, wrap  
Private Key Object; RSA  
  label:      TEST_KEY  
  ID:         01  
  Usage:      decrypt, sign, unwrap

Instalace PKCS11 Engine

Pro použití karty v OpenSSL je nutné nainstalovat engine PKCS#11 pro OpenSSL. Tento přídavný modul (engine) je následně možné použít pro práci s některými funkcemi OpenSSL (především pak EVP funkce).

Instalace

# cd /root/apps  
# wget http://www.opensc-project.org/files/engine_pkcs11/engine_pkcs11-0.1.4.tar.gz  
# wget http://www.opensc-project.org/files/libp11/libp11-0.2.3.tar.gz  
# gtar xvfz libp11-0.2.3.tar.gz  
# cd libp11-0.2.3  
# ./configure --with-openssl=/opt/csw --with-ltdl-prefix=/opt/csw  
# gmake  

# cd ..  
# gtar xvfz engine_pkcs11-0.1.4.tar.gz  
# cd engine_pkcs11-0.1.4  
# export LIBP11_LIBS="-L/root/apps/libp11-0.2.3/src/.libs/ -lp11"  
# export LIBP11_CFLAGS="-I/root/apps/libp11-0.2.3/src"  
# ./configure --with-ssl=/opt/csw  
# gmake  
# gmake install

Použití

Více viz. http://www.opensc-project.org/engine_pkcs11/wiki/QuickStart

Důležité: V příkladu na stránkách projektu OpenSC se předpokládá použítí na Linuxu a použití PKCS#11 knihovny libp11. Na systému Solaris 10 bude místo knihovny /usr/lib/opensc-pkcs11.so použita standardní systémová knihovna /usr/lib/libpkcs11.so.

Vytvoření konfiguračního souboru

Abychom nemuseli vypisovat všechny parametry pokaždé ručně, je možné vytvořit pro OpenSSL konfigurační soubor. Tento konfigurační soubor je také zapotřebí ve chvíli, kdy je knihovna OpenSSL používána dalšími aplikacemi, které nutně nemusí mít možnost předávat OpenSSL všechny potřebné parametry pro použití PKCS#11 knihovny.

/root/apps/openssl.cnf  

openssl_conf = openssl_def  

[openssl_def]  
engines = engine_section  

[engine_section]  
pkcs11 = pkcs11_section  

[pkcs11_section]  
engine_id = pkcs11  
dynamic_path = /root/apps/engine_pkcs11-0.1.4/src/.libs/engine_pkcs11.so'  
MODULE_PATH = /usr/lib/libpkcs11.so  
#PIN =  

[req]  
distinguished_name = req_distinguished_name  

[req_distinguished_name]

Příklad vygenerování žádosti certifikátu

Pozn.: Tento příklad je zde pouze pro ukázku použití PKCS#11 knihovny v OpenSSL a pro samotnou funkci podepisování zónového souboru není zapotřebí.

 # openssl req -config /root/apps/openssl.cnf -engine pkcs11 -new -key slot_1-id_1 -keyform engine -out req.pem -text -x509 -subj "/CN=TEST"  
engine "pkcs11" set.  
PKCS#11 token PIN:

Příklad podepsání žádosti certifikátu

Pozn.: Tento příklad je zde pouze pro ukázku použití PKCS#11 knihovny v OpenSSL a pro samotnou funkci podepisování zónového souboru není zapotřebí.

Pozn.: x509 nemá konfigurační volbu "-config", takže musíme změnit standardní openssl.cnf soubor:

# cp /opt/csw/ssl/openssl.cnf /opt/csw/ssl/openssl.cnf.orig  
# cp /root/apps/openssl.cnf /opt/csw/ssl/openssl.cnf  

# openssl x509 -engine pkcs11 -signkey slot_1-id_1 -keyform engine -in req.pem -out cert.pem  
engine "pkcs11" set.  
PKCS#11 token PIN:

Instalace ldns

Pro podepisování použijeme nástroje obsažené v balíku ldns. ldns je sada nástrojů pro práci se zónovými soubory, DNS a DNSSECem (od verze 1.3.0 včetně NSEC3).

Instalace

Instalace sdílených knihoven

# cd /root/apps  
# wget [http://www.nlnetlabs.nl/downloads/ldns-1.3.0.tar.gz](http://www.nlnetlabs.nl/downloads/ldns-1.3.0.tar.gz)  
# gtar xvfz ldns-1.3.0.tar.gz  
# cd ldns-1.3.0 # ./configure --with-ssl=/opt/csw  
# gmake  
# gmake install }}}

Instalace nástrojů

Pozn.: Nezalekněte se adresáře examples/. Ve skutečnosti jsou tyto nástroje použitelné pro naše potřeby.

# cd /root/apps/ldns-1.3.0/examples  
# ./configure --with-ssl=/opt/csw --with-ldns=/opt/csw  
# gmake  
# gmake install

Instalace nástroje drill

Nástroj drill není pro samotné podepisování zóny potřebný, nicméně je velmi dobře použitelný pro ověřování DNSSECu a jako alternativa k dnes již klasickému nástroji

dig}} pocházejícího z dílen ISC (je součástí zdrojových kódu DNS serveru Bind 9).  

{{{  
# cd cd /root/apps/ldns-1.3.0/drill/  
# ./configure --with-ssl=/opt/csw --with-ldns=/opt/csw  
# gmake  
# gmake install  
# LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/opt/csw/lib ./drill

Použití

Podrobněji se použítím HSM zabývá dokument An introduction to the use of HSM, pro potřeby podepsání zónového souboru bude stačit pouze příklad použítí nástoje ldns-signzone. Parametr -o určuje tzv. Origin zónového souboru, tzn. o jakou doménu se jedná, v našem příkladě podepisujeme zónový soubor domény dnssec.cz. Parametrem -E říkáme, že použijeme engine pkcs11 (viz. konfigurační soubor OpenSSL). Parametr -k pak obsahuje identifikaci RSA klíče: 'Slot 1, Id 1' a použitý algoritmus. Nástroj ldns-signzone nemá přes OpenSSL rozhraní možnost poznat o jaký druh algoritmu klíče se jedná. Číslo 5 je pak identifikací algoritmu RSASHA1.

# OPENSSL_CONF=/root/apps/openssl.cnf ldns-signzone -o dnssec.cz -E pkcs11 -k slot_1-id_1,5 db.dnssec.cz  
[XX] Reading zone file  
Derived DNSKEY RR:  
cz.     3600    IN      DNSKEY  256 3 5  
AQOthtHfujfroH3xFkYVSOjmLcfiXxLMt2HkvEMKCp5x+7xzWQhCZHZQ2+7BsZxIIuqKXEUMuPbN  
x8l7ncqmnqgDpOOQwtS55ERE0U4rgQdwJTEm03VbncCqcvbaxylm/pgW5mmP2T4+7NaAXdfz3e  
/4n13vBG8lpZPrTMjsEGzOfQ== ;{id = 25334 (zsk), size = 1024b}  
#

Výsledná podepsaná zóna bude v souboru db.dnssec.cz.signed. Gratulujeme. Pokud jste se dostali až sem, tak jste podepsali svou první zónu pomocí HSM. (Pozn. úplně na konec. Pro experimenty s PKCS#11 není nutně zapotřebí hardwarová karta. PKCS#11 rozhraní přistupující k souborům na disku poskytuje projekt opencryptoki, který je možné provozovat na Linuxu.)