Site is under maintenance mode. Please wait few min!
Saltar al contenido

Cómo desplegar aplicaciones web en Python con el Bottle Micro Framework en CentOS 7

marzo 4, 2020

 

Introducción

Redis es un almacén de datos clave-valor de código abierto, utilizando un modelo de almacenamiento en memoria con las escrituras en disco opcionales para la persistencia. Cuenta con transacciones, un patrón de mensajería pub / sub y conmutación automática entre otra funcionalidad. Redis tiene clientes escritos en la mayoría de los idiomas con los recomendados destacados en su página web.

Redis no proporciona funciones de cifrado de su propio. Opera bajo el supuesto de que se ha desplegado a una red privada aislada, accesible únicamente a las partes de confianza. Si el entorno no coincide con este supuesto, tendrá que ajustar el tráfico Redis en el cifrado por separado.

En esta guía, vamos a demostrar cómo cifrar el tráfico Redis utilizando un programa de tuberías seguro llamado spiped. El tráfico entre clientes y servidores Redis se enruta a través de un túnel encriptado dedicado, similar a un túnel SSH dedicado. Nosotros vamos a usar dos servidores Ubuntu 16.04 para demostrar.

Requisitos previos

Para empezar, usted debe tener un usuario no root con privilegios de sudo configurados en cada una de sus máquinas. Además, esta guía se supone que tiene un servidor de seguridad básica en su lugar. Puedes seguir nuestra guía de configuración inicial del servidor de Ubuntu 16.04 para cumplir con estos requisitos.

Cuando esté listo para continuar, seguir a lo largo de abajo.

Lo que se spiped?

El spiped utilidad es fácil de instalar y configurado para la comunicación segura entre dos conectores de red (puertos de red regular o conectores Unix). Puede ser utilizado para configurar la comunicación encriptada entre dos servidores remotos. Las conecta el cliente a un puerto local y lo envuelve en spiped cifrado antes de enviarlo al servidor remoto. En el lado del servidor, spiped escucha en el puerto configurado y descifra el tráfico antes de enviarlo a un puerto local (en nuestro caso, el puerto que el servidor Redis escuchas sobre).

Algunas ventajas de utilizar spiped son:

  • Ubuntu mantiene paquetes para spiped en sus repositorios por defecto. proyecto
  • El Redis actualmente sugiere el uso de spiped para cifrar el tráfico. Configuración
  • es sencillo e intuitivo.

  • Un nuevo tubo se utiliza para cada propósito. Esto podría ser una desventaja en algunas situaciones, pero proporciona un control granular sobre el acceso.

Algunas desventajas son: Los clientes

  • se conectan a la máquina remota mediante la unión a un puerto local no predeterminado, que puede ser poco intuitivo al principio.
  • Si conecta dos servidores Redis para la replicación o la agrupación, dos túneles se debe configurar en cada máquina para la comunicación de servidor a servidor (uno para la ida y otro para el tráfico entrante).
  • No se incluye ningún script de inicio, por lo que uno debe ser creado con el fin de crear automáticamente las conexiones necesarias en el arranque.

Con estas características en mente, vamos a empezar.

Instalar el servidor Redis y paquetes de cliente

Antes de empezar, debemos tener el servidor Redis instalado en una máquina y los paquetes de cliente disponibles en el otro. Si ya dispone de uno o ambos de estos configurado, no dude en saltar a continuación.

Nota: Las instrucciones de servidor El Redis establece una clave de prueba que se utiliza para probar la conexión más tarde. Si ya tiene instalado el servidor Redis, puede seguir adelante y establecer esta clave o utilizar cualquier otra tecla conocida cuando se prueba la conexión.

Instalación del servidor Redis

Utilizaremos servidor Redis de Chris Lea PPA para instalar una versión actualizada de Redis. Siempre tenga cuidado cuando se utiliza una tercera parte del repositorio. En este caso, Chris Lea es un empaquetador de confianza que mantiene una alta calidad, hasta a la fecha de paquetes para varios proyectos de código abierto populares.

Añadir el PPA e instalar el software de servidor Redis en su primera máquina escribiendo:

sudo apt-add-repository ppa:chris-lea/redis-server
sudo apt-get update
sudo apt-get install redis-server

  • sudo ppa add-apt-repositorio: Chris-lea / Redis-servidor
  • sudo apt-get update
  • sudo apt-get instalar Redis-servidor

Tipo Introduzca a aceptar las indicaciones durante este proceso.

Cuando se complete la instalación, prueba que se puede conectar con el servicio Redis localmente escribiendo:

redis-cli ping

  • Redis-cli de ping

Si el software está instalado y en funcionamiento, debería ver: de

Redis server outputPONG

deje reposar una clave que podemos usar más adelante:

redis-cli set test 'success'

  • Redis-cli equipo de prueba ‘éxito’

hemos establecido la clave prueba para el éxito de valor. Vamos a tratar de acceder a esta clave de nuestra máquina cliente Después de configurar spiped.

Instalación del Cliente Redis

La otra Ubuntu 16.04 voluntad función de la máquina como el cliente. Todo lo que el software que necesita está disponible en el paquete Redis-herramientas en el repositorio predeterminado:

sudo apt-get update
sudo apt-get install redis-tools

  • sudo apt-get update
  • sudo apt-get instalar Redis-herramientas

Con la configuración por defecto del servidor Redis remoto y un firewall activo, no podemos Actualmente conectarse a la instancia remota Redis a prueba.

Instalar spiped en cada equipo

A continuación, tendrá que instalar spiped en cada uno de los servidores y clientes. Si no necesita instalar nada en el apartado anterior, asegúrese de incluir el comando update sudo apt-get para actualizar el índice de paquete antes de instalar:

sudo apt-get install spiped

  • sudo apt-get install spiped

Ahora que tenemos tiene el software necesario instalado, se puede generar una clave segura que spiped puede utilizar para cifrar el tráfico entre las dos máquinas.

Generar una clave de encriptación en el Redis servidor

A continuación, crear un directorio de configuración spiped dentro de / etc en el servidor Redis para almacenar la clave generaremos para el cifrado:

sudo mkdir /etc/spiped

  • sudo mkdir / etc / spiped

Generar una clave segura escribiendo:

sudo dd if=/dev/urandom of=/etc/spiped/redis.key bs=32 count=1

  • sudo dd if = / dev / urandom of = / etc / spiped / redis.key bs = 32 count = 1

Restringir el acceso al archivo de clave generada por el ajuste de los permisos:

sudo chmod 600 /etc/spiped/redis.key

  • sudo chmod 600 /etc/spiped/redis.key

Ahora que tenemos la llave disponible en el servidor Redis, podemos establecer spiped en el servidor usando un archivo de unidad de systemd.

crear un archivo Unidad systemd para servidores Redis

El spiped utilidad es muy simple y no tiene soporte para leer un archivo de configuración. Debido a que cada tubo tiene que ser configurado manualmente, el paquete de Ubuntu no viene con un guión de inicio para iniciar un tubo de forma automática en el arranque.

Para resolver estas cuestiones, vamos a crear un simple archivo de unidad de systemd. Abrir un nuevo archivo de unidad en el directorio / etc / systemd / system para empezar:

sudo nano /etc/systemd/system/spiped-receive.service

  • sudo nano /etc/systemd/system/spiped-receive.service

el interior, crear una sección [Unidad] para describir la unidad y establecer el pedido para que esta unidad se inicia después de la creación de redes está disponible:

[Unit]
Description=spiped receive for Redis
Wants=network-online.target
After=network-online.target

a continuación, abra una [Servicio] sección para definir el comando real para funcionar. Vamos a utilizar las siguientes opciones con spiped:

  • -F: Ejecutar en el primer plano. El sistema de inicio systemd está diseñado para gestionar los servicios que se ejecutan en el primer plano cuando sea posible. Que se ejecuta en el primer plano simplifica la configuración requerida.
  • -d: Descifrar el tráfico de la toma de la fuente. Esto le dice a spiped la dirección de cifrado para que sepa descifrar el tráfico a partir de la fuente y cifrar el tráfico de la meta.
  • -s: Esto define el enchufe hembra de fuente. Las direcciones IP deben estar entre corchetes seguido de dos puntos y luego el puerto. Para el servidor Redis, esto debe ser ajustado a la dirección IP pública y el puerto Redis.
  • -t: La toma de destino. Aquí es donde se enviará el tráfico a después de descifrar. Redis escucha en el puerto 6379 en el host local de forma predeterminada, por lo que eso es lo que hay que utilizar.
  • -k: Especifica el archivo de clave para su uso. Esto debería apuntar a la clave de cifrado hemos generado anteriormente.

Todas estas opciones va a ir en una sola directiva ExecStart, que es el único elemento que necesitamos en esta sección:

[Unit]
Description=spiped receive for Redis
Wants=network-online.target
After=network-online.target

[Service]
ExecStart=/usr/bin/spiped -F -d -s [redis_server_public_IP]:6379 -t [127.0.0.1]:6379 -k /etc/spiped/redis.key

Finalmente, se incluirá una sección [Instalar] para decirle systemd cuando se inicie automáticamente la unidad si está habilitado :

[Unit]
Description=spiped receive for Redis
Wants=network-online.target
After=network-online.target

[Service]
ExecStart=/usr/bin/spiped -F -d -s [redis_server_public_IP]:6379 -t [127.0.0.1]:6379 -k /etc/spiped/redis.key

[Install]
WantedBy=multi-user.target

Cuando haya terminado, guardar y cerrar el archivo.

de inicio del servicio spiped y ajustar el Firewall en el servidor Redis

de inicio y activar la nueva unidad spiped escribiendo:

sudo systemctl start spiped-receive.service
sudo systemctl enable spiped-receive.service

  • sudo inicio systemctl spiped-receive.service
  • sudo systemctl permiten spiped-receive.service

Si marca los servicios de escucha para las conexiones en el servidor Redis, debería ver la escucha en el puerto 6379 spiped en la interfaz pública. También debe ver Redis está escuchando a ese mismo puerto en la interfaz local:

sudo netstat -plunt

  • sudo netstat -plunt

Redis server outputActive Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 public_IP:6379 0.0.0.0:* LISTEN 4292/spiped
tcp 0 0 127.0.0.1:6379 0.0.0.0:* LISTEN 2679/redis-server 1
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1720/sshd
tcp6 0 0 :::22 :::* LISTEN 1720/sshd

Aunque spiped está escuchando en la interfaz pública, el cortafuegos está probablemente no configurado para permitir el tráfico a través todavía.

Para permitir todo el tráfico en el puerto 6379, escriba:

sudo ufw allow 6379

  • sudo permiten UFW 6379

Esto abrirá el acceso al puerto 6379 en su interfaz pública donde spiped está escuchando. El puerto spiped sólo acepta el tráfico cifrado.

transferir la clave de cifrado para el cliente

Para transferir la clave de cifrado para el cliente, tendremos que establecer una conexión segura entre los dos servidores. Vamos a utilizar ssh ya que esto nos permite aprovechar nuestra configuración existente.

Si utiliza la autenticación basada en clave, tendrá que pasar su clave SSH al servidor Redis para establecer la conexión. Esto no es necesario para los sistemas basados ​​en contraseñas.

pasos adicionales para Key autenticación basada en

desconecte de su servidor Redis:

exit

    salida

Ahora, en el equipo local, asegúrese de que un agente SSH está funcionando y que su clave privada ha sido añadido a la misma :

eval `ssh-agent`
ssh-add

  • eval `ssh-agent`
  • ssh-add

Ahora, vuelva a conectar a su servidor Redis y añadir la bandera -A para desviar las teclas:

ssh -A sammy@redis_server_public_IP

  • ssh -A Sammy @ redis_server_public_IP

ahora puede continuar con los pasos siguientes.

Transferencia de la llave

Vamos a conectar desde el servidor al cliente Redis porque nuestro archivo de claves requiere privilegios sudo locales de acceso. Ahora podemos transferir el archivo, asegurándose de incluir los dos puntos al final del comando a continuación:

sudo -E scp /etc/spiped/redis.key sammy@redis_client_public_IP:

  • sudo -E SCP /etc/spiped/redis.key Sammy @ redis_client_public_IP:

SCP escribir en sus usuarios de Inicio guía en la máquina cliente.

Después de transferir la clave, crear el directorio / etc / spiped en la máquina cliente:

sudo mkdir /etc/spiped

  • sudo mkdir / etc / spiped

Mueva la clave de cifrado en el nuevo directorio:

sudo mv ~/redis.key /etc/spiped

  • sudo mv ~ / Redis .key / etc / spiped

de bloqueo hacia abajo los permisos para restringir el acceso:

sudo chmod 600 /etc/spiped/redis.key

  • sudo chmod 600 /etc/spiped/redis.key

Ahora que el cliente tiene una copia de la clave de cifrado del servidor, podemos configurar el lado del cliente de la configuración spiped.

crear un archivo Unidad systemd para clientes Redis

Tendremos que crear un archivo de unidad de systemd para spiped en el lado del cliente tal como lo hicimos en el servidor Redis.

abrir un nuevo archivo de unidad de systemd escribiendo:

sudo nano /etc/systemd/system/spiped-send.service

  • sudo nano /etc/systemd/system/spiped-send.service

En el interior, una abierta [Unidad] sección para describir el servicio y establecer que depende de la disponibilidad de redes:

[Unit]
Description=spiped sending for Redis
Wants=network-online.target
After=network-online.target

a continuación, abrir una sección [Servicio] para ejecutar el proceso spiped. Las opciones que se utilizan aquí son muy similares a los utilizados en el servidor Redis, con las siguientes diferencias:

  • -e: Especifica que el tráfico que entra tendrá que ser encriptada la toma de la fuente. Esto establece la relación entre las cuencas de origen y de destino.
  • -s: Define la toma de la fuente, al igual que antes. En este caso, sin embargo, la fuente es un puerto disponible arbitraria en la interfaz local donde el cliente local Redis puede conectarse.
  • -t: Define el socket de destino, al igual que antes. Para el cliente esta será la dirección IP pública del servidor Redis remoto y el puerto que se abrió.

Estos se establecerá mediante la directiva ExecStart nuevo:

[Unit]
Description=spiped sending for Redis
Wants=network-online.target
After=network-online.target

[Service]
ExecStart=/usr/bin/spiped -F -e -s [127.0.0.1]:8000 -t [redis_server_public_IP]:6379 -k /etc/spiped/redis.key

Por último, incluye una sección [Instalar] para definir cuándo se iniciará la unidad si está habilitado:

[Unit]
Description=spiped sending for Redis
Wants=network-online.target
After=network-online.target

[Service]
ExecStart=/usr/bin/spiped -F -e -s [127.0.0.1]:8000 -t [redis_server_public_IP]:6379 -k /etc/spiped/redis.key

[Install]
WantedBy=multi-user.target

Cuando haya terminado, guarde y cierre el archivo.

inicio del spiped de servicio en el cliente y probar la conexión

Ahora, podemos empezar a nuestro servicio spiped en el cliente y permitir que se inicie automáticamente en el arranque:

sudo systemctl start spiped-send.service
sudo systemctl enable spiped-send.service

  • sudo systemctl puesta en send.service spiped
  • sudo systemctl enable-send.service spiped

Comprobar que el túnel en el cliente se ha configurado adecuadamente:

sudo netstat -plunt

  • sudo netstat -plunt

Redis client outputActive Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 127.0.0.1:8000 0.0.0.0:* LISTEN 3264/spiped
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1705/sshd
tcp6 0 0 :::22 :::* LISTEN 1705/sshd

Como se puede ver, spiped está escuchando en el puerto local 8000 para las conexiones.

Ahora, usted debe ser capaz de conectarse a la instancia Redis distancia apuntándolo a su cliente al puerto 8000 en su interfaz local:

redis-cli -p 8000 ping

  • Redis-cli -p 8000 de ping

Redis client outputPONG

de consulta para la clave de prueba que nos propusimos en el comienzo de esta guía:

redis-cli -p 8000 get test

  • Redis-cli -p 8000 prueba get

Redis client output"success"

esto confirma que somos capaces de llegar a la base de datos remota con éxito.

que confirmar que somos incapaces para comunicarse con el servidor Redis remota sin necesidad de utilizar el túnel, podemos tratar de conectar con el puerto remoto directamente:

redis-cli -h redis_server_public_IP -p 6379 ping

  • Redis-cli -h redis_server_public_IP -p 6379 de ping

Redis client outputError: Protocol error, got "xac" as reply type byte

Como se puede ver, el tráfico sólo se acepta en el puerto Redis remota si está codificada correctamente a través del túnel.

Extendiendo el ejemplo anterior para Multi-cliente y de servidor a servidor de comunicaciones

El ejemplo que utiliza señaladas anteriormente un ejemplo sencillo de un solo servidor Redis y un único cliente. Sin embargo, estos mismos métodos pueden ser aplicados a las interacciones más complejas.

La extensión de este ejemplo para manejar múltiples clientes es sencillo. Lo que se necesita para llevar a cabo las siguientes acciones descritas anteriormente.

  • Instalar el software de cliente Redis y el paquete spiped en el nuevo cliente
  • La transferencia de la clave de cifrado para el nuevo cliente
  • Copia el archivo unidad de systemd spiped a la nueva máquina cliente
  • de inicio del servicio spiped y permitir que se inicie al arranque

para configurar la comunicación segura de servidor a servidor (por ejemplo, para la replicación o agrupación), que tendría que configurar dos túneles paralelos:

  • en el nuevo servidor, instale el paquete de servidor Redis y spiped
  • generar una nueva clave de cifrado para el nuevo servidor Redis (utilizar un nombre único para el archivo)
  • Copiar la clave de cifrado de un servidor a otro en el directorio / directorio / etc spiped
  • Crear una spiped archivo unidad de systemd en cada servidor (incluidos los servidores existentes) para que cada servidor tiene un servidor de archivos cada función: a la recepción del archivo unidad de mapeo de un puerto externo en el fichero de unidad de envío REDISA local de la asignación de un puerto local a la SER remoto Ver su puerto expuesta
  • A la recepción del archivo unidad de mapeo de un puerto externo a la Redis
  • Un archivo que envía la unidad local de la asignación de un puerto local al puerto expuesta del servidor remoto
  • abierto el puerto externo en el servidor de seguridad en el nuevo servidor Redis
  • Configurar cada instancia Redis para conectarse al puerto asignado localmente para acceder al servidor remoto mediante el ajuste del fichero de configuración Redis (las directivas requeridas dependen de la relación de los servidores. Consulte la documentación Redis para más detalles).

Crear un archivo de unidad de systemd spiped en cada servidor (incluidos los servidores existentes) para que cada servidor tiene un servidor de archivos cada rol:

  • A la recepción del archivo unidad de mapeo de un puerto externo a la Redis
  • una correlación de archivo que envía la unidad local de un puerto local al puerto expuesta del servidor remoto

abierto el puerto externo en el servidor de seguridad en el nuevo servidor Redis

Configurar cada instancia Redis para conectarse al puerto asignado localmente para acceder al servidor remoto mediante el ajuste del fichero de configuración Redis (la directivas requeridas dependen de la relación de los servidores. Consulte la documentación Redis para más detalles).

si los archivos de la unidad es necesario, varios clientes se pueden configurar en cada máquina para mapear puertos locales a servidores remotos. En estos casos, asegúrese de elegir un puerto local sin uso diferente en la especificación de toma de origen en el archivo unidad de envío.

Conclusión

Redis es una herramienta potente y flexible que tiene un valor incalculable para muchas implementaciones. Sin embargo, operando Redis en un entorno inseguro es una responsabilidad enorme que deja sus servidores y los datos vulnerables al ataque o robo. Es esencial para proteger el tráfico a través de otros medios, si usted no tiene una red aislada únicamente poblado por partes de confianza. El método descrito en esta guía es sólo una manera de asegurar la comunicación entre las partes Redis. Otras opciones incluyen un túnel con stunnel o la creación de una VPN.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *