Tutorial como restringir login ssh por chave pública e privada para um diretório específico no Ubuntu

O objetivo deste tutorial é criar um usuário, restringir o acesso de login do servidor por chave pública/privada, configurar um diretório específico que este usuário fique restrito (jail user). Desta forma, o usuário que fizer login não pode caminhar por outras pastas.

Neste caso específico, visando garantir acesso ao usuário no servidor, como se fosse um acesso FTP, só que de forma mais segura, usando o SSH. Lembrando que é necessário tomar cuidado ao definir o diretório do usuário dentro do diretório de produção em caso de um servidor de webhosting. Não deixe o diretório do usuário dentro da pasta pública com acesso html.

Criando o diretório que o usuário deve ficar restrito

Neste caso, o usuário vai ser um webmaster de um site, então temos o desejo de criar seu acesso dentro do diretório /var/www/html
O nome da pasta escolhida é pasta_webmaster

Criando a pasta do usuário:
sudo mkdir /var/www/html/pasta_webmaster

Criando a pasta pública dos sites que o usuário poderá hospedar:
sudo mkdir /var/www/html/pasta_webmaster/public_html

Criando novo usuário por linha de comando

Nesta etapa, vamos criar um novo usuário e definir a pasta para que fique restrito
O nome de usuário escolhido é webmaster
O nome da pasta escolhida é pasta_webmaster
sudo useradd webmaster -d /var/www/html/pasta_webmaster

Definindo as permissões de diretórios

sudo chmod 755 /var/www/html/pasta_webmaster
sudo chmod 755 /var/www/html/pasta_webmaster/public_html
sudo chown root:root /var/www/html
sudo chmod root:root /var/www/html/pasta_webmaster
sudo chown webmaster:webmaster /var/www/html/pasta_webmaster
sudo chown webmaster:webmaster /var/www/html/pasta_webmaster/public_html

Crie uma chave pública/privada para o usuário

Nesta etapa, o próprio usuário pode criar uma chave pública e privada e enviar para você cadastrar no servidor. Temos um tutorial para gerar chave pública e privada para ssh. Os passos são os mesmos para gerar a chave pro github/gitlab.

Lembrando que o usuário terá que te enviar a chave pública dele localizada no diretório (se utilizar windows):
C:\Users\NOME_USUARIO\.ssh\id_rsa.pub

Para o usuário realizar a conexão ao servidor, utilizando o filezilla, por exemplo, ele deve informar a chave privada. O caminho pra chave privada é:
C:\Users\NOME_USUARIO\.ssh\id_rsa
Atenção: o usuário não deve te mandar a chave privada, esta é uma chave pessoal dele e não deve enviada para ninguém.

Como instalar chave pública de usuário SSH para login automático sem necessidade de senha

Levando em conta os passos anteriores, devemos então criar a pasta .ssh do usuário
sudo mkdir /var/www/html/pasta_webmaster/.ssh
Agora devemos definir a permissão correta da pasta .ssh do usuário
sudo chmod 700 /var/www/html/pasta_webmaster/.ssh
Nesta etapa vamos criar o arquivo conhecido como “authorized_keys”, que vai conter a chave dos usuários que tem permissão de login.
Particularmente, gosto de utilizar o editor “vi” ou “vim”, mas fique a vontade de utilizar o editor que tiver mais preferência, segue os passos:
Abra no seu computador o arquivo da chave pública do usuário, aquela que ele te enviou (id_rsa.pub)
Copie o conteúdo da chave com o famoso control+c, ou selecione todo o código da chave e clique com o botão direito do mouse e selecione “copiar”. Atenção: tem que copiar certinho, sem faltar nenhum caracter.
Agora no terminal do servidor, siga os passos:
vi /var/www/html/pasta_webmaster/.ssh/authorized_keys
Agora digite: i
Cole a chave, se tiver usando o prompt no windows, clique com o botão direito do mouse; se tiver com terminal no mac command+v
Agora tecle: Esc
Agora digite: :wq
Agora tecle: Enter
Pronto, você criou o arquivo, colou a chave dentro dele, salvou e fechou o arquivo.
Agora precisamos definir a permissão correta pro arquivo “authorized_keys”
sudo chmod 600 /var/www/html/pasta_webmaster/.ssh/authorized_keys

Como restringir acesso do servidor apenas para login com chave pública/privada

Esta etapa precisa de atenção. Vamos bloquear todos os acessos por “usuário e senha” e permitir somente acesso por chave para usuários conhecidos. É interessante que o administrador do servidor também tenha sua pasta .ssh criada, e sua chave pública também autorizada. Não recomendamos que tenha usuário root configurado, recomendado que seu usuário pessoal de administrador tenha um nome diferente de root/admin/ubuntu, etc. E que seu usuário tenha privilégios de superusuário com sudo, ou seja um SUDOER. Antes de seguir nesta etapa, tenha certeza que você consegue acesso ao servidor: seja fisicamente, serial, ou por um terminal virtual criado pela empresa que te forneça o serviço (grande maioria possui).
Atenção! Se não realizar os passos abaixo de forma correta, você pode trancar o servidor com a chave pra dentro e bloquear seu acesso a ele.

Primeiro passo é editar o arquivo de configuração do SSH para permitir somente acesso de usuários que você permite
vi /etc/ssh/sshd_config
Agora caminhe até o fim do arquivo
Agora caminhe até o fim da linha
Agora digite: a
Agora tecle: Enter
Agora insira o texto: AllowUsers SEU_USUARIO webmaster
agora tecle: Esc
Agora digite: :wq
Agora tecle: Enter

allowusers linux ssh

Agora é desabilitar o acesso com login e senha:
vi /etc/ssh/sshd_config
Agora tecle: /
Agora digite: PasswordAuthentication
Agora tecle: Enter
Agora caminhe até o fim da linha
Agora tecle: a
Agora apague yes e troque por: no
agora tecle: Esc
Agora digite: :wq
Agora tecle: Enter

password authentication linux ssh

Nesta etapa então vamos definir a regra que bloqueia o usuário webmaster para seu diretório pessoal (pasta_webmaster)
vi /etc/ssh/sshd_config
Agora caminhe até o fim do arquivo
Agora caminhe até o fim da linha
Agora digite: a
Agora tecle: Enter
Agora insira o texto:
Match User webmaster
ChrootDirectory /var/www/html/pasta_webmaster/
AllowTCPForwarding no
X11Forwarding no
ForceCommand internal-sftp

Agora tecle: Esc
Agora digite: :wq
Agora tecle: Enter

matchuser ssh login folder linux

Se não tiver utilizando o login de root, sugiro também verificar o PermitRootLogin no mesmo arquivo e deixá-lo como:
PermitRootLogin: no

Após os passos acima realizados é hora de reiniciar o daemon do SSH, fique tranquilo, seu terminal não será desconectado.
service sshd restart

Etapa importante! Não feche ser terminal atual do SSH. Abre um novo terminal e tente realizar a conexão com seu usuário pessoal. Se conseguir realizar a conexão, garantimos que não trancou o servidor com você para fora. Caso aconteça algum problema, volte para o outro terminal, e reverta as modificações realizadas e reinicie o daemon novamente, para que eles tenham efeito. E novamente teste o login com um novo terminal.