Linux
Roteador Linux - Parte 3 - Usuários, Segurança e Firewall
Esta é a terceira parte de uma série de artigos descrevendo como construir seu próprio roteador Linux.
- Parte 1: Configuração Inicial
- Parte 2: Rede e Internet
- Parte 4: Podman e Unbound
- Parte 5: Wifi
- Parte 6: Nextcloud e Jellyfin
Nas primeiras e segundas partes, instalamos o sistema operacional, configuramos a rede e configuramos o Mac Mini para funcionar como um roteador.
Nesta parte, vamos aumentar a segurança criando usuários, alterando a autenticação SSH e reforçando a configuração do firewall.
EAA AirVenture Oshkosh 2013 Parede de fogo
Índice
Usuários
Vamos criar os usuários esperados. Você pode criar qualquer usuário que tenha necessidade. No meu caso, preciso de dois. Um para atuar como usuário administrador chamado admin
e outro com o nome de git
para ter um repositório Git pessoal e privado.
1. Gerar Senha Hashed (opcional)
Este passo é opcional, pois a forma pretendida de autenticação no servidor é através de SSH usando ssh keys
, mas pode ser criada se você quiser que o console solicite inserir uma senha ao usar sudo
ou autenticar localmente.
Crie uma senha para o usuário admin
. A senha para o usuário git
não é necessária, pois será autenticado usando uma chave ssh
.
mkpasswd --method=SHA-512
Senha: #digite a senha (hackme00)
$6$ZeLsWXraGkrm9IDL$Y0eTIK4lQm8D0Kj7tSVzdTJ/VbPKea4ZPf0YaJR68Uz4MWCbG1EJp2YBOfWHNSZprZpjpbUvCIozbkr8yPNM0.
2. Chaves SSH
Gere suas chaves SSH privadas e publicas ou use um par de chaves que você já tenha. Por exemplo, se você possuir uma conta no Github, poderá usar as chaves geradas quando você criou uma nova chave SSHH.
Realize esse procedimento em seu computador local, não no servidor.
ssh-keygen -t ed25519 -C "[email protected]" -f ~/.ssh/router-admin
Generating public/private ed25519 key pair.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /root/.ssh/router-admin
Your public key has been saved in /root/.ssh/router-admin.pub
The key fingerprint is...
Copie o conteúdo das chaves SSH geradas:
cat ~/.ssh/router-admin.pub
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC... [email protected]
Tenha ciência que manter as chave privada de seu roteador pode acarretar em riscos de segurança. Se você perder a chave privada, você não poderá mais acessar o servidor. Você precisa armazenar essas chaves em local seguro e não as compartilhar com ninguém.
Repita o processo para cada usuário que desejar criar. No meu caso, repeti o processo para o usuário git
. Se quiser, você pode usar o mesmo par de chaves para vários usuários, mas eu considero isso um risco a segurança.
3. Criar `users.nix` em `/etc/nixos/modules/`
Acesse o servidor via SSH usando através do usuário root
e a senha na parte 1 desse tutorial.
Crie seus usuários. Substitua as authorization.keys
pela chave gerada acima em ~/.ssh/router-admin.pub
.
/etc/nixos/modules/users.nix
{ config, pkgs, ... }: {
users.users = {
# Usuário Admin
admin = {
isNormalUser = true;
description = "Usuário Administrador";
home = "/home/admin"; # Diretório Home
extraGroups = [ "wheel" ]; # Adiciona o usuário ao grupo 'wheel' para acesso sudo
hashedPassword = "$6$rounds=656000$example$hashedpassword"; # Senha, opcional
openssh.authorizedKeys.keys = [
"ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC..." # Substitua pela chave pública real
];
};
# Usuário Git
git = {
isNormalUser = true;
description = "Usuário Git";
home = "/home/git";
openssh.authorizedKeys.keys = [
"ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC..." # Substitua pela chave pública real
];
};
};
# Habilitar sudo para usuários no grupo 'wheel'
security.sudo = {
enable = true;
wheelNeedsPassword = true; # Opcional: exigir senha ao usar sudo. Use false para permitir sudo sem senha ou se não definiu uma senha para o usuário admin.
};
}
Adicione o arquivo users.nix
ao configuration.nix
.
/etc/nixos/configuration.nix
...
imports = [
...
./modules/users.nix
];
...
4. Desabilitar autenticação por senha no SSH
Desabilitar a autenticação por senha aumenta a segurança, pois o usuário só poderá fazer login através de ssh keys
. Além disso, desabilitar a autenticação de root
é uma boa medida.
/etc/nixos/modules/services.nix
services = {
...
openssh = {
enable = true;
settings.PermitRootLogin = "no";
settings.PasswordAuthentication = false;
};
...
};
5. Atualize a configuração e tente fazer login
Reconstrua a configuração:
nixos-rebuild switch
Teste a autenticação ao servidor com o usuário admin
, usando a chave privada gerada para o mesmo nas etapas anteriores.
ssh -i ~/.ssh/router-admin [email protected]
6. Adicionar configuração de SSH
Para não precisar digitar toda a vez ssh -i ~/.ssh/router-admin [email protected]
para se autênticar, adicione ao arquivo ~/.ssh/config
:
Host macmini
Hostname 10.1.78.1
user admin
IdentityFile ~/.ssh/router-admin
Host macmini
Hostname 10.1.78.1
user admin
IdentityFile ~/.ssh/router-git
Teste o acesso SSH sem informar o arquivo de chaves.
ssh admin@macmini
7. Trancar conta root (opcional)
Desabilitar o login do usuário root
aumenta a segurança do servidor. Não é mandatório, mas é uma boa prática.
ATENÇÃO! Caso não tenha configurado uma senha para o usuário admin
, ao travar a senha do root
, não será mais possível se autenticar no servidor localmente, mas apenas via ssh
. Lembre-se de se certificar que o usuário admin
foi criado e seja parte do grupo wheel
para usar sudo
.
passwd -l root
Firewall
Configuramos nossos usuários e agora vamos aumentar a segurança do Firewall.
Até agora, o que fizemos no nosso firewall foi:
- Permitir todo o tráfego vindo da rede
lan
. - Bloquear qualquer tráfego vindo de
wan pppoe
,iot
eguest
, a não ser a internet
O servidor está bastante seguro dessa forma, mas um controle mais granular sobre o tráfego é desejável, pois garante que caso algum dos serviços configurados levante alguma porta adicional em nosso servidor, o tráfego para tal porta não será iniciado automaticamente. Com isso em mente, vamos atualizar nosso firewall para permitir apenas o tráfego necessário para nosso servidor. Para a rede lan
, guest
e iot
, habilitaremos apenas o serviço dhcp
. Para a rede lan
além do dhcp
vamos permitir acesso ao ssh
. Habilitaremos també o ssh
em ppp0
para permitir acesso remoto. Conforme habilitarmos novos serviços ao nosso servidor, abrimos novas portas. No NixOS, é bastante fácil configurar nosso firewall apenas atualizando o arquivo nftables.nft
.
/etc/nixos/modules/nftables.nft
table inet filter {
# Mantenha `flowtable` e demais regras do firewall.
# Adicione esses `chains` a tabela `inet filter`.
chain ssh_input {
iifname "lan" tcp dport 22 ct state { new, established } counter accept comment "Allow SSH on LAN"
iifname "ppp0" tcp dport 22 ct state { new, established } limit rate 10/minute burst 50 packets counter accept comment "Allow SSH traffic from ppp0 interface with rate limiting"
}
chain dhcp_input {
iifname { "lan", "guest", "iot" } udp dport 67 ct state { new, established } counter accept comment "Allow DHCP on LAN, Guest and IoT networks"
}
# Substituia todo o `chain input` por esses valores.
chain input {
type filter hook input priority filter; policy drop;
jump ssh_input
jump dhcp_input
iifname "ppp0" ct state { established, related } counter accept
iifname "ppp0" counter drop
}
# Deixe `chain output`, `chain forward` e `table ip nat` como estão.
...
}
Abrimos as portas para os serviços habilitados no nosso servidor. Nesse caso, ele permite apenas o serviço DHCP
para as redes lan
, guest
e iot
, e habilita ssh
tanto para lan
quanto para ppp0
. Você pode pensar que permitir tráfego SSH para o nosso servidor na internet é uma brecha de segurança, mas desde que aumentamos a segurança no SSH
bloqueando os usuários de fazer login com senha, estamos dentro dos padrões esperados de segurança. Além disso, para dificultar qualquer tentativa de força bruta para quebrar a criptografia de segurança do nosso servidor, configuramos uma regra para permitir apenas 10 novas conexões por minuto.
Recostruir a configuração
nixos-rebuild switch
Faça logout fazer login no servidor com o usuário admin
usando a chave privada gerada anteriormente.
Conclusão
Melhoramos a segurança de nosso servidor. Na próxima parte, instalaremos o podman
e configuraremos nosso Servidor DNS com Unbound.
- Parte 4: Podman e Unbound
keywords: macmini • roteador • linux • nixos • pppoe • unifi • ubiquiti • apple • vlan • tl-sg108e