2016. május 31.

Titkosíts!

10 perc olvasási idő

Titkosíts!

Az utóbbi időben reflektorfénybe kerülő megfigyelési és lehallgatási botrányok nyomán egyre inkább terjed az a nézet, hogy titkosítani kell mindent. Legtöbbször az derül ki, hogy olyan mintha a különböző titkosszolgálati szerveknek korlátlan hatalmuk lenne, és az olyan nagy cégek, mint a Google vagy az Apple is áldozatul tudnak esni lehallgatásoknak. Másrészt a technológia fejlődésével és térnyerésével egyre nagyobb erőforrás és eszközpark áll a különböző hackerek kezében, hogy személyes adatainkat megszerezzék. Főként igaz ez olyan oldalakon, ahol érzékeny adatokat is adunk meg, mint pl. bankkártyaszámot.

Erre a problémára nyújt megoldást a webszerverekbe építhető SSL tanúsítvány. Az alap http protokoll alapvetően titkosítás nélkül, plain-text formában küldi és fogadja az adatokat. Ennek a titkosított verziója a https protokoll, ahol magát a kommunikációs csatornát titkosítjuk a tanúsítványokkal, melyekben legalább egy 2048 bit hosszú kulcspár és a tanúsítvány egyéb adatai pl. aláírója és kibocsájtója biztosítja a kommunikáció megbízhatóságát és nehezített lehallgatását. Nem utolsó sorban a Google is szereti a titkosított weblapokat, keresési találatban előrébb helyezi az tanúsítvánnyal rendelkező honlapokat. Általában ezért a különböző tanúsítványkibocsájtó cégek elég tetemes, akár több száz dollárt is elkérhetnek, cserébe biztosítás jár melléjük.

Let's Encrypt

Ez a kérdéskör vezette az Internet Security Research Group (ISRG) non-profit szervezetet, hogy létrehozza a Let's Encrypt projektet, jó pár nagy és neves IT cég szponzorálásában. Az ISRG célja, hogy ledöntse a technikai, pénzügyi, oktatásbeli akadályokat, melyek nehezítik a biztonságos kommunikációt az interneten. Ennek az eszmének teljes mértékben megfelel a Let's Encrypt projekt, melynek célja, hogy nyílt, a közösség által épített rendszeren keresztül bárki számára ingyenes tanúsítványokat állítson ki, és azok bárki számára visszaellenőrizhetőek legyenek.

Az fps-nél már egy bő hónapja használunk ilyen SSL certificate-eket, egy két helyen már éles körülmények között is. A rendszer 2016. április 12-én lépett ki a béta státuszból, így már lehet használni production környezetben is. Annak ellenére, hogy új tanúsítványkibocsájtók, jó kompatibilitási tulajdonságokkal rendelkeznek, gyakorlatilag mindenféle platform és böngésző támogatja, amit az elmúlt 5-6 évben adtak ki.

Két nagy előnye van a rendszernek az egyéb ingyenes tanúsítványkibocsájtókkal szemben. Egyrészt mindenféle komolyabb regisztrációs folyamat nélkül lehet igényelni, másrészt a certificate-ek igénylésére, megújítására, visszavonására kész programot, Certbot, biztosít az ISRG. A program szabadon letölthető GitHubról.

Van azonban néhány korlátozása a rendszernek. Egyrészt csak domain alapú rendszerekhez, tipikusan web és levelezőszerverekhez használhatóak a kiállított tanúsítványok, másrészt a kiállított tanúsítványok mindössze 90 napra szólnak, ezzel biztosítva, hogy ha még is ellopnak egy kulcsot, vagy az sérül, hamar inaktívvá válik különösebb beavatkozás nélkül. Fontos szem előtt tartani, hogy nincs wildcard certificate kiállítás, nem korlátlanul kapunk tanúsítványokat, viszont enged összefűzni 100 darab domaint egyetlen certificate alá.

A Certbot, ami kezeli a megújításokat, alapvetően Linux és Unix alapú operációs rendszerekkel működik együtt, és az azokon fellelhető webszervekkel. A tanúsítványok kezeléséhez az ACME protokolt használja. Alapesetben egy saját webszervert indít a program a szabvány 80-as porton, amin keresztül megy a domain validálás, ám ez nem járható út egy éles rendszeren.

Éles rendszereknél az Apache webszervert támogatja stabilan, de készül az NginX támogatás is, ami még nem stabil. Egyéb webszerver esetén létezik egy webroot funkció, melyet megadva a validációs fájlt a program egy megadott könyvtárban helyezi el, és ezt ellenőrzi vissza a rendszer.

Hogyan automatizáld a megújítást?

NginX esetén lehet egy ügyes, pár soros kis include-ot csinálni, melyet akármelyik server definícióba betöltve ki lehet szolgálni az összes ilyen domain validációs kérést:


location ~ /.well-known {
   allow all;
   root /var/www/letsencrypt;
}

Így a következő paranccsal tudsz tanúsítványt igényelni:


certbot-auto certonly -a webroot --webroot-path=/var/www/letsencrypt/ -d example.com -d www.example.com -d example.hu -d www.example.hu

A certbot-auto renew paranccsal meg az összes, a szerveren létrehozott Let's Encrypt tanúsítványt lehet megújítja. Figyelni kell azonban, hogy lejárat előtt maximum 30 nappal korábban lehet megújítani, így célszerű a cron folyamatot úgy időzíteni, hogy kb. 15 naponta fusson le, nehogy kicsússz az érvényességi időből.

Ezt követően már csak egy sima SSL server, vagy vhost blokkot kell csinálni, mint bármilyen más esetben, és működik is a friss ingyenes tanúsítványod, pl így:


server {
        listen 443;
        server_name www.example.com;

        ssl on;
        ssl_certificate /etc/letsencrypt/live/www.example.com/fullchain.pem;
        ssl_certificate_key /etc/letsencrypt/live/www.example.com/privkey.pem;

        ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
        ssl_prefer_server_ciphers on;
        ssl_dhparam /etc/nginx/dhparam.pem;
        ssl_ciphers 'ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA';
        ssl_session_timeout 1d;
        ssl_session_cache shared:SSL:50m;
        ssl_stapling on;
        ssl_stapling_verify on;
        add_header Strict-Transport-Security "max-age=15768000;";
        add_header X-Content-Type-Options nosniff;
        add_header X-Frame-Options "SAMEORIGIN";
        add_header X-XSS-Protection "1; mode=block";
        add_header X-Robots-Tag none;
        add_header X-Download-Options noopen;
        add_header X-Permitted-Cross-Domain-Policies none;

        root /var/www/html;
}

Tar Péter

IT Architect. Több mint 10 éve dolgozik üzemeltetési területen, főként Linux szerverek üzemeltetésével. Hobbi szinten kb 10 éve foglalkozik fejlesztéssel. Területei: Linux, webszerverek, biztonság.

Tar Péter

Hozzászólások