準備する
すべてのアクションは「仮想化ノード」(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トンネルを作成するよりも、一度設定して使用する方が簡単です。