Libro Linux en acción

Libro Linux en acción ¡Hola residentes de Khabro! En el libro, David Clinton describe 12 proyectos de la vida real, incluida la automatización de su sistema de respaldo y recuperación, la configuración de una nube de archivos personales estilo Dropbox y la creación de su propio servidor MediaWiki. Explorará la virtualización, la recuperación ante desastres, la seguridad, las copias de seguridad, DevOps y la resolución de problemas del sistema a través de interesantes estudios de casos. Cada capítulo termina con una revisión de las mejores prácticas, un glosario de términos nuevos y ejercicios.

Extracto “10.1. Creando un túnel OpenVPN"

Ya he hablado mucho sobre el cifrado en este libro. SSH y SCP pueden proteger los datos transferidos a través de conexiones remotas (Capítulo 3), el cifrado de archivos puede proteger los datos mientras están almacenados en el servidor (Capítulo 8) y los certificados TLS/SSL pueden proteger los datos transferidos entre sitios y navegadores de clientes (Capítulo 9). . Pero a veces es necesario proteger sus datos en una gama más amplia de conexiones. Por ejemplo, tal vez algunos de los miembros de su equipo trabajen en la carretera mientras se conectan a Wi-Fi a través de puntos de acceso públicos. Definitivamente no debe asumir que todos esos puntos de acceso son seguros, pero su gente necesita una forma de conectarse a los recursos de la empresa, y ahí es donde una VPN puede ayudar.

Un túnel VPN diseñado correctamente proporciona una conexión directa entre clientes remotos y el servidor de una manera que oculta los datos mientras viajan a través de una red insegura. ¿Así que lo que? Ya has visto muchas herramientas que pueden hacer esto con cifrado. El valor real de una VPN es que al abrir un túnel, puedes conectar redes remotas como si todas fueran locales. En cierto sentido, estás utilizando un bypass.

Al utilizar esta red extendida, los administradores pueden realizar su trabajo en sus servidores desde cualquier lugar. Pero lo más importante es que una empresa con recursos distribuidos en múltiples ubicaciones puede hacerlos visibles y accesibles para todos los grupos que los necesitan, dondequiera que estén (Figura 10.1).

El túnel en sí no garantiza la seguridad. Pero uno de los estándares de cifrado se puede incluir en la estructura de la red, lo que aumenta significativamente el nivel de seguridad. Los túneles creados con el paquete OpenVPN de código abierto utilizan el mismo cifrado TLS/SSL sobre el que ya has leído. OpenVPN no es la única opción de tunelización disponible, pero sí una de las más conocidas. Se considera un poco más rápido y seguro que el protocolo de túnel alternativo de Capa 2 que utiliza cifrado IPsec.

¿Quiere que todos los miembros de su equipo se comuniquen de forma segura entre sí mientras están de viaje o trabajan en diferentes edificios? Para hacer esto, necesita crear un servidor OpenVPN para permitir compartir aplicaciones y acceder al entorno de red local del servidor. Para que esto funcione, todo lo que necesita hacer es ejecutar dos máquinas virtuales o dos contenedores: uno para actuar como servidor/host y otro para actuar como cliente. Crear una VPN no es un proceso sencillo, por lo que probablemente valga la pena tomarse unos minutos para tener una visión general en mente.

Libro Linux en acción

10.1.1. Configuración del servidor OpenVPN

Antes de empezar, te daré algunos consejos útiles. Si va a hacerlo usted mismo (y le recomiendo encarecidamente que lo haga), probablemente se encontrará trabajando con varias ventanas de terminal abiertas en su escritorio, cada una conectada a una máquina diferente. Existe el riesgo de que en algún momento ingrese el comando incorrecto en la ventana. Para evitar esto, puede usar el comando hostname para cambiar el nombre de la máquina que se muestra en la línea de comando por algo que le indique claramente dónde se encuentra. Una vez que haga esto, deberá cerrar sesión en el servidor y volver a iniciarla para que la nueva configuración surta efecto. Esto es lo que parece:

Libro Linux en acción
Si sigue este enfoque y asigna nombres apropiados a cada una de las máquinas con las que trabaja, podrá realizar un seguimiento de dónde se encuentra fácilmente.

Después de usar el nombre de host, puede encontrar molestos mensajes de No se puede resolver el servidor OpenVPN del host al ejecutar comandos posteriores. Actualizar el archivo /etc/hosts con el nuevo nombre de host apropiado debería resolver el problema.

Preparando su servidor para OpenVPN

Para instalar OpenVPN en su servidor, necesita dos paquetes: openvpn y easy-rsa (para administrar el proceso de generación de claves de cifrado). Los usuarios de CentOS primero deben instalar el repositorio epel-release si es necesario, como lo hizo en el Capítulo 2. Para poder probar el acceso a la aplicación del servidor, también puede instalar el servidor web Apache (apache2 en Ubuntu y httpd en CentOS).

Mientras configura su servidor, le recomiendo activar un firewall que bloquee todos los puertos excepto el 22 (SSH) y el 1194 (el puerto predeterminado de OpenVPN). Este ejemplo ilustra cómo funcionaría ufw en Ubuntu, pero estoy seguro de que todavía recuerdas el programa CentOS firewalld del Capítulo 9:

# ufw enable
# ufw allow 22
# ufw allow 1194

Para habilitar el enrutamiento interno entre interfaces de red en el servidor, debe descomentar una línea (net.ipv4.ip_forward = 1) en el archivo /etc/sysctl.conf. Esto permitirá que los clientes remotos sean redirigidos según sea necesario una vez que estén conectados. Para que la nueva opción funcione, ejecute sysctl -p:

# nano /etc/sysctl.conf
# sysctl -p

Su entorno de servidor ahora está completamente configurado, pero aún queda una cosa más por hacer antes de estar listo: deberá completar los siguientes pasos (los cubriremos en detalle a continuación).

  1. Cree un conjunto de claves de cifrado de infraestructura de clave pública (PKI) en el servidor utilizando los scripts proporcionados con el paquete easy-rsa. Básicamente, el servidor OpenVPN también actúa como su propia autoridad de certificación (CA).
  2. Preparar claves adecuadas para el cliente.
  3. Configure el archivo server.conf para el servidor
  4. Configure su cliente OpenVPN
  5. Comprueba tu VPN

Generando claves de cifrado

Para simplificar las cosas, puede configurar su infraestructura clave en la misma máquina donde se ejecuta el servidor OpenVPN. Sin embargo, las mejores prácticas de seguridad suelen sugerir el uso de un servidor CA independiente para las implementaciones de producción. El proceso de generación y distribución de recursos de claves de cifrado para su uso en OpenVPN se ilustra en la Fig. 10.2.

Libro Linux en acción
Cuando instaló OpenVPN, el directorio /etc/openvpn/ se creó automáticamente, pero todavía no hay nada en él. Los paquetes openvpn y easy-rsa vienen con archivos de plantilla de ejemplo que puede utilizar como base para su configuración. Para iniciar el proceso de certificación, copie el directorio de la plantilla easy-rsa de /usr/share/ a /etc/openvpn y cambie al directorio easy-rsa/:

# cp -r /usr/share/easy-rsa/ /etc/openvpn
$ cd /etc/openvpn/easy-rsa

El directorio easy-rsa ahora contendrá bastantes scripts. En mesa 10.1 enumera las herramientas que utilizará para crear claves.

Libro Linux en acción

Las operaciones anteriores requieren privilegios de root, por lo que debe convertirse en root mediante sudo su.

El primer archivo con el que trabajará se llama vars y contiene las variables de entorno que usa easy-rsa al generar claves. Debe editar el archivo para usar sus propios valores en lugar de los valores predeterminados que ya existen. Así es como se verá mi archivo (Listado 10.1).

Listado 10.1. Fragmentos principales del archivo /etc/openvpn/easy-rsa/vars

export KEY_COUNTRY="CA"
export KEY_PROVINCE="ON"
export KEY_CITY="Toronto"
export KEY_ORG="Bootstrap IT"
export KEY_EMAIL="[email protected]"
export KEY_OU="IT"

La ejecución del archivo vars pasará sus valores al entorno de shell, donde se incluirán en el contenido de sus nuevas claves. ¿Por qué el comando sudo por sí solo no funciona? Porque en el primer paso editamos el script llamado vars y luego lo aplicamos. Aplicar y significa que el archivo vars pasa sus valores al entorno de shell, donde se incluirán en el contenido de sus nuevas claves.

Asegúrese de volver a ejecutar el archivo usando un nuevo shell para completar el proceso inacabado. Una vez hecho esto, el script le pedirá que ejecute otro script, clean-all, para eliminar cualquier contenido del directorio /etc/openvpn/easy-rsa/keys/:

Libro Linux en acción
Naturalmente, el siguiente paso es ejecutar el script clean-all, seguido de build-ca, que utiliza el script pkitool para crear el certificado raíz. Se le pedirá que confirme la configuración de identidad proporcionada por vars:

# ./clean-all
# ./build-ca
Generating a 2048 bit RSA private key

Luego viene el script build-key-server. Dado que utiliza el mismo script pkitool junto con un nuevo certificado raíz, verá las mismas preguntas para confirmar la creación del par de claves. Las claves se nombrarán según los argumentos que pases, que, a menos que estés ejecutando varias VPN en esta máquina, normalmente serán el servidor, como en el ejemplo:

# ./build-key-server server
[...]
Certificate is to be certified until Aug 15 23:52:34 2027 GMT (3650 days)
Sign the certificate? [y/n]:y
1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
Data Base Updated

OpenVPN utiliza parámetros generados por el algoritmo Diffie-Hellman (usando build-dh) para negociar la autenticación para nuevas conexiones. No es necesario que el archivo creado aquí sea secreto, pero debe generarse utilizando el script build-dh para las claves RSA que están actualmente activas. Si crea nuevas claves RSA en el futuro, también deberá actualizar el archivo Diffie-Hellman:

# ./build-dh

Las claves del lado del servidor ahora terminarán en el directorio /etc/openvpn/easy-rsa/keys/, pero OpenVPN no lo sabe. De forma predeterminada, OpenVPN buscará claves en /etc/openvpn/, así que cópielas:

# cp /etc/openvpn/easy-rsa/keys/server* /etc/openvpn
# cp /etc/openvpn/easy-rsa/keys/dh2048.pem /etc/openvpn
# cp /etc/openvpn/easy-rsa/keys/ca.crt /etc/openvpn

Preparación de claves de cifrado de cliente

Como ya ha visto, el cifrado TLS utiliza pares de claves coincidentes: una instalada en el servidor y otra instalada en el cliente remoto. Esto significa que necesitará claves de cliente. Nuestro viejo amigo pkitool es exactamente lo que necesitas para esto. En este ejemplo, cuando ejecutamos el programa en el directorio /etc/openvpn/easy-rsa/, le pasamos el argumento del cliente para generar archivos llamados client.crt y client.key:

# ./pkitool client

Los dos archivos del cliente, junto con el archivo ca.crt original que todavía se encuentra en el directorio claves/, ahora deberían transferirse de forma segura a su cliente. Debido a sus derechos de propiedad y acceso, esto puede no ser tan fácil. El método más simple es copiar manualmente el contenido del archivo fuente (y nada más que ese contenido) en una terminal que se ejecuta en el escritorio de su PC (seleccione el texto, haga clic derecho sobre él y seleccione Copiar en el menú). Luego péguelo en un nuevo archivo con el mismo nombre que creó en una segunda terminal conectada a su cliente.

Pero cualquiera puede cortar y pegar. En su lugar, piense como un administrador porque no siempre tendrá acceso a la GUI donde las operaciones de cortar y pegar son posibles. Copie los archivos al directorio de inicio de su usuario (para que la operación scp remota pueda acceder a ellos) y luego use chown para cambiar la propiedad de los archivos de root a un usuario normal no root para que se pueda realizar la acción scp remota. Asegúrese de que todos sus archivos estén actualmente instalados y accesibles. Los moverás al cliente un poco más tarde:

# cp /etc/openvpn/easy-rsa/keys/client.key /home/ubuntu/
# cp /etc/openvpn/easy-rsa/keys/ca.crt /home/ubuntu/
# cp /etc/openvpn/easy-rsa/keys/client.crt /home/ubuntu/
# chown ubuntu:ubuntu /home/ubuntu/client.key
# chown ubuntu:ubuntu /home/ubuntu/client.crt
# chown ubuntu:ubuntu /home/ubuntu/ca.crt

Con un conjunto completo de claves de cifrado listas para usar, debe decirle al servidor cómo desea crear la VPN. Esto se hace usando el archivo server.conf.

Reducir el número de pulsaciones de teclas

¿Se escribe demasiado? La expansión con corchetes ayudará a reducir estos seis comandos a dos. Estoy seguro de que puedes estudiar estos dos ejemplos y comprender lo que está pasando. Más importante aún, podrá comprender cómo aplicar estos principios a operaciones que involucran decenas o incluso cientos de elementos:

# cp /etc/openvpn/easy-rsa/keys/{ca.crt,client.{key,crt}} /home/ubuntu/
# chown ubuntu:ubuntu /home/ubuntu/{ca.crt,client.{key,crt}}

Configurando el archivo server.conf

¿Cómo puedes saber cómo debería verse el archivo server.conf? Recuerde la plantilla de directorio easy-rsa que copió de /usr/share/? Cuando instaló OpenVPN, le quedó un archivo de plantilla de configuración comprimido que puede copiar a /etc/openvpn/. Me basaré en el hecho de que la plantilla está archivada y les presentaré una herramienta útil: zcat.

Ya sabes cómo imprimir el contenido de texto de un archivo en la pantalla usando el comando cat, pero ¿qué pasa si el archivo se comprime usando gzip? Siempre puedes descomprimir el archivo y luego cat lo generará felizmente, pero son uno o dos pasos más de los necesarios. En cambio, como habrás adivinado, puedes ejecutar el comando zcat para cargar el texto descomprimido en la memoria en un solo paso. En el siguiente ejemplo, en lugar de imprimir texto en la pantalla, lo redirigirá a un nuevo archivo llamado server.conf:

# zcat 
  /usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz 
  > /etc/openvpn/server.conf
$ cd /etc/openvpn

Dejemos a un lado la extensa y útil documentación que viene con el archivo y veamos cómo se verá cuando termine de editarlo. Tenga en cuenta que el punto y coma (;) le indica a OpenVPN que no lea ni ejecute la siguiente línea (Listado 10.2).

Libro Linux en acción
Repasemos algunas de estas configuraciones.

  • De forma predeterminada, OpenVPN se ejecuta en el puerto 1194. Puede cambiar esto, por ejemplo, para ocultar aún más sus actividades o evitar conflictos con otros túneles activos. Dado que 1194 requiere una coordinación mínima con los clientes, es mejor hacerlo de esta manera.
  • OpenVPN utiliza el Protocolo de control de transmisión (TCP) o el Protocolo de datagramas de usuario (UDP) para transmitir datos. TCP puede ser un poco más lento, pero es más confiable y es más probable que lo entiendan las aplicaciones que se ejecutan en ambos extremos del túnel.
  • Puede especificar dev tun cuando desee crear un túnel IP más simple y eficiente que transporte contenido de datos y nada más. Si, por el contrario, necesitas conectar varias interfaces de red (y las redes que representan), creando un puente Ethernet, tendrás que elegir dev tap. Si no comprende lo que significa todo esto, utilice el argumento tun.
  • Las siguientes cuatro líneas le dan a OpenVPN los nombres de los tres archivos de autenticación en el servidor y el archivo de opciones dh2048 que creó anteriormente.
  • La línea del servidor establece el rango y la máscara de subred que se utilizarán para asignar direcciones IP a los clientes al iniciar sesión.
  • El parámetro de inserción opcional "ruta 10.0.3.0 255.255.255.0" permite a los clientes remotos acceder a subredes privadas detrás del servidor. Para que esto funcione también es necesario configurar la red en el servidor para que la subred privada conozca la subred OpenVPN (10.8.0.0).
  • La línea port-share localhost 80 le permite redirigir el tráfico del cliente que llega al puerto 1194 a un servidor web local que escucha en el puerto 80. (Esto será útil si va a utilizar el servidor web para probar su VPN). Esto solo funciona luego cuando se selecciona el protocolo tcp.
  • Las líneas de usuario nadie y grupo nogroup deben habilitarse eliminando el punto y coma (;). Obligar a los clientes remotos a ejecutarse como nadie y sin grupo garantiza que las sesiones en el servidor no tengan privilegios.
  • log especifica que las entradas de registro actuales sobrescribirán las entradas antiguas cada vez que se inicia OpenVPN, mientras que log-append agrega nuevas entradas al archivo de registro existente. El archivo openvpn.log en sí se escribe en el directorio /etc/openvpn/.

Además, a menudo también se agrega un valor de cliente a cliente al archivo de configuración para que varios clientes puedan verse entre sí además del servidor OpenVPN. Si está satisfecho con su configuración, puede iniciar el servidor OpenVPN:

# systemctl start openvpn

Debido a la naturaleza cambiante de la relación entre OpenVPN y systemd, a veces puede ser necesaria la siguiente sintaxis para iniciar un servicio: systemctl start openvpn@server.

Al ejecutar ip addr para enumerar las interfaces de red de su servidor, ahora debería generarse un enlace a una nueva interfaz llamada tun0. OpenVPN lo creará para atender a los clientes entrantes:

$ ip addr
[...]
4: tun0: mtu 1500 qdisc [...]
      link/none
      inet 10.8.0.1 peer 10.8.0.2/32 scope global tun0
          valid_lft forever preferred_lft forever

Es posible que deba reiniciar el servidor antes de que todo comience a funcionar completamente. La siguiente parada es la computadora cliente.

10.1.2. Configurar el cliente OpenVPN

Tradicionalmente, los túneles se construyen con al menos dos salidas (de lo contrario, los llamaríamos cuevas). Un OpenVPN configurado correctamente en el servidor dirige el tráfico dentro y fuera del túnel por un lado. Pero también necesitará algún software que se ejecute en el lado del cliente, es decir, en el otro extremo del túnel.

En esta sección, me centraré en configurar manualmente algún tipo de computadora Linux para que actúe como cliente OpenVPN. Pero esta no es la única manera en que se presenta esta oportunidad. OpenVPN admite aplicaciones cliente que se pueden instalar y utilizar en computadoras de escritorio y portátiles con Windows o macOS, así como en teléfonos inteligentes y tabletas con Android e iOS. Consulte openvpn.net para obtener más detalles.

El paquete OpenVPN deberá instalarse en la máquina cliente tal como se instaló en el servidor, aunque aquí no es necesario usar easy-rsa ya que las claves que está utilizando ya existen. Debe copiar el archivo de plantilla client.conf al directorio /etc/openvpn/ que acaba de crear. Esta vez el archivo no se comprimirá, por lo que el comando cp normal hará el trabajo perfectamente:

# apt install openvpn
# cp /usr/share/doc/openvpn/examples/sample-config-files/client.conf 
  /etc/openvpn/

La mayoría de las configuraciones en su archivo client.conf se explican por sí mismas: deben coincidir con los valores en el servidor. Como puede ver en el siguiente archivo de ejemplo, el parámetro único es remoto 192.168.1.23 1194, que le indica al cliente la dirección IP del servidor. Nuevamente, asegúrese de que esta sea la dirección de su servidor. También debe obligar a la computadora cliente a verificar la autenticidad del certificado del servidor para evitar un posible ataque de intermediario. Una forma de hacer esto es agregar la línea server-cert-tls remoto (Listado 10.3).

Libro Linux en acción
Ahora puede ir al directorio /etc/openvpn/ y extraer las claves de certificación del servidor. Reemplace la dirección IP del servidor o el nombre de dominio en el ejemplo con sus valores:

Libro Linux en acción
Es probable que no suceda nada interesante hasta que ejecute OpenVPN en el cliente. Como necesitas pasar un par de argumentos, lo harás desde la línea de comando. El argumento --tls-client le dice a OpenVPN que actuará como cliente y se conectará mediante cifrado TLS, y --config apunta a su archivo de configuración:

# openvpn --tls-client --config /etc/openvpn/client.conf

Lea atentamente el resultado del comando para asegurarse de que esté conectado correctamente. Si algo sale mal la primera vez, puede deberse a una discrepancia en la configuración entre los archivos de configuración del servidor y del cliente o a un problema de conexión de red/firewall. A continuación se ofrecen algunos consejos para la resolución de problemas.

  • Lea atentamente el resultado de la operación OpenVPN en el cliente. A menudo contiene valiosos consejos sobre qué es exactamente lo que no se puede hacer y por qué.
  • Verifique los mensajes de error en los archivos openvpn.log y openvpn-status.log en el directorio /etc/openvpn/ del servidor.
  • Verifique los registros del sistema en el servidor y el cliente para ver si hay mensajes cronometrados y relacionados con OpenVPN. (journalctl -ce mostrará las entradas más recientes).
  • Asegúrese de tener una conexión de red activa entre el servidor y el cliente (más sobre esto en el Capítulo 14).

Acerca del Autor

David Clinton - administrador de sistemas, profesor y escritor. Ha administrado, escrito y creado materiales educativos para muchas disciplinas técnicas importantes, incluidos sistemas Linux, computación en la nube (particularmente AWS) y tecnologías de contenedores como Docker. Escribió el libro Aprenda los servicios web de Amazon en un mes de almuerzos (Manning, 2017). Muchos de sus cursos de capacitación en video se pueden encontrar en Pluralsight.com, y los enlaces a sus otros libros (sobre administración de Linux y virtualización de servidores) están disponibles en bootstrap-it.com.

» Puede encontrar más detalles sobre el libro en sitio web del editor
» tabla de contenidos
» Extracto

Para Khabrozhiteley 25% de descuento usando cupón - Linux
Previo pago de la versión impresa del libro, se enviará por correo electrónico un libro electrónico.

Fuente: habr.com

Añadir un comentario