¿Cómo configurar usuarios virtuales para vsftpd con acceso a un subdirectorio específico?

24

Necesito poder agregar usuarios virtuales a vsftpd que solo tengan acceso a una subcarpeta. La razón por la que quiero usar usuarios virtuales es que solo quiero tener 1 usuario real en el servidor.

La estructura FTP es:

  • www
    • website_name1
      • sub_folder1
    • website_name2
      • sub_folder2
      • sub_folder3
    • website_name3
    • website_name4

La cuenta principal tiene acceso a la carpeta www y a todos los subdirectorios y quiero agregar un usuario virtual que pueda tener acceso a sub_folder1 y solo sub_folder1

También para evitar cierta confusión, también requeriría que otro usuario acceda a sub_folder3 y solo a sub_folder3 . Mi punto es que necesito poder elegir qué carpeta y subcarpetas usuario por usuario.

He encontrado formas de agregar usuarios para ver la estructura completa o configurar carpetas con nombre de usuario, las cuales no me sirven.

Encontré una pregunta similar publicada aquí:

Cómo configurar VSFTPD para múltiples usuarios, incluida la adición de directorios específicos

pero recomienda proftpdque, aunque en general, era menos seguro.
¿O he perdido el punto aquí?

Avenyet
fuente
Tuve un problema con la autenticación durante mucho tiempo hasta que encontré este serverfault.com/questions/450214/… Aparentemente, PAM tiene problemas con el hash MD5. Esta guía resuelve ese problema.

Respuestas:

31

Con un poco de juego he logrado encontrar una semi solución (no perfecta pero lo suficientemente buena)

utilizando 2707974 respuestas e información que obtuve en otro lugar donde pude obtener lo que necesito.

Primero necesitas vsftp y PAM instalados

apt-get install vsftpd libpam-pwdfile

Editar /etc/vsftpd.conf

nano /etc/vsftpd.conf

luego pegue lo siguiente

listen=YES
anonymous_enable=NO
local_enable=YES
write_enable=YES
local_umask=022
local_root=/var/www
chroot_local_user=YES
allow_writeable_chroot=YES
hide_ids=YES

#virutal user settings
user_config_dir=/etc/vsftpd_user_conf
guest_enable=YES
virtual_use_local_privs=YES
pam_service_name=vsftpd
nopriv_user=vsftpd
guest_username=vsftpd

Edite según sus necesidades exactas, lo más importante para los usuarios virtuales es todo después de que la configuración del usuario virtual comente

Crear usuario

Puede usar una base de datos o htpasswdme pareció htpasswdmás rápido y fácil de usar.

crea un directorio para almacenar tus usuarios

mkdir /etc/vsftpd
htpasswd -cd /etc/vsftpd/ftpd.passwd user1

agregar usuarios adicionales simplemente omita el -c

htpasswd -d /etc/vsftpd/ftpd.passwd user2

Solo he logrado que funcione con CRYPT, que limita a 8 caracteres para usar más de 8 caracteres, utiliza openssl para generar un hash compatible y canalizar directamente en htpasswd

htpasswd -c -p -b /etc/vsftpd/ftpd.passwd user1 $(openssl passwd -1 -noverify password)

Una vez que se crean sus usuarios, ahora puede cambiar su archivo de configuración PAM

nano /etc/pam.d/vsftpd

y elimine todo lo que está dentro de este archivo y reemplácelo con lo siguiente

auth required pam_pwdfile.so pwdfile /etc/vsftpd/ftpd.passwd
account required pam_permit.so

Esto habilitará el inicio de sesión para los usuarios virtuales definidos en /etc/vsftpd/ftpd.passwdy deshabilitará a los usuarios locales.

A continuación, necesitamos agregar un usuario para que lo usen estos usuarios virtuales. Estos usuarios no tendrán acceso al shell y serán llamadosvsftpd

useradd --home /home/vsftpd --gid nogroup -m --shell /bin/false vsftpd

el usuario debe coincidir guest_username=vsftpden el archivo de configuración vsftpd

Definición de acceso al directorio

La línea importante aquí es la siguiente

user_config_dir=/etc/vsftpd_user_conf

Esto significa que cuando user1inicie sesión, buscará el siguiente archivo

/etc/vsftpd_user_conf/user1

este archivo es igual que el vsftpd.confpara que pueda definir un nuevolocal_root

volviendo a la pregunta user1a la que solo queremos tener acceso var/www/website_name1/sub_folder1, por lo que debemos crear la vsftpd_user_confcarpeta:

mkdir /etc/vsftpd_user_conf

Ahora cree el archivo de usuario:

nano /etc/vsftpd_user_conf/user1

e ingrese la siguiente línea

local_root=/var/www/website_name1/sub_folder1

Ahora reinicie vsftp

service vsftpd restart

ahora debería poder iniciar sesión como usuario1, que solo podrá ver var/www/website_name1/sub_folder1cualquier carpeta y archivo que contenga.

Eso es todo, ahora puede agregar tantos usuarios como desee y limitar su acceso a la carpeta que desee.

Es importante recordar que si no crea un archivo de configuración de usuario, la carpeta var / www se configurará como raíz (en el ejemplo anterior)

Si el usuario pretende modificar la subcarpeta, puede ser necesario cambiar el propietario de la subcarpeta compartida:

chown vsftpd:nogroup /var/www/website_name1/sub_folder1
Avenyet
fuente
Esto funciona con algunas modificaciones: 1) Use rutas absolutas (reemplace las rutas que comienzan en "var /" con "/ var". 2) vsftpd 2.3.5 que está en Ubuntu 12.04 no admite la opción allow_writeable_chroot, puede resolverlo instalando parcheado vsftpd .
gadelat
Hola, con la contraseña de SSL, ¿omitimos nuevamente -c con -d o simplemente omitimos -c? También en una segunda nota, ¿acabamos de volver a ejecutar la consulta para cambiar la contraseña? o hay otro método. Gracias
mdixon18
¿Por qué necesita crear un directorio de inicio con useradd --home? ¿es necesario?
e-info128
1
Adicional: habilite conexiones seguras de TLS. digitalocean.com/community/tutorials/…
e-info128
1
Apache2-utils puede ser necesario para algunas instalaciones. No lo he incluido en las respuestas ya que no es relevante para todos.
Avenyet
12

Prueba con este manual. Quizás funcione para ti.

Cómo hacerlo

Instale vsftpd y una biblioteca PAM

Editar /etc/vsftpd.confy/etc/pam.d/vsftpd

Cree cuentas de usuario con directorios personalizados (en / var / www / por ejemplo)

Establecer directorios con el correcto chmodychown

Crear un usuario administrador con acceso completo al servidor

  1. Instalar vsftpd(Very Secure FTP Deamon) y libpam-pwdfilecrear usuarios virtuales

Quería crear usuarios FTP pero no quería agregar usuarios locales de Unix (sin acceso a shell, sin directorio de inicio, etc.). Un PAM (Módulos de autenticación conectables) lo ayudará a crear usuarios virtuales.

sudo apt-get install vsftpd libpam-pwdfile

  1. Editar vsftpd.conf

Primero debes hacer una copia de seguridad del archivo original

sudo mv /etc/vsftpd.conf /etc/vsftpd.conf.bak

Luego crea uno nuevo

sudo vim /etc/vsftpd.conf

Copie y pegue las siguientes líneas. El archivo SOLO debe contener estas líneas:

listen=YES
anonymous_enable=NO
local_enable=YES
write_enable=YES
local_umask=022
nopriv_user=vsftpd
virtual_use_local_privs=YES
guest_enable=YES
user_sub_token=$USER
local_root=/var/www/$USER
chroot_local_user=YES
hide_ids=YES
guest_username=vsftpd
  1. Registrar usuarios virtuales

Para registrar un usuario que usa htpasswd, así que supongo que tiene apache2trabajando en su servidor. Cree una vsftpdcarpeta y luego coloque los archivos de configuración en ella.

sudo mkdir /etc/vsftpd

luego

sudo htpasswd -cd /etc/vsftpd/ftpd.passwd user1

-c significa que crearemos el archivo si aún no existe -d fuerza MD5, lo necesitas en ubuntu 12.04, solo úsalo siempre

El comando le pedirá una contraseña.

Si desea agregar nuevos usuarios después:

sudo htpasswd -d /etc/vsftpd/ftpd.passwd user2

  1. Configurar PAM en /etc/pam.d/vsftpd

Nuevamente, debe hacer una copia de seguridad del archivo original

sudo mv /etc/pam.d/vsftpd /etc/pam.d/vsftpd.bak

y crear uno nuevo

sudo vim /etc/pam.d/vsftpd

Copie y pegue estas 2 líneas (este debería ser el único contenido). Insisto solo en estas 2 líneas, perdí mucho tiempo guardando los originales y acabo de agregarlos.

auth required pam_pwdfile.so pwdfile /etc/vsftpd/ftpd.passwd
account required pam_permit.so
  1. Crear un usuario local sin acceso a shell

sudo useradd --home /home/vsftpd --gid nogroup -m --shell /bin/false vsftpd

Puede verificar que se haya creado con el comando id: id vsftpd. Definimos al usuario con el shell / bin / false debido al parámetro check_shell (incluso si no lo usa). Cuando el usuario final se conecta al servidor FTP, se utilizarán para obtener derechos y propiedad:

chmody chown.

  1. Reiniciar vsftpd

La forma común es usar init.d como todos los deamon

sudo /etc/init.d/vsftpd restart

sudo service vsftpd restart

  1. Crear directorios

Según la configuración, todos los usuarios se colocarán en esta carpeta: / var / www / user1.

Debe crearlos con derechos particulares: ¡la carpeta raíz no puede ser editable!

 / [root = /var/www/user1] => 555
www [ /var/www/user1/www ] => 755
docs [ /var/www/user1/docs ] => 755

Nota: el usuario no puede crear archivos o carpetas en el directorio raíz.

En lo vsftpd.confque tenemos, chroot_local_user=YESel usuario no puede ver nada fuera de su carpeta. Para él, el servidor se ve así:

Así que solo ejecuta estos comandos:

mkdir /var/www/user1`
chmod -w /var/www/user1
mkdir www/user1/www
chmod -R 755 /var/www/user1/www
chown -R vsftpd:nogroup /var/www/user1

La /var/www/user1carpeta TIENE QUE existir o la conexión fallará.

Ahora puedes intentar conectarte con tu FTP

  1. Cree un usuario administrador para acceder a todo el servidor

Para crear un usuario administrador necesitamos registrar un nuevo usuario con htpasswd.

Antes de hacerlo, le aconsejaré que verifique el /etc/ftpusersarchivo que define a ciertos usuarios a los que no se les permite conectarse con ftp. Creo que es solo para usuarios locales y no para usuarios virtuales, pero por si no elige un nombre contenido en este archivo.

sudo htpasswd -d /etc/vsftpd/ftpd.passwd theadmin

Ahora necesitamos agregar una nueva línea en /etc/vsftpd.conf

chroot_list_enable=YES

Esto significa que su usuario será colocado en su carpeta (como cárcel) EXCEPTO los usuarios en / etc /

vsftpd.chroot_list

Creemos este archivo y agreguemos nuestro usuario, el archivo es una línea simple que contiene "theadmin". Agregue un usuario por línea. Eso significa que NO necesita crear una /var/www/theadmincarpeta, el usuario iniciará sesión y comenzará /home/vsftpd.

Reinicie el servidor y listo.

2707974
fuente
Probé esto ya es muy inflexible ya que impone local_root = / var / www / $ USER. No me permite especificar un solo directorio para un usuario o usuarios. este directorio normalmente tiene un propósito y una ubicación diferentes según el cliente. Gracias por la respuesta sin embargo.
Avenyet
0

sí, puede, y por flexibilidad, cree un directorio y un archivo de configuración de usuario, mkdir /var/www/userconfso lo que sea que desee cambiar el nombre de la configuración de usuario, luego cree un archivo específico

vi /var/www/userconfigs/ftpuseraccount

tipo interno, local_root=/var/www(o lo que quiera acceder por dir) guest_username=www-data(el propietario de ubuntu de la edición superior del archivo

después de actualizar vsftpd.conf agregando user_config_dir=/var/www/userconfigs(o lo que sea que lo haya reemplazado, esta cuenta accederá a cualquier sdir yo especificado)

Agunbiade Bolaji
fuente