Hodajući putem unapređenja infrastrukture, odlučio sam da završim jedno drevno i bolno pitanje - bez nepotrebnih gestova, pružiti priliku kolegama (programerima, testerima, administratorima itd.) da samostalno upravljaju svojim virtuelnim mašinama u oviru. Ovirt ima nekoliko komponenti koje je potrebno konfigurirati da bi riješio moj problem: sam web interfejs, noVNC konzolu i otpremanje slika diska.
Nisam pronašao dugme "Neka bude loše", pa vam pokazujem koje sam dugmad okrenuo da rešim ovaj problem. Pune upute ispod reza:

NAPOMENA:
Prije nego što počnem, skrećem vam pažnju na činjenicu da se iz nekog meni nepoznatog razloga, infrastrukturni domeni kreiraju u privatnim zonama lan, local i tako dalje.
Ne znam šta me sprečava da koristim domen organizacije u javnoj zoni. Na primjer, umjesto domene Alex-GLuck-Awesome-Company.local, možete bezbedno koristiti domen za veb lokaciju kompanije Alex-GLuck-Awesome-Company.com.
Ako se bojite da nećete moći pratiti domene u svojoj organizaciji, a to će nešto pokvariti, onda za skromnih 100 rubalja godišnje možete kupiti zaseban domen za infrastrukturu aglac.com.
Zašto je isplativije koristiti domene u javnim zonama:
1. Vaša organizacija ima usluge koje su javno dostupne: vpn, dijeljenje datoteka (seafile, nextcloud) i drugi. Postavljanje enkripcije prometa na takvim servisima 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 u kancelariji, a drugu sa interneta, a te veze treba održavati, što troši naše ograničene stručne resurse. Pa, zaposleni moraju pamtiti različite adrese, što je nezgodno.
2. Možete koristiti besplatne certifikate za šifriranje vaših internih usluga.
Vaš vlastiti PKI je usluga koju treba podržati; 100 rubalja godišnje za mogućnost korištenja PKI-a od besplatnih certifikacijskih tijela više nego što plaća vrijeme zaposlenika koji bi ga mogli potrošiti na druge zadatke.
3. Kada koristite vlastito ovlaštenje za sertifikaciju, vi ćete staviti žbicu u kotače vaših udaljenih zaposlenika i kolega koji žele raditi sa BYOD-om (ponijeti vlastite laptope, telefone, tablete) i ne možete kontrolirati njihove uređaje. Donesu Mac, Linux, Android, iOS, Windows - nema smisla podržavati takav zoološki vrt.
U svemu, naravno, postoje izuzeci, a banke sa drugim grubim preduzećima koje imaju uspostavljene sigurnosne politike nikada neće moći poboljšati uslugu svojim zaposlenima.
Za njih postoje plaćeni certifikacijski organi koji mogu potpisati svoj 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.
Poenta je...
PAŽNJA! Ako dodate Let's Encrypt CA certifikat na listu pouzdanih u oviru, to može uticati na sigurnost vaših sistema!
Prva stvar na koju treba da obratite pažnju je da je izlaganje Ovirt interfejsa Internetu loša praksa, jer Ovo nema praktičnog smisla i stvara dodatne sigurnosne prijetnje.
Stoga morate dobiti certifikat na jednom od naših bastion hostova, a zatim prenijeti certifikat i ključ na naš host pomoću ovirt-engine-a.
Vanjsku adresu našeg bastion hosta dodajemo dns-u sa našim imenom ovirt ovirtengine.example.com, ostavit ću instalaciju certbota i nginxa iza kulisa (kako to učiniti je već 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;
}
}
Tada dobijamo naš sertifikat i ključ:
certbot certonly --nginx -d ovirtengine.example.com
Arhivirajte naš sertifikat i ključ:
tar Phczf /tmp/ovirtengine.example.com.tgz /etc/letsencrypt/live/ovirtengine.example.com
Preuzmite arhivu sa bastion hosta i prenesite je na naš ovirt engine:
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 kreiramo simbolične veze kako bismo pojednostavili razumijevanje sistema lokacija 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 Ovirt tako da se java spremište 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
Konvertujemo CA iz let's encrypt u der format i dodajemo ga u spremište certifikata ovirt java trust store (ovo je kontejner koji sadrži listu certifikata, takav sistem se 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čnih veza i uklanjamo parametar za CA s kojim se provjeravaju certifikati (podrazumevano, sistemski skup pouzdanih CA će se koristiti za verifikaciju):
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 originalnih datoteka generiranih kroz ovirtov automatski PKI 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 ponovo 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 server apache
ovirt-engine - ovirt web sučelje
ovirt-imageio-proxy - demon za preuzimanje slika diska
ovirt-websocket-proxy - servis za pokretanje noVNC konzole
Sve navedeno je testirano na Ovirt verziji 4.2.
Automatsko obnavljanje certifikata na ovirt
Prema dobrim sigurnosnim praksama, ne bi trebalo biti veze između bastiona i ovira, a certifikat se izdaje samo na 3 mjeseca. Ovdje se nameće kontroverzno pitanje o tome kako sam implementirao obnovu certifikata.
Imam ansible playbook koji radi na Foreman-u svaki dan u 5 ujutro po rasporedu. Ovaj playbook ide u ovirt, provjerava rok važenja certifikata, a ako je ostalo manje od 5 dana do isteka, ide na bastion host i počinje ažuriranje certifikata.
Nakon ažuriranja sertifikata, arhivira fasciklu sa datotekama, preuzima je na Forman host i raspakuje na Ovirt host. Nakon toga SElinux vraća kontekste na fajlove i ponovo pokreće naše usluge.
izvor: www.habr.com
