User Tools

Site Tools


apuntes:servicios_transferencia

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
Next revisionBoth sides next revision
apuntes:servicios_transferencia [2017/09/26 14:57] – [Servicio SSH (Secure SHell)] Santiago Faciapuntes:servicios_transferencia [2018/02/08 14:32] – [Ejercicios] Santiago Faci
Line 2: Line 2:
  
 ==== Servicio FTP (File Transfer Protocol) ==== ==== Servicio FTP (File Transfer Protocol) ====
 +
 +El protocolo FTP (**F**ile **T**ransfer **P**rotocol) es un protocolo utilizado para la transferencia de ficheros entre una máquina local y otra remota. Básicamente son dos operaciones las que se pueden realizar, subir ficheros a la máquina remota o bien descargarlos. Además existen más comandos pero se utilizan para manejarse dentro del servidor con el objetivo de poder navegar por la estructura de directorios, crear nuevos, eliminar ficheros y alguna otra tarea.
  
 <figure> <figure>
 {{ ftp_activo_pasivo.jpg?500 }} {{ ftp_activo_pasivo.jpg?500 }}
 <caption>FTP Activo/Pasivo</caption></figure> <caption>FTP Activo/Pasivo</caption></figure>
 +
 +=== Servidores FTP ===
 +
 +[[http://www.proftpd.org|Proftpd]] es uno de los servidores FTP más utilizados en entornos Linux. En nuestro caso, que contamos con Debian 9, podemos instalarlo directamente utilizando ''apt-get''
 +
 +<code bash>
 +santi@zenbook:$ sudo apt-get install proftpd
 +</code>
 +
 +El fichero de configuración principal lo podemos encontrar en ''/etc/proftpd/proftpd.conf'', donde podremos configurar algunos parámetros como pueden ser los mensajes de bienvenida (será útil ocultarlos o modificarlos para no dar pistas a futuros atacantes) y el puerto donde escucha el servicio.
 +
 +<file apache /etc/proftpd/proftpd.conf>
 +. . .
 +Include         /etc/proftdp/modules.conf
 +ServerName      "Debian"
 +DisplayLogin    welcome.msg
 +Port            21
 +. . .
 +</file>
 +
 +=== Servidores SFTP ===
 +
 +En el caso de que queramos utilizar una opción segura a este protocolo, podemos utilizar también ''sftp'' que permite, utilizando SSH, realizar las mismas operaciones que un servidor FTP y de forma segura.
 +
 +<code bash>
 +santi@zenbook:$ sudo apt-get install openssh-server openssh-sftp-server
 +</code>
 +
 +En este caso el fichero de configuración lo encontraremos en ''/etc/ssh/sshd_config''
 +
 +=== Clientes FTP ===
 +
 +Como cliente FTP de consola tendremos el comando ''ftp''
  
 <code bash> <code bash>
-root@zenbook:/var/www/html# ftp misitio.com+santi@zenbook:ftp misitio.com
 Connected to misitio.com. Connected to misitio.com.
-220---------- Welcome to Pure-FTPd [privsep] [TLS] ---------- +220 ProFTPD 1.3.5b Server (Debian) [::ffff:127.0.0.1]
-220-You are user number 9 of 50 allowed. +
-220-Local time is now 15:55. Server port21. +
-220-IPv6 connections are also welcome on this server. +
-220 You will be disconnected after 15 minutes of inactivity.+
 Name (misitio.com:santi): santi Name (misitio.com:santi): santi
-331 User santi OK. Password required+331 Password required for santi
 Password: Password:
-230 OK. Current restricted directory is /+230 User santi logged in
 Remote system type is UNIX. Remote system type is UNIX.
 Using binary mode to transfer files. Using binary mode to transfer files.
 ftp> | ftp> |
 </code> </code>
 +
 +Utilizando el comando ''help'' podemos contar con ayuda interactiva acerca de todos los comandos disponibles
  
 <code bash> <code bash>
Line 45: Line 78:
 debug macdef proxy send debug macdef proxy send
 </code> </code>
 +
 +A continuación se describen los más utilizados
 +
 +<table>
 +^ Comando ^ Descripción ^
 +| bye | Cierra la sesión FTP |
 +| cd | Cambia de directorio en la máquina remota|
 +| delete | Elimina un fichero en la máquina remota |
 +| get | Descarga un fichero de la máquina remota |
 +| lcd | Cambia/Muestra directorio en la máquina local |
 +| ls | Lista el contenido de un directorio de la máquina remota|
 +| mdelete | Elimina múltiples ficheros en la máquina remota |
 +| mget | Descarga múltiples ficheros en la máquina local |
 +| mkdir | Crea un directorio en la máquina remota |
 +| mput | Sube múltiples ficheros a la máquina remota |
 +| prompt | Activa/Desactiva interacción en operaciones múltiples |
 +| put | Sube un fichero a la máquina remota |
 +| pwd | Muestra el directorio activo en la máquina remota |
 +| rmdir | Elimina un directorio en la máquina remota |
 +| verbose | Activa/Desactiva mostrar mensajes |
 +<caption>Resumen de comandos FTP</caption></table>
 +
 +Hay que tener en cuenta que podemos obtener, interactivamente, ayuda específica de cada comando a través de ''help''
  
 <code bash> <code bash>
Line 51: Line 107:
 </code> </code>
  
-=== Servidores FTP ===+En el caso de que queramos conectar a un FTP seguro, utilizando el servicio SSH, podemos hacerlo conectando a través del comando ''sftp'' 
 + 
 +<code bash> 
 +santi@zenbook:$ sftp misitio.com 
 +The authenticity of host 'misitio.com (::1)' cannot be established. 
 +ECDSA key fingerprint is SHA256:B5y+uH5grBUJRLnN5ZNMvKHS4USELBfv5J2Gyf+s37s. 
 +Are you sure you want to continue connecting (yes/no)?  
 +</code> 
 + 
 +Igualmente contamos con ayuda sobre los diferentes comandos de que disponemos, muy del estilo a los que podemos encontrar en un servicio FTP 
 + 
 +<code bash> 
 +sftp> help 
 +Available commands: 
 +bye                                Quit sftp 
 +cd path                            Change remote directory to 'path' 
 +chgrp grp path                     Change group of file 'path' to 'grp' 
 +chmod mode path                    Change permissions of file 'path' to 'mode' 
 +chown own path                     Change owner of file 'path' to 'own' 
 +df [-hi] [path]                    Display statistics for current directory or 
 +                                   filesystem containing 'path' 
 +exit                               Quit sftp 
 +get [-afPpRr] remote [local]       Download file 
 +reget [-fPpRr] remote [local]      Resume download file 
 +reput [-fPpRr] [local] remote      Resume upload file 
 +help                               Display this help text 
 +lcd path                           Change local directory to 'path' 
 +lls [ls-options [path]]            Display local directory listing 
 +lmkdir path                        Create local directory 
 +ln [-s] oldpath newpath            Link remote file (-s for symlink) 
 +lpwd                               Print local working directory 
 +ls [-1afhlnrSt] [path]             Display remote directory listing 
 +lumask umask                       Set local umask to 'umask' 
 +mkdir path                         Create remote directory 
 +progress                           Toggle display of progress meter 
 +put [-afPpRr] local [remote]       Upload file 
 +pwd                                Display remote working directory 
 +quit                               Quit sftp 
 +rename oldpath newpath             Rename remote file 
 +rm path                            Delete remote file 
 +rmdir path                         Remove remote directory 
 +symlink oldpath newpath            Symlink remote file 
 +version                            Show SFTP version 
 +!command                           Execute 'command' in local shell 
 +!                                  Escape to local shell 
 +?                                  Synonym for help 
 +sftp>  
 +</code> 
 + 
 +Conviene tener en cuenta que la IP asociada a un dominio puede cambiar. En ese caso el comando ''sftp'' de conexión con el servidor nos avisará de que quizás nos estén realizando un ataque //man in the middle// puesto que el guarda la firma del equipo y ahora ya coincide al haberse modificado su IP. 
 + 
 +<code bash> 
 +santi@zenbook:$ sftp misitio.com 
 +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 
 +@    WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!     @ 
 +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 
 +IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY! 
 +Someone could be eavesdropping on you right now (man-in-the-middle attack)! 
 +It is also possible that a host key has just been changed. 
 +The fingerprint for the ECDSA key sent by the remote host is 
 +SHA256:B5y+uH5grBUJRLnN5ZNMvKHS4USELBfv5J2Gyf+s37s. 
 +Please contact your system administrator. 
 +Add correct host key in /home/santi/.ssh/known_hosts to get rid of this message. 
 +Offending ECDSA key in /home/santi/.ssh/known_hosts:
 +  remove with: 
 +  ssh-keygen -f "/home/santi/.ssh/known_hosts" -R misitio.com 
 +ECDSA host key for misitio.com has changed and you have requested strict checking. 
 +Host key verification failed. 
 +Couldn't read packet: Connection reset by peer 
 +</code> 
 + 
 +En el caso de que estemos seguros de que simplemente ha sido un cambio de IP y confiemos plenamente en el servidor al que nos vamos a conectar, podremos añadir dicho dominio al registro de //hosts conocidos// con el siguiente comando: 
 + 
 +<code bash> 
 +santi@zenbook:$ ssh-keygen -f "/home/santi/.ssh/known_hosts" -R misitio.com 
 +# Host misitio.com found: line 13 
 +/home/santi/.ssh/known_hosts updated. 
 +Original contents retained as /home/santi/.ssh/known_hosts.old 
 +</code> 
 +==== Configuración del servicio FTP ===
 + 
 +=== Creación de un sistema de cuentas de usuario === 
 + 
 +El primer paso será instalar el servidor FTP ''proftpd'' y el módulo para que éste sea capaz de trabajar con Bases de Datos MySQL, puesto que usaremos una Base de Datos para almacenar los diferentes usuarios junto con la información necesaria. 
 + 
 +<code bash> 
 +santi@zenbook:$ sudo apt-get install proftpd proftpd-mod-mysql 
 +</code> 
 + 
 +En el sistema tendremos que crear un grupo y usuario al que asignaremos a todos aquellos usuarios que, más adelante, se registren a través de la Base de Datos 
 + 
 +<code bash> 
 +santi@zenbook:$ groupadd grupoftp 
 +santi@zenbook:$ useradd -s /bin/false -d /dev/null -g grupoftp usuarioftp 
 +</code> 
 + 
 +Y echando un vistazo a los ficheros ''/etc/passwd'' y ''/etc/group'' veremos cuáles son los UID y GID asignados 
 + 
 +<code bash> 
 +santi@zenbook:$ cat /etc/passwd | grep usuarioftp 
 +usuarioftp:x:1002:1003::/dev/null:/bin/false 
 +santi@zenbook:$ cat /etc/group | grep grupoftp 
 +grupoftp:x:1003: 
 +</code> 
 + 
 +De la salida de los dos últimos comandos podemos concluir que el usuario ''usuarioftp'' tiene un UID de 1002 y un GID de 1003 (que coincide con el grupo al que pertenece). Tomaremos esos valores como por defecto para los valores de UID y GID de los usuarios en la Base de Datos 
 + 
 +<code sql> 
 +CREATE DATABASE ftp; 
 +USE ftp; 
 + 
 +CREATE TABLE usuarios ( 
 + usuario VARCHAR(30) NOT NULL UNIQUE, 
 + password VARCHAR(80) NOT NULL, 
 + uid INTEGER default 1002, 
 + gid INTEGER default 1003, 
 + home VARCHAR(255), 
 + shell VARCHAR(255) default NULL, 
 + bloqueado BOOLEAN default 0 
 +); 
 + 
 +CREATE TABLE grupos ( 
 + nombre VARCHAR(30) NOT NULL, 
 + gid INTEGER NOT NULL, 
 + miembros VARCHAR(255) 
 +); 
 +</code> 
 + 
 +Activamos el módulo de SQL en la configuración de proftpd 
 + 
 +<file apache /etc/proftpd/modules.conf> 
 +. . . 
 +LoadModule mod_sql.c 
 +. . . 
 +</file> 
 + 
 +Y en el fichero de configuración principal modificamos algunos parámetros 
 + 
 +<file apache /etc/proftpd/proftpd.conf> 
 +. . . 
 +# No es necesario que los usuarios tengan una consola de sistema 
 +RequireValidShell Off 
 +# Hace que los usuarios no puedan salir de su carpeta de inicio 
 +DefaultRoot ~ 
 +. . . 
 +</file> 
 + 
 +Ahora pasamos a configurar la conexión de proftpd con la Base de Datos 
 + 
 +<file apache etc/proftpd/sql.conf> 
 +SQLBackend       mysql 
 +SQLAuthTypes          Backend Crypt  
 +SQLConnectInfo        ftp@localhost usuario_mysql contrasena_mysql 
 +SQLUserInfo           usuarios usuario password uid gid home shell 
 +SQLGroupInfo          grupos nombre gid miembros 
 +SQLUserWhereClause    "bloqueado = '0'" 
 +</file> 
 + 
 +Para que los cambios sean efectivos tendremos que reiniciar el servicio 
 + 
 +<code bash> 
 +santi@zenbook:$ sudo service proftpd restart 
 +</code> 
 + 
 +Y registrar el grupo en la Base de Datos: 
 + 
 +<code sql> 
 +INSERT INTO grupos (nombre, gid, miembros) VALUES ("grupoftp", 1003, "usuarioftp"); 
 +</code> 
 + 
 +Por último, nos queda dar de alta algún usuario en la Base de Datos para comprobar que todo funciona correctamente 
 + 
 +<code sql> 
 +INSERT INTO usuarios (usuario, password, home) VALUES ("santi", PASSWORD("misupercontraseña"), "/var/ftp/santi"); 
 +</code> 
 + 
 +Habrá que asegurarse de que dicha carpeta existe y, en caso contrario, crearla y asignarle permisos correctamente 
 + 
 +<code bash> 
 +santi@zenbook:$ sudo chown -R usuarioftp:grupoftp /var/ftp 
 +</code> 
 + 
 +Y ahora ya podemos probar a conectarnos a nuestro servidor FTP con el nuevo usuario creado 
 + 
 +<code bash> 
 +santi@zenbook:$ ftp localhost 
 +Connected to localhost. 
 +220 Proftpd 1.3.5b Server (Debian) [::1] 
 +Name (localhost:santi):
 +</code> 
  
-=== Clientes FTP === 
  
 ==== Servicio SSH (Secure SHell) ==== ==== Servicio SSH (Secure SHell) ====
Line 70: Line 315:
  
 === Protocolo SCP (Secure CoPy) === === Protocolo SCP (Secure CoPy) ===
 +
 +<code bash>
 +santi@zenbook:$ scp -r misitio santi@misitio.com:/var/www/html
 +</code>
 +
 +=== Configuración del servicio SSH ===
  
 ---- ----
  
 ===== Ejercicios ===== ===== Ejercicios =====
 +
 +  * Conectate a un servidor FTP y descarga varios ficheros evitando que el servidor te pida confirmación para descargar cada uno de ellos
 +  * Conectate a un servidor FTP y sube varios ficheros que se encuentran en diferentes carpetas en tu equipo local. En el servidor deben estar juntos en una sola carpeta que se llamara ''documentos''
 +  * Conectate al servidor FTP y elimina una serie de ficheros
 +  * A partir de tu máquina Debian 9 instala lo necesario para montar un sistema de usuarios en MySQL para el servidor FTP proftpd
  
 ---- ----
apuntes/servicios_transferencia.txt · Last modified: 2019/01/04 13:02 by 127.0.0.1