Cómo Resolver Problemas de Permisos SFTP en Amazon Linux 2023: Configuración y Seguridad

En este artículo, exploramos cómo resolver los problemas de permisos predeterminados para usuarios SFTP en servidores Amazon Linux 2023, donde los archivos subidos reciben permisos 600.

Cómo Resolver Problemas de Permisos SFTP en Amazon Linux 2023: Configuración y Seguridad

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_config
2sed -i "/Port 22/c Port 22\nPort 2112" /etc/ssh/sshd_config
3semanage port -a -t ssh_port_t -p tcp 2112
4systemctl 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/tcp
2firewall-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.

  1. 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 644

      o

      1Subsystem sftp internal-sftp -u 0022

      Es importante saber que el hacer esto sería de modo global para todos los usuarios SFTP.

  2. 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.

  3. 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'); do
29 _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 ]; then
35 egrep "^$user" /etc/passwd >/dev/null
36 if [ $? -eq 0 ]; then
37 echo "$user exists"
38 else
39 echo "Adding user: $user"
40 home="/home/$${user}"
41 groupadd -g $group $user
42 useradd -m -d $${home} -u $group -g $user $user
43 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');do
45 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/" ]]; then
47 mkdir -p "$${home}/.ssh/"
48 chmod 750 $${home}/.ssh
49 fi
50 if [ ! -f "$${home}/.ssh/authorized_keys" ]
51 then
52 if [[ -n $PUBLIC_KEY ]]; then
53 echo "command=\"umask 0022; /usr/libexec/openssh/sftp-server\" $PUBLIC_KEY" > $${home}/.ssh/authorized_keys
54 fi
55 else
56 if [[ -n $PUBLIC_KEY ]]; then
57 echo "command=\"umask 0022; /usr/libexec/openssh/sftp-server\" $PUBLIC_KEY" >> $${home}/.ssh/authorized_keys
58 fi
59 fi
60 done
61 chmod 600 $${home}/.ssh/authorized_keys
62 chown -R $user:$user $${home}
63 for directory in $(_jq '.directories'); do
64
65 if [ ! -d "$${directory}" ]
66 then
67 mkdir -p "$${directory}"
68 chown $user:$user $${directory}
69 fi
70 chmod 775 $${directory}
71 done
72 usermod -a -G app-user $user
73 fi
74 else
75 echo "Only root may add a user to the system"
76 exit 2
77 fi
78done

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