tlsの上にリモートシステムを持つvirt-managerの友人

職場では、 libvirtを介してqemu / kvmベースの仮想化を積極的に使用しています。 私自身は長い間linuxに移行し、ローカルマシンでqemu / kvmを使用していますが、多くの場合、グラフィカルなvirt-managerを使用してさまざまなVMパラメーターを構成しています。 リモートサーバー上のハイパーバイザーを管理するために使用したかったのです。 これを行う方法については、段階的な指示の形式の記事があります(実際、これは公式文書の翻訳と「1つに混ぜる」です)。

準備する


すべてのアクションは「仮想化ノード」(libvirtdがこの場合はCentOS 6である)で実行され、selinuxは無効になっていることがわかります。 コンソールで実行します:

mkdir /tmp/certs cd /tmp/certs 

自己署名ルート証明書を生成する


 mkdir ca cd ca 

ルート証明書(CA)パラメーターを使用してテンプレートを作成します。

 cat > certificate_authority_template.info << 'EOF' cn = Name of your organization ca cert_signing_key expiration_days = 3650 EOF 
「組織名」-したがって、ラテン語での組織名、証明書は10年間有効です。

CAの秘密鍵を生成します。

 (umask 277 && certtool --generate-privkey > certificate_authority_key.pem) 

自己署名CAを生成します。

 certtool --generate-self-signed \ --template certificate_authority_template.info \ --load-privkey certificate_authority_key.pem \ --outfile certificate_authority_certificate.pem 

「仮想化ノード」(libvirtdの略)の証明書を生成します


 cd .. mkdir kvm_host cd kvm_host 

「仮想化ノード」の証明書パラメーターを含むテンプレートを作成します。

 cat > host_server_template.info << 'EOF' organization = Name of your organization cn = server.name tls_www_server encryption_key signing_key EOF 
「Server.name」-証明書が生成される「仮想化ノード」のdns名、

「仮想化ノード」の秘密鍵を生成します。

 (umask 277 && certtool --generate-privkey > host_server_key.pem) 

「仮想化ノード」の証明書を生成します。

 certtool --generate-certificate \ --template host_server_template.info \ --load-privkey host_server_key.pem \ --load-ca-certificate ../ca/certificate_authority_certificate.pem \ --load-ca-privkey ../ca/certificate_authority_key.pem \ --outfile host_server_certificate.pem 

クライアント接続用の証明書を生成します。


 cd .. mkdir client cd client 

クライアントの証明書パラメーターを含むテンプレートを作成します。

 cat > client_template.info << 'EOF' country = RU state = State locality = City organization = Name of your organization cn = client.host tls_www_client encryption_key signing_key EOF 
「Client.host」-dnsクライアント名、状態、および地域はあなたの裁量で記入します。

クライアントの秘密鍵を生成します。

 (umask 277 && certtool --generate-privkey > client_key.pem) 

クライアントの証明書を生成します。

  certtool --generate-certificate \ --template client_template.info \ --load-privkey client_key.pem \ --load-ca-certificate ../ca/certificate_authority_certificate.pem \ --load-ca-privkey ../ca/certificate_authority_key.pem \ --outfile client_certificate.pem 

libvirtへの証明書/キーの接続


 cd /tmp/certs 

以下のすべてのアクションは、sudoを介して、またはrootユーザーとして実行する必要があります。

 mkdir -p /etc/pki/libvirt/private chmod 755 /etc/pki/libvirt chmod 750 /etc/pki/libvirt/private cp ./ca/certificate_authority_certificate.pem /etc/pki/libvirt/cacert.pem cp ./kvm_host/host_server_certificate.pem /etc/pki/libvirt/servercert.pem cp ./kvm_host/host_server_key.pem /etc/pki/libvirt/private/serverkey.pem ln -s /etc/pki/libvirt/cacert.pem /etc/pki/CA/ chgrp qemu /etc/pki/libvirt \ /etc/pki/libvirt/servercert.pem \ /etc/pki/libvirt/private \ /etc/pki/libvirt/private/serverkey.pem chmod 440 /etc/pki/libvirt/servercert.pem chmod 444 /etc/pki/libvirt/cacert.pem chmod 640 /etc/pki/libvirt/private/serverkey.pem 

同じキーをvnc接続に使用できるように、server-key.pemの640権限が必要です。一方、virt-pki-validateユーティリティは、権限を無視することを誓います600-。

証明書/キーをvncに接続する


以下のすべてのアクションは、sudoを介して、またはrootユーザーとして実行する必要があります。

 mkdir /etc/pki/libvirt-vnc ln -s /etc/pki/libvirt/cacert.pem /etc/pki/libvirt-vnc/ca-cert.pem ln -s /etc/pki/libvirt/servercert.pem /etc/pki/libvirt-vnc/server-cert.pem ln -s /etc/pki/libvirt/private/serverkey.pem /etc/pki/libvirt-vnc/server-key.pem chgrp qemu /etc/pki/libvirt-vnc chmod 750 /etc/pki/libvirt-vnc 

libvirtdデーモンの構成


/etc/libvirt/libvirtd.confファイルで、対応するパラメーターに次の値を設定する必要があります。

 listen_tls = 1 tls_port = "16514" auth_tls = "none" key_file = "/etc/pki/libvirt/private/serverkey.pem" cert_file = "/etc/pki/libvirt/servercert.pem" ca_file = "/etc/pki/libvirt/cacert.pem" crl_file = "/etc/pki/libvirt/crl.pem" #tls_allowed_dn_list = ["DN1", "DN2"] log_level = 3 log_outputs="4:syslog:libvirtd 3:file:/var/log/libvirt/libvirt.log" audit_level = 2 audit_logging = 1 keepalive_interval = 5 keepalive_count = 5 

その結果、tlsを有効にし、ログを構成します。
tls_allowed_dn_listには、証明書のdn(識別名)が登録されており、libvirtdに接続できます。
/ etc / sysconfig / libvirtdファイルで、LIBVIRTD_ARGSパラメーターを「--listen」に設定する必要があります。

 LIBVIRTD_ARGS="--listen" 

Qemu / kvmデーモンの構成


/etc/libvirt/qemu.confファイルで、対応するパラメーターに以下の値を設定する必要があります。

 vnc_tls = 1 vnc_tls_x509_verify = 1 vnc_allow_host_audio = 0 cgroup_controllers = [ "cpu", "devices", "memory", "blkio", "cpuset", "cpuacct" ] save_image_format = "lzop" clear_emulator_capabilities = 1 

したがって、vncを介して仮想マシンを接続するためにtlsをオンにし、音声送信をオフにします(必要な場合はオンにします)、メモリスナップショットの圧縮をオンにします(ライブバックアップに役立ちます。興味のあるは以前の方法でバックアップします)そこに配置し、リンクとして引用します)、対応するcgroupsグループを有効にします(一般に、デフォルトでオンになっていますが、ハードに設定します)
この編集の後、libvirtdを再起動します。

 service libvirtd restart 

すでに実行中の仮想マシンの場合、tlsを介したvnc接続は、それらをオフにしてから再びオンにした後にのみ可能になります(virsh shutdown / start)

iptablesのセットアップ


libvirtdおよびvncに接続するには、次のルールをINPUTチェーンに入力する必要があります(iptablesを使用する場合)。

 iptables -I INPUT -m state --state NEW -m tcp -p tcp --dport 16514 -j ACCEPT iptables -I INPUT -m state --state NEW -s 192.168.40.0/24 -m tcp -p tcp --dport 5900:6000 -j ACCEPT 

vncコンソールは5900から6000までのポートでホイストすることが理解されています。その後、次のコマンドで現在のiptablesルールを保存します。

 iptables-save>/etc/sysconfig/iptables 

既に自己署名ルート証明書/クライアント証明書を持っている場合


この場合、1と2を除くすべての手順に従い、適切なパラメーター(-load-ca-certificat、-load-ca-privkey)でルート証明書とそのキーへのパスを示し、必要に応じて項目をスキップします4.必要な顧客の証明書が既に生成されている場合。

クライアントのセットアップ(Linux)


この場合のLinuxはCentos / Fedoraを意味します
「仮想化ノード」が管理されるリモートシステムで実行されます。
まず、対応する証明書用のフォルダーを作成する必要があります。

 mkdir -m 750 -p /etc/pki/libvirt/private mkdir -m 700 ~/.pki/libvirt-vnc 

次に、接続が行われるローカルマシン上の必要なパスに沿って、サーバーから適切なファイルを配置します。

/tmp/certs/ca/certificate_authority_certificate.pem /etc/pki/CA/cacert.pemに配置
/tmp/certs/client/client_key.pem /etc/pki/libvirt/private/clientkey.pemに配置
/tmp/certs/client/client_certificate.pem /etc/pki/libvirt/clientcert.pemに配置

 chmod 444 /etc/pki/CA/cacert.pem chmod 440 /etc/pki/libvirt/clientcert.pem \ /etc/pki/libvirt/private/clientkey.pem chown -R root:wheel /etc/pki/libvirt cd ~/.pki/libvirt-vnc/ ln -s /etc/pki/libvirt/clientcert.pem clientcert.pem ln -s /etc/pki/libvirt/private/clientkey.pem clientkey.pem 

これらの設定により、wheelグループのローカルユーザーとrootユーザーは、リモートサーバーのlibvirtd / vncに接続できます。
例:

virsh:

 virsh -c qemu+tls://server.name/system, virsh -c qemu+tls://kvm_server.local/system 

重要! ここでのserver.nameは、「仮想化ノード」(証明書のcnフィールド)の証明書を生成するときに指定した正確な名前であり、クライアントのipで正しく定義する必要があります。

Virt-manager:

virt-managerで、接続タイプを選択します-「ssl / tls with certificate」、ユーザー名は空、ホスト名は上記のserver.nameです。

仮想ビューア:

virt-viewer -c qemu + tls://server.name/system vm_name

クライアントのセットアップ(Windows、vncコンソールアクセスのみ)


「仮想化ノード」が管理されるリモートシステムで実行されます。
以下を介して接続できます。

仮想ビューア

仕事に行けなかった

ssvnc

ssvncの場合、クライアントのキーと証明書は同じファイルにある必要があります。この方法で実行できます(つまり、証明書が最初に生成されたサーバーにいることを意味します)。
 cd /tmp/certs/client cat client_certificate.pem client_key.pem >client.pem 

結果のclient.pemをサーバーから取得し、/ tmp / certs / ca /​​ certificate_authority_certificate.pemを取得します
ssvncを開始します-「SSLを使用」を設定したメインウィンドウで、「MyCerts」の「Certs」をクリックし、client.pemへのパスを示します。「ServerCert」でcertificate_authority_certificate.pemへのパスを指定し、「Options」->「Advanced」をクリックして設定します「サーバーはVencrypt ssl暗号化を使用します」の反対のチェックマーク。 メインウィンドウの[Vnc Host:Display]フィールドで、サーバーアドレスとvncポート番号をそれぞれ指定します。 [接続]をクリックします。

結果:


その結果、virsh、virt-managerを介してローカルで仮想マシンを管理できます(サーバーがサポートする機能のみが利用可能です)。 このソリューションの欠点は、VMのリモートコントロールがログに表示されないことです(または、これを達成できませんでした)。つまり、/などのシャットダウンがそのようなユーザーおよびそのようなIPから開始されたことはログに表示されません。

関連リンク


wiki.libvirt.org/page/TLSSetup
wiki.libvirt.org/page/VNCTLSSetup

更新


コメントに記載されているように、ルートのssh c without-passwordの上に接続できます(centosのlibvirtグループへのユーザーの追加は適用されません)、はい、しかしvncは直接移動し、「画面を覗く」オプションがあります。 vnc用のsshトンネル。
個人的には、毎回sshトンネルを作成するよりも、一度設定して使用する方が簡単です。

Source: https://habr.com/ru/post/J221693/


All Articles