Criando um servidor FTP seguro com o MySecureShell

Criando um servidor FTP seguro com o MySecureShell
O protocolo FTP possui um problema fundamental, que é o fato de transmitir as senhas (e todos os arquivos transferidos) de forma desencriptada. Isso abre margem para roubo de senhas e outros problemas de segurança.

A resposta para o problema é o SFTP, um componente do SSH, que permite transferir os arquivos de forma segura. Uma das limitações do SFTP é que, ao criar uma conta de usuário, ele tem acesso não apenas aos arquivos que deve modificar, mas acesso via shell ao servidor, que pode ser usado para rodar comandos diversos e até mesmo explorar brechas de segurança locais (onde um usuário restrito do sistema pode obter privilégios adicionais).

A alguns meses postei uma dica sobre o rssh, que é uma resposta para esses casos. Ele permite que o usuário tenha acesso ao servidor apenas via sftp ou scp, sem ter como executar comandos adicionais: https://www.hardware.com.br/dicas/usando-rssh.html

Outra opção de software para dar acesso aos arquivos em determinadas pastas do servidor, de forma segura, sem permitir que eles loguem diretamente no sistema é o MySecureShell. Ele também é baseado no uso do SFTP, mas usa um chroot para prender o usuário dentro de seu diretório home.

Ele tem exatamente a mesma função do rssh, mas oferece como principal vantagem o fato de realmente isolar o usuário dentro de sua pasta home (ou outra pasta definida por você), sem ter como visualizar o conteúdo de outras pastas do sistema, ao contrário do rssh, que na configuração padrão permite que o usuário visualize o conteúdo de outras pastas, de acordo com suas permissões de acesso.

O MySecureShell é também um pouco mais fácil de configurar. A principal desvantagem é que ele é ainda um software novo, que ainda não passou por um período tão grande de amadurecimento e correção de bugs. Ele ainda não está disponível nos repositórios de muitas distribuições, por isso você vai precisar baixá-lo manualmente na maioria dos casos. Os arquivos estão disponíveis no:
http://sourceforge.net/projects/mysecureshell/

Na página estão disponíveis pacotes .deb, .rpm e também o pacote com o código fonte. Ele tem como dependências os pacotes libssl, ssh e openssh-server, que precisam ser instalados primeiro, usando o gerenciador de pacotes, como em:

# apt-get install libssl0.9.7 ssh openssh-server


(o nome do pacote libssl pode variar de acordo com a versão, como “libssl0.9.7” ou “libssl0.9.8”; verifique qual está disponível)

A partir daí você pode instalar o pacote do MySecureShell da forma normal, como em:

# dpkg -i mysecureshell_0.95_i386.deb

Assim como no caso do rssh, é necessário que você use o especifique o binário do MySecureShell (/bin/MySecureShell) como shell de cada usuário que vai utilizá-lo, o que pode ser feito editando manualmente o arquivo “/etc/passwd”, ou usando o comando “usermod -s /bin/MySecureShell usuário”, como em:

# usermod -s /bin/MySecureShell manuel

A partir daí o usuário pode se logar usando o comando “sftp” ou um cliente gráfico com suporte a sftp, como o gFTP (disponível na maioria das distribuições Linux), o Filezilla (no Windows, http://filezilla.sourceforge.net/) e o WinSP (http://winscp.sourceforge.net/).

Nos três, procure pela opção que indica o protocolo usado e troque de “FTP” para “SSH2”. Indique também a porta usada pelo servidor, que no SFTP é 22 e não 21. No caso do gFTP as opções estão disponíveis diretamente na barra principal:

index_html_5a9012fa

No Filezilla você precisa usar o Site Manager para criar a conexão. Só assim você tem acesso à opção de usar o SFTP:

index_html_m71c75333

Assim como ao usar o rssh, o usuário consegue se conectar normalmente, visualizar e transferir arquivos, mas ao tentar acessar qualquer diretório fora de seu diretório home, recebe um erro de permissão negada:

index_html_35823e66

Para criar um novo usuário, já utilizando o MySecureShell por padrão, você usaria o comando “adduser –shell /bin/MySecureShell”, como em

# adduser –shell /bin/MySecureShell joao

Para criar uma pasta vazia e usá-la como diretório home do usuário, você usaria:

# mkdir /var/www/joao
# chown -R joao.joao /var/www/joao
# adduser –home /var/www/joao –shell /bin/MySecureShell –no-create-home joao

O MySecureShell oferece também um bom volume de configurações, que lembram bastante as de um servidor de FTP tradicional. Elas vão no arquivo “/etc/ssh/sftp_config” que, ao contrário do que o nome sugere, é um arquivo específico para o MySecureShell, utilizado apenas por ele. Este é outro ponto em que ele se destaca em relação ao rssh, que oferece poucas opções de configuração.

Excluindo as linhas comentadas, o arquivo contém:

<Default>
GlobalDownload 50k #total speed download for all clients
GlobalUpload 0 #total download for all clients (0 for unlimited)
Download 5k #limit speed download for each connection
Upload 0 #unlimit speed upload for each connection
StayAtHome true #limit client to his home
VirtualChroot true #fake a chroot to the home account
LimitConnection 10 #max connection for the server sftp
LimitConnectionByUser 1 #max connection for the account
LimitConnectionByIP 2 #max connection by ip for the account
Home /home/$USER #overrite home of the user
IdleTimeOut 300 #(in second) deconnect client is idle too long time
ResolveIP true #resolve ip to dns
HideNoAccess true #Hide file/directory which user has no access
DefaultRights 0640 0750 #Set default rights for new file and directory
ShowLinksAsLinks false #show links as their destinations
Charset “ISO-8859-15” #set charset of computer
</Default>

Você pode ver que, por padrão, o arquivo inclui as linhas ” Download 5k” e “GlobalDownload 50k”. Elas fazem com que a taxa de download fique em apenas 5 KB/s e todos os usuários somados não possam ultrapassar 50 KB/s, o que é inadequado na maioria das situações. Edite as opções ajustando os valores ou simplesmente use o valor “0” para desativar os limites.

As opções “LimitConnection”, “LimitConnectionByUser” e “LimitConnectionByIP” indicam, respectivamente, o número máximo de conexões aceitas pelo servidor, o número de conexões com cada login e o número de conexões a partir do mesmo endereço IP. Elas podem ser usadas em situações onde o servidor tem um link estreito, e consequentemente não pode acomodar muitos usuários simultâneos, ou caso você deseje impedir que o usuário possa abrir várias conexões usando o mesmo login, ou a partir do mesmo endereço IP.

A opção “Home /home/$USER” indica a pasta onde o usuário ficará “preso”. Por padrão, ele tem acesso à sua pasta home (o “/home/$USER” é uma variável de sistema que é convertida automaticamente no diretório home do usuário logado).

As opções dentro da seção “Default” se aplicam a todos os usuários, mas é possível criar seções particulares, especificando limites para cada usuário em particular. Nesse caso, adicione uma nova seção no final do arquivo, contendo o login do usuário e as opções desejadas, como em:

<User joao>
Home /var/www/joao
Download 20k
Upload 10k
</User>

Nesse exemplo o usuário joao fica limitado a uma taxa de download de 20 KB/s e upload de 10 KB/s e tem acesso à pasta “/var/www/joao”.

Sempre que fizer alterações no arquivo, é necessário reiniciar o MySecureShell para que elas entrem em vigor:

# /etc/init.d/mysecureshell restart

Você pode verificar quais usuários estão logados e detalhes sobre as transferências que estão sendo realizadas usando o comando “sftp-who”, como em “sftp-who joao”. Ele retorna um bom volume de informações. Caso precise desconectar um usuário, pode usar o comando “sftp-kill”, como em “sftp-kill joao”.

Sobre o Autor

Redes Sociais:

Deixe seu comentário

X