Чтобы работа по сети была безопасной и удобной необходимо использование SSL сертификатов для создания зашифрованных TLS-соединений. Так же TLS-соединения сертификаты могут использованы для организации комплексных сервисных решений построенных на пример на технологии Libvirt.
Внимание: В новых версиях virt-manager автоматически создает TLS-порт для виртуальной машины использующей Spice-протокол удаленного доступа. В случае если в системе не установлены SSL-сертификаты или вручную не подправлена конфигурация виртуальной машины, запуск гипервизора QEMU осуществляться не будет!
Настройка работы с помощью зашифрованных соединений состоит из следующих этапов:
- Создания сертификатов шифрования
- Размещения сертификатов в нужных каталогах.
Создание сертификатов
Чтобы приступить к созданию сертификатов нужно выбрать каталог где будут создаваться сертификаты и перейти в него, а также установить пакет gnutls-bin.
$ sudo apt-get install gnutls-bin
Рассмотрим простой пример:
- Удостоверяющий центр - 1шт.
- Сервер - 1шт.
- Клиент - 1шт.
Для более сложных примеров изменяется только количество серверов и клиентов. Придется переделать структуру папок сертификатов а также изменить пути в приведенных ниже примерах.
Сертификат удостоверяющего центра
Первым делом создается сертификат удостоверяющего центра (УЦ) также называемого Certificate Authority (CA).
0. Создаем каталог CA и входим в него:
$mkdir CA
$ cd CA
1. Создадим приватный ключ УЦ с помощью следующей команды
$ certtool --generate-privkey > cakey.pem
2. Добавим информацию в сертификат. Для этого создадим текстовым файл ca.info со следующим содержимым:
cn = Name of your organization
ca
cert_signing_key
где "Name of your organization" - название вашей компании
3.Подпишем сертификат с добавлением информации из файла "ca.info" с помощью следующей команды:
$ certtool --generate-self-signed --load-privkey cakey.pem \
--template ca.info --outfile cacert.pem
На выходе должно получится отчет о подписи сертификата следующего вида:
Generating a self signed certificate...
X.509 Certificate Information:
Version: 3
Serial Number (hex): 50ffbddd
Validity:
Not Before: Wed Jan 23 10:39:25 UTC 2013
Not After: Thu Jan 23 10:39:25 UTC 2014
Subject: CN=Umvirt.Org
Subject Public Key Algorithm: RSA
Certificate Security Level: Normal
Modulus (bits 2432):
00:c8:d9:c4:99:e6:7a:3f:20:ac:df:ff:f6:1c:55:f2
4c:9b:c0:ed:9e:79:63:c9:57:a4:73:fb:38:48:d3:8a
29:85:77:ef:01:41:2a:71:ff:d9:0d:62:79:ee:d7:cb
22:aa:1d:f5:10:24:8f:38:d8:79:3c:37:c2:16:8f:d7
bb:f5:32:c7:47:87:b5:7e:e9:15:79:e5:a6:6b:bc:1c
17:cc:68:e5:86:25:18:46:9e:7a:c1:9e:c4:4b:aa:33
26:67:f0:51:e7:84:46:e1:4b:3f:c6:29:f6:23:f2:ef
94:27:93:96:0a:aa:4c:a1:90:ab:bb:f1:2f:46:a2:1f
76:1d:26:05:c9:3e:c9:30:3c:b6:0c:72:c6:fa:ec:b8
a7:e7:6c:71:55:50:11:30:65:ec:7d:ea:15:2f:7d:86
bb:d2:f4:cc:70:23:48:f5:e2:5f:fc:5c:db:05:4e:2e
2e:c0:f8:1f:6b:41:9a:b9:76:fe:0f:29:3c:c4:a7:af
a1:1e:2b:16:66:17:b0:b7:5d:89:21:d5:8b:9f:c1:1b
af:ed:b6:83:e4:71:e0:21:29:7d:e8:80:91:b8:c9:a0
8c:2d:64:71:e9:ca:bf:27:90:d6:1d:b5:e2:8a:cc:80
c5:44:9c:de:a1:0a:99:c5:c5:fe:c8:7b:ba:90:ca:c8
4c:92:d7:fe:a1:6b:ff:29:2b:f0:70:01:6c:88:ff:2d
bd:d1:67:f6:a4:e7:99:6b:3f:5b:8d:cc:9c:6e:7b:75
9e:06:19:5b:f0:88:d8:af:06:3f:00:25:ec:8f:9f:71
e7
Exponent (bits 24):
01:00:01
Extensions:
Basic Constraints (critical):
Certificate Authority (CA): TRUE
Key Usage (critical):
Certificate signing.
Subject Key Identifier (not critical):
88aea5e4afa72d354b63318b284694c34e603bbd
Other Information:
Public Key Id:
88aea5e4afa72d354b63318b284694c34e603bbd
Signing certificate...
Если в каталоге обнаружите файл cacert.pem значит вы успешно подписали сертификат УЦ.
Сертификат сервера
После того как был создан и подписан сертификат УЦ, создадим сертификат сервера.
0. Переходим в каталог сертификата сервера
Выходим из каталога CA (если нужно)
$ cd ..
Создаем и переходим в каталог сертификата сервера
$ mkdir server
$ cd server
1. Создадим приватный ключ с помощью команды:
$ certtool --generate-privkey > serverkey.pem
2. Добавим информацию в сертификат. Для этого создадим текстовым файл server.info со следующим содержимым (важно только поле CN, которое указывает имя сервера):
organization = Name of your organization
cn = Server Name
tls_www_server
encryption_key
signing_key
где "Name of your organization" - название вашей компании
"Server Name" - сетевое имя сервера (определяется через файлы "hostname", "hosts", а также с помощью службы DNS)
3. Подпишем сертификат с добавлением информации из файла server.info с помощью следующей команды:
$ certtool --generate-certificate --load-privkey serverkey.pem \
--load-ca-certificate ../CA/cacert.pem --load-ca-privkey ../CA/cakey.pem \
--template server.info --outfile servercert.pem
На выходе должно получится отчет о подписи сертификата следующего вида:
Generating a signed certificate...
X.509 Certificate Information:
Version: 3
Serial Number (hex): 50ffc472
Validity:
Not Before: Wed Jan 23 11:07:30 UTC 2013
Not After: Thu Jan 23 11:07:30 UTC 2014
Subject: O=Umvirt.Org,CN=lab
Subject Public Key Algorithm: RSA
Certificate Security Level: Normal
Modulus (bits 2432):
00:cd:c1:91:af:a9:a8:49:c1:e7:95:6b:c6:87:e8:28
74:ab:85:fe:1e:27:11:50:6a:9b:6c:72:27:6a:c4:af
df:b1:98:36:a8:be:75:ca:f1:f3:22:b6:56:f5:c4:fc
26:b6:f9:d6:fd:05:34:57:7a:1c:ed:fc:a1:37:91:c1
ce:ae:bc:2b:8e:6c:b4:ff:be:bd:ea:5b:d4:87:f9:ae
7e:14:c2:9f:bb:68:4f:06:d4:16:e8:a4:76:8d:4b:11
11:c6:e9:c5:fa:ee:91:03:3e:2d:fc:06:19:dd:01:ca
80:92:d6:75:cb:52:ac:6b:dd:d7:79:c8:b6:05:00:99
95:a1:24:07:68:80:0f:4a:ea:d1:5f:63:1b:98:df:88
7e:a8:a6:10:52:c4:66:2a:98:e6:50:e8:50:ce:a4:77
c0:57:80:50:21:5e:ea:b1:bc:00:70:20:21:38:23:9f
84:a6:53:b9:8b:8f:f9:87:0e:7e:3b:4d:46:7b:e3:35
86:eb:bd:18:e2:02:9b:7c:50:05:40:86:5d:cf:e0:f3
70:a9:6a:77:64:23:44:66:4c:d0:b9:1d:27:18:22:74
30:7f:b3:f9:03:b8:1e:9a:6d:fb:ef:bd:02:a5:60:3c
0c:52:10:5b:83:ab:6f:74:b0:46:12:6d:d9:fd:24:63
d5:27:26:dc:de:77:72:97:a6:ec:50:7d:33:f6:46:7e
56:28:74:ba:a9:51:5f:d7:c9:f9:0c:1d:38:fc:a8:0a
a1:22:16:f7:7d:89:d8:c0:5e:15:40:33:c0:d1:23:e8
c9
Exponent (bits 24):
01:00:01
Extensions:
Basic Constraints (critical):
Certificate Authority (CA): FALSE
Key Purpose (not critical):
TLS WWW Server.
Key Usage (critical):
Digital signature.
Key encipherment.
Subject Key Identifier (not critical):
d51c21eeca9debca30cb34d3b2c86f01c06939ad
Authority Key Identifier (not critical):
88aea5e4afa72d354b63318b284694c34e603bbd
Other Information:
Public Key Id:
d51c21eeca9debca30cb34d3b2c86f01c06939ad
Signing certificate...
Если в каталоге обнаружите файл servercert.pem значит вы успешно подписали сертификат сервера.
Сертификат клиента
0. Переходим в каталог сертификата клиента
Выходим из каталога CA (если нужно)
$ cd ..
Создаем и переходим в каталог сертификата клиента
$ mkdir client
$ cd client
1. Создадим приватный ключ с помощью команды:
$ certtool --generate-privkey > clientkey.pem
2.2. Добавим информацию в сертификат. Для этого создадим текстовым файл client.info со следующим содержимым:
country = Country code
state = State
locality = Locality
organization = Name of your organization
cn = Username
tls_www_client
encryption_key
signing_key
где где "Name of your organization" - название вашей компании
"Country code" - двухбуквенный код страны
"State" - Регион
"Locality" - Имя населенного пункта
"Username" - Имя пользователя
3. Подпишем сертификат с добавлением информации из файла client.info с помощью следующей команды:
#certtool --generate-certificate --load-privkey clientkey.pem \
--load-ca-certificate ../CA/cacert.pem --load-ca-privkey ../CA/cakey.pem \
--template client.info --outfile clientcert.pem
На выходе должно получится отчет о подписи сертификата следующего вида:
Generating a signed certificate...
X.509 Certificate Information:
Version: 3
Serial Number (hex): 50ffc804
Validity:
Not Before: Wed Jan 23 11:22:44 UTC 2013
Not After: Thu Jan 23 11:22:44 UTC 2014
Subject: C=RU,O=Umvirt.Org,L=Chita,ST=Zabaikalye,CN=boris
Subject Public Key Algorithm: RSA
Certificate Security Level: Normal
Modulus (bits 2432):
00:d8:b9:a5:f6:e5:d5:82:39:2d:4c:c5:db:90:18:6b
d9:76:c3:19:2a:26:e8:19:2c:93:e2:7c:74:13:ba:a2
68:b3:01:7f:05:4a:20:6a:14:92:41:f0:cd:b0:90:5e
f4:14:42:7d:ea:86:98:31:c8:51:2f:6b:c1:bf:1c:29
09:ee:8d:52:a8:f5:b1:f6:23:c2:64:29:57:a4:a8:1f
8b:66:ed:0c:ba:5e:d1:2d:7e:e4:85:c1:38:02:98:65
09:bf:78:16:6f:24:bc:c7:89:7c:04:18:71:ad:03:51
e0:78:83:bd:91:42:4a:a1:5b:3f:fd:28:ed:e0:96:39
61:e6:77:2f:82:91:d1:3b:ca:39:df:ad:d1:51:e9:dd
5b:41:e5:c1:aa:75:c5:0b:b4:57:bc:be:46:92:19:83
49:29:be:29:54:5c:ff:6b:92:96:7b:fb:2d:bf:ee:ab
c3:84:f9:2e:6e:5c:51:a2:80:19:c7:06:40:1d:5a:ce
04:17:7e:f3:34:ad:ac:6b:80:eb:75:ea:62:a7:78:8a
d1:74:a6:92:5c:31:11:93:14:68:40:50:76:0b:a5:4d
d6:d6:c8:9f:6a:2c:65:3b:ac:8d:1a:dc:aa:51:24:27
99:e9:53:b7:05:17:36:8f:3e:65:80:f3:6e:48:0a:bb
b1:fe:fa:29:60:71:82:6e:d0:a1:16:98:1a:67:67:02
bb:83:95:a2:c3:c6:08:ee:f9:5b:c2:b8:21:10:5c:87
33:c0:d2:78:76:32:c6:db:87:78:ab:98:93:36:41:aa
ef
Exponent (bits 24):
01:00:01
Extensions:
Basic Constraints (critical):
Certificate Authority (CA): FALSE
Key Purpose (not critical):
TLS WWW Client.
Key Usage (critical):
Digital signature.
Key encipherment.
Subject Key Identifier (not critical):
558c2dc92c638558075a82af4c7820adf8469927
Authority Key Identifier (not critical):
88aea5e4afa72d354b63318b284694c34e603bbd
Other Information:
Public Key Id:
558c2dc92c638558075a82af4c7820adf8469927
Signing certificate...
Если в каталоге обнаружите файл clientcert.pem значит вы успешно подписали сертификат клиента.
Итог создания сертификатов
В результате создания сертификатов должны получится файлы в следующей структуре:
<каталог с сертификатами>/
CA/
cacert.pem
ca.info
cakey.pem
client/
clientcert.pem
client.info
clientkey.pem
server/
servercert.pem
server.info
serverkey.pem
Чтобы структура файлов *.info была понятной, во вложениях приведены примеры файлов.
Подключение сертификатов
Рассмотрим подключение сертификатов на примере libvirt, spice и vnc.
Подключение сертификатов к libvirt
Для того чтобы сервер libvirt стал работать с сертификатами нужно разместить файлы сертификатов на сервере в следующей структуре:
/etc/pki/
CA/
cacert.pem
libvirt/
private/
serverkey.pem
servercert.pem
Чтобы клиент libvirt смог работать с сервером нужно разместить файлы сертификатов на компьютере клиента в следующей структуре:
/etc/pki/
CA/
cacert.pem
libvirt/
private/
clientkey.pem
clientcert.pem
Для того чтобы отладить процесс работы с сертификатами рекомендуется запускать libvirt в ручную, чтобы получить полную информацию о обработке сертификатов. Для того чтобы приступить к запуску libvirt в ручную необходимо сначала остановить службу libvirt-bin:
# service libvirt-bin stop
Затем запускаем демона libvirtd с активацией встроенного TCP-сервера и режима отладки:
# libvirtd --listen --verbose
Со стороны клиента подключаемся к libvirt из консоли выполняя команду
$ virsh -c qemu+tls://boris@lab/system list --all
Если соединение прошло успешно и вы получили список виртуальных машин, приступаем к настройке автоматического запуска libvirtd. Для этого в файле "/etc/default/libvirt-bin" заменяем строку:
libvirtd_opts="-d"
на строку:
libvirtd_opts="-d --listen"
Подключение сертификатов к spice
Для того чтобы spice-сервер стал работать с сертификатами нужно разместить файлы сертификатов на сервере в следующей структуре:
/etc/pki/
libvirt-spice/
ca-cert.pem
server-cert.pem
server-key.pem
Чтобы spice-клиент смог работать с сервером нужно разместить файлы сертификатов на компьютере клиента в следующей структуре:
~/.spicec/
spice_truststore.pem
где spice_truststore.pem - это переименованный файл ca-cert.pem
На сервере в файле настроек /etc/libvirt/qemu.conf прописываем следующие параметры:
spice_tls = 1
spice_tls_x509_cert_dir = "/etc/pki/libvirt-spice"
Перезагружаем демона libvirt-bin
# service libvirt-bin restart
В настройках виртуальной машины с помощью virt-manager или virsh edit создаем TLS-порт.
На клиенте подключаемся к виртуальной машине на сервере lab через tls-порт 5916 следующим образом:
Spicec:
$ spicec -h lab -s 5916
Spicy:
$ spicy -h lab -s 5916
Remote-Viewer (из пакета virt-viewer):
$ remote-viewer spice://lab?tls-port=5916;
Подключение сертификатов к vnc
Для того чтобы vnc-сервер стал работать с сертификатами нужно разместить файлы сертификатов на сервере в следующей структуре:
/etc/pki/
libvirt-vnc/
ca-cert.pem
server-cert.pem
server-key.pem
Чтобы spice-клиент смог работать с сервером нужно разместить файлы сертификатов на компьютере клиента в следующей структуре:
На одного клиента:
~/.pki/
CA/
ca-cert.pem
vinagre/
private/
clientkey.pem
clientcert.pem
На всех пользователей:
/etc/pki/
CA/
ca-cert.pem
vinagre/
private/
clientkey.pem
clientcert.pem
libvirt/
private/
clientkey.pem
clientcert.pem
На сервере в файле настроек /etc/libvirt/qemu.conf прописываем следующие параметры:
vnc_tls = 1
vnc_tls_x509_cert_dir = "/etc/pki/libvirt-vnc"
vnc_tls_x509_verify = 1
Перезагружаем демона libvirt-bin
# service libvirt-bin restart
На клиенте подключаемся к виртуальной машине на сервере lab через tls-порт 5915 следующим образом:
Vinagre:
$ vinagre lab:5915
Virt-manager
$ virt-viewer -c qemu+tls://lab/system guest
Remote-viewer
$ remote-viewer vnc://lab:5915
Дополнительная информация о подключении VNC-клиентов через TLS на странице:
http://wiki.libvirt.org/page/VNCTLSSetup#VNC_clients_known_to_work
Исправление ошибок
Libvirt: Certificate check failed
В случае если во время подключения стороны клиента и выполнения команды
$ virsh -c qemu+tls://boris@lab/system list --all
Возникает ошибка вида:
2013-01-23 12:04:54.686+0000: 4954: info : libvirt version: 0.9.13
2013-01-23 12:04:54.686+0000: 4954: warning : virNetTLSContextCheckCertificate:1093 : Certificate check failed Certificate [session] owner does not match the hostname 127.0.0.1
ошибка: Не удалось подключиться к гипервизору
ошибка: сбой аутентификации: Failed to verify peer's certificate
Это значит:
- Вы не правильно подключаетесь к серверу, вместо имени указанного в сертификате вы использете другое имя или IP-адрес.
- Имя сервера не резолвится (не преобразуется в IP-адрес) через службу DNS или файл hosts