Como fazer com que as chaves compartilhadas .ssh / allowed_keys e sudo funcionem juntos?

15

Eu configurei o .ssh / allowed_keys e sou capaz de fazer login com o novo "usuário" usando a chave pub / private ... Também adicionei "user" à lista de sudoers ... o problema que tenho agora é quando Eu tento executar um comando sudo, algo simples como:

$ sudo cd /root

ele solicitará minha senha, que eu insiro, mas não funciona (estou usando a senha da chave privada que defini)

Além disso, desabilitei a senha do usuário usando

$ passwd -l user

o que estou perdendo?

Em algum lugar minhas observações iniciais estão sendo mal compreendidas ...

Estou tentando proteger meu sistema ... o objetivo final é usar chaves públicas / privadas para fazer logins versus autenticação simples de senha. Eu descobri como configurar tudo isso através do arquivo allowed_keys.

Além disso, evitarei logins de servidor por meio da conta raiz. Mas antes de fazer isso, preciso que o sudo trabalhe para um segundo usuário (o usuário com o qual entrarei no sistema o tempo todo).

Para este segundo usuário, quero impedir logins regulares de senhas e forçar apenas logins de pub / chave privada, se não bloquear o usuário através de "passwd -l user ... então, se não usar uma chave, ainda posso entre no servidor com uma senha regular.

Porém, mais importante , preciso que o sudo funcione com uma configuração de pub / chave privada com um usuário cuja senha seja desativada.


Edit: OK, acho que entendi (a solução):

1) Ajustei / etc / ssh / sshd_config e configurei PasswordAuthentication no Isso evitará logins de senha ssh (certifique-se de ter uma configuração de chave pública / privada funcionando antes de fazer isso

2) Ajustei a lista de sudoers visudoe adicionei

root      ALL=(ALL) ALL
dimas     ALL=(ALL) NOPASSWD: ALL

3) root é a única conta de usuário que terá uma senha, estou testando com duas contas de usuário "dimas" e "sherry" que não possuem uma senha definida (as senhas estão em branco passwd -d user)

O acima mencionado impede essencialmente que todos façam login no sistema com senhas (uma chave pública / privada deve ser configurada).

Além disso, os usuários da lista de sudoers têm habilidades de administrador. Eles também podem supara contas diferentes. Então, basicamente "dimas" pode sudo su sherry, no entanto, "dimas NÃO pode fazer su sherry. Da mesma forma, qualquer usuário que NÃO esteja na lista de sudoers NÃO pode fazer su userou sudo su user.

NOTA O procedimento acima funciona, mas é considerado uma segurança insuficiente. Qualquer script capaz de acessar código como usuários "dimas" ou "sherry" poderá executar o sudo para obter acesso root. Um bug no ssh que permite que usuários remotos efetuem login, apesar das configurações, uma execução remota de código em algo como o Firefox ou qualquer outra falha que permita a execução de códigos indesejados, já que o usuário poderá executar como root. O Sudo sempre deve exigir uma senha ou você também pode fazer login como root em vez de outro usuário.

farinspace
fonte

Respostas:

10

sshe sudonão têm nada a ver um com o outro. A configuração de um sshmétodo de autenticação não serve para nada sudo. sudonão vai entender uma sshsenha.

passwd -ldestina-se a bloquear a conta de um usuário, para que ele não possa mais se autenticar por senha. É exatamente o oposto do que você deseja, que permite que o usuário se autentique sem uma senha.

Eu acho que o que você quer é a NOPASSWDopção no seu sudoersarquivo .

(PS, não há nenhuma razão para estar executando um cdcomando com sudo. cdNão propagar para processos pai, por isso, logo que as sudosaídas, você está de volta onde você começou.)

Editar: Você continua dizendo que deseja bloquear a senha da conta e deseja que o sudo entenda as chaves públicas / privadas. Desculpe, o sudo não usa as teclas ssh. Não é ssh. Se você não deseja que os usuários possam fazer login com suas senhas, acho que a resposta é desativar a autenticação por senha ssh , não bloquear a conta. Em seguida, você pode reter uma senha para os usuários, que eles podem usar para sudo após o login via ssh authoredkeys.

coneslayer
fonte
ok, mas o fato de o usuário não ter senha via: passwd -l user ... faz com que o comando sudo não funcione?
farinspace
@farinspace Sim, entendi melhor a pergunta e ampliei substancialmente meus comentários. passwd -lremove a senha no sentido de que a conta está BLOQUEADA - ou seja, nenhuma senha funcionará. Você deseja desativar a autenticação de senha no sudo.
coneslayer
como é essa lógica: desativar a senha no arquivo sudoers ainda seria seguro, pois o sistema é reforçado por meio dos logins de pub / chave privada ... e, novamente, apenas o administrador poderá adicionar usuários à lista de sudoers
farinspace
quando se utiliza uma chave privada é típico para definir uma senha para ele, ou é segura o suficiente para simplesmente não tê-lo criado e ignorar qualquer entrada de senha no login do servidor
farinspace
4
@coneslayer esta resposta não é 100% exata. Como você pode ver abaixo, o sudo pode ser configurado para respeitar a autenticação ssh.
Andre de Miranda
18

O que você quer fazer é possível, mas será necessária alguma experiência, pois você precisará compilar um módulo PAM chamado pam-ssh-agent-auth .

O processo é razoavelmente simples:

$ sudo aptitude install libssl-dev libpam0g-dev build-essential checkinstall
$ wget "http://downloads.sourceforge.net/project/pamsshagentauth/pam_ssh_agent_auth/v0.9.3/pam_ssh_agent_auth-0.9.3.tar.bz2"
$ tar -xjvf pam_ssh_agent_auth-0.9.3.tar.bz2
$ cd pam_ssh_agent_auth-0.9.3

$ ./configure --libexecdir=/lib/security --with-mantype=man

$ make
$ sudo checkinstall

A edição da configuração do sudo:

$ sudo visudo

Adicione o seguinte:

Defaults env_keep += SSH_AUTH_SOCK

Continue alterando as configurações do sudo PAM:

$ sudo vi /etc/pam.d/sudo

Adicione (logo acima das linhas @include):

**auth [success=2 default=ignore] pam_ssh_agent_auth.so file=~/.ssh/authorized_keys**
@include common-auth
@include common-account
Andre de Miranda
fonte
4
Esta deve ser a resposta aceita
Christopher Monsanto
11
Estas instruções (particularmente as /etc/pam.d/sudoinstruções) estão desatualizadas para as versões atuais do Ubuntu. Forneci instruções atualizadas na minha resposta.
Chris Escolha
4

A resposta de Andre de Miranda fornece uma boa solução usando pam_ssh_agent_auth , mas as peças estão desatualizadas. Particularmente as /etc/pam.d/sudoinstruções ao usar muitas versões atuais do Linux.

Se você estiver executando o Ubuntu 12.04 com precisão, simplifiquei o processo fornecendo uma compilação pam_ssh_agent_auth a partir de um ppa: ppa: cpick / pam-ssh-agent-auth .

Você pode instalar o pacote executando:

sudo add-apt-repository ppa:cpick/pam-ssh-agent-auth
sudo apt-get install pam-ssh-agent-auth

Após a instalação, se você quiser usar este módulo PAM com o sudo, terá que definir as configurações e a configuração do PAM, no Ubuntu 12.04, você precisará fazer isso criando os dois arquivos a seguir:

/etc/sudoers.d/pam-ssh-agent-auth:

Defaults    env_keep+="SSH_AUTH_SOCK"

/etc/pam.d/sudo:

ent#%PAM-1.0

auth       required   pam_env.so readenv=1 user_readenv=0
auth       required   pam_env.so readenv=1 envfile=/etc/default/locale user_readenv=0
auth       sufficient pam_ssh_agent_auth.so file=/etc/security/authorized_keys
@include common-auth
@include common-account
@include common-session-noninteractive

Se você estiver usando chef, o processo acima pode ser automatizado com meu livro de receitas, encontrado em um dos dois locais a seguir:
https://github.com/cpick/pam-ssh-agent-auth
http: //community.opscode .com / livros de culinária / pam-ssh-agent-auth .

O filesdiretório do livro de receitas contém os arquivos /etc/pam.d/sudoe /etc/sudoers.d/pam-ssh-agent-authdescritos acima, que funcionam com o Ubuntu 12.04 preciso e devem ser um ponto de partida útil ao usar outras versões / distribuições.

Chris Pick
fonte
-1

A única maneira que sei ignorar a inserção de uma senha é desativando-a no seu sudoersarquivo.

Algo assim dará roote todos os membros de acesso wheel total sem senha:

root    ALL=(ALL)   NOPASSWD: ALL
%wheel  ALL=(ALL)   NOPASSWD: ALL

Isso absolutamente não é recomendado , no entanto. Se você tiver um comando específico para este servidor executar, conceda a eles acesso apenas a esse comando. Ou, melhor ainda, encontre uma maneira diferente de realizar o que você deseja fazer que não exija uma brecha na segurança.

Jack M.
fonte
não me importo de usar a senha, o problema parece ser depois que eu desabilito a senha do usuário via: passwd -l user ... Ainda consigo fazer login no sistema através da chave pub / private (a chave privada possui uma senha segura) , quando eu faço um sudo, ele solicita uma senha, mas essa não é a senha da chave privada que parece, onde está essa senha definida se a desativou para o usuário (eu preferiria evitar manter uma senha no sistema e na chave privada)
farinspace 15/07/10
"onde esta senha é definida se você a desativou para o usuário?" Lugar algum. Não existe uma senha que você possa digitar que funcione, porque você bloqueou a conta.
coneslayer
Você precisaria reativar a conta no sistema remoto e, em seguida, definir a senha. De qualquer forma, você certamente deve manter a senha nas duas máquinas. Se não por outro motivo, a não ser logins locais em caso de falha.
Jack M.