Mostrando entradas con la etiqueta ftp. Mostrar todas las entradas
Mostrando entradas con la etiqueta ftp. Mostrar todas las entradas

Backup incremental vía ftp

Si bien es cierto que uno de los programas más usados para hacer copias incrementales de directorios es rsync, también hay que saber sacar todo el provecho a ftp. Desde el principio de los tiempos, el sistema ftp fue usado para albergar copias de archivos y servir de backup de los mismos en numerosas ocasiones, pero el principal problema que tenía era la sincronización. Si un archivo existía podía sobre-escribirlo  pero si dentro de una carpeta un fichero se ha modificado, realmente había que subir todo el contenido de la carpeta, lo que hace que se consuma mucho ancho de banda. Para solucionarlo, investigando un poco descubrí el proyecto lftp (Sophisticated command-line FTP/HTTP client programs), que permite crear un pequeño script que sólo suba aquellos archivos que se han modificado en un directorio ftp.
A continuación os dejo un ejemplo de cómo emplearlo.
shell> lftp -c "set ftp:list-options -a;
       open ftp://usuarioftp:passwordftp@hostftp;
       lcd /directorio/donde/copiar;
       cd /directorio/local/a/copiar;
       mirror --reverse --delete;
       close -a;"
Leer más

Bloquear acceso sftp, scp, rsync, ssh

Hace tiempo vimos una forma simple de hacer que un usuario sólo pueda acceder por sftp al sistema y que además quede "enjaulado" en su home, impidiéndole así cotillear archivos que no debe. Sin embargo esa forma quizás no es del todo flexible que nos pueda interesar. Para hacerla un poco más manejable, hoy vamos a ver cómo empleando rssh vamos a poder seleccionar las diferentes formas de acceso que se van a permitir al sistema.
rssh es una shell restrictiva, que permite elegir el método de acceso que se desea entre los disponibles: scp, sftp, cvs, svn, rsync o rdist. Para usarla primero habrá que instalarla.
shell> apt-get install rssh
Una vez instalada sólo queda configurarla y emplearla. Para empezar vamos a incluir la nueva shell instalada como una shell válida dentro del sistema. Para ello,
shell> echo "/usr/bin/rssh" >> /etc/shells
Y a continuación la configuramos (/etc/rssh.conf). Aquí es donde podemos optar por una configuración general o una particular para cada usuario.
  • General
    Establece los métodos de conexión permitidos por la shell y se aplican a todos los usuarios. Se define al principio del fichero de configuración.
    ...
    #allowsvnserve
    #allowscp
    allowsftp
    #allowcvs
    #allowrdist
    #allowrsync
    ...
    
  • Particular
    Se aplica a cada usuario y permite diferenciar usuario a usuario el método de acceso, así como la jaula chroot (si se desea) en la que éste quedará encerrado con dicha conexión. La forma de establecer a qué tendrá permisos es mediante una máscara binaria (0: no permitido, 1: sí permitido).
    user=javier:011:000010:"/home/javier chroot" # scp with chroot
    user=javier:011:000100:"/var/www chroot"     # sftp with chroot
    user=test:011:000110                         # scp & sftp
    
Una vez establecidos los permisos en el fichero de configuración tendremos que indicarle al sistema que emplee la nueva shell a aquellos usuarios que nos interese. Por lo tanto si creamos un usuario nuevo,
shell> adduser --shell /usr/bin/rssh javier
Y si modificamos uno existente,
shell> usermod -s /usr/bin/rssh test
Ahora al intentar acceder con algún sistema del que no se tenga permisos saldrá la advertencia de que no es posible acceder y los métodos para los que sí está habilitado el acceso a dicho usuario.
shell> ssh -l test 192.168.1.35
test password:
Last login: Wed Feb  9 22:49:47 2011 from 192.168.1.33

This account is restricted by rssh.
Allowed commands: sftp and sftp

If you believe this is in error, please contact your system administrator.

Connection to 192.168.1.35 closed.
Leer más

Qué hace tu usuario sftp?

Hace ya un par de meses escribí la forma de configurar el sistema sftp como una jaula chroot, para que todos los usuarios que accedan al sistema queden "dentro" de la carpeta para la que tienen permisos y así no anden de cotillas por el resto del sistema. En sistemas compartidos esto es perfecto, ya que cada usuario tiene su espacio, por ejemplo, su página web, y de ahí no se mueve.
Sin embargo siempre se suele dar el caso de que alguien protesta por algo que hizo y no lo recuerda. Un fichero no tiene el contenido que debería, una carpeta desapareció, hay una carpeta que no debería, etc. Para evitar esos problemas sftp tiene la opción de escribir todo lo que un usuario está a realizar y así evitar que tengamos ese problema. Si recordamos un poco, para habilitar el sistema sftp en el servidor ssh tenemos que crear el siguiente contenido,
...
Subsystem sftp internal-sftp
....
Pues bien, si leemos el man de sftp, podemos observar que existe una opción, -l log_level que hace justamente lo que nos interesa, por lo tanto sólo queda añadirla a la línea de sftp
...
Subsystem sftp internal-sftp -l INFO
....
Y relanzar el servicio ssh,
shell service sshd restart
Tras ello, el resultado que observamos es el siguiente,
Oct 12 16:52:23 s1 sftp-server[28846]: mkdir name "/tmp/aa" mode 0777
Oct 12 16:52:26 s1 sftp-server[28846]: opendir "/tmp/aa"
Oct 12 16:52:26 s1 sftp-server[28846]: closedir "/tmp/aa"
Oct 12 16:52:26 s1 sftp-server[28846]: rmdir name "/tmp/aa"
Un log perfectamente depurado de las acciones del usuario, para así estar protegidos ante eventuales contratiempos.
Leer más

sftp en chroot

Hay veces que se puede dar el caso de que un equipo tenga que ser compartido por varias personas, lo típico es un servidor web, por ejemplo, que tiene un apache y un número de personas tienen acceso a su directorio web, para poder subir sus archivos, pero no por eso quiere decir que tengan que tener acceso al resto de las páginas. Ni mucho menos, al resto de los archivos del servidor. Aun cuando la gente es de confianza, puede suponer un peligro, si el servidor en 100% compartido, peor. Por lo tanto, vamos a ver cómo poder habilitar un acceso por usuario a un directorio (y subdirectorios) sin que pueda salir del mismo. Es decir, vamos a crear una jaula chroot para el sistema sftp. Como veremos la forma de realizarlo es muy sencilla, así que sólo hay que seguir estos pasos:
  • Editamos el fichero /etc/ssh/sshd_config
    En el hay que buscar la línea "Subsystema sftp" y dejarla tal como está a continuación y al final del fichero, incluir las líneas del final para cada uno de los usuarios que queramos enjaular.
  • ...
    Subsystem sftp internal-sftp
    ....
    Match User user1
      ChrootDirectory /home/user1
      AllowTCPForwarding no
      X11Forwarding no
      ForceCommand internal-sftp
    
  • Reiniciamos el servicio ssh
  • shell> service ssh restart
    
  • Creamos el usuario (el mismo que dimos de alta en el fichero sshd_config).
    Aquí es muy importante establecer los permisos correctamente. En caso de que éstos no estén así establecidos, el usuario no podrá acceder a su carpeta personal y por lo tanto no podrá iniciar sesión.
  • shell> adduser user1
    shell> chown root:root /home/user1
    shell> mkdir /home/user1/public_html
    shell> chown www-data:www-data /home/user1/public_html
    shell> chmow 0775 /home/user1/public_html
    
  • Para este ejemplo, el usuario tendrá una carpeta public_html que será de www-data, es decir, del usuario de apache y para que dicho usuario pueda escribir en ella, es conveniente que lo agreguemos al grupo www-data.
  • shell> adduser www-data user1
    
  • Finalmente ya podemos iniciar sesión con el usuario que hemos creado empleando sftp (ftp bajo ssh) y sabiendo que no podrá salir de la carpeta pre establecida en configuración.
  • En caso de que necesitemos que varios usuarios tengan que iniciar sesión a un mismo lugar, en el fichero sshd_config también se puede realizar un match por grupos, tal que así.
    Match Group webs
      ChrootDirectory /home/webs
      AllowTCPForwarding no
      X11Forwarding no
      ForceCommand internal-sftp
    
Espero que os haya ayudado.
Leer más

ftpfs (ftp to filesystem)

Hay veces que por algún motivo puede ser estrictamente necesario poder montar un directorio ftp como un sistema de archivos. Por ejemplo, se me está ocurriendo, si es necesario realizar un rsync sobre los datos para poder subir sólo aquellos que se han actualizado.
Un cliente ftp normal, como puede ser por ejemplo FileZilla no es capaz de saber qué cosas subir y cuales no, ya que no detecta si hay cambios entre el fichero remoto y el fichero local. En estos cosas, poder montar un sistema de ficheros ftp como una carpeta local, puede ser de gran utilidad.
Para poder por lo tanto conseguir hacerlo, uniremos la potencia del cURL con la gran versatilidad de FUSE y así lograremos el objetivo. Para hacerlo de una forma sencilla existe el programa curlftpfs, que hace justamente lo descrito. Está disponible en los repositorios oficiales de Debian, así que a tirar de apt!
Una vez esté instalado, simplemente necesitamos montar sistema de ficheros en una carpeta local. Para ello indicamos el usuario y la contrasela, así como el ftp remoto al que nos vamos a conectar y finalmente, el punto de montaje local.
shell> curlftpfs -o user="user:passwd" ftp.empresa.com /mnt/ftp/
Ahora bajo la carpeta /mnt/ftp tenemos el ftp de la empresa. Algo realmente sorprendente. Eso sí, la velocidad de acceso es ftp y si ponemos el programa curlftpfs en modo debug, vemos exactamente qué es lo que está realizando. En este caso, autenticaciones ftp para cada fichero. No es óptimo ni veloz, pero sirve para el propósito.
shell> mount
...
curlftpfs#ftp://ftp.empresa.com/ on /mnt/ftp type fuse (rw,nosuid,nodev)
En caso de que el servidor ftp remoto emplee un protocolo cifrado, sftp, la forma simple de conectarse es la siguiente, con las opciones de certificados.
shell> curlftpfs -o ssl -o ssl_control -o no_verify_hostname \
       -o user="user:passwd" ftp.empresa.com /mnt/ftp/

Leer más

Formulario de contacto

Nombre

Correo electrónico *

Mensaje *

Últimos comentarios