Devo admitir que gosto de servidores sem senhas em alguns casos. Um servidor típico é vulnerável a qualquer pessoa que tenha acesso físico a ele. Portanto, em alguns casos, é prático bloqueá-lo fisicamente e, desde então, confiar em qualquer acesso físico.
Conceitos Básicos
Em teoria, quando eu alcanço fisicamente esse servidor, devo ser capaz de executar tarefas de administração sem senha digitando simplesmente root
como o logon e não devo solicitar uma senha. O mesmo pode se aplicar às contas de usuário, mas não seria possível acessá-las fisicamente. Portanto, nenhuma senha do sistema é necessária para acesso local (ocasional).
Ao acessar o servidor remotamente, seja para administração ou para conta de usuário, espero sempre usar uma chave privada SSH. É muito fácil configurar uma chave SSH para uma conta recém-criada e, portanto, nenhuma senha do sistema é necessária para acesso remoto (regular).
# user=...
#
# useradd -m "$user"
# sudo -i -u "$user"
$ keyurl=...
$
$ mkdir -p .ssh
$ curl -o .ssh/authorized_keys "$keyurl"
A conclusão é que, em teoria, não teríamos neeed quaisquer senhas do sistema para casos de uso desse tipo. Portanto, a questão é: como configuramos o sistema e as contas de usuário para que isso aconteça de maneira consistente e segura.
Detalhes de acesso local
Como garantimos que a conta root possa ser acessada localmente sem uma senha? Acho que não podemos usá-lo, passwd -d
pois isso tornará o acesso root muito permissivo e um usuário sem privilégios poderá mudar para o root gratuitamente, o que está errado. Não podemos usar, passwd -l
pois isso nos impede de fazer login.
Observe que o acesso local é exclusivamente sobre o acesso usando o teclado local. Portanto, uma solução válida não deve permitir nenhuma troca de usuário (seja usando su
ou sudo
).
Detalhes de acesso remoto
Até recentemente, a solução acima funcionava, mas agora o SSH começou a verificar contas de usuário bloqueadas. Provavelmente não podemos usar passwd -d
pelos mesmos motivos. Não podemos usar passwd -u
, pois apenas reclama que isso levaria ao que passwd -d
faz.
Existe uma solução alternativa com senha fictícia para esta parte.
user=...
echo -ne "$user:`pwgen 16`\n" | chpasswd
Também pode ser possível desativar totalmente a verificação de conta bloqueada no SSH, mas seria melhor manter o suporte a contas bloqueadas e apenas poder desbloqueá-las.
Notas finais
O que me interessa é uma solução que permita que você faça login localmente na conta raiz e em todas as contas, incluindo a raiz remotamente, sem nenhuma senha. Por outro lado, uma solução não deve afetar a segurança, exceto de maneiras explicitamente descritas, especialmente não permitindo que usuários remotos tenham acesso à conta raiz ou à conta de outros usuários. A solução deve ser suficientemente robusta para não causar problemas de segurança indiretamente.
Uma resposta aceita e premiada pode ou não descrever a configuração detalhada de ferramentas individuais, mas deve conter os pontos principais para alcançar as metas estabelecidas. Note que este provavelmente não pode ser resolvido através do uso convencional de ferramentas como passwd
, ssh
, su
, sudo
e similares.
Mais ideias depois de ler as primeiras respostas
Apenas uma idéia - o acesso raiz local pode ser alcançado iniciando shells raiz em vez de processos de login. Mas ainda há a necessidade de bloquear apenas a autenticação por senha, não a autenticação por chave pública.