Esta es una pregunta canónica sobre cómo asegurar una pila LAMP
¿Cuáles son las pautas absolutas para asegurar un servidor LAMP?
Esta es una pregunta canónica sobre cómo asegurar una pila LAMP
¿Cuáles son las pautas absolutas para asegurar un servidor LAMP?
Respuestas:
La respuesta de David es una buena base de los principios generales de endurecimiento del servidor. Como David indicó, esta es una gran pregunta. Las técnicas específicas que tome podrían depender en gran medida de su entorno y de cómo se utilizará su servidor. Advertencia, esto puede tomar mucho trabajo en un entorno de prueba para construirlo y hacerlo bien. Seguido de mucho trabajo para integrarse en su entorno de producción y, lo que es más importante, en el proceso comercial.
Primero, sin embargo, verifique si su organización tiene políticas de endurecimiento, ya que podrían ser las más directamente relevantes. De lo contrario, dependiendo de su rol, este podría ser un buen momento para desarrollarlos. También recomendaría abordar cada componente por separado de abajo hacia arriba.
The L
Hay muchas buenas guías disponibles para ayudarte. Esta lista puede o no ayudarlo dependiendo de su distribución.
El A
Apache puede ser divertido de asegurar. Me resulta más fácil fortalecer el sistema operativo y mantener la usabilidad que Apache o PHP.
Ellos
La P
Esto choca con la idea de las Prácticas de Programación Segura, que es una disciplina propia. SANS y OWASP tienen una cantidad ridícula de información sobre el tema, por lo que no intentaré replicarla aquí. Me centraré en la configuración del tiempo de ejecución y dejaré que sus desarrolladores se preocupen por el resto. A veces, la 'P' en LAMP se refiere a Perl, pero generalmente a PHP. Estoy asumiendo lo último.
Has hecho una pregunta que es, francamente, digna de algunos libros sobre el tema. Pero hay algunas pautas básicas generales que funcionan bien:
Espero que te ayude a comenzar.
Aquí hay una buena lista de verificación con la que me gusta comenzar.
Además de lo que sugiere David, cuanto más modular sea su instalación, me refiero a restringir el acceso a ciertos usuarios / grupos creados específicamente para una tarea y limitar su alcance, más segura es su pila LAMP: un ejemplo de esto es tener un usuario de Apache para archivos / carpetas Apache con permisos establecidos en consecuencia y no en ningún grupo que pueda acceder a archivos / carpetas críticos del sistema. Un usuario que puede acceder a las tablas MySql que están asociadas con sus sitios web que va a servir y solo a esas tablas. Además, puede restringir su acceso para dar la cantidad mínima de acceso desde una llamada PHP. Además, asegúrese de que el nombre de usuario MySQL utilizado / expuesto a través del archivo PHP no sea el mismo nombre de usuario o contraseña utilizado para otro usuario.
Lo que esto significa: si el usuario de apache o el usuario de MySql están comprometidos, no pueden hacer ningún daño fuera del alcance de la (s) carpeta (s) a las que apache tiene acceso (en el caso del usuario de apache) y fuera de la tabla ( s) / base de datos (en el caso del usuario para la base de datos MySQL).
Si de alguna manera el usuario de MySQL se viera comprometido, no podría, por ejemplo, acceder a la base de datos y eliminar todas las bases de datos de MySQL y arruinar todos sus datos. PODRÍAN, en algunas circunstancias, poder soltar tablas o insertar información en algunas tablas en una base de datos aislada, por lo que es importante otorgar solo acceso a la tabla donde sea absolutamente necesario y solo otorgar los permisos necesarios ... si no lo hace ' No es necesario tener privilegios para eliminar tablas o actualizar privilegios, luego no se los dé a ese usuario.
Además, si por alguna razón se descubre el nombre de usuario y la contraseña de su cuenta administrativa para MySQL, si usa un nombre de usuario diferente al de cualquier nombre de usuario en su sistema, primero tienen que romper la seguridad de su sistema antes de ingresar a su base de datos para causar daños. Lo mismo ocurre con el usuario de apache y el acceso a los archivos.
Hora de ejemplo! Voy a dar un ejemplo de sistema para simplificar la idea.
supongamos que tiene usuarios en su sistema (la raíz debe estar deshabilitada por seguridad mediante algo como umod -l o passwd -l, etc.): john, barney, terence y lisa.
puede crear un usuario en MySQL con el nombre de bigbird (asegúrese de usar una contraseña cifrada). Bigbird solo tiene privilegios selectos y privilegios de actualización, pero no se descarta ni crea, y ciertamente no . Además, crea otro usuario administrativo de MySQL con el nombre garfield para trabajar en la base de datos MySQL y elimina al usuario raíz de la base de datos MySQL para que no se pueda comprimir. Garfield ha sido otorgado . privilegios en todo MySQL (efectivamente, esto es solo renombrar root).
ahora, crea un grupo apache o un usuario y lo llamaremos apweb2. Appweb2 no es miembro de otros grupos, y todos los archivos / carpetas para apache se almacenan en / home / apweb2 /. Cada host virtual tendría su propia subcarpeta y cada uno de estos hosts tendría la raíz del documento establecida en esa subcarpeta. Los enlaces simbólicos se deshabilitarían para no proporcionar accidentalmente acceso al resto del sistema.
Además, puede restringir el acceso ssh solo a ciertos usuarios (o ciertos grupos, me gusta ponerlos en el grupo ssh y hacer que sea lo único que pueda usar ssh).
Además, puede elegir qué usuarios tienen privilegios de sudo para restringir aún más las cosas. Otro paso que puede llevar más allá es hacer que los usuarios de ssh no puedan sudo, podría crear usuarios especiales que puedan usar sudo que no puedan usar ssh, por lo que una vez que ingrese, debe iniciar sesión en otro usuario para tener Acceso al sudo.
Entonces, al modularizar cada segmento, si uno se ve comprometido, la pila completa no se verá comprometida y puede solucionar el problema 1 en lugar de tener que comenzar de nuevo desde cero.
Encontré este documento de SANS.org realmente útil http://www.sans.org/score/checklists/linuxchecklist.pdf
En la actualidad, no descuide la virtualización de contenedores, a saber, Docker, systemd-nspawn y los mecanismos de virtualización de contenedores en los que están construidos (espacios de nombres, cgroups). El uso de la virtualización de contenedores le permite aislar procesos, por ejemplo, si uno de los servicios se ve comprometido, un atacante no obtendrá acceso a otros servicios.
En el caso de LAMP, es posible utilizar, por ejemplo, cuatro contenedores Docker con servidor SSH, Apache, MySQL, PHP-FPM / Python / Perl / etc.