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.
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.)
