Servidor de FTP, com utilizadores virtuais no MySQL
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.
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
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
Este artigo tem mais de um ano
Fantástico!
Parabéns pelo artigo =)
Esse dissipador da foto é que mete dó 🙂 Já merece uma boa limpeza.
Off topic – Para quando um tutorial de como ligar um router via wireless a outro router para expandir o sinal wireless?
Está para breve 🙂
No entanto, um equipamento destes faz maravilhas
https://pplware.sapo.pt/networking/anlise-aztech-wl556e-inovador-repetidor-wireless-parte-i/
Isso seria tentacular, ainda para mais nos Router’s da Sapo/Meo!
Pelo que já me andei a informar os router’s tem de ter a função repetidor se não estou em erro.
Sim, exactamente.
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
Boas Bruno, parece-me que é problema de permissões. Ora Samba deixa ver o que anda para aqui:
https://pplware.sapo.pt/linux/howto-partilha-de-ficheiros-com-samba/
https://pplware.sapo.pt/linux/dica-gesto-simples-do-samba-no-ubuntu/
Podes mandar-me o ficheiro smb.conf para ppinto@pplware.com?
Tenho no trabalho amanhã envio-te isso para dars uma vista de olhos..
Cumps..
Bruno Moreira
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 😉
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?
Centos sem dúvida
Sim, totalmente de acordo 🙂
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!
Nem mais, Altamente discutível 🙂
para mim…quase qualquer um …eu uso sempre debian, porque gosto da forma como se gerem as coisas no debian!!
cmps
Pessoalmente uso red hat e nao desgosto
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.
Podes sempre experimentar o arch linux server edition http://www.archserver.org/
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
Yups, tava no sitio errado. Thanks
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.
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.sapo.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) 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.