Troch it paad te rinnen om de ynfrastruktuer te ferbetterjen, besleat ik in âlde en pynlike fraach ôf te meitsjen - sûnder ûnnedige stjoerings, biede de kâns foar kollega's (ûntwikkelders, testers, behearders, ensfh.) om har firtuele masines selsstannich te behearjen yn ovirt. Ovirt hat ferskate komponinten dy't moatte wurde konfigureare om myn probleem op te lossen: de webynterface sels, de noVNC-konsole en it uploaden fan skiifôfbyldings.
Ik fûn de knop "Make It Bad" net, dus ik lit jo sjen hokker knoppen ik draaide om dit probleem op te lossen. Folsleine ynstruksjes ûnder de besuniging:

Disclaimer:
Foardat jo begjinne, wol ik jo omtinken jaan oan it feit dat om ien of oare foar my ûnbekende reden ynfrastruktuerdomeinen wurde makke yn partikuliere sônes lan, lokaal, ensfh.
Ik wit net wat my foarkomt om it domein fan in organisaasje yn in iepenbiere sône te brûken. Bygelyks, ynstee fan it domein Alex-GLuck-Awesome-Company.local, kinne jo it domein feilich brûke foar de bedriuwwebside Alex-GLuck-Awesome-Company.com.
As jo bang binne dat jo de domeinen yn jo organisaasje net kinne folgje, en dit sil wat brekke, dan kinne jo foar in beskieden 100 roebel yn 't jier in apart domein keapje foar de aglac.com-ynfrastruktuer.
Wêrom is it rendabeler om domeinen te brûken yn iepenbiere sônes:
1. Jo organisaasje hat tsjinsten dy't iepenbier tagonklik binne: vpn, triemdieling (seafile, nextcloud), en oaren. It ynstellen fan ferkearsfersifering op sokke tsjinsten is meastal in bytsje in slordige saak, en wy sille ús net ferdigenje tsjin MitM-oanfallen, om't it lestich is (net echt).
Of jo hawwe ien tsjinstadres binnen it kantoar, en in oar fan it ynternet, en dizze ferbiningen moatte wurde ûnderhâlden, wat ús beheinde spesjalistyske boarnen fergriemt. No, meiwurkers moatte ferskate adressen ûnthâlde, wat ûngemaklik is.
2. Jo kinne fergees sertifikaatautoriteiten brûke om jo ynterne tsjinsten te fersiferjen.
Jo eigen PKI is in tsjinst dy't moat wurde stipe; 100 roebel yn 't jier foar de kâns om PKI te brûken fan fergese sertifikaasjeautoriteiten mear dan betellet foar de tiid fan meiwurkers dy't it kinne besteegje oan oare taken.
3. By it brûken fan jo eigen sertifikaatautoriteit, sille jo in sprek yn 'e tsjillen sette fan jo meiwurkers en kollega's op ôfstân dy't wolle wurkje mei BYOD (bring har eigen laptops, tillefoans, tablets) en jo kinne har apparaten net beheare. Se bringe Macs, Linux, Androids, iOS, Windows - it hat gjin punt om sa'n bistetún te stypjen.
Yn alles binne d'r fansels útsûnderingen, en banken mei oare hurde bedriuwen dy't feiligensbelied hawwe fêststeld, sille de tsjinst foar har meiwurkers nea kinne ferbetterje.
Foar har binne d'r betelle sertifisearingsautoriteiten dy't har CA-sertifikaat kinne ûndertekenje foar in bepaald bedrach (Google "root-ûndertekeningstsjinst").
D'r binne oare redenen wêrom't it mear rendabel is om in publike domein te brûken (it wichtichste is dat it by jo heart), mar dit artikel giet der net oer.
It punt is ...
OANDACHT! As jo in Let's Encrypt CA-sertifikaat tafoegje oan de fertroude list fan ovirt, kin it ynfloed hawwe op de feiligens fan jo systemen!
It earste ding dat jo moatte betelje omtinken oan is dat it bleatstellen fan Ovirt-ynterfaces oan it ynternet is minne praktyk, om't Dit makket gjin praktysk sin, en soarget foar ekstra feiligensbedrigingen.
Dêrom moatte jo in sertifikaat krije op ien fan ús bastion-hosts, en dan it sertifikaat en de kaai oerjaan oan ús host mei ovirt-motor.
Wy foegje it eksterne adres fan ús bastionhost ta oan de dns mei ús ovirtnamme ovirtengine.example.com, Ik sil de ynstallaasje fan certbot en nginx efter de skermen litte (hoe dit te dwaan is al beskreaun op Habré).
njinx-ferzje ynstelle >=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;
}
}
Dan krije wy ús sertifikaat en kaai:
certbot certonly --nginx -d ovirtengine.example.com
Argivearje ús sertifikaat en kaai:
tar Phczf /tmp/ovirtengine.example.com.tgz /etc/letsencrypt/live/ovirtengine.example.com
Download it argyf fan 'e bastion-host en upload it nei ús ovirt-motor:
scp bastion-host:/tmp/ovirtengine.example.com.tgz /tmp/
scp /tmp/ovirtengine.example.com.tgz ovirtengine.example.com:/
Lit ús gean nei it doel
Dêrnei pakke wy ús argyf út en meitsje symlinks om it begryp fan it bestânslokaasjesysteem te ferienfâldigjen:
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
Wy konfigurearje de ynboude pki yn Ovirt sadat de java-sertifikaatwinkel (openjdk) wurdt brûkt om sertifikaten te ferifiearjen:
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
Wy konvertearje de CA fan let's fersiferje yn it formaat en foegje it ta oan de ovirt java trust store certificate store (dit is in kontener dy't in list mei sertifikaten befettet, sa'n systeem wurdt brûkt yn 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
Wy bewurkje de SSL-ynstellingen foar apache, foegje in parameter ta om symlinks te stypjen en ferwiderje de parameter foar de CA wêrmei jo sertifikaten kontrolearje (standert wurdt de systeemset fan fertroude CA's brûkt foar ferifikaasje):
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
Dan, foar it gefal, meitsje wy in reservekopy fan 'e orizjinele bestannen generearre fia de automatyske PKI fan ovirt en ferfange se mei symlinks mei bestannen fan 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
Wy herstelle SElinux-konteksten op 'e bestannen en starte ús tsjinsten opnij (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 - ovirt webynterface
ovirt-imageio-proxy - daemon foar it downloaden fan skiifôfbyldings
ovirt-websocket-proxy - tsjinst foar it útfieren fan de noVNC-konsole
Al it boppesteande waard hifke op Ovirt ferzje 4.2.
Automatyske fernijing fan sertifikaten op ovirt
Neffens goede feiligenspraktiken soe d'r gjin ferbining wêze moatte tusken de bastionhost en de ovirt, en it sertifikaat wurdt allinich foar 3 moannen útjûn. Dit is wêr't in kontroversjele kwestje ûntstiet oer hoe't ik de fernijing fan sertifikaten ymplementearre.
Ik haw in ansible playbook dat rint op foarman alle dagen om 5 oere neffens in skema. Dit playbook giet nei de ovirt, kontrolearret de jildichheid perioade fan it sertifikaat, en as der binne minder as 5 dagen oerbleaun foar ferrinnen, it giet nei de bastion host en begjint bywurkjen fan it sertifikaat.
Nei it bywurkjen fan it sertifikaat, argivearret it de map mei bestannen, downloadt it nei de Forman-host en unzips it nei de Ovirt-host. Wêrnei't SElinux de konteksten op 'e bestannen herstelt en ús tsjinsten opnij starte.
Boarne: www.habr.com
