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トンネルを作成するよりも、一度設定して使用する方が簡単です。



All Articles