Wie man Ovirt und Let’s Encrypt zusammenbringt

Auf dem Weg zur Verbesserung der Infrastruktur habe ich beschlossen, eine alte und lĂ€stige Frage zu klĂ€ren – ohne unnötige UmstĂ€nde Kollegen (Entwicklern, Testern, Administratoren usw.) die Möglichkeit zu geben, ihre virtuellen Maschinen in Ovirt selbststĂ€ndig zu verwalten. In Ovirt gibt es mehrere Komponenten, die konfiguriert werden mĂŒssen, um mein Anliegen zu lösen: die WeboberflĂ€che selbst, die noVNC-Konsole und das Hochladen von Festplattendisk-Images.

Die SchaltflĂ€chen „Mach es großartig“ habe ich nicht gefunden, daher zeige ich, welche Einstellungen ich vorgenommen habe, um dieses Problem zu lösen. Eine vollstĂ€ndige Anleitung finden Sie weiter unten:

Wie man ovirt und Let's Encrypt verbindet.

HAFTUNGSAUSSCHLUSS:

Vorab möchte ich darauf hinweisen, dass aus mir unbekannten GrĂŒnden die InfrastrukturdomĂ€nen in privaten Zonen wie lan, local usw. erstellt werden.

Mir ist unklar, was gegen die Verwendung der OrganisationsdomĂ€ne in einer öffentlichen Zone spricht. Anstatt beispielsweise die DomĂ€ne Alex-GLuck-Awesome-Company.local zu verwenden, könnte man ohne Bedenken die DomĂ€ne fĂŒr die Unternehmenswebsite Alex-GLuck-Awesome-Company.com verwenden.

Wenn Sie befĂŒrchten, dass Sie den Überblick ĂŒber die DomĂ€nen in Ihrer Organisation verlieren und dies etwas kaputt macht, können Sie fĂŒr bescheidene 100 Rubel im Jahr eine separate DomĂ€ne fĂŒr die Infrastruktur aglac.com erwerben.

Warum es vorteilhafter ist, DomÀnen in öffentlichen Zonen zu verwenden:

1. Innerhalb Ihrer Organisation entstehen Services, die ins öffentliche Netz gehen: VPN, Dateiaustausch (seafile, nextcloud) und andere. Die Einrichtung der Traffic-VerschlĂŒsselung auf solchen Services sieht in der Regel wie eine kurzsichtige Lösung aus, und gegen MitM sind wir nicht geschĂŒtzt, weil es kompliziert ist (tatsĂ€chlich ist es das nicht).

Oder innerhalb des BĂŒros haben Sie eine Adresse fĂŒr den Service, und aus dem Internet eine andere, und diese Verbindungen mĂŒssen aufrechterhalten werden, was die begrenzten Ressourcen unserer Spezialisten beansprucht. Außerdem mĂŒssen sich die Mitarbeiter verschiedene Adressen merken, was unpraktisch ist.

2. Sie können kostenlose Zertifizierungsstellen fĂŒr die VerschlĂŒsselung Ihrer internen Services nutzen.

Eine eigene PKI ist ein Service, der aufrechterhalten werden muss. 100 Rubel im Jahr fĂŒr die Nutzung von PKI aus kostenlosen Zertifizierungsstellen rechtfertigen sich durch die Zeit, die Mitarbeiter fĂŒr andere Aufgaben aufwenden könnten.

3. Wenn Sie ein eigenes Zertifizierungszentrum verwenden, stellen Sie Ihren entfernten Mitarbeitern und Kollegen, die mit BYOD (Bring Your Own Device) arbeiten möchten, Hindernisse in den Weg, und Sie können deren GerĂ€te nicht verwalten. Sie bringen Macs, Linux, Android, iOS, Windows - es macht keinen Sinn, einen solchen Zoo zu unterstĂŒtzen.

NatĂŒrlich gibt es Ausnahmen, und Banken sowie andere große Unternehmen mit etablierten Sicherheitsrichtlinien werden ihren Mitarbeitern den Service niemals verbessern können.

FĂŒr sie gibt es kostenpflichtige Zertifizierungszentren, die gegen eine bestimmte GebĂŒhr ihr CA-Zertifikat signieren können (googeln Sie "root signing service").

Es gibt auch andere GrĂŒnde, warum ein öffentlicher Domain wirtschaftlicher ist (das Wichtigste ist, dass er Ihnen gehört), aber darum geht es in diesem Artikel nicht.

Die Essenz und das Prinzip...

Achtung! Wenn Sie das CA-Zertifikat von Let’s Encrypt zur Liste der vertrauenswĂŒrdigen fĂŒr ovirt hinzufĂŒgen, kann dies die Sicherheit Ihrer Systeme beeintrĂ€chtigen!

Das Erste, worauf man achten sollte, ist, dass die ovirt-Interfaces ins Internet auszustellen, eine schlechte Praxis ist, da dies keinen praktischen Sinn hat und zusÀtzliche Sicherheitsbedrohungen schafft.

Folglich mĂŒssen Sie das Zertifikat auf einem unserer Bastion-Hosts erhalten und dann das Zertifikat und den SchlĂŒssel zu unserem Host mit ovirt-engine ĂŒbertragen.

FĂŒgen Sie die externe Adresse unseres Bastion-Hosts in den DNS mit unserem ovirt-Namen ein. ovirtengine.example.com, die Installation von certbot und nginx ĂŒberlasse ich der Fantasie (wie man das macht, wurde bereits auf Habr beschrieben).

Konfigurieren Sie Nginx-Versionen >=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;

    # Erlauben Sie dem Server, OCSP-Antworten anzuhĂ€ngen, um die Ladezeit der Seiten fĂŒr Benutzer zu verringern
    ssl_stapling on;
    ssl_stapling_verify on;
    add_header Strict-Transport-Security max-age=15768000;

    location / {
        return 444;
    }
}

Dann erhalten wir unser Zertifikat und unseren SchlĂŒssel:

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

Wir archivieren unser Zertifikat und unseren SchlĂŒssel:

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

Wir laden das Archiv vom Bastion-Host herunter und ĂŒbertragen es auf unseren oVirt-Engine:

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

Gehen wir zum Ziel

Anschließend entpacken wir unser Archiv und erstellen symbolische Links zur Vereinfachung des VerstĂ€ndnisses des Dateisystems:

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

Wir konfigurieren die integrierte PKI in oVirt, damit zur ÜberprĂŒfung von Zertifikaten der Java-Zertifikatspeicher (openjdk) verwendet wird:

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

Wir konvertieren das CA von Let’s Encrypt in das DER-Format und fĂŒgen es dem Zertifikatspeicher des oVirt-Truststores hinzu (das ist ein Container, in dem die Liste der Zertifikate aufbewahrt wird, ein solches System wird in Java verwendet):

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

Wir bearbeiten die SSL-Einstellungen fĂŒr Apache, fĂŒgen einen Parameter zur UnterstĂŒtzung von Symlinks hinzu und entfernen den Parameter fĂŒr CA, mit dem Zertifikate ĂŒberprĂŒft werden (standardmĂ€ĂŸig wird das systemeigene Trusted CA-BĂŒndel zur ÜberprĂŒfung verwendet):

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

Anschließend sichern wir vorsichtshalber die Originaldateien, die automatisch ĂŒber PKI von ovirt generiert wurden, und ersetzen sie durch Symlinks auf die Dateien von 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

Wir stellen die SElinux-Kontexte fĂŒr die Dateien wieder her und starten unsere Dienste neu (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 — WeboberflĂ€che von ovirt
ovirt-imageio-proxy — Dienst zum Hochladen von Disk-Images
ovirt-websocket-proxy — Dienst fĂŒr die Nutzung der noVNC-Konsole

Alles Vorhandene wurde mit der Version ovirt 4.2 ĂŒberprĂŒft.

Automatische Zertifikatserneuerung in ovirt

Laut guter Sicherheitspraktiken sollte keine Verbindung zwischen dem Bastion-Host und ovirt bestehen, und das Zertifikat wird nur fĂŒr 3 Monate ausgestellt. Hier entsteht ein strittiger Punkt, wie das Update der Zertifikate bei mir umgesetzt wird.

Ich habe ein Ansible-Playbook, das tĂ€glich um 5 Uhr morgens nach Plan auf Foreman ausgefĂŒhrt wird. Dieses Playbook geht auf ovirt, prĂŒft das Ablaufdatum des Zertifikats, und wenn weniger als 5 Tage bis zur Ablauffristen verbleiben, geht es zum Bastion-Host und startet das Update des Zertifikats.

Nach der Zertifikatserneuerung wird der Ordner mit den Dateien archiviert, auf den Foreman-Host heruntergeladen und auf dem ovirt-Host entpackt. Danach werden die SElinux-Kontexte fĂŒr die Dateien wiederhergestellt und unsere Dienste neu gestartet.

Quelle: habr.com

ZuverlĂ€ssiges Hosting fĂŒr Websites mit DDoS-Schutz kaufen, VPS VDS Server đŸ”„ ZuverlĂ€ssiges Hosting fĂŒr Websites mit DDoS-Schutz kaufen, VPS VDS Server - ProHoster