¿Cómo puedo mantener seguro un entorno Python de producción?

7

La mayor parte de mi trabajo consiste en crear sitios web en Django (un marco web de Python) y desplegarlos en mis propios servidores o en los de los clientes. Trabajo desde un virtualenv para separar el sitio de los paquetes del sistema y tal vez tenga instalados entre 60 y 80 paquetes y ese lote se comparte entre dos docenas de sitios.

Esta limitación obvia para este enfoque es la necesidad de probar cada sitio si actualizo un paquete que usa. Considero que es una compensación justa por no tener que estar al tanto de innumerables eventos virtuales separados.

Y ese es esencialmente mi problema. ¿Cómo diablos se supone que debes mantenerte al tanto de virtualenv despliegues? La gente parece tratarlos como si fuera un basurero, pero si el universo de programación ha aprendido algo la semana pasada de la explosión de Ruby on Rails , el uso de versiones anteriores de software es inaceptable.

Tengo un script simple que intenta verificar las versiones actuales del paquete con la última contraparte pip , pero es bastante impreciso. Tampoco distingue entre actualizaciones de seguridad y actualizaciones de funciones (que requieren días de pruebas y arreglos).

Estoy buscando algo mejor. Estoy buscando algo que me permita saber si Django tiene una nueva versión de seguridad o si algo está al final de su vida útil. Quiero algo que me ayude (y a otros devops de Python) a no convertirme en el siguiente grupo de personas que lloran después de que una ola de niños con escáneres y scripts convierten nuestros servidores en una red de bots.

¿Existe tal cosa?

    
pregunta Oli 30.05.2013 - 17:54

5 respuestas

2

Las principales distribuciones de GNU / Linux tienen equipos de seguridad especializados responsables de mantener seguros todos los paquetes en la distribución. Si no puede permitirse gastar suficientes recursos para emparejarse con estos equipos, entonces (si el objetivo es la máxima seguridad), la mejor solución es probablemente confiar en su trabajo y usar los paquetes de las distribuciones. Las distribuciones con versiones preparadas (como Debian ) intentan parchear paquetes, de modo que sus dependencias no se rompan.

Por supuesto, si utiliza los paquetes de distribución, perderá la flexibilidad del entorno virtual de Python. Por lo tanto, este parece ser otro triángulo de compensación: alta seguridad, bajos costos, flexibilidad de instalación. Elige dos.

    
respondido por el SergiyKolesnikov 16.02.2018 - 15:16
1

Utilizamos buildout para crear implementaciones que sean reproducibles y aisladas.

Un buildout actúa como un virtualenv en que te permite instalar huevos, manteniéndolos separados de tu instalación de Python, y actúa como pip en que puedes controlar qué versiones se usan. Pero buildout también es una herramienta de compilación, con recetas que puede hacer que construya partes arbitrarias según sea necesario para adaptarse a su aplicación y prueba.

Mi env virtual no contiene nada más que el zc.buildout egg para crear nuevos recursos de arranque para nuevos proyectos.

Un buildout típico que compilo tiene varios archivos de configuración, para adaptarse a los entornos de desarrollo, integración continua y producción, pero el base.cfg invariablemente se parece a algo como:

[buildout]
extends = 
     versions.cfg

newest = false

eggs = customer_project_name

[django-base]
recipe = djangorecipe
settings = settings
eggs = ${buildout:eggs}
project = customer_project_name
projectegg = ${:project}

[python]
recipe = zc.recipe.egg
interpreter = python
eggs = ${buildout:eggs}
initialization =
   import os
   os.environ['DJANGO_SETTINGS_MODULE'] = '${django:projectegg}.settings'

con un versions.cfg para fijar todas las versiones para evitar actualizaciones accidentales.

Debido a que usamos un archivo versions.cfg , es fácil analizar todos los archivos de versiones para ver qué proyectos se ven afectados (después de todo, es solo un archivo ConfigParser ), y actualizar el paquete es solo una cuestión de actualizarlos. y volver a probar el proyecto.

Una vez probadas, envíe las actualizaciones de las versiones actualizadas al servidor del cliente, vuelva a ejecutar buildout.

Tenga en cuenta que la actualización de las correcciones de seguridad debe ser una tarea de mantenimiento dedicada de todos modos, ya que necesita planificar, probar y encontrar una ventana de actualización para sus clientes.

    
respondido por el Martijn Pieters 30.05.2013 - 18:29
1

Le recomiendo que use Docker, proporciona una buena estructura de seguridad básica, se actualiza automáticamente y es absolutamente portátil. Implementar un sitio de Django es un dolor total, pero como dije, ya que uso Docker, mi entorno de desarrollo y producción es casi idéntico, así que solo presione y tire =)

Algunas buenas lecturas sobre el tema:

enlace

enlace

    
respondido por el nyx00 19.09.2018 - 11:35
0

Para recibir notificaciones cuando existen vulnerabilidades, hay feeds RSS, servicios y productos que le informarán sobre las vulnerabilidades. Como mínimo, cualquier administrador probablemente debería estar siguiendo CVE o NVD (que incluye CVE).

¿Cómo administrar los exploits en las bibliotecas utilizadas por su aplicación, pero no en el virtualenv? Por ejemplo, ImageMagick, el ejecutable de python o una biblioteca del sistema que usa python. Creo que su única opción es actualizar la plataforma y luego realizar la verificación requerida de virtualenv y la aplicación.

En mi trabajo creamos nuestro propio paquete (RPM) que incluye python. Estamos en el mismo barco si hay una falla de seguridad en la biblioteca del sistema (actualizar la plataforma, revisar la aplicación). Sin embargo, las bibliotecas de aplicaciones o Python en sí se administran fácilmente como lo están en el paquete de herramientas. Simplemente lo revisamos y lo ejecutamos a través de nuestra compilación de integración continua que reconstruye todos los proyectos y genera todos los paquetes nuevos para la cadena de herramientas de actualización.

No hay una solución integrada verticalmente específica para python o django que yo sepa.

    
respondido por el dietbuddha 01.06.2013 - 06:22
0

Debería echar un vistazo a las características de requisitos. io . Esto parece lo que estás buscando.

Es gratis para cualquier cuenta de Bitbucket o GitHub.

Aparte de eso:

Estoy trabajando en un contexto, donde tengo que trabajar con datos confidenciales para el sector público. Y usamos CentOS como nuestra plataforma de despliegue. Principalmente, confiamos en las actualizaciones de seguridad de los paquetes .rpm que vienen con CentOS. Y para algunos casos, hacemos nuestro propio empaquetado de "paquetes de python" seleccionados. Nuestro equipo de infraestructura realiza un seguimiento de los problemas de seguridad conocidos de las cosas empaquetadas automáticamente y realiza el reenvasado. Así es como funciona para nosotros.

PS: Si estás en el lado de los contenedores, hay anchore que proporciona un servicio de aspecto similar de escanear imágenes de contenedores.

    
respondido por el Thomas Junk 17.02.2018 - 15:59

Lea otras preguntas en las etiquetas