Como configurar usuários virtuais para vsftpd com acesso a um subdiretório específico?

24

Eu preciso ser capaz de adicionar usuários virtuais ao vsftpd que só têm acesso a uma subpasta. A razão pela qual eu quero usar usuários virtuais é que eu só quero ter um usuário real no servidor.

A estrutura do FTP é:

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

A conta principal tem acesso à pasta www e a todos os subdiretórios e desejo adicionar um usuário virtual que possa ter acesso à subpasta1 e apenas à subpasta1

Além disso, para evitar confusão, eu também exigiria que outro usuário acessasse sub_folder3 e apenas sub_folder3 . O que quero dizer é que preciso escolher qual pasta e subpastas um usuário por usuário.

Encontrei maneiras de adicionar usuários para ver as pastas nomeadas do usuário ou da estrutura inteira, ambas as quais não me servem.

Encontrei uma pergunta semelhante postada aqui:

Como configurar o VSFTPD para vários usuários, incluindo a adição de diretórios específicos

mas recomenda proftpdque, em geral, eu era menos seguro.
Ou eu perdi o ponto aqui?

Avenyet
fonte
Eu tive um problema com a autenticação por mais tempo até encontrar este serverfault.com/questions/450214/… Aparentemente, o PAM tem problemas com o hash MD5. Este guia resolve esse problema.

Respostas:

31

Com um pouco de brincadeira, consegui encontrar uma solução semi (não perfeita, mas boa o suficiente)

usando 2707974 resposta e informações que adquiri em outros lugares onde consegui o que precisava.

Primeiro você precisa do vsftp e PAM instalado

apt-get install vsftpd libpam-pwdfile

Edite /etc/vsftpd.conf

nano /etc/vsftpd.conf

depois cole no seguinte

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 para suas necessidades exatas, o bit mais importante para usuários virtuais é tudo após o comentário das configurações do usuário virtual

Criando Usuário

Você pode usar um banco de dados ou htpasswdeu achei htpasswdmais rápido e fácil de usar.

crie um diretório para armazenar seus usuários

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

adicionar usuários adicionais apenas omite o -c

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

Eu só consegui fazê-lo funcionar usando o CRYPT, que limita a 8 caracteres para usar mais de 8 caracteres, use openssl para gerar um hash e canal compatível diretamente no htpasswd

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

Depois que seus usuários são criados, agora você pode alterar seu arquivo de configuração do PAM

nano /etc/pam.d/vsftpd

e remova tudo dentro deste arquivo e substitua pelo seguinte

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

Isso permitirá o login para seus usuários virtuais definidos /etc/vsftpd/ftpd.passwde desabilitará os usuários locais

Em seguida, precisamos adicionar um usuário para esses usuários virtuais usarem. Esses usuários não terão acesso ao shell e serão chamadosvsftpd

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

o usuário deve corresponder guest_username=vsftpdno arquivo conf vsftpd

Definindo acesso ao diretório

A linha importante aqui é a seguinte

user_config_dir=/etc/vsftpd_user_conf

isso significa que, ao fazer user1login, ele procurará o seguinte arquivo

/etc/vsftpd_user_conf/user1

este arquivo é o mesmo que o vsftpd.confpara que você possa definir um novolocal_root

voltando à pergunta à qual queremos user1ter apenas acesso var/www/website_name1/sub_folder1, precisamos criar a vsftpd_user_confpasta:

mkdir /etc/vsftpd_user_conf

Agora crie o arquivo do usuário:

nano /etc/vsftpd_user_conf/user1

e insira a seguinte linha

local_root=/var/www/website_name1/sub_folder1

Agora reinicie o vsftp

service vsftpd restart

agora você deve conseguir fazer login como usuário1, que só poderá ver var/www/website_name1/sub_folder1e qualquer pasta e arquivo dentro dele.

É agora que você pode adicionar quantos usuários quiser e limitar o acesso deles à pasta que desejar.

É importante lembrar que, se você não criar um arquivo conf do usuário, ele será padronizado para a pasta var / www como raiz (no exemplo acima)

Se a subpasta tiver a intenção de ser modificável pelo usuário, pode ser necessário alterar o proprietário da subpasta compartilhada:

chown vsftpd:nogroup /var/www/website_name1/sub_folder1
Avenyet
fonte
Isso funciona com algumas modificações: 1) Use caminhos absolutos (substitua os caminhos iniciados em "var /" por "/ var". 2) vsftpd 2.3.5, que está no Ubuntu 12.04, não suporta a opção allow_writeable_chroot, você pode resolvê-lo instalando patches vsftpd .
gadelat
Olá, com a senha ssl, novamente omitimos -c com -d ou apenas omitimos -c? Também em uma segunda observação, apenas executamos novamente a consulta para alterar a senha? ou existe outro método. Graças
mdixon18
Por que você precisa criar um diretório inicial com useradd --home? é necessário?
e-info128
1
Adicional: habilite conexões TLS seguras. digitalocean.com/community/tutorials/...
e-info128
1
O apache2-utils pode ser necessário para algumas instalações. Não o incluí nas respostas, pois não é relevante para todos.
Avenyet 11/05
12

Tente com este manual. Talvez funcione para você.

Como fazer isso

Instale vsftpd e uma biblioteca PAM

Editar /etc/vsftpd.confe/etc/pam.d/vsftpd

Crie contas de usuário com diretórios personalizados (em / var / www / por exemplo)

Definir diretórios com a correta chmodechown

Crie um usuário administrador com acesso total ao servidor

  1. Instale vsftpd(Very Secure FTP Deamon) e libpam-pwdfilecrie usuários virtuais

Eu queria criar usuários de FTP, mas não queria adicionar usuários unix locais (sem acesso ao shell, sem diretório inicial e assim por diante). Um PAM (Módulos de autenticação conectáveis) ajudará você a criar usuários virtuais.

sudo apt-get install vsftpd libpam-pwdfile

  1. Editar vsftpd.conf

Primeiro você precisa fazer o backup do arquivo original

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

Em seguida, crie um novo

sudo vim /etc/vsftpd.conf

Copie e cole as seguintes linhas. O arquivo deve conter SOMENTE estas linhas:

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 usuários virtuais

Para registrar um usuário que você usa htpasswd, presumo que você esteja apache2trabalhando no seu servidor. Crie uma vsftpdpasta e coloque os arquivos de configuração nela.

sudo mkdir /etc/vsftpd

então

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

-c significa que criaremos o arquivo se ele ainda não existir -d força o MD5, você precisa dele no ubuntu 12.04, use-o sempre

O comando solicitará uma senha.

Se você deseja adicionar novos usuários posteriormente:

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

  1. Configurar o PAM no /etc/pam.d/vsftpd

Novamente, você precisa fazer backup do arquivo original

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

e crie um novo

sudo vim /etc/pam.d/vsftpd

Copie e cole essas 2 linhas (esse deve ser o único conteúdo). Insisto apenas nessas duas linhas, perdi muito tempo mantendo os originais e apenas os adicionei.

auth required pam_pwdfile.so pwdfile /etc/vsftpd/ftpd.passwd
account required pam_permit.so
  1. Crie um usuário local sem acesso ao shell

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

Você pode verificar se ele foi criado com o comando id: id vsftpd. Definimos o usuário com o shell / bin / false por causa do parâmetro check_shell (mesmo que você não o use). Quando o usuário final se conectar ao servidor FTP, eles serão usados ​​para direitos e propriedade:

chmode chown.

  1. Reiniciar vsftpd

A maneira comum é usar o init.d como todos os deamon

sudo /etc/init.d/vsftpd restart

sudo service vsftpd restart

  1. Criar diretórios

De acordo com a configuração, todos os usuários serão colocados nesta pasta: / var / www / user1.

Você precisa criá-los com direitos específicos: a pasta raiz não pode ser gravável!

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

Nota: o usuário não pode criar arquivos ou pastas no diretório raiz.

No vsftpd.confque temos chroot_local_user=YES, o usuário não pode ver nada fora de sua pasta. Para ele, o servidor fica assim:

Então, basta executar estes 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

A /var/www/user1pasta TEM QUE EXISTIR ou a conexão falhará.

Agora você pode tentar se conectar ao seu FTP

  1. Crie um usuário Admin para acessar todo o servidor

Para criar um usuário administrador, precisamos registrar um novo usuário htpasswd.

Antes de fazer isso, aconselhamos que você verifique o /etc/ftpusersarquivo que define certos usuários que não têm permissão para se conectar ao ftp. Eu acho que é apenas para usuários locais e não para usuários virtuais, mas por precaução, não escolha um nome contido neste arquivo.

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

Agora precisamos adicionar uma nova linha no /etc/vsftpd.conf

chroot_list_enable=YES

Isso significa que seu usuário será colocado em sua pasta (como uma prisão), EXCETO usuários no diretório / etc /

vsftpd.chroot_list

Vamos criar este arquivo e adicionar nosso usuário, o arquivo é uma linha simples que contém "theadmin". Adicione um usuário por linha. Isso significa que você NÃO precisa criar uma /var/www/theadminpasta, o usuário fará o login e iniciará /home/vsftpd.

Reinicie o servidor e pronto!

2707974
fonte
Já tentei isso muito inflexível, uma vez que impõe local_root = / var / www / $ USER. Não me permite especificar um único diretório para um usuário ou usuários. esse diretório normalmente possui finalidade e local diferentes, dependendo do cliente. Obrigado pela resposta embora.
Avenyet
0

sim, você pode e, para flexibilidade, crie um diretório e arquivo userconfig, mkdir /var/www/userconfsou o que você quiser alterar para o nome userconfs e, em seguida, crie um arquivo específico

vi /var/www/userconfigs/ftpuseraccount

tipo interno, local_root=/var/www(ou o que você quiser acessar por dir) guest_username=www-data(o proprietário do ubuntu do arquivo

após a atualização você vsftpd.conf adicionando user_config_dir=/var/www/userconfigs(ou o que você substituiu como, esta conta acessará o que sdir yo especificou)

Agunbiade Bolaji
fonte