Cómo proteger su servidor web Linux

Construir un servidor LAMP y configurarlo todo bien con un manejo de datos confiable, un dominio y un certificado TLS es solo la mitad de la batalla. También deberá asegurarse de que su infraestructura esté protegida de las muchas amenazas aterradoras de Internet.

En este artículo, que fue extraído del capítulo 9 de mi libro Manning, Linux en acción, exploraré la seguridad del sitio web a través del uso adecuado de grupos de sistemas, aislamiento de procesos y auditorías regulares de los recursos de su sistema. No es toda la historia (mi libro Linux en acción cubre herramientas adicionales como instalar certificados TLS y trabajar con SELinux), pero es un gran comienzo.

Grupos de sistemas y el principio de privilegio mínimo

Los desarrolladores a los que da soporte se han dado cuenta (finalmente) de que necesitan restringir el acceso público a los datos y archivos de configuración que se encuentran en el servidor de aplicaciones y, al mismo tiempo, permitir el acceso a varios equipos de desarrollo y TI.

La primera parte de la solución son los grupos . Un grupo es un objeto del sistema, lo mismo que un usuario, excepto que nadie iniciará sesión en el sistema como grupo. El poder de los grupos está en cómo ellos, al igual que los usuarios, pueden ser "asignados" a archivos o directorios, permitiendo que cualquier miembro del grupo comparta los poderes del grupo. Esto se ilustra en la figura.

Pruebe esto usted mismo: use un editor de texto para crear un nuevo archivo. Agregue un poco de texto "Hola mundo" para que pueda saber fácilmente cuándo puede acceder a él correctamente. Ahora edite sus permisos usando chmod 770 para que el propietario y el grupo del archivo tengan todos los derechos sobre el archivo, pero otros ni siquiera puedan leerlo.

nano datafile.txt chmod 770 datafile.txt

Si su sistema aún no tiene un usuario adicional además de su cuenta, cree uno usando adduser, al estilo Debian / Ubuntu, o useradd si está en CentOS. useradd también funcionará en Ubuntu.

El comando useradd (a diferencia del adduser de Debian) requiere que

generar una contraseña de usuario por separado:

# useradd otheruser # passwd otheruser Enter new UNIX password: Retype new UNIX password: passwd: password updated successfully

Utilice su para cambiar a su nuevo usuario. Una vez que ingrese la contraseña del usuario, todos los comandos que ejecute se ejecutarán como ese usuario. Trabajará solo con la autoridad de ese usuario: ni más ni menos. Si intenta leer el archivo datafile.txt (usando cat), no tendrá suerte ya que, como recordará, a otros se les negó el permiso de lectura. Cuando haya terminado, escriba exit para salir del nuevo shell de usuario y volver a su shell original.

$ su otheruser Password: $ cat /home/ubuntu/datafile.txt cat: /home/ubuntu/datafile.txt: Permission denied $ exit

Todo esto es esperado y fácil de entender. Y, como ha visto, no poder leer el archivo que pertenece a un lector diferente a veces puede ser un problema. Veamos qué podemos hacer al asociar el archivo con un grupo y luego configurar correctamente los permisos del archivo.

Cree un nuevo grupo que pueda usar para administrar los datos de su aplicación y luego edite las propiedades de su archivo de datos usando chown. El argumento ubuntu: app-data-group deja la propiedad del archivo en manos del usuario de ubuntu, pero cambia su grupo a tu nuevo app-data-group.

groupadd app-data-group chown ubuntu:app-data-group datafile.txt

Ejecute ls con salida "larga" en el archivo para ver sus nuevos permisos y estado. Tenga en cuenta que, como se esperaba, ubuntu es el propietario del archivo y app-data-group es su grupo.

$ ls -l | grep datafile.txt -rwxrwx — — 1 ubuntu app-data-group 6 Aug 9 22:43 datafile.txt

Puede usar usermod para agregar su usuario al grupo app-data-group y luego, una vez más, su para cambiar a un shell que implementa la cuenta del otro usuario. Esta vez, aunque los permisos del archivo bloquean a otros, y definitivamente estás actuando como un "otro" usuario en este momento, deberías poder leerlo gracias a la membresía de tu grupo.

# usermod -aG app-data-group otheruser $ su otheruser $ cat datafile.txt Hello World

Utilice su para cambiar entre cuentas de usuario. Estos resultaron ser el contenido de mi archivo datafile.txt. Este tipo de organización es la forma correcta y eficaz de tratar muchos de los complicados problemas de permisos que surgirán en un sistema multiusuario.

De hecho, no solo se utiliza para brindar a los usuarios individuales el acceso que necesitan, sino que muchos procesos del sistema no podrían hacer su trabajo sin membresías de grupos especiales. Eche un vistazo rápido al archivo / etc / group y observe cuántos procesos del sistema tienen sus propios grupos.

Una lista parcial del contenido del archivo / etc / group:

$ cat /etc/group root:x:0: daemon:x:1: bin:x:2: sys:x:3: adm:x:4:syslog tty:x:5: disk:x:6: lp:x:7: mail:x:8: news:x:9: uucp:x:10: man:x:12: proxy:x:13: […]

Aislar procesos dentro de contenedores

¿Le preocupa que los múltiples servicios que tiene ejecutándose en un solo servidor, si se viola un servicio, estén todos en riesgo? Una forma de limitar el daño que pueden causar los usuarios descuidados o malintencionados es aislando los recursos y procesos del sistema. De esta manera, incluso si alguien quisiera expandir su alcance más allá de un límite establecido, no tendrá acceso físico.

El antiguo enfoque del problema era aprovisionar una máquina física separada para cada servicio. Pero la virtualización puede hacer que sea mucho más fácil, y más asequible, construir una infraestructura "aislada".

Esta arquitectura a menudo se conoce como microservicios y tendría que lanzar varios contenedores con uno, quizás, ejecutando solo una base de datos, otro Apache y un tercero que contenga archivos multimedia que podrían estar incrustados en sus páginas web. Además de los muchos beneficios de rendimiento y eficiencia asociados con las arquitecturas de microservicios, esto puede reducir en gran medida la exposición al riesgo de cada componente individual.

Por "contenedores" no me refiero necesariamente a los de la persuasión LXC.

En estos días, para este tipo de implementación, los contenedores Docker son mucho más

popular. Si está interesado en obtener más información sobre Docker, consulte mis cursos de Pluralsight que abordan el tema.

Escaneo de valores de ID de usuario peligrosos

Si bien cualquier usuario administrador podrá asumir temporalmente la autoridad de root usando sudo, solo root es realmente root. Como ya ha visto, no es seguro realizar funciones habituales como root. Pero puede suceder, ya sea por un accidente inocente o una manipulación maliciosa, que un usuario normal pueda obtener derechos de administrador a tiempo completo.

La buena noticia es que es fácil detectar a los impostores: sus números de identificación de usuario y / o grupo, como root, serán cero (0). Eche un vistazo al archivo passwd en / etc /. Este archivo contiene un registro para cada cuenta de usuario regular y del sistema que existe actualmente. El primer campo contiene el nombre de la cuenta (root y ubuntu en este caso) y el segundo campo puede contener una x en lugar de una contraseña (que, si existe, aparecerá cifrada en el archivo / etc / shadow). Pero los dos campos siguientes contienen los ID de usuario y grupo. En el caso de ubuntu en este ejemplo, ambos ID son 1000. Y, como puede ver, la raíz tiene ceros.

$ cat /etc/passwd root:x:0:0:root:/root:/bin/bash […] ubuntu:x:1000:1000::/home/ubuntu:/bin/bash

If you ever see a regular user with a user or group ID of 0, however, then you know there’s something nasty going on and you should get to work fixing it.The quick and easy way to spot a problem is to run this awk command against the passwd file, which will print out any line whose third field contains only a 0. In this case, to my great relief, the only result was root . You can run it a second time substituting $4 for $3 to pick up the group ID field.

$ awk -F: ‘($3 == “0”) {print}’ /etc/passwd root:x:0:0:root:/root:/bin/bash

Auditing system resources

The more things you’ve got running, the greater the odds of something breaking. So it makes sense that you’ll want to keep track of what’s running. This will apply to network ports (if they’re “open” then, by definition, there must be a way in), services (if they’re active, then people can run them), and installed software (if it’s installed, it can be executed).

For audits to be useful you’ll have to remember to run them once in a while. Since you just know you’re going to forget, you’ll be much better off incorporating your auditing tools into a script that not only executes regularly but, ideally, also parses the results to make them more readable.

Here, however, I’ll focus on introducing you to three key audit tools to help you scan for open ports, active services, and unnecessary software packages. Getting it automated will be your job.

Scanning for open ports

A port is considered “open” if there’s some process running on the host that’s listening on that port for requests. Keeping an eye on your open ports can keep you plugged into what’s really going on with your server.

You already know that a regular web server is probably going to have HTTP (80) and SSH (22) open, so it shouldn’t come as a surprise to come across those. But you’ll really want to focus on other unexpected results. netstat will display open ports along with a wealth of information about how they’re being used.

In this example run against a fairly typical multi-purpose server, -n tells netstat to include the numeric ports and addresses. -l includes only listening sockets, and -p adds the process ID of the listening program. Naturally, if you see something, do something.

# netstat -npl Active Internet connections (only servers) Proto Local Address Foreign Address State PID/Program name tcp 127.0.0.1:3306 0.0.0.0:* LISTEN 403/mysqld tcp 0.0.0.0:139 0.0.0.0:* LISTEN 270/smbd tcp 0.0.0.0:22 0.0.0.0:* LISTEN 333/sshd tcp 0.0.0.0:445 0.0.0.0:* LISTEN 270/smbd tcp6 :::80 :::* LISTEN 417/apache2 […]

In recent years, ss has begun to replace netstat for many uses. Just in case you find yourself at a party one day and someone asks you about ss , this example (which lists all established SSH connections) should give you enough information to save you from deep embarrassment:

$ ss -o state established ‘( dport = :ssh or sport = :ssh )’ Netid Recv-Q Send-Q Local Address:Port Peer Address:Port tcp 0 0 10.0.3.1:39874 10.0.3.96:ssh timer:(keepalive,18min,0)

Scanning for active services

Getting a quick snapshot of the systemd-managed services currently enabled on your machine can help you spot activity that doesn’t belong. systemctl can list all existing services, which can then be narrowed down to only those results whose descriptions include enabled. This will return only active services.

# systemctl list-unit-files — type=service — state=enabled [email protected] enabled bind9.service enabled cron.service enabled dbus-org.freedesktop.thermald.service enabled docker.service enabled [email protected] enabled haveged.service enabled mysql.service enabled networking.service enabled resolvconf.service enabled rsyslog.service enabled ssh.service enabled sshd.service enabled syslog.service enabled systemd-timesyncd.service enabled thermald.service enabled unattended-upgrades.service enabled ureadahead.service enabled

If you do find something that shouldn’t be there, you can use systemctl to both stop the service and make sure it doesn’t start up again with the next boot.

systemctl stop haveged systemctl disable haveged

There’s actually nothing dark and sinister about the haveged service I’m

stopping in this example: it’s a very small tool I often install to generate

random background system activity when I’m creating encryption keys.

Searching for installed software

Could someone or something have installed software on your system without you knowing? Well, how would you know if you don’t look? yum list installed or, on Debian/Ubuntu, dpkg — list will give you the whole briefing, while remove should delete any packages that don’t belong.

yum list installed yum remove packageName

Here’s how it goes on Ubuntu:

dpkg --list apt-get remove packageName

It’s also a good idea to be aware of changes to your system configuration files - which is something I cover in chapter 11.

This article is excerpted from my Manning “Linux in Action” book. There’s lots more fun where this came from, including a hybrid course called Linux in Motionthat’s made up of more than two hours of video and around 40% of the text of Linux in Action. Who knows... You might also enjoy my recently published Learn Amazon Web Services in a Month of Lunches.