Logotipo de CentOS ( https://commons.wikimedia.org/wiki/File:Centos-logo-light.svg )

Centos 7: configuración como servidor en DigitalOcean

Download PDF

En esta entrada veremos cómo agregar usuarios para delegar la responsabilidad de administrar un servidor CentOS 7. Aunque está basado para realizarlo con el proveedor DigitalOcean, nada impide que lo puedan hacer en sus propias máquinas físicas (bare-metal). Veamos.

Para que puedan realizar completa esta práctica, pueden crear una nueva cuenta en DigitalOcean con mi código de referido y obtendrán 100 USD como crédito para crear vuestras propias máquinas virtuales.

Digitalocean Sammy green heart balloon
Digitalocean Sammy green heart balloon

Lo primero que haremos es crear un proyecto, le colocamos un nombre que mejor nos parezca y seleccionamos que es un tema educativo. Luego crearemos la máquina virtual en sí misma (en DigitalOcean la denominan droplet). 

Creación de un proyecto en DigitalOcean

Creación de una máquina virtual con CentOS 7 en DigitalOcean
Creación de una máquina virtual con CentOS 7 en DigitalOcean
Selección de sistema operativo y plan para una máquina virtual (droplet) en DigitalOcean
Selección de sistema operativo y plan para una máquina virtual (droplet) en DigitalOcean
Selección de una región para alojar una máquina virtual en DigitalOcean entre otros opciones
Selección de una región para alojar una máquina virtual en DigitalOcean entre otros opciones

La manera más segura para conectar a nuestra máquina virtual y administrar, es por medio de una llave pública y privada con la tecnología SSH. En DigitalOcean permiten almacenar nuestras llaves públicas las cuales seleccionaremos al momento de crear la máquina virtual, claro, también podremos guardar nuevas llaves públicas. La teoría es la siguiente: el usuario que le vamos a delegar la administración del servidor nos suministrará su propia clave pública la cual agregaremos en su debida oportunidad. Luego le crearemos una cuenta de usuario y colocaremos derechos de administrador entre otras medidas de seguridad. La(s) llave(s) pública(s) que agregaremos primero, en este preciso paso, son las nuestras como usuario raíz desde nuestra posición de administrador del panel de control de DigitalOcean.

Agregando llaves públicas para conectar como usuario raíz en una máquina virtual en DigitalOcean
Agregando llaves públicas para conectar como usuario raíz en una máquina virtual en DigitalOcean

Dado el caso de que estamos instalando en nuestra propia máquina física pues durante el proceso de instalación del sistema operativo establecemos un contraseña para el usuario raíz. Luego iniciamos sesión al finalizar la instalación y copiamos nuestra llave pública de manera parecida a la que haremos con nuestro futuro usuario administrador.


Los siguientes artículos (en inglés) fueron consultados para este tutorial rápido:


Primera conexión como usuario raíz (CentOS 7 en DigitalOcean)
Primera conexión como usuario raíz (CentOS 7 en DigitalOcean)

Si tenemos varias claves públicas y privadas en nuestra cuenta de usuario de nuestra máquina local, deberemos de registrar nuestra preferencia de uso en el fichero config en nuestra carpeta .ssh (en este tutorial usamos el editor de texto nano, usen el programa que más les guste para editar):

# nano ~/.ssh/config

Esencialmente se trata de establecer tres valores básicos para cada una de las máquinas que administremos de manera remota (en color rojo lo campos que deben sustituir con vuestros propios valores):

Host dominio_o_direccion_ip
IdentityFile ~/.ssh/llave_privada
User root
 

Creación de un nuevo usuario

Una vez hallamos agregado los valores de huella digital (fingerprint) de nuestro nuevo servidor CentOS 7 (conectados como usuario root el indicador de línea de comando será una almohadilla o numeral #), crearemos un usuario nuevo y le colocamos una contraseña. En este punto, si deseamos instalar el editor de texto nano lo podemos realizar con yum install -y nano o si no usar el editor de texto por defecto llamado vi.

# adduser jimmy
# paswd jimmy
Comandos adduser y passwd (CentOs 7 en DigitalOcean)
Comandos adduser y passwd (CentOs 7 en DigitalOcean)

A continuación en cinco pasos lo convertiremos en un administrador del sistema y podrá administrar de manera remota y de forma segura con su propia clave SSH.

Asignación de derechos de administrador y agregado de clave pública del nuevo usuario (CentOs 7 en DigitalOcean)
Asignación de derechos de administrador y agregado de clave pública del nuevo usuario (CentOs 7 en DigitalOcean)
# gpasswd -a jimmy wheel
# su - jimmy
$ mkdir .ssh
$ chmod 700 .ssh
$ vi .ssh/authorized_key
  1. Agregamos al grupo de administradores o sudoers; en CentOS 7 el grupo es llamado wheel.
  2. Iniciamos sesión como usuario jimmy y el indicador de la línea de comando cambiará de manera acorde.
  3. Haremos una carpeta para guardar las claves públicas de dicho usuario.
  4. Cambiaremos los derechos de carpeta para que solamente ese usuario jimmy tenga acceso a esa directorio.
  5. Con el editor de texto predeterminado llamado vi agregaremos la llave pública que suministró jimmy.
    • Para editar con vi debemos presionar la lera «i».
    • Editamos o agregamos, como este es el caso.
    • Copiamos y pegamos la llave pública del futuro usuario administrador.
    • Pulsamos la tecla «Escape» para salir del modo de edición, escribimos «:x», presionamos «Intro» y guardamos el fichero.

Ahora debemos limitar el acceso a las claves autorizadas y salir del uso de credenciales del usuario jimmy:

$ chmod 600 .ssh/authorized_keys
$ exit

A partir de este momento podemos enviar la contraseña que le colocamos al nuevo usuario para que él o ella la cambie inmediatamente al conectarse de manera remota con la clave privada que él o ella solamente conocen.

chmod 600 (CentOS 7 en DigitalOcean)
chmod 600 (CentOS 7 en DigitalOcean)

Comprobando conexión con credenciales de usuario administrador

sudo systemctl status sshd (CentOS en DigitalOcean)
sudo systemctl status sshd (CentOS en DigitalOcean)

Medidas de seguridad adicionales

Desactivar el acceso remoto para root user

Siempre se recomienda proteger la cuenta del usuario root en todo momento, y una medida efectiva es deshabilitar el acceso remoto con este usuario especial.

  • Si utilizan DigitalOcean recuerden que siempre pueden acceder directo a la consola e introducir su contraseña de usuario raíz (a su vez la página web del panel de control tiene verificación de acceso por correo electrónico, envían un código especial para autorizar el ingreso y administración de las máquinas virtuales que tengamos arrendadas).
  • Si están practicando este tutorial en una máquina real, en cualquier momento pueden acceder físicamente al ratón y teclado del futuro servidor, como medida adicional se acostumbra cerrar los armarios con llave e incluso destinar una habitación completa para alojar los servidores también bajo llave y adecuada refrigeración. Con DigitalOcean se ahorran estos dolores de cabeza pero recuerden respaldar datos constantemente, tanto en Internet de manera cifrada como en vuestros servidores locales.

Para lograr nuestro propósito, procedemos a editar el siguiente archivo:

# nano /etc/ssh/sshd_config

Y buscaremos la siguiente línea (presionamos CTRL+W para buscar con el editor nano):

#PermitRootLogin yes

Y la cambiamos a:

PermitRootLogin no

A continuación guardamos el archivo.

Edición de sshd_config con vi (CentOS 7 en DigitalOcean)
Edición de sshd_config con vi (CentOS 7 en DigitalOcean)

Ya solo queda reiniciar el servicio SSH con la siguiente orden:

# systemctl reload sshd
systemctl reload sshd (CentOS 7 en DigitalOcean)
systemctl reload sshd (CentOS 7 en DigitalOcean)

Ahora debemos, sin desconectarnos, abrir una nueva ventana terminal e intentar conectar como usuario raíz y dicha conexión será negada (ergo hemos cumplido con nuestro objetivo).

Conexión remota como usuario raíz negada por política de seguridad (CentOS 7 en DigitalOcean)
Conexión remota como usuario raíz negada por política de seguridad (CentOS 7 en DigitalOcean)

Limitar los derechos de administración

Hasta este momento hemos delegado absolutamente toda carga de trabajo del servidor en nuestro usuario administrador, y solamente nos reservamos el derecho de ser usuario raíz (sin embargo también debemos crear nuestro propio usuario y dejar al root de lo más tranquilo). ¿Qué tal si necesitamos que solamente personal expresamente autorizado pueda reiniciar y/o apagar el servidor?


Advertencia.
Advertencia.

Utilicen siempre el programa visudo para este trabajo que viene a continuación.

¡Quedan avisadas y avisados!

El comando visudo ejecuta nuestro editor de texto favorito para poder editar el fichero que limita los derechos de administración a grupos o usuarios y verifica que su sintaxis sea la correcta antes de guardar el archivo. Un error en los parámetros que le escribamos al fichero /etc/sudoers puede dejar inutilizada nuestra máquina.

Lo primero que haremos será escoger nuestro editor de texto de entre los que tengamos instalado.

sudo update-alternatives --config editor
sudo update-alternatives --config editor (Lubuntu 18)
sudo update-alternatives –config editor (Lubuntu 18)

Sintaxis de cada línea de comando

Ahora abriremos con sudo visudo para su edición, si desean conocer un poco más sobre el uso de cada línea de parámetro, lean el artículo de los señores  Justin Ellingwood y Brian Boucheron.

Por favor, lea también   Apache Servidor Web: ¿dónde almacena los registros de eventos y errores?

Presento como ejemplo los derechos asignados un usuario o usuaria (o usuarios o usuarias) . He coloreado cada parte con propósito didáctico:

<usuario(s)> <anfitrión(es)>=(<operadores>) <etiquetas> <comando(s)>

  1. <usuario(s)>: La primera columna es el nombre de usuario, o lista de nombres de usuario, o grupos, para los que especificamos esta regla. Si en vez de un usuario estamos trabajando con un grupo, usaremos el signo de porcentaje «%» como prefijo.
  2. <anfitrión(es)>: La segunda columna, justo antes del signo de igualdad, es el nombre del anfitrión (computador u ordenador) en el que se aplica esta regla. De esta manera tenemos una forma de limitar los usuarios en máquinas específicas (asumiendo que en una LAN centralicemos en una sola máquina la administración). Bien podemos usar «ALL» (todas o todos, palabra del idioma inglés) para indicar que la regla es sin restricción en este aspecto.
  3. <operadores>: La siguiente sección es después «=», entre paréntesis, es una lista de usuarios a los que los <usuario(s)> se les permite ejecutar comandos (como tales <operadores>). Así, si queremos permitir que un usuario ejecute comandos no sólo como el usuario root, sino también como otro(s) usuario(s), podemos poner los nombres de el (los) usuario(s) aquí como una lista separada por comas; o podemos simplemente permitir que se ejecute como cualquier usuario, lo cual se hace usando la declaración «ALL».
  4. <etiquetas>: (siempre acompañadas de dos puntos «:») son acciones especiales a ejecutar en la siguiente columna que contiene los <comando(s)>. A saber son dos pares:
    • PASSWD: NOPASSWD: solicita o no solicita contraseña al usuario (o usuarios).
    • EXEC:  NOEXEC: permite ejecutar o no al usuario (o usuarios).
  5. <comando(s)>: La última columna es una lista de comandos a los que se aplicará esta regla. También puede ser un solo comando o una lista de comandos separados por comas.

.

Alias para crear reglas dinámicas

Los alias son como «variables» que nos permiten crear reglas que se adapten rápidamente al entorno humano; hay casos como «Pedro, Sara y Laura son administradores pero solamente Sara tiene derecho a reiniciar el equipo. Cualquier otro administrador o administradora, a futuro, tampoco tendrá derechos de apagado o reinicio«. Para ese caso en particular incluiremos a los tres en el grupo wheel (sudoers si usamos Debian) pero debemos crear un alias para el grupo de programas que permiten apagar, reiniciar o suspender el equipo.

Estos alias son de cuatro tipos conocidos hasta ahora:

  • User_Alias: permite agregar por nombre de usuario(a).
  • Runas_Alias: igual que el anterior y además permite agregar por identificador de usuario (UID). Generalmente el usuario raíz es cero, para saber el identificador de un usuario o usuaria ejecutamos id nombre_usuario. Este artículo cuenta con varios ejemplos útiles.
  • Host_Alias: permite especificar nombres de ordenadores o bien por dirección IP y/o rango de direcciones.
  • Cmnd_Alias: los programas en sí mismos, en este capítulo nos enfocamos en los GNU esenciales para llevar adelante un sistema Linux, pero también podemos incluir cualquier otro programa como Freecad o Gimp, etc.

La sintaxis debe ser la siguiente:

Tipo_de_alias Nombre_de_alias = elemento1, elemento2, ...

Algunos ejemplos (es bueno dejar lineas de comentarios -comienzan con «#»- explicando qué hace cada uno):

Alias de usuarios
# maria es administradora
User_Alias ADMINS = maria

# luis y sara son diseñadores web
User_Alias USUARIOSWEB = luis, sara

# Todos y todas son son usuarios limitados excepto anteriores
User_Alias USUARIOSLIMITADOS = ALL, !ADMINS, !USUARIOSWEB

Comentario: cualquier futuro usuario(a) que agreguemos será limitado de manera automática, a menos que lo agreguemos de manera expresa como administrador o diseñador web. Tal vez si es administrador tendrá derecho a reiniciar el equipo, si es diseñador web tendrá derecho a escribir en las carpetas que contienen las páginas web.

Alias de anfitriones
# Red de área local con máscara
Host_Alias REDLOCAL = 192.168.1.0/255.255.255.0

# Los servidores de la red local

Host_Alias SERVIDORES = 192.168.1.7, 192.168.1.120, servidor9

# Los demás equipos son meros clientes
Host_Alias CLIENTES = REDLOCAL, !SERVIDORES

Comentario: cualquier ordenador o dispositivo que agreguemos a la red será cliente por defecto; así podremos limitar que los usuarios web solo tengan acceso a los mismos. Deberíamos tener una máquina que centralice un solo fichero sudoers y que sea repartido por la red con rsyn, por ejemplo.

Alias de comandos
# Comandos que reinician o apagan el equipo
Cmnd_Alias CMD_APAGADORES = /sbin/poweroff, /sbin/reboot, /sbin/halt

# Comando que permite manejar al servidor web Apache
Cmnd_Alias CMD_WEB = /etc/init.d/apache2

# Comandos que permiten administrar usuarios
Cmnd_Alias CMD_USUARIOS = /usr/sbin/passwd, /usr/sbin/userdel, /usr/sbin/usermod, /usr/sbin/visudo

# Comandos que permiten crear usuarios
Cmnd_Alias CMD_AGREGAUSUARIO = /usr/sbin/useradd

Comentarios: de esta manera podemos otorgar la tarea de administrar los usuarios y podremos reservar la creación de usuarios al root user, por ejemplo.

Casos prácticos

Basados en los alias que colocamos como ejemplo:

  • Los usuarios web solo se pueden conectar a los servidores y, si tienen Apache como servidor web, podrán administrarlo:
USUARIOSWEB SERVIDORES = (ALL, ALL) EXEC: CMD_WEB
  • Todos los usuario(a)s pueden reiniciar los equipos clientes:
USUARIOSLIMITADOS CLIENTES = (ALL, ALL) EXEC: CMD_APAGADORES
USUARIOSLIMITADOS SERVIDORES = (ALL, ALL) NOEXEC: CMD_APAGADORES
  • Solo los administradores pueden apagar y reiniciar los servidores:
ADMINS SERVIDORES = (ALL, ALL) EXEC: CMD_APAGADORES
USUARIOSWEB SERVIDORES = (ALL, ALL) NOEXEC: CMD_APAGADORES
  • Solo el usuario raíz puede agregar nuevos usuario(a)s:
ALL ALL = (ALL, ALL) NOEXEC: CMD_AGREGAUSUARIO

Notese que no hemos limitado la capacidad de que cualquier usuario pueda ejecutar comandos con credenciales de usuario distintas

Ejemplo completo de un fichero sudoers
# /etc/sudoers
#
# This file MUST be edited with the 'visudo' command as root.
#
# See the man page for details on how to write a sudoers file.
#

Defaults    env_reset

# Uncomment to allow members of group sudo to not need a password
# %sudo ALL=NOPASSWD: ALL

# Host alias specification

# User alias specification

# Cmnd alias specification

# User privilege specification
root    ALL=(ALL) ALL

# Members of the admin group may gain root privileges
%admin ALL=(ALL) ALL

Directorio sudoers.d

Dentro de la carpeta /etc/sudoers.d/ podremos guardar, de manera ordenada, un conjunto de ficheros de se ejecutarán después de haber sido cargado el fichero sudoers. En la última línea de sudoers existe una instrucción (que curiosamente está «comentada» con «#») y que dirige a la carpeta de marras.

Para editar dichos archivos debemos usar también a visudo:

$ sudo visudo -f /etc/sudoers.d/fichero

Tal vez resulte práctico colocar en un solo fichero los alias que usamos para los usuarios, otro para los equipos, etc.

$ sudo visudo -f /etc/sudoers.d/alias_usuarios.conf
$ sudo visudo -f /etc/sudoers.d/alias_equipos.conf
$ sudo visudo -f /etc/sudoers.d/alias_comandos.conf

Aunque no es estrictamente necesario la extensión del archivo, «.conf» permite indicar que es un fichero que contiene configuraciones. Existe una limitación: si el nombre finaliza con «~» no será ejecutado (muchos editores de texto crean copias de seguridad con el mismo nombre más este sufijo).


Language programming books, photo by Helder da Rocha
Fuentes consultadas

En idioma castellano

  • «».
  • «».
  • «».

En idioma francés

  • «».
  • «».
  • «».

En idioma inglés

Crédito de la imagen Gerd Altmann, trabajo, licencia de uso:Pixabay
Crédito de la imagen Gerd Altmann, trabajo, licencia de uso:Pixabay

Download PDF

Deja una respuesta