PKI ratkaisun rakenne

Ennen kuin aloin sub CA:n kanssa työstämään ihan mahdottomasti, mietin hetken systeemin rakennetta.

Palvelin näkökulmaPKI ratkaisun rakenne

5 palvelinta:

– Juuri CA pääasiassa sammuksissa

– CRL palvelin, jonne kaikki CA:t julkaisee CRL:nsä. Tämä on normaali WEB palvelin.

– Sub CA, päällä oleva CA, jota voidaan käyttää varmenteiden allekirjoittamiseen

– RA palvelin, CA:n suoja, tähän loppukäyttäjät ottaa yhteyttä anoakseen varmenteita

– OCSP palvelin, tämä on CRL:lle rinnakkainen palvelu, se kertoo yksittäisen varmenteen statuksen pyydettäessä.

En vaivaudu rakentamaan RA:ta. Olen itse ainut systeemini asiakas. Se tarkoittaa että vain kolme palvelinta tarvii olla päällä. Todellisuudessa CRL ja OCSP mahtuu hyvin samalle koneelle, joten DNS aliaksia kehiin vaan. Näin saadaan aikaan että lopulta tarvitaan vain 2 konetta, sub CA ja hylkäysdataa ylläpitävä palvelin. Sub CA:n tulisi sijaita verkon syvimmässä nurkassa, karmean suojauksen takana, mutta valitettavasti sisäverkkoni on lättänä tällä hetkellä – asia mikä pitää korjata jossain vaiheessa. Kotikäytössä lopulta kaikki roolit voisivat olla samalla koneella…

PKI hierarkia

Luonnollisesti systeemissä on läjäpäin allekirjoitettuja varmenteita. Niiden luottorakenne menee näin.

PKI ratkaisun allekirjoitukset

Tästä rakenteesta meillä on toteutettuna jo Root CA ja sub CA. Seuraavaksi kartoitin mitä varmenteita tulen myöntämään sub CA:lta. Ilmiselviä on

  • OCSP varmenne
  • SSL palvelimen varmenne
  • SSL asiakkaan varmenne

tällä pohjalla päästään varmasti eteenpäin, joten seuraavaksi Sub CA:n konfiguroiminen.

OpenSSL ja CA:n luominen

Netistä saa metsästää oikein urakalla, että saa tarvittavat palaset CA:n luomiseen OpenSSL:llä. Peruspaketista löytyy kyllä CA:n konffis, mutta se on mielestäni ihan päin mäntyä. Minä tein CA:n omien tietämysteni ja CA/B forumin ohjeisiin pohjaten. Tällä päästään ratkaisuun, jonka pitäisi kantaa pitkälle.

Mietittävää

Avaimen koko: 1024 ei ole enää suositeltu CA:n avaimen koko (ref:NIST 800-57, part 3), 2048 riittää nykytietämyksen mukaan, 4096 on “varma”
Avaimen salasana: kaksi piippuinen juttu. Täysin automatisoitua CRL:n luontia varten salasana pitää syöttää skripteihin, joten kotionline CA:n avainta ei ehkä kannata salata. Toisaalta jos salasanaan menee, oleellista on valittu salausalgoritmi ja salasanan pituus. AES-128 bittinen vaatii kaveriksieen 23 merkkiä pitkän salasanan (a-z,A-Z,0-9 aakkosto), jotta salasana olisi yhtä vahva kuin  algoritmi. 25 vuotta voimassa oleva avain kaipaa järeämpää salausta ja vastaavasti useita kymmeniä merkkejä pitkän salasanan.
Allekirjoitusalgoritmi: MD5 on heikko, eikä suositeltava. SHA1 on yhtä vahva kuin 1024 bittinen avain. SHA256 on 2048:n kanssa oikea pari. Huomioitavaa on että SHA256 ei ole kaikkien vempainten tukema. Esimerkiksi 2010 vuoden Tomato firmwaressa oleva OpenVPN ei tue SHA256:sta. Vanhat älypuhelimet, eivät välttämättä tue ja näin lista jatkuu.

Nämä asiat kun on mietittynä lähdetään CA:n luontiin.

Pohjatyöt

Tarvitsemme OpenSSL:n  valitsemallemme käyttikselle. Linuxien tapauksessa pakettienhallinnasta löytyy, Windowsin tapauksesta täältä löytyy.
Seuraavanlainen hakemisto rakenne on tarpeen

/LeivoCA 
  |-/certs 
  |-/newcerts 
  |-/crl 
  |-/private

CA:n juurihakemistosta (/LeivoCA) pitää löytyä seuraavat tiedostot

index.txt 
index.txt.attr 
serial (tämän tiedoston sisältä pitää löytyä sarjanumero hex-muodossa, joten laita sinne vaikka 01) 
crlnumber (tämän tiedoston sisältä pitää löytyä sarjanumero hex-muodossa, joten laita sinne 00)

Hakemistoihin oikat pitää rajata hyvin hyvin tiukaksi. Root tai Administrator pääsy on ainut hyväksyttävä pääsy, jos kokee että CA:ta tulee ajaa jollain muulla tunnuksella, sille tarpeelliset oikat. Näiden käyttäjien oikeuksien lisäksi mitään muita oikeuksia hakemistoihin ei tule olla.

Konfiguraatiotiedosto

Tässä on konffitiedosto paloiteltuna osiin. Tämä konfiguraatiotiedosto on tarkoitettu vain juuriCA:lle. Varsinaisen tiedoston löydät täältä.

Tässä osuudessa määritellään kotihakemisto ja tiedostojen sijainti. Korjaa hakemistot täsmäämään tarpeisiisi.

# 
# OpenSSL configuration for Leivo Root 
#
# This definition stops the following lines choking if HOME isn't 
# defined. 
HOME            = . 
RANDFILE        = $ENV::HOME/.rnd
#################################################################### 
[ ca ] 
default_ca    = Leivo_Root        # The default ca section
############################# Defining CA ###################################### 
[ Leivo_Root ]
dir        = d:/temp/testCA    # Where everything is kept 
certs        = $dir/certs        # Where the issued certs are kept 
crl_dir        = $dir/crl        # Where the issued crl are kept 
database    = $dir/index.txt    # database index file. 
new_certs_dir    = $dir/newcerts        # default place for new certs.
certificate    = $dir/Leivo_Root.pem    # The CA certificate 
serial        = $dir/serial         # The current serial number 
crlnumber    = $dir/crlnumber    # the current crl number 
crl        = $dir/crl.pem         # The current CRL 
private_key    = $dir/private/root-ca.key # The private key 
RANDFILE    = $dir/private/.rand    # private random number file 
string_mask    = utf8only

######################## End of defining CA ####################################

Tässä osuudessa määritellään yleisesti ottaen varmenteen allekirjoittamiseen liittyvät palaset. Laajennukset, nimeämiskäytännöt, CRL voimassaolo aika, allekirjoitusalgoritmi.

#################### Defining certificate signing ############################## 
x509_extensions    = v3_ca        # The extentions to add to the cert 
name_opt     = ca_default        # Subject Name options 
cert_opt     = ca_default        # Certificate field options
crl_extensions    = crl_ext
default_days    = 3650            # how long to certify for 
default_crl_days= 365             # how long before next CRL 
default_md    = sha256        # use public key default MD 
preserve    = no            # keep passed DN ordering
policy        = policy_match
# For the CA policy 
[ policy_match ] 
countryName        = match 
organizationName    = match 
commonName        = supplied 
emailAddress               = optional

################## End of defining certificate signing #########################

Tämän osuuden jälkeen määritellään laajennukset. Tässä tulee se varsinainen pihvi varmenteille.

v3_ca_root –osuus määrittelee juurivarmenteen. Olen rajannut juuren alla olevien CA:n määrän yhteen (pathlen:1)

v3_ca –osuus on subCA:lle tarkoitettu osuus.  Pathlen on 0, sillä subCA:lla ei voi alla olevia CA:ta. SubCA:lle on myös määritelty CRL, mikä on juuriCA:n CRL.

[ crl_ext ] 
  authorityKeyIdentifier    = keyid:always
[ v3_ca_root ] 
  subjectKeyIdentifier        = hash 
  authorityKeyIdentifier    = keyid:always,issuer 
  basicConstraints         = CA:true, pathlen:1 
  keyUsage             = cRLSign, keyCertSign, digitalSignature
[ v3_ca ] 
  subjectKeyIdentifier        = hash 
  authorityKeyIdentifier    = keyid:always,issuer 
  basicConstraints         = critical, CA:true, pathlen:0 
  crlDistributionPoints     = URI:http://crl.leivo.org/Rootca-crl.pem
########################### Basic SSL request ################################## 
[ req ] 
  default_bits        = 2048 
  default_keyfile     = privkey.pem 
  distinguished_name    = req_distinguished_name 
  req_extensions    = extensions 
  string_mask        = utf8only
[ req_distinguished_name ] 
countryName            = Country Name (2 letter code) 
countryName_default        = FI 
countryName_min            = 2 
countryName_max            = 2
0.organizationName        = Organization Name (eg, company) 
0.organizationName_default    = Leivo.org
# get the DN name for the certificate 
commonName            = Server FQDN 
commonName_max            = 64
[ extensions ] 
  subjectKeyIdentifier        = hash 
  basicConstraints         = critical,CA:true, pathlen:0 
  keyUsage             = cRLSign, keyCertSign, digitalSignature

######################### End basic SSL request ################################

Juuren, sub:n ja CRL:n luonti

Juuren avaimen luonti

openssl genrsa -aes256 -out testCA\private\root-ca.key 4096

Juuren itse itsensä allekirjoittaminen

openssl req -new -x509 -days 9125 -key testCA\private\root-ca.key -out testCA\Leivo_Root.pem -extensions v3_ca_root -sha256 -config testca.cnf

CRL:n luominen

openssl ca -config testca.cnf -gencrl -out testCA\crl\Rootca-crl.pem

SubCA:n luonti

openssl req -out subca.csr -pubkey -new -keyout subca.key -config testca.cnf

SubCA:n allekirjoittaminen

openssl ca -config testca.cnf -extensions v3_ca -out subca.crt -infiles subca.csr

Juuren sammuttaminen

Lopuksi kopioidaan koneelta ulos

  • Leivo_Root.pem (JuuriCA:n varmenne)
  • Rootca-crl.pem (JuuriCA:n CRL)
  • subca.key (SubCA:n privaattiavain, TÄMÄ SIIRRETÄÄN, ei kopioida!)
  • subca.crt (SubCA:n varmenne)

Ja näin, iso työ on tehty. Seuraavaksi subCA:n konffaus, ensimmäiset SSL varmenteet, automaattinen CRL julkaisu ja muu työ.

Kunnon kotiverkon alkupiste on oma CA

Työni Nokialla on vienyt minut syvälle, syvälle PKI ihmeelliseen maailmaan. Nyt kun kenkäisin kotiprojektit käyntiin katsoin omaa varmennetoteutustani. Käytän varmenteita OpenVPN:n kanssa. Käytän varmenteita Slicen ja Home serverin HTTPS yhteyksissä. Käytän “kaupallista” varmennetta Slicen kanssa ja Home serverin kanssa käytin mitä Microsoft näki hyväksi asentaa koneelle. Tuohan on surullista mieheltä, jonka päivätyössä vuosia säädettiin varmenteita. Niinpä käärin hihat ja aloitin Leivo.org PKI järjestelmän miettimisen.

Luonnollisesti sen tulisi olla vähintään 2 tasoinen. Yksi sammuksissa oleva juuriCA, jonka CRL olisi voimassa vuoden kerrallaan. Juuren alla olisi 1-3 käynnissä olevaa CA:ta, jotka julkaisevat CRL:n joka olkoon voimassa 3 vuorokautta kerrallaan. Täysin tolkullinen kotikäyttöön tarkoitettu pikku hierarkia. Haluan tehdä tämän mahdollisimman helposti ja lähelle minun näkemystä oikeasta. Valitsin työkalukseni OpenSSL:n, sillä siitä minulla on aikaisempaakin kokemusta. Heti tämän valinnan jälkeen törmäsin nimeämisongelmaan, miten nimeän CA:ni ja vielä tärkeämmin miten nimeän koneet joita tästä syntyy? Kehitin ongelman ratkaisuksi nimeämiskäytännön, josta blogimerkintä löytyykin. Sitten aloin ajattelemaan eri rooleja eri CA:lle… Tässä kohtaa mieleeni tuli KISS (Keep It Simple Stupid). Jos rehellisiä ollaan, selviän varmaan vain kahdella käynnissä olevalla CA:lla. Yksi kappale OpenSSL:llä tehtyjä CA:ta, joka antaa palvelimien SSL ja  ja VPN:n tunnistusvarmenteet, sekä muita mahdollisia varmenteita, mitä en vielä ole kuvitellut. Toinen CA on Microsoft CA, joka on tiukasti kiinni AD:ssani jakaen laitevarmenteita, joilla mahdollistetaan kodin langattomaan verkkoon 802.1X tunnistautuminen ja myöhemmin kotiverkon NAC.  Tästä luonnollisesti päästään RADIUS palvelin tarpeisiin, mutta siitäkin myöhemmin. Tärkeintä on että olen nyt päässyt ymmärrykseen, että tarvitsen vain kolme CA:ta kotiverkkoani varten.

JuuriCA – Leivo Root CA

Alkuspeksit CA:lle oli nämä:

  • Voimassa 25 vuotta
  • 4096 bittinen avain
  • SHA256 allekirjoitus algoritmi
  • CRL on voimassa vuoden kerrallaan

JuuriCA on kaiken ankkuri ja se mitä firma/yksilö haluaa eniten suojata. Sen avulla voidaan allekirjoittaa muita CA:ta, joilla taasen voidaan allekirjoittaa mitä vaan ja luottamusketju säilyy. HSM olisi se oikea tapa mennä, mutta ne maksavat vähän liikaa näinkin vakavaan kotikäyttöön Smile. Näin ollen on aika virittää tinahattu päähän ja miettiä mitä vähillä varoilla voidaan tehdä avaimen suojaamiseksi.

Kyseessä on lähes vuoden kerrallaan sammuksissa oleva laite/ohjelmisto (CRL oli voimassa vuoden). Kyseinen CA on täysin verkoton, se ei tarvitse nettiä mihinkään. Tässä pikaresepti oman juuriCA:n rakentamiseen – käyn konfiguraatiotiedostot eri kirjoituksessa läpi.

  1. Polta valitsemasi Linux distribuutio levylle (oma valintani Ubuntu 12.04 LTS)
  2. Asenna Linux koneelle, mikä on täysin irti kaikista tietoverkoista
  3. Valmistele itsellesi osoite missä CRL voi levätä (esim. http://crl.leivo.org/Rootca-crl.pem)
  4. Asenna ja konfiguroi OpenSSL
  5. Tee avain, varmenne ja ensimmäinen CRL
  6. Polta varmenne ja CRL CD:lle. (Tinahattu HUOM. USB tikkuja ei voi käyttää, sillä ne ovat RW mediaa ja voivat sisältää vaikka mitä.)
  7. Turvaa CA (Tinahattu temppu! Kotikäytössä tämä temppu on ehkä inan verran yliampuva…)

 

a) Polta CA:n hakemistosta DVD ja laita kone tai kovalevy sekä DVD turvalliseen talteen (Tinahattu HUOM. turvapussit luovat luotettavuutta käytettäessä logeja sekä useita varmistavia henkilöitä)

 

b) Polta kaksi DVD:ta CA:n hakemistosta ja laita DVD:t turvalliseen talteen. Aja boot & nuke muutamalla kerralla satunnaista ylikirjoitusta koneen kovalevylle (ref. Gutmann method). Nyt konetta levyineen voidaan käyttää uudelleen muihin tarkoituksiin.

Luonnollisesti vaihtoehdossa B pitää aina asentaa uudestaan käyttöjärjestelmä ja OpenSSL kun pitää allekirjoittaa uusi CA tai uusi CRL, mutta toisaalta se ratkaisu ei ole laitesidottu (Tinahattu HUOM. vikasietoisuus! \o/)

Ja näin minulla on ensimmäinen palvelin läjästä palvelimia suunniteltuna.

Nimeämiskäytäntö

Säätämisen myötä tulen asentelemaan paljon koneita ja aikaisemmasta kokemuksesta tiesin, että hyvin nopeasti jään jumiin palvelimien nimiin. Tästä on syytä päästä ohi nopeasti, joten otin apuihin työkokemukseni.

Palvelimien nimeämiskäytäntö

  1. Nimet tulee olla määrämittaisia. Olkoon mitta 10 merkkiä
  2. Nimistä tulee selvitä palvelimen sijainti. Olkoon 2 ensimmäistä kirjainta kaupungin 2 kirjainta (esimerkiksi TU = Turku)
  3. Nimestä tulee selvitä onko palvelin fyysinen vai virtuaalinen. Olkoon yksin kirjain varattuna tähän. P = fyysinen, V = virtuaalinen
  4. Palvelimilla on käyttötarkoitus tai lempinimi, sen tulee selvitä nimestä. Olkoon kolme kirjainta varattuna tähän määritykseen. (esimerkiksi ESX = VMware ESX palvelin)
  5. Palvelimia on kahta mallia, kehityskoneet ja tuotantokoneet, laadunvarmistus jääköön väliin tässä kevyessä kotirakennelmassa. Olkoon yksi kirjain varattuna tähän. P = tuotanto, D = testi/kehitys
  6. Palvelimia saattaa olla useita samaa tarkoitusta varten tai uudelleenasennettuna monta kertaa. On hienoa tietää montako kertaa tämäkin on tullut tehtyä. Olkoon kolme viimeistä numeroa juokseva “versionumero”.

Näin saamme VMware ESX palvelimilleni nimet TUPESXP001 ja TUPESXP002.

Hyvin nopeasti tulen törmäämään tilanteeseen, jossa minulla on useita eri käyttäjätilejä hallittavana, tämä tulee olemaan ongelma. Kehitin tähänkin työkalun

Käyttäjätilien nimeämiskäytäntö

Tilin nimen mitta on satunnainen. Tilin nimi muodostuu käyttäjän etunimen ensimmäisestä kirjaimesta ja sukunimestä yhdistettynä. Sikäli tulee törmäystilanne, uudemmat tilit nimetään lisäämällä .X missä X on juokseva numero. Esimerkiksi minun tili on jleivo

Sikäli käyttäjän tili on ylläpitotili tulee käyttäjän tilin nimen eteen tulee lisätä _. Esimerkiksi minun ylläpitotilin on _jleivo.

CMDB

Tämä laitemäärä ja tilimäärä lähtee lapasesta kuin viritetty tossumopo minun käsistä kesäasvaltilla – Mies jää selälleen maahan ja ihmettelee mitä tapahtui. Ratkaisu tähän on CMDB. Valitettavasti kuuden (6) tunnin säätämisen ja kahden eri ilmaisen CMDB ohjelmiston jälkeen palasin käyttämään Exceliä. Se kelvatkoon toistaiseksi. Pystyn laajentamaaan sitä tarvittaessa. Se näyttää tältä:

Name Creation date Purpose Disposal date OS Last patching date Physical host Notes
               

Säätöalusta

Työpäivän jälkeen, istuessani auton takapenkillä matkalla kohti kotia, ajatus riivaa minua. Ajatus on oman pilven (owncloud) rakentaminen. Otan puhelimeni esiin, laitan sen 10” näytön sisälle, yhdistän sen näppäimistöön. Nyt kun minulla on pieni läppäri avaan VPN yhteyden kotiin, kirjaudun reitittimelle ja Home serverille. WOL käskyt liikkeelle ja TUPESXP001 herää henkiin. Home serverin kautta luon uuden Linux pohjaisen virtuaalikoneen aikaisemmin tekemäni Linuxpohjan avulla TUPESXP001:lle. Virtuaalikoneen bootattua pystyyn otan yhteyden siihen puhelimeni SSH ohjelmalla ja alan asentamaan. Turkuun päästyämme oma pilvi on pystyssä omassa sisäverkossani ja työpöytäohjelmisto on asennettua virtuaali Windows 7 koneelle (TUVW07D001). Olen tyytymätön, ohjelmiston versio Ubuntun repoissa oli vanha. Pitää käsin alkaa säätämään.

Viikko takaperin tein oikeasti noin. Puhelimeni on Asus Padfone. Kotini reititin on Buffalon WHR-G125, missä on Tomato firmware OpenVPN variaatiolla. Kellarissa lepää Atom pohjainen Microsoft Home Server, sekä 2 kappaletta räkkipalvelimia, nimeltään TUPESXP001 ja TUPESXP002. Näissä pyörii VMwaren ESXi ilmainen versio. Yläkerrassa nukkuu Nightmare, pääkoneeni – täysin valmiina palvelemaan jos tarve tulee. Tämä koko paketti mahdollistaa säätämisen mistä vain milloin vain ja tätä olen halunnut kauan. Nyt vain aika on säätämiseni rajoitteena.

Suunnitelmissani on lisätä laitteistoa ainakin parilla vanhalla läppärillä ja vähän muullakin raudalla. Home server pitää uusia, verkkolaitteisto on vanhaa…Kerron tästä myöhemmin

Mites vihreät arvot? – Ne on kovassa huudossa tässä taloudessa. Talossa aina hereillä on vain läjä verkkolaitteita netin ja sisäverkon ylläpitämiseen sekä Home server. Kaikki muut laitteet nukkuvat tai ovat sammuksissa ja herätän ne WOL:n avulla tarvittaessa.

Yksinkertaistettuna se näyttää tältä

Simple home

Mitä sä oikein teet tuolla?!

TyöpisteOtsikon mukainen kysymys on ollut vuosia riesanani. Kysymys yleensä tulee esiin hieman sen jälkeen kun henkilö on nähnyt sen hetken pääkoneeni. (kuva vieressä).

“Sä varmaan pelaat paljon” “Koodaat”… Itseasiassa en juurikaan pelaa, pelaan lähes ainoastaan MökkiLAN:lla. WoT on ensimmäinen peli vuosiin, jota pelaan merkittäviä määriä LANien ulkopuolella. En myöskään koodaa mitään kieltä. Osaan skriptata Windowsin komentorivikielellä, VBscriptillä sekä Linuxin bashilla. Mitä hittoa sitten oikein teen tällä koneella? Olen aikaisemmin vastannut “Säädän, säädän asioita”. Se on aikalailla kenraalitason vastaus. Täysin oikein ja täysin hyödytön. Nyt kun olen miettinyt asiaa enemmän, voisin sanoa että ratkon ongelmia kuten joku ratkoo sanaristikoita tai sudokuja, minä ratkon ongelmia. Mitä ongelmia? Mitä päähän pälkähtää. Saan idean tehdä jotain ja sen jälkeen alan tekemään. Tärkeintä on tekeminen ja ongelmien ratkominen, jonkin lopputuloksen aikaan saaminen, ei sen hyödyllisyys tai “järjellisyys”. Järjellisyys on suhteellista.

Nyt olen saanut säätöalustani sille tasolle mistä olen vuosia unelmoinut. Nyt ajattelin Epin inspiroimana alkaa kertomaan maailmalle mitä minä säädän.  Pyrin kirjoittamaan näitä aina säätöpäivän päätteeksi ja välillä vähän pahan päivän varalle.