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.
Respostas:
Requisitos para os quais vou oferecer soluções, como pontos de bala:
Os exemplos a seguir são baseados no Debian, já que é o que eu tenho aqui para testar. No entanto, não vejo razão para que os princípios não possam ser aplicados a nenhuma distribuição (ou mesmo a qualquer derivado * ix baseado em PAM).
Login no console raiz sem senha
Eu acho que a maneira como abordaria isso seria alavancar o PAM e o
/etc/securetty
arquivo de configuração.Como pré-requisito, uma senha root "suficientemente segura" deve ser definida. Isso não é necessário para o login do console, mas existe para tornar irreais as tentativas de quebra de força bruta. Caso contrário, a conta é perfeitamente normal.
Em
/etc/pam.d/login
eu tenho o seguinte conjunto padrão de linhas para autenticação (as que começam com a palavra-chaveauth
):O
common-auth
arquivo de inclusão mencionado contém as seguintes linhas relevantes:O
common-auth
arquivo instrui o PAM a ignorar uma regra (a negação) se um "login UNIX" for bem-sucedido. Normalmente, isso significa uma correspondência dentro/etc/shadow
.A
auth ... pam_securetty.so
linha está configurada para impedir logins raiz, exceto nos dispositivos tty especificados em/etc/securetty
. (Este arquivo já inclui todos os dispositivos do console.)Modificando essa
auth
linha levemente, é possível definir uma regra que permita um login raiz sem uma senha de um dispositivo tty especificado em/etc/securetty
. Osuccess=ok
parâmetro precisa ser alterado para queok
seja substituído pelo número deauth
linhas a serem puladas no caso de uma correspondência bem-sucedida. Na situação mostrada aqui, esse número é3
, que pula para aauth ... pam_permit.so
linha:Login remoto raiz sem senha de usuários pré-autorizados
Essa é uma inclusão direta de chaves ssh para os usuários autorizados sendo adicionados ao
authorized_keys
arquivo raiz .Login remoto sem senha para contas especificadas de usuários pré-autorizados
Essa também é uma inclusão direta de chaves ssh para usuários autorizados sendo adicionados ao
.ssh/authorized_keys
arquivo do usuário apropriado e correspondente . (O usuário remoto típico chris deseja login sem senha no cenário de usuário local chris .)Observe que as contas podem permanecer no estado bloqueado padrão após a criação (ou seja, apenas
!
no campo de senha para/etc/shadow
), mas permitem o login baseado em chave SSH. Isso requer raiz para colocar a chave no.ssh/authorized_keys
arquivo do novo usuário . O que não é tão óbvio é que essa abordagem só está disponível quandoUsePAM Yes
é definida/etc/ssh/sshd_config
. O PAM se diferencia!
como "conta bloqueada por senha, mas outros métodos de acesso podem ser permitidos" e!...
"conta bloqueada. Período". (SeUsePAM No
estiver definido, o OpenSSH considera qualquer presença de!
iniciar o campo de senha para representar uma conta bloqueada.)Login remoto sem senha para qualquer conta de usuários pré-autorizados
Não estava totalmente claro para mim se você queria essa instalação ou não. Nomeadamente, certos usuários autorizados seriam capazes de efetuar login ssh sem uma senha em qualquer conta local.
Não posso testar esse cenário, mas acredito que isso possa ser alcançado com o OpenSSH 5.9 ou mais recente, que permite
authorized_keys
a definição de vários arquivos/etc/ssh/sshd_config
. Edite o arquivo de configuração para incluir um segundo arquivo chamado/etc/ssh/authorized_keys
. Adicione as chaves públicas dos usuários autorizados selecionados a esse arquivo, garantindo que as permissões sejam de propriedade do root e tenham acesso de gravação apenas pelo root (0644).fonte
.ssh/authorized_keys
arquivo contenha a chave pública relevante. Isso ajuda?!
no campo de senha em/etc/shadow
. De acordo com a página de manual, isso indica uma conta válida para a qual nenhuma senha pode corresponder.Parece que você deseja contas de usuário reais (não raiz) com chaves ssh e
NOPASSWD
acesso completo viasudo
(que está disponível por padrão na maioria das distribuições Linux atualmente e também é fácil de instalar manualmente). Você pode ter senhas em branco para cada conta de usuário (que não funcionará remotamente), então o usuário é executadosudo -s
ou~/.bash_profile
apenas contém esse comando.Sudo
Inclua cada usuário no
sudo
grupo UNIX (por exemplousermod -a -G sudo USERNAME
, embora os sistemas mais antigos tenham maneiras menos intuitivas de fazer isso; na pior das hipóteses, você edita/etc/groups
diretamente).Em
/etc/sudoers
ou/etc/sudoers.d/local
, você deseja uma linha como esta:Se você deseja acesso automático à raiz, adicione-o ao perfil do usuário. Pois
bash
, isso seria~/.bash_profile
:Isso permitirá que você veja quem está logado (tente
who
oulast
) e deixará os logins/var/log/auth.log
.Login sem senha
Em sistemas muito mais antigos, você pode simplesmente editar
/etc/passwd
(ou em sistemas um pouco mais antigos/etc/shadow
) e remover o hash, por exemplo,bob:$1$salt$hash:12345:0:99999:7:::
torna-se justobob::12345:0:99999:7:::
. Era tudo o que você precisava. Os sistemas modernos não gostam disso. Provavelmente, existem outras maneiras de fazer isso, mas o que acabei de verificar é o seguinte (fonte: Leo's Random Stuff ) :Abra
/etc/shadow
e observe uma conta com informações reais. Isso incluirá três elementos delimitados por cifrões ($
). Eles representam o mecanismo de hash, depois o sal e o hash. Observe o sal e execute o seguinte:(Ele usa o MD5 como o mecanismo de hash. É uma senha em branco, portanto você não deve se importar.) Quando a senha for solicitada, pressione enter. Salve essa sequência, incluindo os pontos finais, e cole-a após o primeiro dois pontos na linha do usuário
/etc/shadow
(isso deve substituir qualquer conteúdo preexistente entre o primeiro e o segundo ponto). (Por favor, não use literalmenteSALT
como sal!)SSH
Sua
ssh
configuração de daemon vive em/etc/sshd_config
ou/etc/ssh/sshd_config
. Para segurança adequada, recomendo que inclua estas linhas:Consulte o artigo Secure Secure Shell para obter medidas adicionais de segurança que você pode adicionar à sua configuração ssh para melhor protegê-la contra invasores sofisticados.
Agora, seus usuários não podem efetuar login por
ssh
terem senhas vazias (essa é uma medida de segurança necessária). Isso significa que eles podem efetuar login apenas com as teclas ssh.Cada usuário, para cada um de seus sistemas clientes, deve criar um par de chaves ssh, por exemplo
Isso produz uma chave privada em
$HOME/.ssh/id_rsa
e uma chave pública em$HOME/.ssh/id_rsa.pub
. Peça que esse usuário envie suas chaves públicas e as anexe às deste servidor$HOME/.ssh/authorized_keys
(observe que cada usuário$HOME/.ssh
deve estar no modo 700, por exemplomkdir -p ~user/.ssh && chmod 700 ~user/.ssh
).Os usuários que não desejam chaves ssh podem ser direcionados para o sistema físico. Lá, a senha em branco fará o logon, quando eles podem digitar
passwd
no shell e definir uma senha, permitindo acesso remoto.(Na verdade, eu usei essa técnica para dar às pessoas acesso a uma coleção de sistemas quando eu dirigia um departamento de TI. Isso forçou os usuários a usar chaves ssh e eu não
~/.bash_profile
precisei fornecer senhas. As iniciais tinham duas linhas na parte inferior:passwd
e, em seguida,mv ~/.bash_profile.real ~/.bash_profile
para que eles definam uma nova senha no primeiro login.)Riscos
Você está confiando plenamente em seus usuários. Não há nada que impeça um usuário de mexer com o
~/.ssh/authorized_keys
arquivo de outro usuário e, portanto, altere sua capacidade de revogar e auditar o acesso, mas isso é inevitável se você estiver fornecendo acesso root completo.Conclusão
Agora, cada usuário é membro do grupo sudo e tem acesso total sem senha a um shell raiz. Esses usuários não têm senhas para suas contas e podem efetuar login remotamente usando as teclas ssh.
Se você perder um de seus funcionários, poderá remover a conta dele. Se um dos laptops de seus funcionários for roubado, você poderá remover a chave ssh desse laptop do
authorized_keys
arquivo do usuário . Se você tiver uma violação de segurança, terá logs mostrando quem efetuou login.fonte
passwd -d
da pergunta, permitindosu
alternar para esse usuário sem senha. A seção de riscos descreve duas coisas (mexer com os dados de outros usuários e obter acesso root) cuja remoção é o ponto principal da questão. Portanto, enquanto seções individuais são bem escritas, isso não é de forma alguma uma resposta para a pergunta.