Hi. I'm Guilherme. But you can call me guits

I'm a beginner web dev trying to figure out server side stuffs.

I run a message board called gchan. You're welcome to join in and share your thoughts.

You can reach me at blinkenshell's IRC!

RSS

I'll use this space to share my adventures trying to run a proper debian web server. Updates weekly!

Posts:

  1. Setting up a VPS running Debian: apache2. english português
  2. Instalando seu próprio servidor GIT. português
  3. Sincronizando um repositório git a um servidor. português
  4. Restaurando uma instalação Ubuntu após deletar arquivos do sistema. português
  5. Alterando a porta padrão do ssh. português
  6. Habilitando acesso SSH no Windows 10. português

Configurando um VPS com Debian: apache2.

A ideia é, tendo contratado um servidor virtual privado, qual o caminho mais rápido para começar a desenvolver?

Neste primeiro post, vamos instalar o Apache 2 e ajustar as configurações necessárias para acessar seu servidor através de um domínio registrado e com um firewall para filtrar as portas.

Índice

Configurações iniciais de ambiente

voltar para o índice

O serviço que eu contratei foi com a Locaweb coff o mais barato que eu achei coff, e eles entregam o servidor com o sistema operacional já instalado, que foi o Debian 9 (stretch).

Após logar como root, o primeiro objetivo é criar um usuário com permissões normais, mas que possa agir como super quando necessário. Isso cria uma barreira para que você não faça nenhuma cagada.

$ adduser nome-do-usuario

Agora, adicionamos ele ao grupo sudo

$ usermod -aG sudo nome-do-usuario

Precisamos também permitir que o novo usuário consiga acessar o servidor. A forma como isso vai ser feito depende de como você configurou o login do usuário root.

Se você configurou o usuário root com acesso SSH, pode criar uma nova chave, ou utilizar a mesma do root.

Em um novo terminal, faça login utilizando seu novo usuario:

$ ssh seu_usuario@seu_servidor

Verifique que você está no grupo sudo:

$ groups

Deve listar algo do tipo:

seu_usuario root

Verifique que você consegue rodar programas como super:

$ sudo ls -la /root

Caso você receba o erro "sudo command not found", no servidor, como root, rode:

$ apt-get install sudo

Caso a instalação peça para substituir o arquivo /etc/sudoers, mantenha o original. Você pode também precisar adicionar o usuário manualmente pelo arquivo:

$ vim /etc/sudoers

e adicione as seguintes linhas ao final do arquivo:

# permite acesso completo aos usuários do grupo sudo
%sudo ALL=(ALL:ALL) ALL
# especifica os privilégios do usuário root
root ALL=(ALL:ALL) ALL

Rode o comando anterior com o prefixo sudo. Se tudo ocorrer bem, pode fechar a conexão com o usuário root e seguir com seu novo user.

Instalando o Apache 2 e restrições básicas de acesso

voltar para o índice

Para direcionar a um domínio, comece criando um diretório para o projeto:

Com a instalação do apache, esperam-se acessos na porta 80 (http) ou 443 (https) o que pode trazer riscos de segurança se os outros acessos do servidor não forem filtrados.

Isso pode ser feito, no Debian, através do iptables, que regula as permissões de acesso ao servidor, ou utilizando o programa ufw (Uncomplicated Firewall) que serve como um front-end para o iptables, visando simplicidade no uso.

$ apt-get install ufw
$ apt update

Vamos nos certificar, antes de ativar o firewall, de manter o acesso ssh aberto, para que não fiquemos trancados pra fora do servidor.

O comando abaixo nos mostra as aplicações que podem ser liberadas usando o ufw

$ ufw app list

Liberaremos, então, conexões SSH através do OpenSSH.

$ ufw allow OpenSSH

Podemos ver as conexões permitidas com:

$ ufw status

Verifique na listagem se você possui a ação ALLOW para OpenSSH

To Action From
-- ------ ----
OpenSSH ALLOW Anywhere
OpenSSH (v6) ALLOW Anywhere (v6)

Agora o firewall pode ser ativado com:

$ ufw enable

A instalação do Apache 2 é feita com o comando:

$ sudo apt install apache2

Um erro comum é que alguns programas podem aparecer como não instalados:

dpkg: warning: 'ldconfig' not found in PATH or not executable.
dpkg: warning: 'ufw' not found in PATH or not executable.

Verifique como está configurado seu $PATH:

$ echo $PATH

Um erro comum é que alguns diretórios não tem seus arquivos verificados por padrão. Caso o seu retorno for parecido com:

/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games

Precisaremos adicionar /usr/sbin e /sbin ao caminho do sistema:

$ echo PATH=/usr/sbin:/sbin:$PATH >> .bashrc

Agora a instalação pode ser feita normalmente. O próximo passo é liberar as portas 80 (http) e 443 (https), para que o servidor possa ser acessado.

$ sudo ufw allow 'WWW' # libera apenas a porta 80
$ sudo ufw allow 'WWW Secure' # libera apenas a porta 443
$ sudo ufw allow 'WWW Full' # ambas

Agora você pode acessar o seu site pelo IP do servidor.

Organizando os arquivos do projeto e apontando para o domínio

voltar para o índice

Para direcionar a um domínio, comece criando um diretório para o projeto:

$ sudo mkdir -p /var/www/meuprojeto.com.br/html

Ajuste as permissões:

$ sudo chown -R $USER:$USER /var/www/meuprojeto.com.br/html
$ sudo chmod -R 755 /var/www/meuprojeto.com.br

A pasta /html vai servir como raíz do seu projeto. O Apache, por padrão, vai servir para qualquer requisição nas portas 80 e 443, o arquivo index

$ echo "<h1>Olá mundo!</h1>" > /var/www/meuprojeto.com.br/html/index.html

Para que o sistema entenda essa estrutura de pastas, é necessário que seja adicionado uma entrada Virtual Host no arquivo .conf

Ao invés de sobrescrevermos o arquivo padrão, /etc/apache2/sites-available/000-default.conf, podemos gerar um arquivo específico para o projeto:

$ sudo vim /etc/apache2/sites-available/meuprojeto.com.br.conf

A seguinte configuração serve para conexões http:

<VirtualHost *:80>
ServerAdmin admin@meuprojeto.com.br
ServerName meuprojeto.com.br
ServerAlias www.meuprojeto.com.br
DocumentRoot /var/www/meuprojeto.com.br/html
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

Agora, o arquivo deve ser habilitado usando o a2ensite, enquanto a configuração padrão (000-default.conf) deve ser desabilitada.

$ sudo a2ensite meuprojeto.com.br.conf
$ sudo a2dissite 000-default.conf

Podemos validar as configurações definidas com:

$ sudo apache2ctl configtest

E então reiniciar o Apache para implementar as mudanças:

sudo systemctl restart apache2

Falta apenas criar um apontamento, no seu domínio, para o servidor. O processo pode mudar dependendo de onde foi comprado o domínio, mas a ideia é criar um record A apontando para o IP do servidor

No registro.br o processo ocorre da seguinte forma:
Dentro da sua conta, entre nas configurações do domínio, e vá até a aba DNS.

Opção de ir para edição de zonas

Clique em EDITAR ZONA. Caso for sua primeira alteração no domínio, vai ser emitido um alerta quanto à demora de propagação das alterações, segurança, etc.

Talvez você tenha que esperar até meio hora para cadastrar os records.

Crie um registro A apontando para o IP do seu servidor.

Você pode conseguir o IP com o código:

$ hostname -I

Preenchimento de novo apontamento

Opcional: criação de registro A em www. para o IP do servidor.

Após os registro, seus apontamentos devem estar no seguinte formato:

Apontamentos finalizados no REGISTRO BR
Apontamentos finalizados no REGISTRO BR.

Instalando seu próprio servidor Git.

Um uso digno de um servidor privado é como remote para versionamento através do Git.

Para isso, é preciso ter o git instalado.

$ sudo apt install git

Faça também as configurações básicas para os commits

$ git config --global user.name "seu_usuario"
$ git config --global user.email "seu_usuario@seu_email.com.br"

Primeiro vamos criar um usuario git, e um diretorio .ssh para acessarmos com esse usuario.

$ sudo adduser git
$ su git
$ cd
$ mkdir .ssh && chmod 700 .ssh
$ touch .ssh/authorized_keys && chmod 600 .ssh/authorized_keys

Agora devemos adicionar no authorized_keys do usuário git chaves de quem desejamos permitir acesso. É o mesmo processo descrito aqui.

O próximo passo é criar um diretório para gerenciamento dos projetos. Optei por criar em /var/www/, assim posso alocar um subdomínio (git.meusite.com.br) e criar uma página para visualizar os projetos. Logado com o usuário git:

$ mkdir /var/www/git.meusite.com.br

Para que você possa acessar o subdomínio pelo navegador, primeiro deve ser feito um apontamento CNAME no seu domínio. Usando o registro.br (veja como chegar nessa tela):

Opcional: crie também um apontamento CNAME www.git para o seu domínio.

Após fazer os apontamentos, seus registros devem estar parecidos com:

Agora, temos que configurar um arquivo .conf para O Apache redirecionar as requisições git. e www.git. para a pasta que criamos anteriormente.

$ vim /etc/apache2/sites-available/git.meusite.com.br.conf

Coloque a configuração abaixo:

<VirtualHost *:80>
ServerAlias www.git.meusite.com.br
DocumentRoot /var/www/git.meusite.com.br/
ErrorLog ${APACHE_LOG_DIR}/git.meusite.com.br.error.log
LogLevel warn
CustomLog ${APACHE_LOG_DIR}/git.meusite.com.br.access.log combined
<Directory />
Options FollowSymlinks
AllowOverride None
</Directory>
<Directory /var/www/git.meusite.com.br/>
Options Indexes FollowSymLinks MultiViews
AllowOverride All
Order allow,deny
allow from all
</Directory>
</VirtualHost>

Habilite e verifique as configurações e depois reinicie o Apache.

$ sudo a2ensite git.meusite.com.br.conf
$ sudo apache2ctl configtest
$ sudo systemctl restart apache2

Espere a propagação dos DNS registrados. Você pode verificar o status com:

$ dig +short CNAME git.meusite.com.br

Para cada projeto que você for versionar, é preciso criar um diretório .git, e utilizar o comando git init --bare

$ mkdir /var/www/git.meusite.com.br/primeiro_projeto.git && cd var/www/git.meusite.com.br/primeiro_projeto.git && git init --bare

Agora, os usuários que tiveram suas chaves adicionadas já podem utilizar o repositório.

# no seu computador
$ mkdir primeiro_projeto && cd primeiro_projeto
$ git init
$ echo "Olá Mundo" > index.html # caso seja um novo projeto
$ git add .
$ git remote add origin git@git.meusite.com.br:/var/www/git.meusite.com.br/primeiro_projeto.git
$ git commit -m "Primeiro commit"
$ git push origin master

Agora você já pode utilizar esse repo no computador de outro usuário:

$ git clone git@git.meusite.com.br:/var/www/git.meusite.com.br/primeiro_projeto.git && cd primeiro_projeto

Verifique os commits realizados, no servidor:

$ cd /var/www/git.meusite.com.br/primeiro_projeto.git && git log

Pronto! Você tem um repositório particular funcional. Agora precisamos realizar algumas restrições de segurança.

No formato atual, qualquer usuário pode acessar o servidor com o usuário git, através de ssh. Podemos restringir isso utilizando o git shell, ferramenta que vem em conjunto com a instalação do git.

Verifique se o git-shell está na lista de shells disponíveis no sistema

$ cat /etc/shells | grep git

Caso o resultado for vazio, verifique o caminho do programa git shell e adicione-o ao arquivo /etc/shells

$ sudo echo $(which git-shell) >> /etc/shells

Agora defina o git-shell como padrão para o usuário git

sudo chsh git -s $(which git-shell)

Isso previne acesso via shell ao servidor com o usuário git, mas ainda permite que os usuários usem funcionalidades ssh, como por ex.

# na maquina do usuário
$ ssh -D 8080 git@meusite.com.br

E outros usos do ssh como port-forwarding. Podemos restringir este acesso editando o arquivo authorized_keys do usuário git e adicionando a seguinte linha antes da chave de cada usuário que deve ter o acesso restrito:

no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty

Lembre-se de adicionar um arquivo index pros seus arquivos não ficarem à mostra!

Vamos adicionar um front-end simples para vizualiação dos repositórios, utilizando o programa gitweb

Comece clonando o repositório do git, que trás consigo o gitweb, para que instalemos a partir do código fonte.

$ git clone git://git.kernel.org/pub/scm/git/git.git && cd git/
$ make GITWEB_PROJECTROOT="/var/www/git.seusite.com.br" prefix=/usr gitweb

Atente para a diretiva GITWEB_PROJECTROOT, que deve apontar para o diretório onde estão seus repositórios. Talvez o make não esteja instalado no seu sistema. Nesse caso:

$ sudo apt update
$ sudo apt install build-essential

Rodando novamente o comando make serão gerados vários arquivos, dentre eles o diretório gitweb que deve ser movido para a raíz do subdomínio git.

$ sudo cp -rf gitweb /var/www/git.meusite.com.br/
$ cd /var/www/git.meusite.com.br && sudo rm -rf git # remove os arquivos após ter compilado

Precisamos agora ter certeza de que nosso servidor Apache tem permissão para rodar scripts perl/cgi na pasta gitweb, além de termos as bibliotecas necessárias instaladas.

$ sudo apt install perl libcgi-pm-perl # bibls. necessárias

Vamos também alterar o arquivo .conf referente ao subdomíno git.

# /etc/apache2/sites-available/git.meusite.com.br.conf
<VirtualHost *:80>
ServerAlias www.git.meusite.com.br
ServerName git.meusite.com.br
DocumentRoot /var/www/git.meusite.com.br/gitweb
ErrorLog ${APACHE_LOG_DIR}/git.meusite.com.br.error.log
LogLevel warn
CustomLog ${APACHE_LOG_DIR}/git.meusite.com.br.access.log combined
<Directory />
Options FollowSymlinks
AllowOverride None
</Directory>
<Directory /var/www/git.meusite.com.br/gitweb>
Options +ExecCGI +FollowSymLinks +SymLinksIfOwnerMatch
AllowOverride All
Order allow,deny
allow from all
AddHandler cgi-script cgi
DirectoryIndex gitweb.cgi
</Directory>
</VirtualHost>

Por último, verificar as configurações e reiniciar o Apache.

$ sudo apache2ctl configtest
$ sudo systemctl restart apache2

Se tudo der certo, você deve ter acesso, em git.meusite.com.br, a um front end neste estilo:

Página índice do gitweb

Old school!


Sincronizando um repositório git a um servidor

Se você possui um servidor com git configurado, e os seus repositórios são referentes a projetos em outro servidor (ou em outro subdomínio do mesmo) uma boa ideia é sincronizar os repositórios aos diretórios que servem seus arquivos para a web.

Para isso, vamos usar uma combinação de git hooks, rsync e, claro, acesso aos servidores via chave ssh.

O fluxo é o seguinte: sempre que um usuário enviar arquivos pro repositório remoto (via git push), o próprio git chama uma ação (hook, ou gancho) e executa uma série de comandos arbitrária.

Existem diversos hooks, mas vamos focar no post-update, que roda no servidor após os novos arquivos terem sido recebidos pelo push.

Esse hook vai atualizar um repositório intermediário, através de um git pull e, depois, enviar as novas alterações pro nosso destino (pasta que serve os arquivos pra web) através do rsync.

Fluxo simplificado:

Usuário: alterações no projeto -> git add -> git commit -> git push
Servidor: git pull (atualiza um diretório com uma cópia do projeto) ~> rsync projeto/ seu_user@servidor_com_o_projeto:/var/www/meu_projeto.com.br/

Criando a rotina post-update

$ sudo chsh git -s $(which bash)
$ su git

No servidor, vá até o repositório (diretório .git) que você deseja sincronizar.

$ cd /var/www/git.meusite.com.br/projeto.git

Procure pelo diretório hooks e crie um arquivo post-update (sem extensão)

$ vim hooks/post-update

Coloque o seguinte código, que irá realizar o fluxo do servidor descrito anteriormente.

# no arquivo hooks/post-update
#!/bin/bash
$ cd ~/repositorio_intermediario || exit #vai para o diretório onde temos a cópia do repositório
$ GIT_DIR=.git/ # define o diretorio .git/ para ser utilizado no git pull abaixo
$ git pull origin master # pega as alterações que foram feitas no ultimo git push
$ rsync -avz . seu_usuario@servidor_com_o_projeto:/var/www/seu_site.com.br/ # envias os arquivos desse repositorio, agora com as ultimas alterações, pro projeto que você quer manter atualizado

Torne o script executável:

$ chmod a+x hooks/post-update

Vamos agora escolher um diretório para mantermos um repositório intermediário, que vai realizar a sincronização entre o que temos no local (nosso computador), e o que temos no servidor onde está nosso projeto.

Eu optei por uma pasta na home.

$ mkdir ~/repositorio_intermediario

Vamos manter ali uma cópia atualizada do repositório

$ git clone git@git.meusite.com.br:/var/www/git.meusite.com.br/projeto.git

Agora precisamos ajustar os acessos ssh para que possamos realizar as operações de git pull e rsync sem digitar senha.

Primeiro o git pull: você precisa ter permissão para dar git pull de um repositório que está no seu próprio servidor. Comece criando uma chave, se ainda não tiver, para o usuário git.

$ ssh-keygen

Depois, adicione essa chave (que fica salva em ~/.ssh/id_rsa_nomedachave.pub)

$ cat ~/.ssh/id_rsa_nomedachave.pub >> .ssh/authorized_keys

Agora, dê um git pull para salvar o host como confiável. Assim, você não vai precisar confirmar nas próximas vezes.

$ git pull origin master
# Você vai se deparar com uma mensagem do tipo:
The authenticity of host 'git.seusite.com.br (123.123.123.123)' can't be established.
ECDSA key fingerprint is SHA256:ssdf98a7sdf9d8sfy8PxHEqmXH64lCxuwzmk.
Are you sure you want to continue connecting (yes/no)?
$ yes
Warning: Permanently added 'git.seusite.com.br' (ECDSA) to the list of known hosts.

O próximo passo é adicionar sua chave recém gerada também no servidor destino.

Você pode fazer isso com o comando:

$ cat ~/.ssh/id_rsa_nomedachave.pub | ssh seu_usuario@servidor_com_o_projeto 'cat >> ~/.ssh/authorized_keys'

Após isso, faça uma conexão teste para salvar o host como confiável.

$ ssh seu_usuario@servidor_com_o_projeto
$ yes

Agora, já pode retornar o shell do usuário git (que foi alterado para bash) para o git-shell

$ su usuario_padrao
$ sudo chsh git -s $(which git-shell)

Pronto! Agora, no seu computador, faça um commit de teste.

$ git clone git@git.meusite.com.br:/var/www/git.meusite.com.br/projeto.git && cd projeto/
$ echo "commit sincronizado!" > teste_commit.txt
$ git add . && git commit -m "teste de commit sincronizado" && git push origin master

Verifique um output no estilo:

Enumerating objects: 5, done.
Counting objects: 100% (5/5), done.
Delta compression using up to 4 threads
Compressing objects: 100% (3/3), done.
Writing objects: 100% (3/3), 1.75 KiB | 1.75 MiB/s, done.
Total 3 (delta 2), reused 0 (delta 0)
remote: From git.meusite.com.br:/var/www/git.meusite.com.br/projeto
remote: * branch master -> FETCH_HEAD
remote: 3771408..ad441b7 master -> origin/master
remote: Updating 3771408..ad441b7
remote: Fast-forward
remote: index.html | 54 +++++++++++++++++++++++++++++++++++++++++++++++++++---
remote: 1 file changed, 51 insertions(+), 3 deletions(-)
remote: sending incremental file list
remote: ./
remote: index.html
remote: .git/
remote: .git/FETCH_HEAD
remote: .git/ORIG_HEAD
remote: .git/index
remote: .git/logs/HEAD
remote: .git/logs/refs/heads/master
remote: .git/logs/refs/remotes/origin/master
remote: .git/objects/
remote: .git/objects/35/
remote: .git/objects/35/55daa3f5521385e5f0997b6d14f3830ffeb224
remote: .git/objects/ad/
remote: .git/objects/ad/441b77095e381c77187c0ae49f794d423d1c27
remote: .git/objects/d1/
remote: .git/objects/d1/327b972ff30b300a199a1e18adef9ec5fd1750
remote: .git/refs/heads/
remote: .git/refs/heads/master
remote: .git/refs/remotes/origin/
remote: .git/refs/remotes/origin/master
remote:
remote: sent 19,587 bytes received 651 bytes 3,679.64 bytes/sec
remote: total size is 400,545 speedup is 19.79
To git.meusite.com.br:/var/www/git.meusite.com.br/projeto.git
3771408..ad441b7 master -> master

Feito! Vá tomar uma ceva.


Restaurando uma instalação Ubuntu após deletar arquivos do sistema

Digamos que você tenha deletado o diretório /etc da sua instalação Ubuntu. oque fazer?

De acordo com as primeiras páginas em qualquer mecanismo de busca, restaurar um backup.

Felizmente o wizard de instalação do Ubuntu consegue identificar uma instalação corrompida e agir de forma a restaurar os arquivos necessários.

Os passos abaixo funcionam para uma instalação com um único usuário.

Com exceção de alguns programas que não foram recuperados, consegui todos os arquivos do diretório /home de volta!

Prepare um pendrive usando um ISO da versão do Ubuntu corrompida, utilizando Rufus ou outro software ISO to USB stick.

O processo é bem tranquilo e existe um passo a passo no site do Ubuntu. Eu usei a versão em windows pois é o OS da outra máquina que tenho disponível. Existem também versões para Ubuntu e macOS.

Certifique-se de que o instalador está rodando em modo UEFI

Com o pendrive conectado, reinicie o computador e entre no modo BIOS. No meu samsung, basta apertar F2 enquanto o computador liga.

Precisei fazer duas alterações aqui para que o computador reconhecesse o instalador:

Salve as configurações e reinicie o computador.

Instale na mesma partição da versão corrompida.

Siga os passos da instalação, escolhendo a versão que você deseja (instalação mínima ou com softwares adicionais). Na tela Installation Type, se a opção Reinstall Ubuntu estiver disponível, você pode utilizá-la e seguir os passos normalmente. Isto indica que os arquivos deletados não impediram o wizzard de detectar o OS instalado.

Caso ela não esteja disponível, escolha Something else.

Escolhendo opção something else no wizzard
Escolhendo opção something else no wizard.

Na próxima tela, certifique-se de escolher a mesma partição utilizada na instalação anterior (a que foi corrompida).

Na opção Use as: coloque Ext4 journaling file system.

Não marque o checkbox Format the partition.

O seu mount point deve ser a raiz da partição (diretório /).

Escolhendo a mesma partição da instalação antiga.
Escolhendo a mesma partição da instalação antiga.

Prossiga com a instalação e certifique-se de ler as informações apresentadas.

Defina o mesmo usuário e senha utilizado anteriormente.

Você será apresentado com uma tela para definir o novo usuário do sistema. Coloque o mesmo usuário, nome de máquina e senha utilizados na instalação corrompida.

Verifique que seus arquivos ainda existem.

Após a conclusão, verifique se seus arquivos estão no estado anterior. Boa sorte!


Alterando a porta padrão do ssh.

BOTS BOTS BOTS. A internet é dos bots. E eles estão sodomizando sua porta 22.

Para ter noção da quantidade de acessos que um servidor recebe, use o comando lastb

$ sudo lastb

Verifique uma listagem de acessos do tipo:

pi ssh:notty 193.253.116.163 Thu Apr 1 11:52 - 11:52 (00:00)
pi ssh:notty 193.253.116.163 Thu Apr 1 11:52 - 11:52 (00:00)
user ssh:notty 194.165.16.69 Thu Apr 1 11:52 - 11:52 (00:00)
user ssh:notty 194.165.16.69 Thu Apr 1 11:52 - 11:52 (00:00)
admin ssh:notty 194.165.16.68 Thu Apr 1 11:51 - 11:51 (00:00)
admin ssh:notty 194.165.16.67 Thu Apr 1 11:51 - 11:51 (00:00)
admin ssh:notty 194.165.16.67 Thu Apr 1 11:51 - 11:51 (00:00)
support ssh:notty 45.227.254.10 Thu Apr 1 09:27 - 09:27 (00:00)
support ssh:notty 45.227.254.10 Thu Apr 1 09:27 - 09:27 (00:00)
admin ssh:notty 45.135.232.165 Thu Apr 1 08:48 - 08:48 (00:00)
admin ssh:notty 45.135.232.165 Thu Apr 1 08:48 - 08:48 (00:00)
admin ssh:notty 45.135.232.165 Thu Apr 1 08:48 - 08:48 (00:00)
admin ssh:notty 45.135.232.165 Thu Apr 1 08:48 - 08:48 (00:00)
admin ssh:notty 45.135.232.165 Thu Apr 1 08:48 - 08:48 (00:00)
admin ssh:notty 45.135.232.165 Thu Apr 1 08:48 - 08:48 (00:00)
root ssh:notty 193.95.24.114 Thu Apr 1 07:23 - 07:23 (00:00)
root ssh:notty 193.95.24.114 Thu Apr 1 07:23 - 07:23 (00:00)
root ssh:notty 193.95.24.114 Thu Apr 1 07:23 - 07:23 (00:00)

Esse código faz uma leitura do arquivo (no debian) /var/log/btemp, onde são salvos os logins falhos no sistema.

A forma padrão de reduzir o número de tentativas é alterando a porta utilizada no ssh. Você pode, em teoria, utilizar qualquer porta, mas algumas são reservadas pelo sistema, então o ideal é chutar um número acima de 1024.

Primeiro, verifique se a porta que você escolheu está em uso:

$ ss -an | grep 66622

Um resultado vazio indica que a porta não está em uso. Compare, por exemplo, com as portas 22, 80, 3306 ...

Estando livre, vamos liberar o acesso a porta pelo firewall com o ufw.

$ sudo ufw allow 66622/tcp

Agora, vamos ajustar as configurações do OpenSSH.

$ sudo vim /etc/ssh/sshd_config

Procure pela linha que referencia a porta 22, que deve estar comentada

# Port 22

Remova o comentário e adicione a porta em questão

Port 66622

Reinicie o ssh:

$ sudo systemctl restart ssh

Eu recomendo verificar pela sua máquina antes de encerrar a conexão atual:

# no seu computador
$ nmap -p 66622 seusite.com.br
# output deve incluir
PORT STATE SERVICE
66622/tcp open unknown
$ ssh seuuser@seusite.com.br -p 66622 # verifique que você consegue realizar o login normalmente

Pronto! Os acessos pela porta 22 devem receber um aviso de conexão recusada. Você pode testar:

#no seu computador
$ ssh t22@seusite.com.br
# output do tipo
ssh: connect to host seusite.com.br port 22: Connection refused
$ ssh t66622@seusite.com.br -p 66622 # entre com uma senha errada propositalmente
Permission denied, please try again.

Verifique os logs no servidor:

$ sudo lastb -R | head
t66622 ssh:notty Wed Apr 7 21:27 - 21:27 (00:00)
t66622 ssh:notty Wed Apr 7 21:27 - 21:27 (00:00)
ftp ssh:notty Wed Apr 7 18:31 - 18:31 (00:00)
default ssh:notty Wed Apr 7 18:31 - 18:31 (00:00)

Apenas as tentativas na porta correta!

Ajustando o uso do git no servidor.

Caso você utilize seu servidor como git, terá que ajustar o remote dos repositórios clonados:

# no seu computador, repositório com o remote no servidor que você alterou a porta do ssh
$ cd ~/caminho/onde/dei/git/clone
$ vim .git/config

Busque pela entrada [remote "origin"] e altere a url para:

url = ssh://git@git.seusite.com.br:66622/var/www/git.seusite.com.br/seurepo.git

Agora você pode usar o git normalmente ::)


Habilitando acesso SSH no Windows 10.

Porque a escolha de OS nem sempre é sua.

Quem tem mais de um computador em casa vai se deparar com várias situações onde se faz necessário compartilhar arquivos e acessar programas ou serviços de uma máquina quando estiver usando a outra.

Ao invés de usar pendrive ou enviar os dados pela internet, isso pode ser feito de forma rápida pela rede do roteador.

No Windows

Comece iniciando o PowerShell com WINDOWS + X e depois Windows PowerShell (Admin).

Realize a instalação do servidor ssh.

PS> Add-WindowsCapability -Online -Name OpenSSH.Server*

Verifique a instalação com:

PS> Get-WindowsCapability -Online | ? Name -like 'OpenSSH.Server*'

O output desejado deve conter State : Installed.

Verifique também o status do agente.

PS> Get-Service -Name *ssh*

A coluna Status vai mostrá-los como Stopped.

Você deve ativá-los com:

PS> Start-Service sshd
PS> Start-Service 'ssh-agent'

Caso perceber um erro do tipo

Start-Service : O serviço 'OpenSSH Authentication Agent (ssh-agent)' não pode ser iniciado devido ao seguinte erro:
Não é possível iniciar o serviço ssh-agent no computador '.'.

Você pode corrigí-lo com:

PS> Set-Service ssh-agent -StartupType Manual
PS> Start-Service 'ssh-agent'

Opcional: ative-os automaticamente ao ligar o computador:

PS> Set-Service -Name sshd -StartupType 'Automatic'
PS> Set-Service -Name ssh-agent -StartupType 'Automatic'

Liberar o tráfego de entrada na porta 22.

  1. liberar todo o tráfego de entrada, não recomendado

    PS> netsh advfirewall firewall add rule name=SSHD service dir=in action=allow protocol=TCP localport=22
  2. liberar apenas tráfego de um IP específico, por ex. 192.168.0.103, recomendado

    PS> netsh advfirewall firewall add rule name="deny ssh except" dir=in action=block protocol=TCP localport=22 remoteip=1.1.1.1-192.168.0.102,192.168.0.104-255.255.255.255

Pronto! Por padrão, o login é feito através de senha, e o shell utilizado é o cmd.exe

Alterar o shell para PowerShell.

PS> New-ItemProperty -Path "HKLM:\SOFTWARE\OpenSSH" -Name DefaultShell -Value "C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe" -PropertyType String -Force

Habilitar autenticação por chaves.

Para habilitar o acesso via chave (ssh-keygen), copie o conteúdo do id_rsa.pub do cliente para C:\winuser\admin.ssh\authorized_keys

Depois, no arquivo sshd_config, ajuste a diretiva referente a login com chave publica.

Descomente a linha:

PS> notepad.exe $env:PROGRAMDATA\ssh\sshd_config
PubkeyAuthentication yes

Isso deve bastar se o usuário que você estiver logando no windows não for admin.

Caso for um usuário admin, você tem duas escolhas:

  1. Remover o mecanismo de segurança para usuários admin, acessando o arquivo sshd_config.

    Comente as linhas:

    PS> notepad.exe $env:PROGRAMDATA\ssh\sshd_config
    # Match Group Administrators
    # AuthorizedKeysFile __PROGRAMDATA__/ssh/administrators_authorized_keys
  2. Copiar o conteúdo do arquivo authorized_keys para um arquivo administrators_authorized_keys e ajuste suas permissões

    Esse é o arquivo definido na diretiva AuthorizedKeysFile para o grupo Administrators

    cp C:\winuser\.ssh\authorized_keys $env:PROGRAMDATA\ssh\administrators_authorized_keys
    # o código abaixo equivale a um chmod 600 no linux
    $acl = Get-Acl C:\ProgramData\ssh\administrators_authorized_keys
    $acl.SetAccessRuleProtection($true, $false)
    $administratorsRule = New-Object system.security.accesscontrol.filesystemaccessrule("Administrators","FullControl","Allow")
    $systemRule = New-Object system.security.accesscontrol.filesystemaccessrule("SYSTEM","FullControl","Allow")
    $acl.SetAccessRule($administratorsRule)
    $acl.SetAccessRule($systemRule)
    $acl | Set-Acl

Com o acesso ao PowerShell e a autenticação por chaves, podemos copiar arquivos entre os dois sistemas utilizando o programa scp.

scp arquivo.file linuxuser@192.168.0.103:~/files/

Liberando acesso SSH na sua máquina Ubuntu

No Ubuntu, para que uma outra máquina consiga se conectar, você precisa ter instalado o openssh-server.

$ sudo apt install openssh-server

A porta 22 também vem fechada por padrão. Crie uma excessão utilizando o ufw.

Decida entre liberar acesso a um IP específico.

$ sudo ufw allow from 192.168.0.105 to any port ssh

Ou um intervalo de IPs.

$ sudo ufw allow from 192.168.0.0/24 to any port ssh

Recarregue suas definições de firewall.

$ sudo ufw reload

Limpeza

Após realizar as operações desejadas, você pode desfazer as alterações no firewall do windows:

PS> netsh advfirewall firewall delete rule name="deny ssh except" dir=in
PS> netsh advfirewall firewall add rule name="deny ssh" dir=in action=block protocol=TCP localport=22

E também as alterações feitas no firewall do Ubuntu:

$ sudo ufw delete allow from 192.168.0.105 to any port ssh
$ sudo ufw delete allow from 192.168.0.0/24 to any port ssh