Automatiza la creación de servidores SFTP seguros con Ansible
¿Tienes la necesidad de habilitar una transferencia segura de archivos para distintos usuarios, pero te da pereza gestionar manualmente los permisos y configuraciones en cada servidor? Hoy te traigo un playbook de Ansible para desplegar, configurar y asegurar un servidor SFTP multiusuario en cuestión de minutos, perfecto tanto para entornos de pruebas como para producción.
¿Por qué automatizar un servidor SFTP con Ansible?
- Reducir errores humanos: La gestión manual de usuarios y permisos suele estar cargada de errores. Ansible estandariza el proceso y lo hace repetible[1][3].
- Cumplimiento y seguridad: El playbook impone parámetros seguros automáticamente.
- Escalabilidad: Añadir, eliminar o modificar usuarios de forma masiva es rápido y sencillo, ideal si tienes que gestionar varios servidores[1].
- Ahorro de tiempo: Los despliegues, actualizaciones y correcciones de configuración pasan de horas a minutos[1].
¿Qué hace este playbook?
Este playbook de dificultad intermedia-avanzada:
- Instala y configura el servicio OpenSSH si no está presente.
- Crea los grupos y usuarios necesarios para SFTP, con directorios propios (chroot).
- Ajusta la configuración de
/etc/ssh/sshd_config
para restringir el acceso a solo SFTP. - Reinicia el servicio SSH para aplicar cambios.
- Opcionalmente, puedes definir distintos usuarios y rutas sencillamente en una variable.
El playbook completo deploy_sftp_secure.yml
---
- name: Despliegue automatizado de un servidor SFTP seguro multiusuario
hosts: sftp_servers
become: yes
vars:
sftp_users:
- name: usuario1
password: "contraseña_segura1"
chroot_dir: "/sftp/usuario1"
- name: usuario2
password: "contraseña_segura2"
chroot_dir: "/sftp/usuario2"
tasks:
- name: Asegurarse de que OpenSSH está instalado
ansible.builtin.package:
name: openssh-server
state: present
- name: Crear grupo para SFTP
ansible.builtin.group:
name: sftpusers
state: present
- name: Crear usuarios SFTP y sus directorios
ansible.builtin.user:
name: "{{ item.name }}"
password: "{{ item.password | password_hash('sha512') }}"
groups: sftpusers
shell: /usr/sbin/nologin
home: "{{ item.chroot_dir }}"
create_home: no
loop: "{{ sftp_users }}"
- name: Crear y establecer los permisos de los directorios chroot
ansible.builtin.file:
path: "{{ item.chroot_dir }}"
state: directory
owner: root
group: root
mode: "0755"
loop: "{{ sftp_users }}"
- name: Crear subdirectorio de carga para el usuario
ansible.builtin.file:
path: "{{ item.chroot_dir }}/upload"
state: directory
owner: "{{ item.name }}"
group: sftpusers
mode: "0750"
loop: "{{ sftp_users }}"
- name: Configurar SFTP en sshd_config
ansible.builtin.blockinfile:
path: /etc/ssh/sshd_config
marker: "# {mark} ANSIBLE MANAGED SFTP CONFIG"
block: |
Match Group sftpusers
ChrootDirectory %h
ForceCommand internal-sftp
X11Forwarding no
AllowTcpForwarding no
notify: Restart ssh
handlers:
- name: Restart ssh
ansible.builtin.service:
name: ssh
state: restarted
Cómo usar este playbook
- Edita el listado
sftp_users
para añadir, modificar o quitar usuarios según tus necesidades. - Asegúrate de tener definidos los hosts bajo el grupo
[sftp_servers]
en tuinventory
de Ansible. - Lanza el playbook con:
ansible-playbook -i inventory deploy_sftp_secure.yml
- Verifica que puedes acceder por SFTP (no por SSH normal) con los usuarios creados.
¿Problemas comunes? Consejos y troubleshooting
- Si recibes «Permission denied», revisa:
- Que el directorio
chroot
pertenece a root y tiene0755
. - Los usuarios NO deben tener permisos de escritura en el chroot raíz, solo en
/upload
. - La ruta del usuario (
home
) debe coincidir conChrootDirectory
.
- Que el directorio
- Para añadir más roles (por ejemplo, auditoría de accesos), basta añadir más tareas al playbook, ¡la automatización está para ganar tranquilidad!
- En Debian/Ubuntu, el servicio de SSH puede llamarse
ssh
osshd
. Ajústalo si ves un error en la tarea «Restart ssh». - ¿Cuestión de políticas más avanzadas? Usa Ansible Vault para almacenar las contraseñas de los usuarios de SFTP de forma segura.
Automatizar el despliegue de servidores SFTP no solo es posible, ¡sino que con Ansible puede ser incluso divertido! ¿Te animas a ampliar el playbook añadiendo notificaciones o autenticación por llaves SSH? Cuéntamelo en los comentarios.