Kao korak prema poboljšanju infrastrukture, odlučio sam riješiti drevno i mučno pitanje — omogućiti kolegama (programerima, testerima, administratorima, itd.) da samostalno upravljaju svojim virtualnim mašinama u ovirtu bez ikakvih dodatnih poteza. U ovirtu postoji nekoliko komponenti koje treba postaviti kako bi se riješilo moje pitanje: sam web sučelje, noVNC konzola i učitavanje slika diskova.
Nisam pronašao gumbe "Napraviti Genijalno", pa pokazujem koje sam ručice okretao kako bih riješio ovaj zadatak. Puna instrukcija ispod:

ODRICANJE OD ODGOVORNOSTI:
Prije nego što počnem, želim skrenuti pažnju da se iz nekog meni nepoznatog razloga domene infrastrukture kreiraju u privatnim zonama lan, local, i tako dalje.
Što ometa korištenje domene organizacije u javnoj zoni, nije mi poznato. Na primjer, umjesto domene Alex-GLuck-Awesome-Company.local, možete slobodno koristiti domenu za web stranicu tvrtke Alex-GLuck-Awesome-Company.com.
Ako se bojite da nećete moći pratiti domene unutar svoje organizacije i da to može nešto pokvariti, za skromnih 100 kuna godišnje možete uzeti posebnu domenu za infrastrukturu aglac.com.
Zašto je isplativije koristiti domene u javnim zonama:
1. Unutar organizacije pojavljuju se usluge koje izlaze u javni prostor: VPN, dijeljenje datoteka (seafile, nextcloud) i druge. Postavljanje enkripcije prometa na takvim uslugama obično izgleda kao improvizacija, a zaštita od MitM napada nećemo raditi jer je to teško (ustvari nije).
Ili unutar ureda imate jednu adresu usluge, a iz interneta drugu, i te veze treba održavati, što troši naše ograničene resurse stručnjaka. Također, zaposlenici moraju pamtiti različite adrese, što je nezgodno.
2. Možete koristiti besplatne centre za certifikaciju za enkripciju vaših unutarnjih usluga.
Vlastiti PKI — to je usluga koju treba održavati, 100 kuna godišnje za mogućnost korištenja PKI od besplatnih certifikacijskih centara višestruko će nadoknaditi vrijeme zaposlenika koji bi to vrijeme mogli trošiti na druge zadatke.
3. Kada koristite vlastitu certifikacijsku središnjicu, otežavate rad svojim udaljenim zaposlenicima i kolegama koji žele koristiti BYOD (donose vlastite laptopove, telefone, tablete) i ne možete upravljati njihovim uređajima. Donose Macove, Linux, Android, iOS, Windows — podržavanje takvog zoo vrta nema nikakvog smisla.
Naravno, postoje iznimke, a banke s drugim strogo organiziranim poduzećima koje imaju uspostavljene sigurnosne politike nikada više neće moći poboljšati uslugu za svoje zaposlenike.
Za njih postoje plaćeni centri certifikacije koji mogu potpisati njihov CA certifikat za određeni iznos (pretražiti "root signing service").
Postoje i drugi razlozi zašto je korištenje javnog domena isplativije (najvažnije, da pripada vama), ali to nije tema ovog članka.
Suština, pa stvar…
PAŽNJA! Ako dodate CA certifikat od Let’s Encrypt na popis povjerenih za ovirt, to može utjecati na sigurnost vaših sustava!
Prvo na što treba obratiti pažnju — izlaganje Ovirt sučelja internetu je loša praksa, jer u tome nema nikakvog praktičnog smisla, a stvara dodatne sigurnosne prijetnje.
Stoga, certifikat je potrebno dobiti na nekom našem bastion hostu, nakon čega se certifikat i ključ premještaju na naš host s ovirt-engine.
Dodajemo vanjsku adresu našeg bastion hosta u DNS sa svojim imenom Ovirta ovirtengine.example.com, instalaciju certbota i nginx ostavljam van radara (kako to učiniti već je opisano na Habr-u).
Konfiguriramo Nginx 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;
ssl_stapling on;
ssl_stapling_verify on;
add_header Strict-Transport-Security max-age=15768000;
location / {
return 444;
}
}
Zatim dobivamo naš certifikat i ključ:
certbot certonly --nginx -d ovirtengine.example.com
Arhiviramo naš certifikat i ključ:
tar Phczf /tmp/ovirtengine.example.com.tgz /etc/letsencrypt/live/ovirtengine.example.com
Preuzimamo arhivu s bastion hosta i prenosimo je na naš ovirt engine:
scp bastion-host:/tmp/ovirtengine.example.com.tgz /tmp/
scp /tmp/ovirtengine.example.com.tgz ovirtengine.example.com:/
Idemo do cilja
Zatim raspakiramo našu arhivu i kreiramo simboličke linkove radi lakšeg razumijevanja sistema rasporeda 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
Postavljamo ugrađeni pki u ovirtu da koristi skladište certifikata java (openjdk) za provjeru certifikata:
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
Konvertujemo CA od Let’s Encrypt-a u der format i dodajemo u skladište certifikata java trust store ovirta (to je kontejner koji sadrži popis certifikata, takav sistem se koristi u 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
Uređujemo SSL postavke za apache, dodajemo parametar za podršku simlinkovima i uklanjamo parametar za CA koji se koristi za provjeru certifikata (zadani će koristiti sistemski skup pouzdanih CA za provjeru):
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
Nakon toga, za svaki slučaj, backupiramo originalne datoteke generirane putem PKI ovirt-a automatski i zamjenjujemo ih simlinkovima na datoteke od 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
Obnavljamo SElinux kontekste na datotekama 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 — web sučelje ovirt
ovirt-imageio-proxy — demon za učitavanje slika diska
ovirt-websocket-proxy — servis za rad noVNC konzole
Sve navedeno je provjereno na verziji ovirta 4.2.
Automatsko ažuriranje certifikata na ovirt
Prema dobrim sigurnosnim praksama, ne bi trebalo biti veze između bastion hosta i ovirta, a certifikat se izdaje samo na 3 mjeseca. Tu se pojavljuje sporna tačka oko toga kako je implementirano ažuriranje certifikata kod mene.
Imam ansible playbook koji se svakodnevno pokreće na foreman-u u 5 sati ujutro prema rasporedu. Ovaj playbook ulazi u ovirt, provjerava datum isteka certifikata i ako do isteka ostane manje od 5 dana, ide na bastion host i pokreće ažuriranje certifikata.
Nakon ažuriranja certifikata arhivira mapu s datotekama, preuzima na host formina i dekomprimira na host ovirta. Nakon toga obnavlja SElinux kontekste na datotekama i ponovno pokreće naše usluge.
Izvor: habr.com
