如何结交朋友Ovirt和让我们加密

在改善基础架构的过程中,我决定结束这个古老而痛苦的问题-为同事(开发人员,测试人员,管理员等)提供在ovirt中独立管理其虚拟机的能力,而无需任何额外的举动。 ovirt中有几个组件需要配置以解决我的问题:Web界面本身,noVNC控制台以及填写磁盘映像。

我没有找到“使闪烁”按钮,因此我显示了为解决该问题而转动的手柄。 完整说明下:





免责声明:


在开始之前,我想提请您注意一个事实,即由于某种我不知道的原因,基础结构域是在lan,local等私有区域中创建的。

我不知道阻止我在公共区域使用组织域的原因。 例如,您可以安全地将域用于公司Alex-GLuck-Awesome-Company.com的站点,而不是域Alex-GLuck-Awesome-Company.local。

如果您担心无法跟踪组织中的域,并且这会造成一些麻烦,那么对于每年不多的100卢布,您可以为aglac.com基础架构选择一个单独的域。

为什么在公共区域使用域名更有利可图:

1.在组织内公共空间中出现的服务:VPN,文件共享(seafile,nextcloud)和其他。 在此类服务上配置流量加密通常看起来像是在吹牛,并且我们不会保护自己不受MitM的侵害,因为这很困难(实际上不是)。

或在办公室内,您有一个服务地址,另一个是来自Internet的服务地址,并且必须维护这些通信,这是我们有限的专业资源所花费的。 好吧,员工必须记住不同的地址,这很不方便。

2.您可以使用免费的证书颁发机构来加密内部服务。

自己的PKI是一项需要得到支持的服务,每年有100卢布的机会可以使用免费证书颁发机构提供的PKI,而不是为将其花费在其他任务上的员工付出时间。

3.使用自己的证书颁发机构时,您将把摇杆放在想要使用BYOD(带他们的笔记本电脑,手机,平板电脑)且无法控制其设备的远程员工和同事的手中。 他们带来了罂粟花,Linux,Android,iOS,Windows-支持这样的动物园毫无意义。

当然,总而言之,有例外,拥有其他制定安全策略的苛刻企业的银行将永远无法改善为员工提供的服务。

他们有付费的证书颁发机构,可以在一定程度上签署其CA证书(谷歌“根签名服务”)。

还有其他原因使使用公共领域更有利可图(最重要的是它属于您),但本文并非如此。

底线,但重点...


注意! 如果将Let's Encrypt的CA证书添加到ovirt的受信任列表中,则可能会影响系统的安全性!

您需要注意的第一件事是将Internet接口放置在Internet上是一种不良做法,因为 这没有实际意义,并且会带来其他安全威胁。

因此,您需要在我们的某些堡垒主机上获得证书,然后使用ovirt-engine将证书和密钥转移到我们的主机上。

我们使用ovirtengine.example.com ovirt名称在DNS中添加堡垒主机的外部地址,我将把certbot和nginx的安装置于幕后(已经在集线器上进行了描述)。

配置Nginx版本> = 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; } } 


然后我们获得了证书和密钥:

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

我们存档我们的证书和密钥:

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

从堡垒主机下载存档,然后将其上传到我们的ovirt-enzhin:

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

达到目标


接下来,我们解压缩归档文件并创建符号链接以简化对文件位置系统的理解:

 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 

我们将ovirt中的内置pki配置为使用Java证书存储区(openjdk)进行证书验证:

 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 

我们将CA从让我们加密转换为der格式,然后在Java信任库的证书存储中添加一个ovirt(这是证书列表所在的容器,在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 

我们编辑apache的SSL设置,添加参数以支持符号链接,并删除CA的参数,这将检查证书(默认情况下,系统将使用受信任的CA设置进行验证):

 sed -r -i 's|^(SSLCACertificateFile.*)|#\1|g' /etc/httpd/conf.d/ssl.conf sed -r -i '0,/(^#?SSLCACertificateFile.*)/ s//\1\nOptions FollowSymlinks/' /etc/httpd/conf.d/ssl.conf 

之后,以防万一,我们将自动备份通过PKI ovirt'a生成的原始文件,并将符号链接替换为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 

我们恢复文件上的SElinux上下文并重新启动我们的服务(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-Apache Web服务器
ovirt-engine-ovirt Web界面
ovirt-imageio-proxy-加载磁盘映像的守护程序
ovirt-websocket-proxy-用于运行noVNC控制台的服务

以上所有内容均已在ovirt 4.2版上进行了测试。

自动续订Ovirt证书


根据良好的安全做法,堡垒主机与ovirt之间不应建立连接,并且证书只能颁发3个月。 这是关于我如何实施证书更新的有争议的观点。

我有一本合奏剧本,每天早上5点按时间表在领班上播放。 该剧本进入Ovirt,检查证书的有效期,如果到期前还剩不到5天,它将进入堡垒主机并开始证书更新。

更新证书后,它将存档文件的文件夹存档,将forman下载到主机,然后解压缩ovirt主机。 然后,它恢复文件上的SElinux上下文并重新启动我们的服务。

Source: https://habr.com/ru/post/zh-CN424127/


All Articles