Servidor de FTP, com utilizadores virtuais no MySQL

25 Comentários

Pessoalmente considero que as distribuições GNU/Linux têm as características perfeitas para implementar serviços de rede. As configurações dos serviços são normalmente realizadas em ficheiros, as quais podemos gerir/controlar facilmente qualquer serviço remotamente usando por exemplo SSH .

Como administrador de uma rede de dados,  já referi em vários artigos que dou preferência a distribuições Linux quando tenho de implementar algum tipo de serviço (ex. DHCP, DNS, HTTP, etc). Hoje deixamos aqui um pequeno guia de como criar um servidor de FTP, usando o vsftpd, com utilizadores virtuais no MySQL.

ftp_00

O vsftpd (Very Secure FTPD) é provavelmente um dos mais rápidos e seguros servidores de FTP para sistemas Unix. Este serviço oferece um conjunto de características das quais destacamos:

  • Suporte para utilizadores virtuais
  • Suporte para IPv6
  • Suporte para virtual IPs
  • Suporte para SSL
  • Controlo para largura de banda a usar
Pré-requisitos

Para este tutorial, vamos considerar que o hostname da nossa máquina é pplware.com e tem o endereço 192.168.1.84. Como vamos necessitar de várias vezes de privilégios root, podemos começar por executar o comando:

sudo su
Instalação do vsftpd, MySQL e phpMyAdmin

Passo 1 – De seguida, vamos instalar o vsftpd, MySQL e phpMyAdmin. Para uso, podemos usar apenas o seguinte comando

apt-get install vsftpd libpam-mysql mysql-server mysql-client phpmyadmin libpam-ldap

e preenchemos com a seguinte informação:

New password for the MySQL "root" user: <-- PASSWORD
Repeat password for the MySQL "root" user: <-- PASSWORD
Web server to reconfigure automatically: <-- apache2
Configure database for phpmyadmin with dbconfig-common? <-- No
LDAP server Uniform Resource Identifier: <-- ENTER
Distinguished name of the search base: <-- ENTER
LDAP version to use: <-- 3
Make local root Database admin: <-- Yes
Does the LDAP database require login? <-- No
LDAP account for root: <-- ENTER
LDAP root account password: <-- ldaprootpw
Criar a base de dados para o serviço vsftpd

Passo 2 – Para este exemplo, vamos criar uma base de dados com o nome db_vsftpd e o utilizador MySQL u_vsftpd. Para tal, acedemos ao MySQL com o seguinte comando:

mysql -u root -p

e em seguida criamos a base de dados e definimos as permissões para o utilizador _vsftpd

CREATE DATABASE vsftpd; 
GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP ON db_vsftpd.* TO 'u_vsftpd'@'localhost' IDENTIFIED BY 'password; 
GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP ON db_vsftpd.* TO u_vsftpd'@'localhost.localdomain' IDENTIFIED BY 'password'; 
FLUSH PRIVILEGES;

Nota: deverá alterar o campo ‘password’ para a password que pretende atribuir ao utilizador

Acesso a base de dados e criação da estrutura

Passo 3 – Ainda dentro do MySQL usamos o seguinte comando para nos “posicionarmos” na base de dados db_vsftpd.

USE db_vsftpd;

depois criamos a estrutura da base de dados com o seguinte código:

CREATE TABLE `accounts` (
`id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY ,
`username` VARCHAR( 30 ) NOT NULL ,
`pass` VARCHAR( 50 ) NOT NULL ,
UNIQUE (
`username`
)
) ENGINE = MYISAM ;

Para sair escrevemos quit

Configurar o vsftp

Passo 4 – Primeiro vamos criar o utilizador  vsftpd, sem privilégios, com o homedir em /home/vsftpd e associá-lo ao grupo nogroup. Os directorios dos utilizadores virtuais ficarão dentro de /home/vsftpd (ex.home/vsftpd/user1, /home/vsftpd/user2)

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

De seguida abrimos o ficheiro /etc/vsftpd.conf e incluimos a seguintes configuração:

listen=YES
anonymous_enable=NO
local_enable=YES
write_enable=YES
local_umask=022
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES
nopriv_user=vsftpd
chroot_local_user=YES
secure_chroot_dir=/var/run/vsftpd
pam_service_name=vsftpd
rsa_cert_file=/etc/ssl/certs/vsftpd.pem
guest_enable=YES
guest_username=vsftpd
local_root=/home/vsftpd/$USER
user_sub_token=$USER
virtual_use_local_privs=YES
user_config_dir=/etc/vsftpd_user_conf

(Opcional) De salientar que a variável user_config_dir aponta para /etc/vsftpd_user_conf. Nesse sentido é necessário criar essa diretoria, usando o comando:

mkdir /etc/vsftpd_user_conf

Agora vamos proceder a configuração do PAM (Pluggable authentication modules) de modo a podermos usar a informação da base de dados criada para autenticar os utilizadores (em vez da informação contida em /etc/passwd ou /etc/shadow). A configuração do PAM, para o vsftp, é realizada no ficheiro /etc/pam.d/vsftpd.

Assim, abrimos o ficheiro etc/pam.d/vsftpd e incluímos a seguinte informação:

auth required pam_mysql.so user=vsftpd passwd=ftpdpass host=localhost db=vsftpd table=accounts usercolumn=username passwdcolumn=pass crypt=2 

account required pam_mysql.so user=vsftpd passwd=ftpdpass host=localhost db=vsftpd table=accounts usercolumn=username passwdcolumn=pass crypt=2

Após as configurações anteriores, vamos reiniciar o serviço MySQL usando o comando

/etc/init.d/vsftpd restart
Criação de utilizadores virtuais

Passo 5 – O próximo passo é a criação de utilizadores virtuais. Para isso voltamos a entrar no MysQL e voltamos a posicionarmos-nos na base de dados db_vsftpd

mysql -u root -p
USE db_vsftpd;

De seguida criamos o nosso primeiro utilizador virtual. Para este exemplo vamos criar o utilizador pplware com a password ppl1220

Como não existe um processo automático para criação dos directórios dos utilizadores, basta executar/adaptar o seguinte código para outros utilizadores

mkdir /home/vsftpd/ppinto
chown vsftpd:nogroup /home/vsftpd/ppinto

E está feito.

Nota: uma vez que têm instalado o phpMyadmin, podem facilmente acrescentar novos utilizadores.

Como aceder ao FTP remotamente

Depois de instalado e configurado o serviço de  FTP, o acesso pode ser realizado via um simples browser ou através de uma aplicação cliente para FTP (ex. FileZilla, fireFTP). Neste exemplo vamos usar o FileZilla.

Para aceder ao serviço de FTP remoto basta indicar:

  • Anfitrião (IP/nome do servidor FTP
  • Nome do utilizador e respectiva Palavra-Passe

filezilla_00

Como podem ver na imagem anterior, o acesso foi realizado com sucesso à home directory do utilizador ppinto. Esperamos que este tutorial seja útil e brevemente ensinaremos mais algumas configurações úteis.Ref

Partilhar:
Tags:

Comentários

25

Deixe um comentário

O seu endereço de email não será publicado. Campos obrigatórios marcados com *

  1. Avatar de Filipe
    Filipe

    Fantástico!
    Parabéns pelo artigo =)

  2. Avatar de euluism

    Esse dissipador da foto é que mete dó 🙂 Já merece uma boa limpeza.

  3. Avatar de Carlos André
    Carlos André

    Off topic – Para quando um tutorial de como ligar um router via wireless a outro router para expandir o sinal wireless?

    1. Avatar de José Bernardes
      José Bernardes

      Isso seria tentacular, ainda para mais nos Router’s da Sapo/Meo!

      1. Avatar de Carlos André
        Carlos André

        Pelo que já me andei a informar os router’s tem de ter a função repetidor se não estou em erro.

  4. Avatar de Bruno Moreira
    Bruno Moreira

    Excelente artigo Pedro… por acaso conhecia mas nao com a parte de users virtuais..

    Pedro tenho um problema, estava com vontade de instalar um servidor samba com maquinas CentOs(Versão Desktop e Servidor) e uma máquina windows… mas consigo ver as pastas no windows mas não aceder… tens algum tutorial ou que tal um artigo assim para ajudar a malta(e eu principalmente)

    Cumprimentos

    Bruno Moreira

    1. Avatar de Pedro Pinto

      Boas Bruno, parece-me que é problema de permissões. Ora Samba deixa ver o que anda para aqui:

      https://pplware.sitedev.pt/linux/howto-partilha-de-ficheiros-com-samba/
      https://pplware.sitedev.pt/linux/dica-gesto-simples-do-samba-no-ubuntu/

      Podes mandar-me o ficheiro smb.conf para ppinto@pplware.com?

      1. Avatar de Bruno Moreira
        Bruno Moreira

        Tenho no trabalho amanhã envio-te isso para dars uma vista de olhos..

        Cumps..

        Bruno Moreira

  5. Avatar de Paulo Ferreira
    Paulo Ferreira

    Parabéns! Excelente artigo!! Por acaso andava para escrever um tutorial semelhante de forma a ajudar um amigo que me tinha solicitado esta hipótese para o serviço de FTP da sua empresa. Nem de propósito 😉

  6. Avatar de furious
    furious

    no meu pc costumo usar wamp (no windows), pessoalmente nunca me aventurei muito no mundo do linux (sim, tenho 1 site hospedado num server linux, mas usa cpanel)…

    qual será a melhor distribuição para fazer um webserver, ubuntu, centos, fedora ou outra?

    1. Avatar de António
      António

      Centos sem dúvida

      1. Avatar de Pedro Pinto

        Sim, totalmente de acordo 🙂

        1. Avatar de Cesar Araujo

          Altamente discutível qual a melhor distro para server. Eu sou amante do debian nas vertentes servidor, acho que o redhat já deu o que tinha a dar, quanto ao Centos, usei algum tempo mas não me aprazou. Mas isto é como as camisas, cada um usa o que gosta!

          1. Avatar de Pedro Pinto

            Nem mais, Altamente discutível 🙂

    2. Avatar de lmx
      lmx

      para mim…quase qualquer um …eu uso sempre debian, porque gosto da forma como se gerem as coisas no debian!!

      cmps

    3. Avatar de Jorge
      Jorge

      Pessoalmente uso red hat e nao desgosto

      1. Avatar de Cesar Araujo

        Por favor! Alem de pago tem o inconveniente de eu ter estado 30 min a tentar perceber como o activava para poder iniciar a instalação de pacotes, a somar a isso foi o facto de o package manager me dizer com imensa frequência que tinha perdido a ligação ao servidor de pacotes. Ora isto em ambiente empresarial onde time is money, não abona nada a favor. Mas cada um tem os seus gostos.

    4. Avatar de rand
      rand

      Podes sempre experimentar o arch linux server edition http://www.archserver.org/

  7. Avatar de andre flores
    andre flores

    CREATE DATABASE vsftpd;
    GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP ON db_vsftpd.* TO ‘u_vsftpd’@’localhost’ IDENTIFIED BY ‘password;
    GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP ON db_vsftpd.* TO u_’vsftpd’@’localhost.localdomain’ IDENTIFIED BY ‘p

    penso por aqui falta uma ‘ junto da password

    1. Avatar de Pedro Pinto

      Yups, tava no sitio errado. Thanks

  8. Avatar de FSilva
    FSilva

    Antes de mais quero dar os parábens por este projecto que conseguem mantê-lo vivo e com actualizações de interesse diariamente.

    No entanto, quanto a este artigo, existem alguns reparos que gostaria de fazer (sem nunca denegrir o fantástico trabalho do Pedro Pinto ou qualquer um dos colaboradores da Pplware).

    1) instalas o pacote libpam-ldap mas no entanto estás a utilizar o MySQL como backend para os utilizadores. Não estará este pacote em excesso? Ou necessitamos dele para alguma dependência?

    2) Penso que existe um erro tipográfico no segundo comando do “grant”, na parte do utilizador.

    3) Não percebo para que necessitas do “/etc/vsftpd_user_conf”, se não utilizas as permissões por cada utilizador (por exemplo “chroot”, a “home” do utilizador, entre outras). Posso estar enganado mas podes tirar essa primitiva do vsftpd.conf que funciona à mesma para a configuração que queres.

    4) Penso que seria útil o comando para inserir o utilizador no MySQL (não sei bem o tipo de público que estás a tentar atingir, mas se for o que necessita de todos os passos porque ainda não está bem à vontade com este SO, este passo também deveria estar incluído).

    5) Quando editas o ficheiro da vsftp da PAM, penso que a directiva “user=vsftpd” deverá ser “user=u_vsftpd”.

    Pensei que esta nova configuração (para mim que desconhecia) tirava partido do MySQL, mas acho que não, pois o utilizador terá sempre de existir no sistema. A utilização de utilizadores virtuais no VSFTP sem recurso ao MySQL é mais simples e não requer mais um serviço (MySQL) para complicar e consumir memória.

    De qualquer maneira, bom trabalho por publicares este artigo, que certamente ajudará novos utilizares a verem algum do poder que os SO Linux têm e que facilmente se põe a funcionar.

    1. Avatar de Pedro Pinto

      Boas FSilva,

      Muito obrigado pelo teu feedback, ve-se que dominas a coisa. Vamos por pontos então

      1) libpam-ldap por causa do PAM – http://wiki.debian.org/LDAP/PAM
      2) Yups, a pelica estava no sitio errado
      3) É opcional como diz no artigo. Podes tirar
      4) Pois, tenho de voltar a a dar luz a rubrica “Vamos dar uns toques SQL” – https://pplware.sitedev.pt/tutoriais/vamos-dar-uns-toques-de-sql-vii/ Desde já te deixo o convite se dominares o assunto :;)
      5) Sim, foi o utilizador criado anteriormente

      A questão dos utilizadores é como refiro no utilizado “não existe um processo automático para todo o processo”, No entanto, passas a poder gerir de forma mais “user friendly” todos os utilizadores. O recurso ao MySQL é verdade que consome memória mas também não é nada de especial.

      Um abraço e mais uma vez obrigado pelo teu feedback

      1. Avatar de FSilva
        FSilva

        1) Sim mas já tens a biblioteca libpam-mysql… Não te esqueças que os PAM “já vêm de origem”. Só estás a adicionar o suporte para MySQL e do LDAP integrado nos PAM.

        5) Pois mas criaste o ‘u_vsftpd’ no MySQL … e no ficheiro vsftpd dos PAM tens “user=vsftpd”. Ou trocas o user no MySQL ou no ficheiro.

        Continuação de bom trabalho.