Certificados

Lista completa de pasos

Creando certificados de servidor, sobre la Capa de Transporte Seguro, para libvirt

En nuestro escenario de ejemplo, están siendo configurados, dos servidores virtualizados, para una comunicación TLS. La Autoridad de Certificado, y su llave privada, fueron configurados en el paso anterior.

En éste paso, se creará el certificado TLS de servidor, que necesitan los huéspedes. Una vez hecho esto, se moverán al mismo. Cuando los certificados de servidor estén en su lugar, y libvirt apropiadamente configurado, los clientes TLS podrán establecer la comunicación con ellos.

Crear los certificados de servidor

Podrá llevarse a cabo la tarea, combinando el Certificado de Servidor(CA) y, su llave privada. Será utilizada la herramienta certtool, procedente del paquete gnutls-utils.

Crear un archivo plantila, para el ertificado de servidor, utilizando un editor de textos

Son archivos en formato texto plano, uno para cada huesped virtualizado; contienen los siguientes campos:

organization = Nombre de tu organización
cn = Nombre de huesped
tls_www_server
encryption_key
signing_key

Note

Es conveniente no traducir el campo identificativo, pués probablemente la variable se llame de la misma forma, en el momento de la compilación, es decir, todo lo que está delante de =.

El campo Nombre de tu organización debe ser ajustado, para hacerlo coincidir con el nombre de la organización, a la pertenecerá el certificado. El nombre de huesped, deberá ser ajustado de igual manera, haciéndolo coincidir nuevamente, con el nombre escrito en la plantilla.

Siguiendo con el ejemplo:

# cat host1_server_template.info
organization = libvirt.org
cn = host1
tls_www_server
encryption_key
signing_key

# cat host2_server_template.info
organization = libvirt.org
cn = host2
tls_www_server
encryption_key
signing_key

# ls -al *server_template.info
-rw-r--r--. 1 root root 82 Aug 25 13:26 host1ServerTemplate.info
-rw-r--r--. 1 root root 82 Aug 25 13:26 host2ServerTemplate.info
******************************* <-- just to avoid md confilcts(deprecated).

Crear el archivo de llave privada, para el certificado de servidor, usando certtool

Son generados los archivos de llave, para ser después usados con los Certificados de Servidor. Estas llaves son usadas para crear los Certificados de Servidor TLS y, por cada supuesto, una vez el sistema virtualizado arranque.

Será creada una única llave privada, por cada supuesto, comprobando que los permisos, sólo dan acceso restringido a estos archivos.

# (umask 277 && certtool --generate-privkey > host1_server_key.pem)
Generating a 2048 bit RSA private key...

# (umask 277 && certtool --generate-privkey > host2_server_key.pem)
Generating a 2048 bit RSA private key...

# ls -al *_server_key.pem
-r--------. 1 root root 1675 Aug 25 13:33 host1_server_key.pem
-r--------. 1 root root 1675 Aug 25 13:33 host2_server_key.pem
******************************* <-- just to avoid md confilcts(deprecated).

Note

La seguridad de los archivos de llaves privadas, es muy importante. Si una persona no autorizada obtiene la llave privada de servidor, puede usarla junto a un Certificado de Servidor, para suplantar a la máquina virtualizada. Usar una buena seguridad Unix, para restringir el acceso a estas llaves.

Combinar el archivo plantilla, con el archivo llave privada, para crear el certificado de servidor

Son generados los Certificados de Servidor, usando las plantillas junto a la correspondiente llave privada. El archivo de la CA, igualmente es añadido con su llave privada, para asegurar que cada nuevo certificado de servidor, es firmado apropiadamente.

# certtool --generate-certificate \
          --template host1_server_template.info \
          --load-privkey host1_server_key.pem \
          --load-ca-certificate certificate_authority_certificate.pem \
          --load-ca-privkey certificate_authority_key.pem \
          --outfile host1_server_certificate.pem
Generating a signed certificate...
X.509 Certificate Information:
Version: 3
Serial Number (hex): 4c749699
Validity:
      Not Before: Wed Aug 25 04:05:45 UTC 2010
      Not After: Thu Aug 25 04:05:45 UTC 2011
      Subject: O=libvirt.org,CN=host1
      Subject Public Key Algorithm: RSA
      Modulus (bits 2048):
              da:75:bd:37:ac:30:4a:6c:fe:8c:8b:d9:d8:f4:94:80
              5e:48:68:31:e7:de:85:d3:d7:54:13:da:8d:d1:f1:21
              3b:d9:f1:eb:86:0a:4e:59:39:2c:53:ee:3e:81:29:7d
              e5:83:6b:bd:e9:86:93:7c:ce:a4:5b:37:b3:b6:6d:7a
              7e:60:14:99:4a:23:18:e3:0f:ff:58:68:09:08:f3:0f
              ca:76:0d:bc:76:e0:8b:38:93:42:f6:8f:b9:d6:4c:21
              2a:0e:d9:cd:1c:33:04:36:a3:eb:97:6b:84:bc:88:16
              8e:0b:80:46:ed:ce:c5:56:fe:3b:f7:32:a7:91:c3:1f
              86:b7:49:77:7b:35:e7:f4:a6:7a:3c:c9:0d:60:fd:b2
              b7:e7:d9:02:02:a5:ef:e9:0c:43:14:15:3b:ef:96:52
              a6:f9:ca:d5:fc:c0:fb:a0:5a:1f:69:6f:ce:66:0c:fc
              d5:42:86:85:7e:ab:24:15:3e:5b:a3:85:a1:3b:41:ec
              11:7c:6c:3d:14:8b:a5:14:7a:7b:79:15:a0:f6:79:2f
              30:a9:a1:6e:8c:5e:3a:97:af:8e:7c:c0:a4:1f:2a:32
              8b:4f:6b:53:e4:f0:28:48:db:2b:4c:0d:94:95:56:f0
              53:e8:0f:ad:1a:a5:cf:35:e4:e3:0c:a6:ba:85:8a:33
              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):
              6ddcfcc00a5ffe064a756d2623ea90fa20ff782c
              Authority Key Identifier (not critical):
              9512006c97dbdedbb3232a22cfea6b1341d72d76
Other Information:
    Public Key Id:
              6ddcfcc00a5ffe064a756d2623ea90fa20ff782c



Signing certificate...

Esto creará el archivo TLS Certificado de Servidor host2_server_certificate.pem para el segundo huesped.

# ls -la *server_certificate.pem
-rw-r--r--. 1 root root 1164 Aug 25 14:05 host1_server_certificate.pem
-rw-r--r--. 1 root root 1164 Aug 25 14:06 host2_server_certificate.pem
******************************* <-- just to avoid md confilcts(deprecated).

La plantillas pueden ser descartadas

# rm host1_server_template.info host2_server_template.info

Moviendo los Certificados a su lugar

Ahora que el cirtificado ha sido creado, es el momente de moverlo a su lugar.

La localización -por defecto, donde el demonio libvirt busca el archivo servercert.pem, es en /etc/pki/libvirt/. Para la la llave, la ruta será /etc/pki/libvirt/private/. Así que moveremos los archivos a su lugar respectivo.

El archivo de llave privada, debe mantenerse en lugar seguro, donde sólo pueda ser accedido por el usuario root. El archivo Certificado de Servidos, es algo menos sensible.

Propietario, Permisos, y etiquetas SELinux

La pertenencia y permisos de ambos archivos, será ajustada consecuentemente. Los directorios son los siguientes:

Directory: /etc/pki/libvirt/
Ownership: root:qemu
Permissions: u=rwx,g=rx,o=rx (755)
SELinux label: system_u:object_r:cert_t:s0

Server Certificate path: /etc/pki/libvirt/servercert.pem
Ownership: root:qemu
Permissions: u=r,g=r,o= (440)
SELinux label: system_u:object_r:cert_t:s0

Directory: /etc/pki/libvirt/private/
Ownership: root:qemu
Permissions: u=rwx,g=rx,o= (750)
SELinux label: system_u:object_r:cert_t:s0

Private Key for Server Certificate: /etc/pki/libvirt/private/serverkey.pem
Ownership: root:qemu
Permissions: u=r,g=r,o= (440)
SELinux label: system_u:object_r:cert_t:s0

Las etiquetas SELinux, únicamente son relevantes si el servidor tiene activado SELinux. De qualquier otra forma, pueden ser ignoradas.

Otras consideraciones como prácticas de seguridad y requisitos específicos para el servidor, deberán ser atendidas igualmente.

Transfiriendo los archivos y, congirurándolos

En el ejemplo de abajo, se utiliza la scp para transferir el par de llaves, a cada huestped. Después, se conecta a cada uno de ellos, para colocarlos en su lugar correcto.

Transfiriendo los archivos al host1

> El nombre de los archivos es cambiado al transferirlos.

# scp -p host1_server_certificate.pem someuser@host1:servercert.pem
someuser@host1's password:
host1_server_certificate.pem           100% 1164     1.1KB/s   00:00

# scp -p host1_server_key.pem someuser@host1:serverkey.pem
someuser@host1's password:
host1_server_key.pem                   100% 1675     1.6KB/s   00:00

Conexión al host1

Primero son creados los directorios y asignados los permisos(del directorio):

# mkdir -p /etc/pki/libvirt/private
# chmod 755 /etc/pki/libvirt
# chmod 750 /etc/pki/libvirt/private

Después son movidos los archivos y ajustados sus permisos:

# mv servercert.pem /etc/pki/libvirt
# mv serverkey.pem /etc/pki/libvirt/private

# 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 \
            /etc/pki/libvirt/private/serverkey.pem

Si el servidor tiene SELinux activado, se actualizan las etiquetas:

# restorecon -R /etc/pki/libvirt \
                /etc/pki/libvirt/private

$ ls -laZ /etc/pki/libvirt
/etc/pki/libvirt:
total 20
drwxr-xr-x  3 root qemu system_u:object_r:cert_t:s0 .
drwxr-xr-x. 8 root root system_u:object_r:cert_t:s0 ..
drwxr-x---  2 root qemu system_u:object_r:cert_t:s0 private
-r--r-----. 1 root qemu system_u:object_r:cert_t:s0 servercert.pem

$ ls -laZ /etc/pki/libvirt/private/
/etc/pki/libvirt/private/:
total 16
drwxr-x---  2 root qemu system_u:object_r:cert_t:s0
drwxr-xr-x  3 root qemu system_u:object_r:cert_t:s0 ..
-r--r-----. 1 root qemu system_u:object_r:cert_t:s0 serverkey.pem

Transfiriendo los archivos al host2

> El nombre de los archivos es cambiado al transferirlos.

# scp -p host2_server_certificate.pem someuser@host2:servercert.pem
someuser@host2's password:
host2_server_certificate.pem           100% 1164     1.2KB/s   00:00

# scp -p host2_server_key.pem someuser@host2:serverkey.pem
someuser@host2's password:
host2_server_key.pem                   100% 1675     1.8KB/s   00:00

Conexción al host2

Primero son creados los directorios y asignados los permisos(del directorio):

$ sudo mkdir -p /etc/pki/libvirt/private
$ sudo chmod 755 /etc/pki/libvirt
$ sudo chmod 750 /etc/pki/libvirt/private

Después son movidos los archivos y ajustados sus permisos:

# mv servercert.pem /etc/pki/libvirt
# mv serverkey.pem /etc/pki/libvirt/private

# 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 \
/etc/pki/libvirt/private/serverkey.pem

Si el servidor tiene SELinux activado, se actualizan las etiquetas:

# restorecon -R /etc/pki/libvirt \
                /etc/pki/libvirt/private

$ ls -laZ /etc/pki/libvirt
/etc/pki/libvirt:
total 20
drwxr-xr-x  3 root qemu system_u:object_r:cert_t:s0 .
drwxr-xr-x. 8 root root system_u:object_r:cert_t:s0 ..
drwxr-x---  2 root qemu system_u:object_r:cert_t:s0 private
-r--r-----. 1 root qemu system_u:object_r:cert_t:s0 servercert.pem

$ ls -laZ /etc/pki/libvirt/private/
/etc/pki/libvirt/private/:
total 16
drwxr-x---  2 root qemu system_u:object_r:cert_t:s0
drwxr-xr-x  3 root qemu system_u:object_r:cert_t:s0 ..
-r--r-----. 1 root qemu system_u:object_r:cert_t:s0 serverkey.pem

La configurarión del certificado de servidor, está ahora completa

Sobreescribiendo la ruta por defecto

Si es necesario que el archivo de Certificado y la llave, estén en otro lugar del servidor, deberá ajustarse mediante el archivo de configuaración /etc/libvirt/libvirtd.conf.

Las dos variables son:

cert_file = "Full path to new Server Certificate location"
key_file = "Full path to new Server Certificate Private Key location"

La ruta debe ser encerrada entre comillas dobles ". Por ejemplo:

cert_file = "/opt/libvirt/etc/pki/libvirt/servercert.pem"
key_file = "/opt/libvirt/etc/pki/libvirt/private/serverkey.pem"

Lista completa del proceso

  1. Crear certificado de Autiridad de certificados(CA).

  2. Crear certificado de servidor.

  3. Crear certificado de cliente.

  4. Configuración de demonio libvirt.

  5. Otras referencias.