Uma abordagem consistente e segura para contas sem senha com SSH

12

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 rootcomo 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 -dpois 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 -lpois 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 suou 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 -dpelos mesmos motivos. Não podemos usar passwd -u, pois apenas reclama que isso levaria ao que passwd -dfaz.

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, sudoe 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.

Pavel Šimerda
fonte
Use uma configuração PAM personalizada para acesso local sem senha e faça o mesmo para logons sudo e SSH.
0xC0000022L

Respostas:

5

Requisitos para os quais vou oferecer soluções, como pontos de bala:

  1. Login no console raiz sem senha
  2. Login remoto raiz sem senha de usuários pré-autorizados
  3. Login remoto sem senha para contas especificadas de usuários pré-autorizados
  4. Login remoto sem senha para qualquer conta de usuários pré-autorizados

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/securettyarquivo 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/logineu tenho o seguinte conjunto padrão de linhas para autenticação (as que começam com a palavra-chave auth):

auth       optional   pam_faildelay.so  delay=3000000
auth [success=ok new_authtok_reqd=ok ignore=ignore user_unknown=bad default=die] pam_securetty.so
auth       requisite  pam_nologin.so

@include common-auth
auth       optional   pam_group.so

O common-autharquivo de inclusão mencionado contém as seguintes linhas relevantes:

auth    [success=1 default=ignore]      pam_unix.so nullok_secure
auth    requisite                       pam_deny.so
auth    required                        pam_permit.so
auth    optional                        pam_cap.so

O common-autharquivo 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.solinha 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 authlinha levemente, é possível definir uma regra que permita um login raiz sem uma senha de um dispositivo tty especificado em /etc/securetty. O success=okparâmetro precisa ser alterado para que okseja substituído pelo número de authlinhas a serem puladas no caso de uma correspondência bem-sucedida. Na situação mostrada aqui, esse número é 3, que pula para a auth ... pam_permit.solinha:

auth [success=3 new_authtok_reqd=ok ignore=ignore user_unknown=bad default=die] pam_securetty.so

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_keysarquivo 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_keysarquivo 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_keysarquivo do novo usuário . O que não é tão óbvio é que essa abordagem só está disponível quando UsePAM 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". (Se UsePAM Noestiver 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_keysa 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).

roaima
fonte
Vou ter que examinar o número 1 com mais cuidado e testá-lo. Parece muito interessante, mesmo que ainda exija uma senha (forte) configurada. O número 3 não está completo, pois atualmente um usuário recém-criado está bloqueado por padrão também a partir do login SSH. Eu realmente não pedi o ponto 4, mas parece muito interessante de qualquer maneira e talvez eu possa usar esse método.
Pavel Šimerda 22/03/2015
A senha forte para root é necessária, mas nunca usada. Presumi que você soubesse implementar o # 3; entre em contato se precisar de mais detalhes. Nos sistemas (Debian), é possível transferir para uma nova conta que ainda não tenha uma senha definida, desde que o .ssh/authorized_keysarquivo contenha a chave pública relevante. Isso ajuda?
roaima 22/03/2015
Eu acho que preciso de uma maneira agradável e padrão de recuperar o comportamento que você vê no Debian, ou seja, que uma conta recém-criada seja bloqueada apenas para autenticação de senha e não para a chave pública.
Pavel Šimerda 22/03/2015
Para a conta de usuário de teste que criei para confirmar a declaração ssh no meu comentário anterior, eu vejo um único !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.
roaima 22/03/2015
1
Isso é interessante, isso realmente não é tão óbvio, pelo menos, obrigado.
Pavel Šimerda
1

Parece que você deseja contas de usuário reais (não raiz) com chaves ssh e NOPASSWDacesso completo via sudo(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 é executado sudo -sou ~/.bash_profileapenas contém esse comando.

Sudo

Inclua cada usuário no sudogrupo UNIX (por exemplo usermod -a -G sudo USERNAME, embora os sistemas mais antigos tenham maneiras menos intuitivas de fazer isso; na pior das hipóteses, você edita /etc/groupsdiretamente).

Em /etc/sudoersou /etc/sudoers.d/local, você deseja uma linha como esta:

%sudo    ALL=(ALL:ALL) NOPASSWD: ALL

Se você deseja acesso automático à raiz, adicione-o ao perfil do usuário. Pois bash, isso seria ~/.bash_profile:

sudo -s

Isso permitirá que você veja quem está logado (tente whoou last) 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 justo bob::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/shadowe 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:

openssl passwd -1 -salt SALT

(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 literalmente SALTcomo sal!)

SSH

Sua sshconfiguração de daemon vive em /etc/sshd_configou /etc/ssh/sshd_config. Para segurança adequada, recomendo que inclua estas linhas:

PermitRootLogin no
PermitEmptyPasswords no

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 sshterem 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

ssh-keygen -t rsa -b 4096 -f $HOME/.ssh/id_rsa -o -a 100 -C "Bob Roberts on his laptop"

Isso produz uma chave privada em $HOME/.ssh/id_rsae 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/.sshdeve estar no modo 700, por exemplo mkdir -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 passwdno 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_profileprecisei fornecer senhas. As iniciais tinham duas linhas na parte inferior: passwde, em seguida, mv ~/.bash_profile.real ~/.bash_profilepara 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_keysarquivo 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_keysarquivo do usuário . Se você tiver uma violação de segurança, terá logs mostrando quem efetuou login.

Adam Katz
fonte
A parte sobre sudo erra a questão, pois era exclusivamente sobre novos logins, e não sobre troca de usuários. Alterou a questão para torná-la mais clara. A parte sobre o login sem senha exibe exatamente o mesmo comportamento errado passwd -dda pergunta, permitindo sualternar 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.
Pavel Šimerda
Supus que você adicionasse o usuário e depois restringisse o usuário.
23815 Adam