Hvordan kombinere Ovirt og Let's Encrypt

NĂ„r jeg gikk veien mot Ă„ forbedre infrastrukturen, bestemte jeg meg for Ă„ lĂžse et gammelt og plagsomt problem – uten unĂždvendige bevegelser gi kollegene (utviklere, testere, administratorer, etc.) muligheten til Ă„ administrere sine virtuelle maskiner selv i ovirt. I ovirt er det flere komponenter som mĂ„ konfigureres for Ă„ lĂžse mitt problem: selve webgrensesnittet, noVNC-konsollen og opplasting av diskbilder.

Jeg fant ikke knappen "GjÞr det fett", sÄ jeg viser hvilke hÄndtak jeg snurte for Ä lÞse oppgaven. Full instruksjon under kat:

Hvordan integrere Ovirt og Let's Encrypt

FRASKRIVELSE:

FÞr jeg begynner, vil jeg pÄpeke at, av en eller annen ukjent grunn, opprettes domenene i infrastrukturen i private soner som lan, local, osv.

Hva som hindrer bruk av organisasjonens domene i offentlig sone er meg ukjent. For eksempel, i stedet for domenet Alex-GLuck-Awesome-Company.local, kan du trygt bruke domenet for selskapets nettside Alex-GLuck-Awesome-Company.com.

Hvis du er redd for at du ikke vil kunne holde styr pÄ domenene i organisasjonen din, og at dette kan Þdelegge noe, kan du for den beskjedne summen av 100 rubler per Är fÄ et eget domene for infrastrukturen aglac.com.

Hvorfor det er mer fordelaktig Ă„ bruke domener i offentlige soner:

1. Du fĂ„r tjenester inne i organisasjonen som gĂ„r ut i det offentlige rom: vpn, filutveksling (seafile, nextcloud) og andre. Å konfigurere trafikk-kryptering pĂ„ slike tjenester ser vanligvis ut som halvhjertet arbeid, og vi vil ikke beskytte oss mot MitM, fordi det er vanskelig (egentlig ikke).

Eller har du én adresse for tjenesten pÄ kontoret, og en annen fra internett, og disse mÄ opprettholdes, noe som koster vÄre begrensede spesialistressurser. Og ansatte mÄ huske forskjellige adresser, noe som er upassende.

2. Du kan bruke gratis sertifiseringssentre for Ă„ kryptere dine interne tjenester.

Egen PKI — det er en tjeneste som mĂ„ vedlikeholdes, 100 rubler per Ă„r for muligheten til Ă„ bruke PKI fra gratis sertifiseringssentre vil mer enn dekke tiden til ansatte som kunne ha brukt den pĂ„ andre oppgaver.

3. NĂ„r du bruker din egen sertifiseringssentral, vil du sette kjepper i hjulene for dine remote ansatte og kollegaer som Ăžnsker Ă„ jobbe med BYOD (Bring Your Own Device), og du kan ikke administrere enhetene deres. De bringer Mac-er, Linux, Android, iOS, Windows – Ă„ stĂžtte et slikt dyrepark er ikke meningsfullt.

Det finnes selvsagt unntak, og banker med andre strenge foretak som har etablerte sikkerhetspolicyer, vil aldri vĂŠre i stand til Ă„ forbedre servicen for sine ansatte.

For dem finnes det betalte sertifiseringssentraler som for en viss sum kan signere deres CA-sertifikat (google "root signing service").

Det finnes ogsÄ andre grunner til at det er mer fordelaktig Ä bruke et offentlig domene (det viktigste er at det tilhÞrer deg), men artikkelen handler ikke om det.

Essensen er...

MERK! Hvis du legger til et CA-sertifikat fra Let’s Encrypt i listen over betrodde sertifikater for ovirt, kan dette pĂ„virke sikkerheten til systemene dine!

Det fÞrste du mÄ merke deg er at det er dÄrlig praksis Ä eksponere ovirt-grensesnittene pÄ internett, da det ikke har noe praktisk formÄl og skaper ytterligere sikkerhetstrusler.

Derfor mÄ du fÄ sertifikatet pÄ en av vÄre bastion-hostene, fÞr du flytter sertifikatet og nÞkkelen til vÄr vert med ovirt-engine.

Legg til den eksterne adressen til vÄr bastion-host i DNS med navnet vÄrt for ovirt. ovirtengine.example.com, installasjonen av certbot og nginx vil jeg la vÊre i bakgrunnen (hvordan man gjÞr dette er allerede beskrevet pÄ Habr).

Vi konfigurerer nginx versjon >=1.15.7

/etc/nginx/conf.d/default.conf

server {
    server_name _;
    listen 80 default_server;
    location /robots.txt { alias /usr/share/nginx/html/robots.txt; }
    location /.well-known {
        root /usr/share/nginx/html;
    }
    location / {
        return 444;
    }
}

server {
    server_name _;
    listen 443 ssl http2 default_server;
    location /robots.txt { alias /usr/share/nginx/html/robots.txt; }
    location /.well-known {
        root /usr/share/nginx/html;
    }

    ssl_certificate /etc/nginx/ssl/$ssl_server_name/fullchain.pem; 
    ssl_certificate_key /etc/nginx/ssl/$ssl_server_name/privkey.pem;

    ssl_protocols TLSv1.2;
    ssl_prefer_server_ciphers on;

    ssl_dhparam /etc/nginx/ssl/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;

    # allow the server to attach OCSP responses, thereby reducing page load times for users
    ssl_stapling on;
    ssl_stapling_verify on;
    add_header Strict-Transport-Security max-age=15768000;

    location / {
        return 444;
    }
}

Then we obtain our certificate and key:

certbot certonly --nginx -d ovirtengine.example.com

We archive our certificate and key:

tar Phczf /tmp/ovirtengine.example.com.tgz /etc/letsencrypt/live/ovirtengine.example.com

We download the archive from the bastion host and upload it to our oVirt engine:

scp bastion-host:/tmp/ovirtengine.example.com.tgz /tmp/
scp /tmp/ovirtengine.example.com.tgz ovirtengine.example.com:/

We move to the target

Next, we unpack our archive and create symlinks to simplify understanding of the file system layout:

tar Pxzf /ovirtengine.example.com.tgz && rm -f ovirtengine.example.com.tgz
mkdir -p /etc/letsencrypt/live
ln -f -s /etc/letsencrypt/live /etc/pki/letsencrypt

We configure the built-in PKI in oVirt to use the Java certificate storage (openjdk) for certificate validation:

cat < /etc/ovirt-engine/engine.conf.d/99-setup-pki.conf 
ENGINE_HTTPS_PKI_TRUST_STORE="/etc/pki/java/cacerts"
ENGINE_HTTPS_PKI_TRUST_STORE_PASSWORD=""
EOF

We convert the CA from Let's Encrypt to DER format and add it to the oVirt Java trust store (a container that contains a list of certificates, such a system is used in Java):

openssl x509 -outform der -in /etc/pki/letsencrypt/ovirtengine.example.com/chain.pem -out /tmp/ovirtengine.example.com.chain.der
keytool -import -alias "Let's Encrypt Authority X3" -file /tmp/ovirtengine.example.com.chain.der -keystore /etc/pki/ovirt-engine/.truststore -storepass $(grep '^ENGINE_PKI_TRUST_STORE_PASSWORD' /etc/ovirt-engine/engine.conf.d/10-setup-pki.conf | cut -f 2 -d '"')
rm -f /tmp/ovirtengine.example.com.chain.der

Redigerer SSL-innstillinger for Apache, legger til parameter for stÞtte av symboliske lenker og fjerner parameter for CA som brukes til Ä verifisere sertifikater (standard vil bruke systemets sett med pÄlitelige CA-er for verifisering):

sed -r -i 's|^(SSLCACertificateFile.*)|#1|g' /etc/httpd/conf.d/ssl.conf
sed -r -i '0,/^#?SSLCACertificateFile.*/ s//1nOptions FollowSymlinks/' /etc/httpd/conf.d/ssl.conf

Deretter tar vi sikkerhetskopi av de originale filene, generert via PKI ovirt automatisk, og bytter ut med symboliske lenker til filer fra Let’s Encrypt:

ln -f -s /etc/pki/letsencrypt/ovirtengine.example.com/fullchain.pem /etc/pki/ovirt-engine/apache-chain.pem
services=( 'apache' 'imageio-proxy' 'websocket-proxy' )
for i in "${services[@]}"; do
cp /etc/pki/ovirt-engine/certs/$i.cer{,."$( date +%F )".bak}
cp /etc/pki/ovirt-engine/keys/$i.key.nopass{,."$( date +%F )".bak}
ln -f -s /etc/pki/letsencrypt/ovirtengine.example.com/privkey.pem /etc/pki/ovirt-engine/keys/$i.key.nopass
ln -f -s /etc/pki/letsencrypt/ovirtengine.example.com/cert.pem /etc/pki/ovirt-engine/certs/{apache,imageio-proxy,websocket-proxy}.cer
done

Vi gjenoppretter SElinux-kontekster pÄ filene og starter vÄre tjenester pÄ nytt (httpd, ovirt-engine, ovirt-imageio-proxy, ovirt-websocket-proxy):

restorecon -Rv /etc/pki
systemctl restart httpd ovirt-engine ovirt-imageio-proxy ovirt-websocket-proxy

httpd — webserver apache
ovirt-engine — webgrensesnitt for ovirt
ovirt-imageio-proxy — daemon for opplasting av diskbilder
ovirt-websocket-proxy — tjeneste for Ă„ bruke noVNC-konsollen

Alt ovenfor er testet pÄ ovirt versjon 4.2.

Automatisk oppdatering av sertifikater pÄ ovirt

I henhold til gode sikkerhetspraksiser skal det ikke vÊre forbindelse mellom bastion-host og ovirt, og sertifikatet utstedes kun for 3 mÄneder. Her oppstÄr det et omdiskutert punkt om hvordan sertifikatoppdateringen er implementert.

Jeg har en Ansible playbook som kjÞres pÄ Foreman daglig kl. 05.00 etter timeplan. Denne playbooken logger inn pÄ ovirt, sjekker utlÞpsdatoen for sertifikatet, og hvis det er mindre enn 5 dager igjen, gÄr den til bastion-host og utfÞrer sertifikatoppdateringen.

Etter oppdatering av sertifikatet arkiverer den mappen med filer, laster dem ned til Foreman-host og pakker dem ut pÄ ovirt-host. Deretter gjenoppretter den SElinux-kontekster pÄ filene og starter vÄre tjenester pÄ nytt.

Kilde: habr.com

KjĂžp pĂ„litelig hosting for nettsteder med DDoS-beskyttelse, VPS VDS-servere đŸ”„ KjĂžp pĂ„litelig hosting for nettsteder med DDoS-beskyttelse, VPS VDS-servere | ProHoster