Genom att förbĂ€ttra infrastrukturen har jag beslutat att ta itu med den gamla och plĂ„gsamma frĂ„gan â utan onödiga rörelser ge kollegor (utvecklare, testare, administratörer, etc.) möjlighet att sjĂ€lva hantera sina virtuella maskiner i ovirt. I ovirt finns det flera komponenter som mĂ„ste konfigureras för att lösa mitt problem: sjĂ€lva webbgrĂ€nssnittet, noVNC-konsolen och uppladdning av diskavbilder.
Jag hittade inga knappar för "Gör det fantastiskt", sÄ jag visar vilka knoppar jag har vridit pÄ för att lösa denna uppgift. FullstÀndig instruktion nedan:

DISKLAMATION:
Innan jag börjar vill jag pÄpeka att av nÄgon okÀnd anledning skapas infrastruktdomÀner i privata zoner som lan, local, och sÄ vidare.
Vad som hindrar mig frÄn att anvÀnda organisationens domÀn i den offentliga zonen Àr okÀnt. Till exempel, istÀllet för domÀnen Alex-GLuck-Awesome-Company.local, kan man utan problem anvÀnda domÀnen för företagets webbplats Alex-GLuck-Awesome-Company.com.
Om du Àr rÀdd för att du inte kommer att kunna hÄlla reda pÄ domÀnerna i din organisation, och att detta kommer att förstöra nÄgot, kan du för blygsamma 100 rubel om Äret skaffa en separat domÀn för infrastrukturen aglac.com.
Varför det Àr mer fördelaktigt att anvÀnda domÀner i offentliga zoner:
1. Inom din organisation fÄr du tjÀnster som gÄr ut i det offentliga rummet: vpn, fildelning (seafile, nextcloud) och andra. Att konfigurera kryptering av trafiken pÄ sÄdana tjÀnster ser vanligtvis slarvigt ut, och att skydda sig mot MitM Àr svÄrt (men det Àr egentligen inte sÄ svÄrt).
Eller inom kontoret har du en adress för tjÀnsten, medan den frÄn internet Àr en annan, och dessa kopplingar mÄste upprÀtthÄllas, vilket kostar vÄra begrÀnsade resurser av specialister. Dessutom mÄste anstÀllda komma ihÄg olika adresser, vilket Àr otrevligt.
2. Du kan anvÀnda gratis certifieringscentra för att kryptera dina interna tjÀnster.
Ett eget PKI â Ă€r en tjĂ€nst som mĂ„ste stödjas, 100 rubel per Ă„r för möjligheten att anvĂ€nda PKI frĂ„n gratis certifieringscentra betalar sig mer Ă€n vĂ€l för den tid som anstĂ€llda kunde ha Ă€gnat Ă„t andra uppgifter.
3. NĂ€r du anvĂ€nder din egen certifikatutfĂ€rdare kommer du att sĂ€tta kĂ€ppar i hjulet för dina distansanstĂ€llda och kolleger som vill jobba med BYOD (ta med sina egna bĂ€rbara datorer, telefoner, surfplattor) och du kan inte hantera deras enheter. De kommer med Mac-datorer, Linux, Android, iOS, Windows â att stödja en sĂ„dan djungel Ă€r totalt meningslöst.
SjÀlvklart finns det undantag, och banker med andra strikta företag som har etablerade sÀkerhetspolicys kommer aldrig kunna förbÀttra servicen för sina anstÀllda.
För dem finns det betalade certifikatcenter som för en viss summa kan signera deras CA-certifikat (googla "root signing service").
Det finns ocksÄ andra anledningar till varför det Àr mer fördelaktigt att anvÀnda en offentlig domÀn (det viktigaste Àr att den tillhör dig), men artikeln handlar inte om det.
Essensen, ja sjĂ€lva grejenâŠ
VARNING! Om du lĂ€gger till ett CA-certifikat frĂ„n Letâs Encrypt i listan över betrodda för ovirt, kan detta pĂ„verka sĂ€kerheten för dina system!
Det första att tĂ€nka pĂ„ â att stĂ€lla in ovirt-grĂ€nssnitten pĂ„ internet Ă€r dĂ„lig praxis eftersom det inte finns nĂ„got praktiskt syfte och dessutom skapar ytterligare sĂ€kerhetshot.
DÀrför Àr det nödvÀndigt att fÄ certifikatet pÄ nÄgon av vÄra bastionservrar, och sedan överföra certifikatet och nyckeln till vÄr server med ovirt-engine.
LÀgg till den externa adressen för vÄr bastion-server i DNS med vÄrt ovirt-namn. ovirtengine.example.com, installation av certbot och nginx lÀmnar jag utanför (hur man gör detta har redan beskrivits pÄ Habré).
Konfigurera Nginx version >=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;
# möjliggör för servern att bifoga OCSP-svar, vilket minskar laddningstiden för anvÀndare
ssl_stapling on;
ssl_stapling_verify on;
add_header Strict-Transport-Security max-age=15768000;
location / {
return 444;
}
}
Sedan fÄr vi vÄrt certifikat och nyckel:
certbot certonly --nginx -d ovirtengine.example.com
Vi packar vÄrt certifikat och nyckel:
tar Phczf /tmp/ovirtengine.example.com.tgz /etc/letsencrypt/live/ovirtengine.example.com
Vi laddar ner arkivet frÄn bastionvÀrden och laddar upp det till vÄr oVirt-motor:
scp bastion-host:/tmp/ovirtengine.example.com.tgz /tmp/
scp /tmp/ovirtengine.example.com.tgz ovirtengine.example.com:/
Vi gÄr vidare till mÄlet
DÀrefter packar vi upp vÄrt arkiv och skapar symboliska lÀnkar för att förenkla systemförstÄelsen:
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
Vi konfigurerar den inbyggda PKI i oVirt sÄ att Java (openjdk) certifikatlager anvÀnds för certifikatverifiering:
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
Vi konverterar CA-certifikatet frĂ„n Letâs Encrypt till DER-format och lĂ€gger till det i Java trust store i oVirt (detta Ă€r en behĂ„llare som innehĂ„ller listan över certifikat, vilket Ă€r ett system som anvĂ€nds i 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
Vi redigerar SSL-instÀllningarna för Apache, lÀgger till en parameter för att stödja symlÀnkar och tar bort parametern för CA som anvÀnds för att verifiera certifikat (standardinstÀllningen kommer att anvÀnda systemets uppsÀttning betrodda CA för verifiering):
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
DĂ€refter sĂ€kerhetskopierar vi de ursprungliga filer som har genererats via PKI ovirt automatiskt, och byter ut symlĂ€nkarna mot filer frĂ„n 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 ÄterstÀller SElinux-kontakterna pÄ filerna och startar om vÄra tjÀnster (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 â webbserver apache
ovirt-engine â webbgrĂ€nssnitt för ovirt
ovirt-imageio-proxy â daemon för uppladdning av diskbilder
ovirt-websocket-proxy â tjĂ€nst för att arbeta med noVNC-konsolen
Allt ovanstÄende har verifierats pÄ ovirt version 4.2.
Automatisk uppdatering av certifikat pÄ ovirt
Enligt god sÀkerhetspraxis bör det inte finnas nÄgon direkt koppling mellan bastion-hosten och ovirt, och certifikatet utfÀrdas endast för 3 mÄnader. HÀr uppstÄr en tvetydig frÄga om hur certifikatens uppdateringar har implementerats hos mig.
Jag har en Ansible-playbook som körs pÄ Foreman dagligen klockan 5 pÄ morgonen enligt schema. Denna playbook loggar in pÄ ovirt, kontrollerar certifikatets giltighetstid och om det Àr mindre Àn 5 dagar kvar till utgÄng gÄr den till bastion-hosten och initierar certifikatets uppdatering.
Efter certifikatets uppdatering arkiverar den mappen med filer, laddar ner den till Foreman-vÀrden och packar upp den pÄ ovirt-vÀrden. DÀrefter ÄterstÀller den SElinux-kontakterna pÄ filerna och startar om vÄra tjÀnster.
KĂ€lla: habr.com
