Los servidores SFTP todavía son utilizados por algunos proveedores, al menos en los sistemas que implementamos, pero estos servidores funcionaban con antiguas imágenes de EC2 de CentOS. Recientemente, AWS nos informó que debíamos actualizar a Amazon Linux 2023, ya que el soporte sería descontinuado.
Durante el proceso de migración, descubrimos algunas configuraciones que no habíamos considerado anteriormente. Una de ellas era la necesidad de habilitar conexiones a través de un puerto diferente para SFTP. Además, nos dimos cuenta de que todos los usuarios que se conectaban por SFTP contaban con permisos 600 para subir o crear archivos, lo que impedía que los usuarios locales pudieran leer esos archivos. Empecemos con como solucionamos el problema con el puerto 2112, esta fue una solución muy sencilla, pero me tomo tiempo llegar a ella.
Habilitar conexiones SFTP a través del puerto 2112.
Hace tiempo, incorporé en mi script la funcionalidad para modificar el archivo /etc/ssh/sshd_config
. Este script localiza la línea #Subsystem sftp internal-sftp
, la descomenta y añade un nuevo puerto al buscar la configuración de Port 22
. Luego, reinicia el servicio sshd para que los cambios surtan efecto.
1sed -i "/#Subsystem sftp internal-sftp -l VERBOSE/c Subsystem sftp internal-sftp" /etc/ssh/sshd_config2sed -i "/Port 22/c Port 22\nPort 2112" /etc/ssh/sshd_config3semanage port -a -t ssh_port_t -p tcp 21124systemctl restart sshd
Sin embargo, esto no estaba dando resultados. Tras revisar los security groups y las conexiones entre los servidores, y sin encontrar inconvenientes, decidimos investigar en uno de los clientes conectados para verificar si el firewall estaba permitiendo las conexiones. A pesar de ello, telnet sftp-server.url 2112
seguía sin funcionar.
Al seguir revisando, noté que el firewall de Amazon Linux 2023 estaba activado. Por ello, añadí el siguiente comando que permite las conexiones a través de ese puerto:
1firewall-cmd --permanent --add-port=2112/tcp2firewall-cmd --reload
En esencia, así fue como se resolvió el problema de conectividad.
Cambiando los permisos de 600 a 644.
Cuando un usuario SFTP carga un archivo a un servidor Amazon Linux 2023, el sistema asigna, de forma predeterminada, permisos 600 a esos archivos. Estos permisos indican:
600 significa que solo el propietario del archivo tiene permisos de lectura y escritura.
El propietario puede leer y escribir el archivo
El grupo y otros usuarios no tienen ningún tipo de acceso al archivo.
¿Por qué Amazon Linux usa 600 por Defecto?
La principal razón detrás de este comportamiento es la seguridad. Los servidores SFTP se utilizan comúnmente para transferir datos sensibles o privados entre el cliente y el servidor. Establecer permisos restrictivos es fundamental para prevenir que otros usuarios del sistema accedan, modifiquen o incluso lean archivos que no les corresponden.
Cómo Funciona: Umask y la Creación de Archivos
El comportamiento de los permisos predeterminados está vinculado a un valor conocido como umask. La umask determina qué permisos se eliminan automáticamente al momento de crear un archivo.
En numerosos sistemas Linux, la configuración de umask predeterminada es 0022, lo que permite que los archivos se generen con permisos 644, concediendo lectura a todos, pero restringiendo la escritura únicamente al propietario. No obstante, en el caso de SFTP en Amazon Linux 2023, se implementa una umask más restrictiva o personalizada dentro del servicio SSH, lo que provoca que las transferencias de archivos por SFTP tengan permisos 600.
Configuración y Personalización de los Permisos SFTP
Si es necesario cambiar estos permisos predeterminados, existen diversas formas de hacerlo. Sin embargo, es fundamental considerar que alterar configuraciones globales puede impactar la seguridad del sistema.
Modificar el archivo sshd_config:
En el archivo
/etc/ssh/sshd_config
, donde se descomentó el subsistema SFTP(Subsystem sftp internal-sftp)
, es posible establecer reglas específicas:1Subsystem sftp internal-sftp -m 644o
1Subsystem sftp internal-sftp -u 0022Es importante saber que el hacer esto sería de modo global para todos los usuarios SFTP.
Usar umask para controlar permisos:
La umask se puede ajustar para usuarios específicos o en scripts de inicio de sesión, como
~/.bashrc
o~/.bash_profile
. Sin embargo, es importante tener en cuenta que en el caso de SFTP, estos archivos no siempre son leídos durante la sesión.
Control mediante authorized_keys:
Para aquellos usuarios que emplean llaves SSH, es posible forzar la ejecución de comandos personalizados que establezcan la configuración de umask al iniciar sesión en SFTP.
Para resolver problema, añadí la línea command="umask 0022; /usr/libexec/openssh/sftp-server"
seguido de la clave ssh-rsa AAAA... en el archivo /home/${USER}/.ssh/authorized_keys
. Esto lo hice para cada uno de los usuarios y llaves necesarios.
Fue bastante fácil, ya que contaba con una lista de usuarios que se iteraba al iniciar el servidor y las llaves se encuentran en AWS secrets.
1users='[ 2 { 3 "name": "user1", 4 "group": "1004", 5 "keys": "public_key1 public_key2 public_key3 public_key4", 6 "directories": "/External/BI/dir1 /External/BI/dir2 7 }, 8 { 9 "name": "user2",10 "group": "1008",11 "keys": "public_key",12 "directories": "/External/dir"13 },14 {15 "name": "user3",16 "group": "1006",17 "keys": "public_key public_key2 public_key3 public_key4 public_key5 public_key6",18 "directories": "/External/BI/dir1 /External/BI/dir2"19 },20 {21 "name": "user4",22 "group": "1005",23 "keys": "public_key1 public_key2 public_key3 public_key4 public_key5",24 "directories": "/External/BI/dir1 /External/BI/dir2"25 },26]'27 28for row in $(echo "$${users}" | /usr/local/bin/jq -r '.[] | @base64'); do29 _jq() {30 echo $row | base64 --decode | /usr/local/bin/jq -r $${1}31 }32 group=$(_jq '.group')33 user=$(_jq '.name')34 if [ $(id -u) -eq 0 ]; then35 egrep "^$user" /etc/passwd >/dev/null36 if [ $? -eq 0 ]; then37 echo "$user exists"38 else39 echo "Adding user: $user"40 home="/home/$${user}"41 groupadd -g $group $user42 useradd -m -d $${home} -u $group -g $user $user43 PASSWORD=$(/usr/bin/aws secretsmanager get-secret-value --secret-id /app-server/$${APP_ENV}/sftp/$${user} --region $${REGION} --query 'SecretString' --output text | /usr/local/bin/jq -r '."password"')44 for key in $(_jq '.keys');do45 PUBLIC_KEY=$(/usr/bin/aws secretsmanager get-secret-value --secret-id /app-server/$${APP_ENV}/sftp/$${user} --region $${REGION} --query 'SecretString' --output text | /usr/local/bin/jq -r '.'$${key}'')46 if [[ ! -d "$${home}/.ssh/" ]]; then47 mkdir -p "$${home}/.ssh/"48 chmod 750 $${home}/.ssh49 fi50 if [ ! -f "$${home}/.ssh/authorized_keys" ]51 then52 if [[ -n $PUBLIC_KEY ]]; then53 echo "command=\"umask 0022; /usr/libexec/openssh/sftp-server\" $PUBLIC_KEY" > $${home}/.ssh/authorized_keys54 fi55 else56 if [[ -n $PUBLIC_KEY ]]; then57 echo "command=\"umask 0022; /usr/libexec/openssh/sftp-server\" $PUBLIC_KEY" >> $${home}/.ssh/authorized_keys58 fi59 fi60 done61 chmod 600 $${home}/.ssh/authorized_keys62 chown -R $user:$user $${home}63 for directory in $(_jq '.directories'); do64 65 if [ ! -d "$${directory}" ]66 then67 mkdir -p "$${directory}"68 chown $user:$user $${directory}69 fi70 chmod 775 $${directory}71 done72 usermod -a -G app-user $user73 fi74 else75 echo "Only root may add a user to the system"76 exit 277 fi78done
Conclusión:
En Amazon Linux 2023, los permisos predeterminados de 600 para usuarios SFTP son una medida de seguridad que protege los archivos recién subidos al evitar que otros usuarios tengan acceso a ellos. Si bien esto refuerza la privacidad y seguridad, es posible personalizar estos permisos utilizando configuraciones avanzadas como umask, o mediante scripts y ajustes en las sesiones SFTP. Al implementar estas configuraciones, es importante considerar el equilibrio entre seguridad y funcionalidad para mantener un entorno seguro y eficiente.
Comentarios