2013/10/11

VSFTPD

Introducion:

Instalar VSFTPD en FreeBSD
En nuestro caso el servicio permitira subir archivos mediante un usuario y clave, pero no permitira conexiones anonimas.

Requerimientos:

* Conexion a Internet
* FreeBSD instalado
* Leer este manual

El proceso:

Actualizar el arbol de ports

(ya se debe hacer mediante portsnap)

Instalar el port de VSFTPD

# whereis vsftpd
vsftpd: /usr/ports/ftp/vsftpd
# cd /usr/ports/ftp/vsftpd
# make install clean
...
===>   Registering installation for vsftpd-3.0.2

El contenidos de los archivos es:

# egrep -v '#|^ *$' /usr/local/etc/vsftpd.conf

anonymous_enable=NO
local_enable=YES
write_enable=YES
local_umask=022
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES
ftpd_banner=Welcome to Alpha FTP service.
chroot_local_user=YES
listen=YES
secure_chroot_dir=/usr/local/share/vsftpd/empty
background=YES
pasv_min_port=49152
pasv_max_port=65535

Para que el servicio inicie con el servidor

# edit /etc/rc.conf

Agregar

vsftpd_enable="YES"

Iniciar el servicio

# /usr/local/etc/rc.d/vsftpd start

Crear el usuario para las transferencias

# adduser
Username: invitadoftp
Full name: invitadoftp
Uid (Leave empty for default):
Login group [invitadoftp]:
Login group is invitadoftp. Invite invitadoftp into other groups? []:
Login class [default]:
Shell (sh csh tcsh nologin) [sh]: nologin
Home directory [/home/invitadoftp]:
Home directory permissions (Leave empty for default):
Use password-based authentication? [yes]:
Use an empty password? (yes/no) [no]:
Use a random password? (yes/no) [no]:
Enter password:
Enter password again:
Lock out the account after creation? [no]:
Username   : invitadoftp
Password   : laclavesecreta
Full Name  : invitadoftp
Uid        : 1120
Class      :
Groups     : invitadoftp
Home       : /home/invitadoftp
Home Mode  :
Shell      : /usr/sbin/nologin
Locked     : no
OK? (yes/no): yes
adduser: INFO: Successfully added (invitadoftp) to the user database.
Add another user? (yes/no): no
Goodbye!

Asignar el directorio creado al usuario root

# chown root /home/invitadoftp

Quitarle el permiso de escribir al usuario

# chmod -w /home/invitadoftp

Crear un directorio llamado pub dentro

# mkdir /home/invitadoftp/pub

Darle permisos de escritura en el directorio pub

# chmod -R 777 /home/invitadoftp/pub

En el firewall hay que abrir los puertos necesarios, un ejemplo para PF (en nuestro caso estamos abriendo el puerto 21 y un rango desde 49152 hasta 65535)

# PF "Self-Protecting" an FTP Server (passive)
pass in on $ext_if proto tcp from any to any port { ftp, > 49151 } \
        keep state

Para verificar que nuestro servidor ftp funciona, lo podemos hacer de dos formas:

Ejemplo 1
En el mismo servidor usando el Shell Unix
$ ftp invitadoftp@localhost
...

Ejemplo 2
Desde otro equipo hacia el servidor por Internet, ejemplo desde un Shell Unix (en el caso de que tenga algun *unix)

$ ftp invitadoftp@IPDELSERVIDOR
Connected to IPDELSERVIDOR.
220 Welcome to Alpha FTP service.
331 Please specify the password.
Password: laclavesecreta
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> ls
229 Entering Extended Passive Mode (|||54611|).
150 Here comes the directory listing.
drwxrwxrwx    2 1010     1010           97 Oct 21 15:50 pub
226 Directory send OK.
ftp> quit
221 Goodbye.
$

Continuando con el ejemplo 2, si este equipo tiene un Windows, desde el DOS

C:\>ftp IPDELSERVIDOR

Si queremos que el directorio no tenga archivos o carpetas con mas de 7 dias

Creamos un script

# edit /usr/home/backups/scripts/script-del-old.sh

que se veria asi, use este comando para verlo # cat /usr/home/backups/scripts/script-del-old.sh

#! /bin/sh

# Archivos
find /usr/home/invitadoftp/pub -type f -mtime +1w -exec rm {} \;

# Carpetas (indispensable la opcion "-depth 1" o borrara pub si esta vacia)
find /usr/home/invitadoftp/pub -depth 1 -type d -empty -mtime +1w -exec rmdir {} \;

Le damos permisos de ejecucion

# chmod +x /usr/home/backups/scripts/script-del-old.sh

Y en cron ponemos la linea

00 01 * * * root /usr/home/backups/scripts/script-del-old.sh

Con esto ejecutamos diariamente una busqueda todos los dias a las 01 de la manana de los
archivos y carpetas vacias de mas de una semana o 7 dias y los borramos.

Otro ejemplo aun mas elaborado del script seria asi, use este comando para verlo # cat /usr/home/backups/scripts/script-del-old.sh

#! /bin/sh

 # Archivos
find /usr/home/invitadoftp/pub -type f -mtime +1w > /tmp/listfiles.txt
rm `cat /tmp/listfiles.txt`
mail -s "Archivos borrados del FTP" login@gmail.com < /tmp/listfiles.txt
rm /tmp/listfiles.txt

# Carpetas
find /usr/home/invitadoftp/pub -depth 1 -type d -empty -mtime +1w > /tmp/listdirectories.txt
rmdir `cat /tmp/listdiries.txt`
mail -s "Carpetas borradas del FTP" login@gmail.com < /tmp/listdiries.txt
rm /tmp/listdiries.txt