На работе активно используем виртуализацию на базе 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
-
Что Такое Аукцион?
19 Oct, 24 -
Наблюдение При Взлете
19 Oct, 24 -
Линус Торвальдс О Бинарной Совместимости
19 Oct, 24 -
Установка Windows 8 Будет На 50% Быстрее
19 Oct, 24 -
Промо-Сайт Телеканала
19 Oct, 24