Ovirt と Let's Encrypt を友達にする方法

インフラストラクチャを改善する道を歩みながら、私は古くからの痛ましい質問に終止符を打つことにしました。不必要なジェスチャーを使わずに、同僚 (開発者、テスター、管理者など) が ovirt で仮想マシンを独立して管理できる機会を提供することです。 Ovirt には、Web インターフェイス自体、noVNC コンソール、ディスク イメージのアップロードなど、私の問題を解決するために構成する必要があるコンポーネントがいくつかあります。

「Make It Bad」ボタンが見つからなかったので、この問題を解決するためにどのノブを回したかを示します。完全な説明はカットの下にあります:

Ovirt と Let's Encrypt を友達にする方法

免責事項:

開始する前に、何らかの理由で私には知られていないが、インフラストラクチャ ドメインがプライベート ゾーン lan、ローカルなどに作成されるという事実に注意していただきたいと思います。

パブリックゾーンで組織のドメインを使用できない理由がわかりません。たとえば、Alex-GLuck-Awesome-Company.local ドメインの代わりに、企業 Web サイト Alex-GLuck-Awesome-Company.com のドメインを安全に使用できます。

組織内のドメインを追跡できなくなり、何かが壊れるのではないかと心配な場合は、年間 100 ルーブル程度で、aglac.com インフラストラクチャ用に別のドメインを購入できます。

パブリックゾーンでドメインを使用する方が収益性が高いのはなぜですか:

1. 組織には公開アクセス可能なサービスがあります。 впн、ファイル共有(seafile、nextcloud)など。こうしたサービスでトラフィックの暗号化を設定するのは、通常、かなりいい加減な作業です。また、難しい(実際は難しい)ため、中間者攻撃の防御は行いません。

または、オフィス内に 1 つのサービス アドレスがあり、インターネットからもう 1 つのサービス アドレスがあり、これらの接続を維持する必要があるため、限られた専門リソースが無駄になります。そうですね、従業員は異なる住所を覚えておく必要があり、不便です。

2. 無料の認証局を使用して内部サービスを暗号化できます。

独自の PKI はサポートが必要なサービスです。無料の認証機関から PKI を使用する機会に年間 100 ルーブルを支払うと、従業員が他のタスクに費やせる時間よりも高額になります。

3. 独自の認証局を使用すると、BYOD (自分のラップトップ、携帯電話、タブレットを持参) で作業したい遠隔地の従業員や同僚に迷惑をかけることになり、彼らのデバイスを管理できなくなります。彼らは Mac、Linux、Android、iOS、Windows を持ち込んでいますが、そのような動物園をサポートする意味はありません。

もちろん、何事にも例外はあり、セキュリティポリシーを確立した他の厳しい企業を抱える銀行は、従業員へのサービスを向上させることはできません。

彼らのために、一定の金額を支払うことで CA 証明書に署名できる有料の認証局 (Google の「ルート署名サービス」) が存在します。

パブリック ドメインを使用する方が収益性が高い理由は他にもありますが (最も重要なことは、パブリック ドメインが自分のものであるということです)、この記事ではそれについては説明しません。

ポイントは...

注意! Let's Encrypt CA 証明書を ovirt の信頼できるリストに追加すると、システムのセキュリティに影響を与える可能性があります。

まず最初に注意する必要があるのは、Ovirt インターフェイスをインターネットに公開するのは悪い習慣であるということです。これは実際には意味がなく、さらなるセキュリティ上の脅威が生じます。

したがって、要塞ホストの 1 つで証明書を取得し、ovirt-engine を使用してその証明書とキーをホストに転送する必要があります。

ovirt 名を使用して、踏み台ホストの外部アドレスを DNS に追加します。 ovirtengine.example.com, certbot と nginx のインストールは裏で行います (これを行う方法はすでに Habré で説明されています)。

njinx バージョン >=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 エンジンにアップロードします。

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

Java 証明書ストア (openjdk) が証明書の検証に使用されるように、Ovirt の組み込み pki を構成します。

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

let's encrypt の CA を der 形式に変換し、それを ovirt Java トラスト ストア証明書ストアに追加します (これは証明書のリストを含むコンテナーであり、このようなシステムは 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//1nOptions FollowSymlinks/' /etc/httpd/conf.d/ssl.conf

次に、万が一に備えて、ovirt の自動 PKI によって生成された元のファイルをバックアップし、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 — веб сервер アパッチ
ovirt-engine - ovirt Web インターフェイス
ovirt-imageio-proxy - ディスクイメージをダウンロードするためのデーモン
ovirt-websocket-proxy - noVNC コンソールを実行するためのサービス

上記はすべて Ovirt バージョン 4.2 でテストされました。

ovirt での証明書の自動更新

適切なセキュリティ慣行に従って、要塞ホストと ovirt の間に接続があってはならず、証明書は 3 か月間のみ発行されます。ここで、証明書の更新をどのように実装したかについて物議を醸す問題が発生します。

スケジュールに従って毎日午前 5 時に職長上で実行される Ansible プレイブックがあります。このプレイブックは ovirt に移動して証明書の有効期間を確認し、有効期限までに 5 日未満がある場合は要塞ホストに移動して証明書の更新を開始します。

証明書を更新した後、ファイルを含むフォルダーをアーカイブし、それを Forman ホストにダウンロードして、Ovirt ホストに解凍します。その後、SElinux はファイルのコンテキストを復元し、サービスを再起動します。

出所: habr.com

DDoS 保護機能を備えた信頼性の高いサイト用ホスティング、VPS VDS サーバーを購入する 🔥 DDoS攻撃対策付きの信頼性の高いウェブサイトホスティング、VPS/VDSサーバーを購入しましょう | ProHoster