Kako steći prijatelje Ovirt i Let's Encrypt

Hodajući putem poboljšanja infrastrukture, odlučio sam dovršiti staro i bolno pitanje - bez nepotrebnih gesta, pružiti priliku kolegama (programerima, testerima, administratorima itd.) da samostalno upravljaju svojim virtualnim strojevima u ovirtu. Ovirt ima nekoliko komponenti koje je potrebno konfigurirati da bi se riješio moj problem: samo web sučelje, noVNC konzola i učitavanje slika diska.

Nisam pronašao gumb "Make It Bad", pa vam pokazujem koje sam gumbe okrenuo da riješim ovaj problem. Potpune upute ispod rezanja:

Kako steći prijatelje Ovirt i Let's Encrypt

UVJETI:

Prije nego počnem, želio bih vam skrenuti pozornost na činjenicu da se iz meni nepoznatog razloga infrastrukturne domene stvaraju u privatnim zonama lan, local i tako dalje.

Ne znam što me sprječava da koristim domenu organizacije u javnoj zoni. Na primjer, umjesto domene Alex-GLuck-Awesome-Company.local, možete sigurno koristiti domenu za web stranicu tvrtke Alex-GLuck-Awesome-Company.com.

Ako se bojite da nećete moći pratiti domene u svojoj organizaciji, a to će nešto pokvariti, tada za skromnih 100 rubalja godišnje možete kupiti zasebnu domenu za infrastrukturu aglac.com.

Zašto je isplativije koristiti domene u javnim zonama:

1. Vaša organizacija ima javno dostupne usluge: vpn, dijeljenje datoteka (seafile, nextcloud) i drugi. Postavljanje enkripcije prometa na takvim uslugama obično je pomalo neozbiljna stvar i nećemo se braniti od MitM napada jer je teško (ne baš).

Ili imate jednu servisnu adresu unutar ureda, a drugu s Interneta, a te se veze moraju održavati, što troši naše ograničene stručne resurse. Pa, zaposlenici moraju pamtiti različite adrese, što je nezgodno.

2. Za šifriranje svojih internih usluga možete koristiti besplatne davatelje certifikata.

Vaš vlastiti PKI usluga je koju treba podržati; 100 rubalja godišnje za mogućnost korištenja PKI-ja od besplatnih certifikacijskih tijela više nego plaća za vrijeme zaposlenika koji bi ga mogli potrošiti na druge zadatke.

3. Kada koristite vlastitu certifikacijsku ovlast, ubacit ćete palce u kotače svojim udaljenim zaposlenicima i kolegama koji žele raditi s BYOD-om (donesu svoja prijenosna računala, telefone, tablete) i ne možete upravljati njihovim uređajima. Donose Macove, Linuxe, Androide, iOS, Windowse – nema smisla podržavati takav zoološki vrt.

U svemu, naravno, postoje iznimke, a banke s drugim oštrim poduzećima koja imaju uspostavljene sigurnosne politike nikada neće moći poboljšati uslugu za svoje zaposlenike.

Za njih postoje plaćena certifikacijska tijela koja mogu potpisati njihov CA certifikat za određeni iznos (Google “root signing service”).

Postoje i drugi razlozi zašto je isplativije koristiti javnu domenu (najvažnije je da ona pripada vama), ali ovaj članak nije o tome.

Poanta je...

PAŽNJA! Ako dodate Let's Encrypt CA certifikat na ovirtov popis pouzdanih, to može utjecati na sigurnost vaših sustava!

Prvo na što morate obratiti pozornost je da je izlaganje Ovirt sučelja internetu loša praksa, jer To nema praktičnog smisla i stvara dodatne sigurnosne prijetnje.

Stoga trebate pribaviti certifikat na jednom od naših bastion hostova, a zatim certifikat i ključ prenijeti na naš host s ovirt-motorom.

Dodamo vanjsku adresu našeg bastion hosta u dns s našim imenom ovirt ovirtengine.example.com, ostavit ću instalaciju certbota i nginxa iza scene (kako to učiniti već je opisano na Habréu).

Postavljanje njinx verzije >=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;

    # позволяем серверу прикреплять OCSP-ответы, тем самым уменьшая время загрузки страниц у пользователей
    ssl_stapling on;
    ssl_stapling_verify on;
    add_header Strict-Transport-Security max-age=15768000;

    location / {
        return 444;
    }
}

Zatim dobivamo svoj certifikat i ključ:

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

Arhivirajte naš certifikat i ključ:

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

Preuzmite arhivu s bastion hosta i prenesite je na naš ovirt motor:

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

Idemo dalje do cilja

Zatim raspakiramo našu arhivu i stvaramo simboličke veze kako bismo pojednostavili razumijevanje sustava lokacije datoteka:

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

Konfiguriramo ugrađeni pki u Ovirtu tako da se spremište java certifikata (openjdk) koristi za provjeru certifikata:

cat << EOF > /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

Konvertiramo CA iz let's encrypt u der format i dodajemo ga u ovirt java trust store spremište certifikata (ovo je spremnik koji sadrži popis certifikata, takav se sustav koristi u Javi):

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

Uređujemo SSL postavke za apache, dodajemo parametar za podršku simboličkih veza i uklanjamo parametar za CA s kojim se provjeravaju certifikati (prema zadanim postavkama za provjeru će se koristiti sistemski skup pouzdanih CA-ova):

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

Zatim, za svaki slučaj, napravimo sigurnosnu kopiju izvornih datoteka generiranih putem ovirtovog automatskog PKI-ja i zamijenimo ih simboličkim vezama s datotekama iz 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

Vraćamo SElinux kontekste na datoteke i ponovno pokrećemo naše usluge (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 — web poslužitelj apaš
ovirt-engine - ovirt web sučelje
ovirt-imageio-proxy - demon za preuzimanje slika diska
ovirt-websocket-proxy - servis za pokretanje noVNC konzole

Sve navedeno testirano je na Ovirt verziji 4.2.

Automatsko obnavljanje certifikata na ovirt

Prema dobroj sigurnosnoj praksi, između bastion hosta i ovirta ne bi trebalo biti veze, a certifikat se izdaje samo na 3 mjeseca. Ovdje se javlja kontroverzno pitanje o tome kako sam proveo obnovu certifikata.

Imam ansible playbook koji se pokreće na Foremanu svaki dan u 5 ujutro prema rasporedu. Ovaj playbook ide na ovirt, provjerava rok valjanosti certifikata i ako je do isteka ostalo manje od 5 dana, odlazi na bastion host i počinje ažurirati certifikat.

Nakon ažuriranja certifikata, arhivira mapu s datotekama, preuzima je na Forman host i raspakuje na Ovirt host. Nakon čega SElinux vraća kontekste datoteka i ponovno pokreće naše usluge.

Izvor: www.habr.com

Kupite pouzdan hosting za stranice s DDoS zaštitom, VPS VDS poslužiteljima 🔥 Kupite pouzdan web hosting sa DDoS zaštitom, VPS VDS servere | ProHoster