Подружить Virt-Manager С Удаленной Системой Через Tls

На работе активно используем виртуализацию на базе qemu/kvm через libvirt .

Я сам давно перешёл на Linux и на локальной машине тоже использую qemu/kvm, при этом часто использую графический вирт-менеджер для настройки различных параметров виртуальной машины.

Я также хотел использовать его для управления гипервизорами на удаленных серверах.

О том, как это сделать, будет статья в виде пошаговой инструкции (по сути, это перевод и «объединение» официальной документации).



Подготовка

Предполагается, что все действия производятся на «узле виртуализации» (где установлен 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 лет. Давайте сгенерируем секретный ключ для ЦС:

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

Создайте самозаверяющий центр сертификации:

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

Права 640 на server-key.pem нужны, чтобы можно было использовать этот же ключ для vnc-соединения, но утилита 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

Итак включим tls для подключения виртуальных машин через vnc, отключим передачу звука (она нам не нужна, если нужно, оставьте включенной), включим сжатие для снимков памяти (полезно для живых резервных копий, если кому интересно, мы резервное копирование Так , так как я это там выкладывал ранее, то приведу в виде ссылки), а также включим соответствующие cgroups (вообще по умолчанию включено, но я жёстко поставил) Только после этого редактирования мы перезапускаем libvirtd:

service libvirtd restart

Для уже запущенных виртуальных машин подключение через vnc по tls будет возможно только после их выключения и повторного включения (virshshutdown/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 -c qemu+ tls://server.name/system , virsh -c qemu+ tls://kvm_server.local/system

ВАЖНЫЙ! server.name здесь — это именно то имя, которое мы указали при генерации сертификата для «узла виртуализации» (поле cn сертификата), оно должно быть правильно определено в ip на клиенте.

Вирт-менеджер: В вирт-менеджере выбираем тип подключения — «ssl/tls с сертификатами», имя пользователя пустое, имя хоста — server.name, о котором говорилось выше.

Вирт-просмотрщик: вирт-просмотрщик -c qemu+ tls://server.name/system name_vm

Настройка клиента (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» указываем путь к client.pem, в «ServerCert» указываем путь к certificate_authority_certificate.pem, далее жмем «Параметры» -> «Дополнительно» » и установите флажок «Сервер использует SSL-шифрование Vencrypt».

В главном окне в поле «Vnc Host:Display» укажите адрес сервера и номер vnc-порта соответственно.

Нажмите «Подключиться».



Результат:

В результате мы можем управлять нашими виртуальными машинами локально через virsh,virt-manager (доступны только те функции, которые поддерживает сервер).

Минусы этого решения в том, что в логах не отображается удаленное управление ВМ (или мне не удалось этого добиться), то есть в логах не будет видно, что выключение/и т. д. было инициировано таким-то пользователь с такого-то ip.

Ссылки по теме

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

Обновить

Как отмечено в комментариях, можно подключиться по ssh без пароля для root (добавление пользователя в группу libvirt для centos не применимо), да, но в этом случае vnc зайдет напрямую и останется возможность "подсмотреть" экран», в этом случае вы также можете использовать ssh-туннели для vnc. Лично мне проще один раз настроить и использовать, чем каждый раз открывать ssh-туннели.

Теги: #Виртуализация #libvirt #qemu/kvm #virt-manager

Вместе с данным постом часто просматривают:

Автор Статьи


Зарегистрирован: 2019-12-10 15:07:06
Баллов опыта: 0
Всего постов на сайте: 0
Всего комментарий на сайте: 0
Dima Manisha

Dima Manisha

Эксперт Wmlog. Профессиональный веб-мастер, SEO-специалист, дизайнер, маркетолог и интернет-предприниматель.