É possível configurar o `sudo 'sem senha em um servidor em nuvem?

58

Adoro a ideia de acessar servidores por meio de chaves, para não precisar digitar minha senha toda vez que sshentrar em uma caixa, até bloqueio a (não root) senha do usuário ( passwd -l username), para que seja impossível fazer login sem uma chave.

Mas tudo isso é interrompido se for necessário digitar a senha para os sudocomandos. Por isso, sou tentado a configurar sem senhasudo para alinhar as coisas com o login sem senha.

No entanto, eu continuo com a sensação de que isso pode sair pela culatra de alguma maneira inesperada, apenas parece inseguro. Existem ressalvas com essa configuração? Você recomendaria / não recomendaria fazer isso para uma conta de usuário em um servidor?

Esclarecimentos

  1. Eu estou falando sobre o uso de sudoem uma sessão interativa do usuário aqui, não para serviços ou scripts administrativos
  2. Estou falando sobre o uso de um servidor em nuvem (portanto, não tenho acesso local físico a uma máquina e só consigo efetuar logon remotamente)
  3. Eu sei que sudohá um tempo limite durante o qual não preciso digitar novamente minha senha. Mas meu show não é realmente sobre perder tempo extra para digitar fisicamente uma senha. Minha ideia, no entanto, era não ter que lidar com uma senha, porque presumo que:
    • Se eu precisar memorizá-lo, é muito provável que seja muito curto para ser seguro ou reutilizado
    • Se eu gerar uma senha longa e exclusiva para minha conta remota, terei que armazená-la em algum lugar (um programa local de gerenciamento de senhas ou um serviço em nuvem) e buscá-la sempre que desejar usar sudo. Eu esperava poder evitar isso.

Portanto, com essa pergunta, eu queria entender melhor os riscos, advertências e compensações de uma configuração possível em relação às outras.

Acompanhamento 1

Todas as respostas dizem que a sudofalta de senha é insegura, pois permite a escalada "fácil" de privilégios se minha conta de usuário pessoal for comprometida. Eu entendi aquilo. Por outro lado, se eu usar uma senha, incorremos em todos os riscos clássicos com senhas (sequência muito curta ou comum, repetida em diferentes serviços etc.). Mas acho que se eu desabilitar a autenticação de senha /etc/ssh/sshd_configpara que você ainda precise ter uma chave para fazer login, posso usar uma senha mais simples apenas para sudofacilitar a digitação? Essa é uma estratégia válida?

Acompanhamento 2

Se eu também tiver uma chave para fazer login como rootvia ssh, se alguém obtiver acesso ao meu computador e roubar minhas chaves (ainda assim elas ainda estão protegidas pela senha do chaveiro do SO!), É possível que tenha acesso direto à rootconta , ignorando o sudocaminho. Qual deve ser a política para acessar a rootconta?

Dmitry Pashkevich
fonte
2
Não recomendaria nada, porque muitas vezes existem maneiras de obter um shell como usuário (já que todos os serviços estão sujeitos a violação de segurança, mas geralmente são executados como usuário para evitar acesso total ao sistema), mas com uma senha para fazer login como root impede que pessoas não autorizadas obtenham acesso root. Se não houver, pensa que qualquer pessoa que tenha acesso à sua conta de usuário, de qualquer forma, tenha acesso total ao servidor. Definir uma senha pode não ser muito, mas ajuda.
piernov
Por favor, veja minhas perguntas seguintes
Dmitry Pashkevich
1
O sudo nunca deve ser sem senha. o root deve ser desabilitado do login remoto via SSH, a porta ssh não deve ser o padrão (para evitar os burros) e qualquer conta que precise de sudo deve ser limitada apenas aos poderes mínimos do sudo para o que for necessário (reinicie um serviço somente etc) e também possui senhas muito fortes.
SnakeDoc
@SnakeDoc Obrigado, esse é um tipo de resposta que eu estava esperando. Gostaria de escrever uma resposta detalhada? Fico feliz em aprender!
Dmitry Pashkevich
2
@EEAA é realmente muito fácil no linux. As únicas contas que deveriam ter senha no sudo seriam as contas do sistema nas quais não é possível efetuar login e, portanto, não é possível elevar a essa conta e usar essas permissões contra você. Defina um shell falso para a conta /etc/passwd, como nologin, não defina senha e defina sem senha no visudo. Se você fizer isso, verifique também se a configuração visudo é apenas para o que a conta do sistema absolutamente precisa, ou seja, bloqueie-a nos únicos comandos que ela deve executar.
SnakeDoc

Respostas:

48

Adoro a idéia de acessar servidores por meio de chaves, para não precisar digitar minha senha toda vez que coloco uma senha em uma caixa, bloqueio até a senha de meu usuário (não root) (passwd -l nome de usuário), tornando impossível faça login sem uma chave ... Você recomendaria / não recomendaria fazer isso para uma conta de usuário em um servidor?

Você está desabilitando logons baseados em senha da maneira errada. Em vez de bloquear a conta de um usuário, defina o PasswordAuthentication noseu /etc/ssh/sshd_config.

Com esse conjunto, a autenticação de senha é desativada para ssh, mas você ainda pode usar uma senha para sudo.

A única vez em que recomendo a configuração NOPASSWDno sudo é para contas de serviço, onde os processos precisam poder executar comandos via sudo programaticamente. Nessas circunstâncias, certifique-se de incluir na lista branca apenas os comandos específicos que a conta precisa executar. Para contas interativas, você deve sempre deixar as senhas ativadas.

Respostas às suas perguntas de acompanhamento:

Mas acho que se eu desabilitar a autenticação de senha no / etc / ssh / sshd_config para que você ainda precise ter uma chave para efetuar login, eu posso usar uma senha mais simples apenas para o sudo que é mais fácil de digitar? Essa é uma estratégia válida?

Sim esta correto. Eu ainda recomendo usar senhas de contas locais relativamente fortes, mas não ridiculamente fortes. ~ 8 caracteres gerados aleatoriamente são suficientes.

Se eu também tiver uma chave para efetuar login como root via ssh, se alguém obtiver acesso ao meu computador e roubar minhas chaves (ainda assim elas ainda estão protegidas pela senha do chaveiro do SO!), É possível que tenha acesso direto ao conta root, ignorando o caminho do sudo.

O acesso raiz via ssh deve estar desativado. Período. Situado PermitRootLogin nono seu sshd_config.

Qual deve ser a política para acessar a conta raiz então?

Você sempre deve ter um meio de obter acesso fora de banda ao console do seu servidor. Vários fornecedores de VPS fornecem isso, assim como fornecedores de hardware dedicado. Se o seu provedor não conceder acesso real ao console (por exemplo, EC2, por exemplo), você ainda poderá restaurar o acesso usando um processo como o descrito nesta resposta .

EEAA
fonte
2
+1 deve deixar senhas ...
Chris S
6
Marque com +1 a senha do sudo, na verdade, não existe para segurança (tanto quanto posso ver), mas mais como uma verificação idiota. Não ter lá pode causar estragos incalculáveis.
Boris, a Aranha
1
se você perder sua chave, estará pronto, a menos que você tenha uma porta dos fundos, mas o invasor também o fará. a única maneira de consertar uma chave perdida, se feita corretamente, seria sentar-se no próprio terminal, fisicamente. Se você precisar do tipo de proteção que as chaves ssh fornecem, você deve estar ciente das armadilhas e, simplesmente ... simplesmente não perca suas chaves.
SnakeDoc 10/03/2014
1
Um comentário sobre o seu último parágrafo e sobre a perda de acesso em geral para qualquer VPS ... alguns provedores de VPS realmente o ajudarão se você ficar bloqueado. Eu iniciei minha VM no modo de usuário único e fiz algumas coisas para mim quando me tranquei (isso acontece ... regra ruim de firewall, risos). Dependendo do seu host, eles podem cobrar pelo serviço; afinal, dedicando atenção especial a você. Além disso, alguns farão backup / snapshots por um preço pequeno ou, às vezes, de graça, o que pode valer a pena se você estiver prestes a cometer uma mudança grande e possivelmente perturbadora.
SnakeDoc
1
@DmitryPashkevich - em relação a PasswordAuthenticationafetar todos os usuários, você sempre pode usar as Matchseções em sshd_config para ativá-lo novamente para determinados usuários ou grupos.
precisa
11

Geralmente, restrito o uso de NOPASSWORDcomandos executados por um processo automatizado. É preferível ter uma conta de serviço para esses comandos e restringir o uso do sudo aos comandos necessários.

Permitindo NOPASSWORDcomandos gerais, permite que qualquer pessoa que tenha acesso ao seu ID do usuário execute qualquer comando. Isso pode resultar de um comprometimento de suas credenciais, mas pode ser tão simples quanto alguém sentado em sua mesa quando você se afasta por um segundo.

Acho que não preciso digitar minha senha com tanta frequência. Depois de digitar sua senha, você poderá executar vários comandos se não esperar muito tempo entre eles. O tempo limite é configurável.

BillThor
fonte
8

Eu usaria isso apenas em duas circunstâncias:

  • Quando é absolutamente necessário para um script automatizado que está sendo executado como um usuário específico
  • Para tarefas administrativas específicas (somente leitura, tarefas administrativas, não aquelas que executam ações para alterar o sistema) e somente para usuários específicos, é claro

Por padrão, a maioria das sudoconfigurações não solicitará novamente por um tempo na mesma sessão (se você abrir um novo shell que não tenha nenhum efeito). Você pode controlar esse comportamento até certo ponto com a timestamp_timeoutconfiguração.

A sudofalta de senha não é tão perigosa quanto as sshchaves sem senha , pois um invasor remoto precisa que suas credenciais cheguem em primeiro lugar, mas se elas chegaram de alguma forma comprometendo sua chave privada (ou se são fisicamente locais para você) e você se deixou logado e desbloqueado enquanto estava longe da máquina), a solicitação de senha é uma valiosa defesa extra entre eles e o acesso privilegiado.

Em relação ao acompanhamento 2:

Se eu também tiver uma chave para fazer login como root via ssh

Também é melhor evitar isso, exatamente pelo motivo que você descreve. Se uma conexão remota precisar ter acesso privilegiado, faça o login por meio de uma conta de serviço e dê a esse controle o suficiente para executar seu trabalho via sudo. É mais fácil configurar isso, é claro que muitos não se incomodam (o que funciona a seu favor, se você o fizer, pois há muitas frutas menores do que você para os atacantes passarem tempo!), Então tudo se resume ao compromisso de velhice entre segurança e conveniência (dica profissional: escolha segurança!).

David Spillett
fonte
Obrigado por abordar o meu acompanhamento # 2. Ainda estou confuso: tento evitar o login tão rootdiretamente, mas preciso de alguma maneira de acessar a conta, certo? Então, como faço isso então? Com uma senha, não chave ssh? Mas as chaves não são melhores que as senhas?
Dmitry Pashkevich
Você sempre pode efetuar login localmente como root, mas é recomendável que os logons diretos para root de hosts remotos (via ssh ou similar) sejam completamente desabilitados. Se você possui uma conta que pode se tornar root via sudo (com senha, é claro), nunca perde todo o acesso à conta.
precisa
7

Você pode ter o melhor dos dois mundos: autenticação SSH para logon e sudo. Se você integrar o módulo pam_ssh_agent_auth , poderá usar as chaves SSH para autenticar sem fornecer uma senha ao fazer o sudo.

Uso isso na produção há mais de cinco anos.

Para configurá-lo, instale o módulo PAM e adicione uma linha /etc/pam.d/sudoou equivalente ao seu sistema:

auth    sufficient     pam_ssh_agent_auth.so file=~/.ssh/authorized_keys

Se você fizer isso, proteja suas chaves no seu computador com uma senha. Dessa forma, alguém teria que invadir seu computador e roubar as chaves para entrar. Eles poderiam fazer isso retirando-os da memória enquanto estavam desbloqueados se tiverem acesso à sua conta, quebrando sua senha ou roubando sua senha. um keylogger ou ombro surfando enquanto você digita (olhe para trás!).

Você pode usar a mesma chave SSH que você faz para fazer login ou pode configurar uma chave separada que você adiciona ao seu agente apenas quando faz o sudo. Portanto, se você quiser ter um cuidado extra, você poderá manter um arquivo autorizado_keys separado que possui uma chave SSH separada que você adiciona ao seu agente apenas quando precisar do sudo:

auth    sufficient     pam_ssh_agent_auth.so file=~/.ssh/authorized_keys_sudo
obscurerichard
fonte
Uau, isso parece ótimo! Então, eu gero uma chave separada para executar sudocomandos ou uso a mesma que foi usada para autenticação SSH?
Dmitry Pashkevich
1
Isso é incrível. Eu votaria em você várias vezes, se pudesse.
nyuszika7h
Você pode usar a mesma chave que usa para autenticação SSH normal ou, para aumentar a segurança, pode adicionar temporariamente uma chave usada para processar ao seu agente de autenticação SSH. Isso exigiria que você especificasse um arquivo diferente de ~/.ssh/authorized_keys, poderia gerenciar outro arquivo, ~/.ssh/authorized_keys_sudopor exemplo, ou /etc/ssh/authorized_keys_sudo.
obscurerichard
6

Desde que você perguntou, aqui está o meu conselho geral sobre como resolver o sudoproblema.

O Sudo não foi projetado para fornecer mais segurança (embora possa, de alguma forma) ... mas sim fornecer uma boa trilha de auditoria de quem está fazendo o que no seu sistema com que privilégios.

Um Sudo configurado corretamente não usará a ALL=(ALL) ALLconfiguração, mas algo mais limitado ao que for especificamente necessário para o usuário. Por exemplo, se você precisar que um usuário possa fazer login e reiniciar um serviço bloqueado, provavelmente não precisará instalar um novo software ou desligar o servidor, alterar as regras de firewall etc.

Às vezes, é comum as pessoas usarem o sudo para se elevar à conta raiz, ou seja. sudo su -. Uma vez que eles fazem isso, você para de ver quem está fazendo o quê na conta raiz (a raiz pode ser acessada várias vezes simultaneamente). Às vezes, as pessoas também querem desativar o sudo su -comando. Mas, por motivos práticos, se você precisar de uma conta com privilégios de administrador para administração, pelo menos ter alguém emitindo o sudo su -comando registrará quem elevou para o root e quando.

Como protejo minhas caixas:

Mude a porta SSH para algo diferente do padrão. Isso é para evitar que os burros que procurem números de portas e se afastem até que entrem (ou não).

Proibir o login root no SSH usando a AllowRootLogin noconfiguração em seu sshd_config. Isso impede que alguém force brutalmente em sua conta root. Geralmente, é uma boa prática nunca permitir que alguém faça login diretamente na conta raiz / administrador por motivos de auditoria e segurança. Se você permitir o login root diretamente, não saberá quem efetuou o login, de quem eles obtiveram a senha etc. Mas, se alguém fizer login na conta de Jimmy, aumentará suas permissões para o root, você terá uma idéia melhor de onde iniciar seu pesquisa de auditoria (e quem é a conta a ser redefinida).

Permitir apenas usuários ao SSH que exijam o uso Use a AllowUsersconfiguração e explicitamente especifique quais contas precisam de acesso SSH. Por padrão, isso bloqueará todas as outras contas do SSH.

Edite Sudoers via visudo e permita apenas os comandos que o usuário precisa. Existem muitos guias detalhados sobre como fazer isso, então não detalharei aqui. Aqui está uma partida: http://ubuntuforums.org/showthread.php?t=1132821

A essência disso é impedir que uma conta comprometida ponha em risco sua máquina. ie se a conta de Sally for invadida, e Sally só puder usar o sudo para reiniciar o servidor da Web, o invasor poderá se divertir ao reiniciar o servidor da Web em um loop, mas pelo menos eles não poderão rm -rf /your/webserver/directoryabrir ou abrir todas as portas do firewall etc.

Configure boas regras de firewall que permitam apenas as portas necessárias para sua caixa operar. Geralmente você deseja largar tudo e permitir apenas explicitamente o que precisa. Há muitas tabelas de ips decentes e outros firewalls iniciam on-line, eis um que eu uso (é uma iniciação básica):

# Generated by iptables-save v1.4.7 on Mon Mar  3 17:55:02 2014
*filter
:INPUT DROP [4528:192078]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [39845:27914520]
-A INPUT -i lo -j ACCEPT
-A INPUT -p tcp -m tcp ! --tcp-flags FIN,SYN,RST,ACK SYN -m state --state NEW -j DROP
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p tcp -m tcp --dport 4254 -m state --state NEW -j ACCEPT
-A INPUT -p tcp -m tcp --dport 8080 -m state --state NEW -j ACCEPT
-A INPUT -p tcp -m tcp --dport 8443 -m state --state NEW -j ACCEPT
-A INPUT -p icmp -m icmp --icmp-type 8 -j ACCEPT
-A INPUT -p icmp -m icmp --icmp-type 11 -j ACCEPT
-A OUTPUT -o lo -j ACCEPT
COMMIT
# Completed on Mon Mar  3 17:55:02 2014

Também uma senha forte é a chave.Mesmo se você usar chaves SSH para seu acesso remoto, ainda precisará de uma senha para o uso do Sudo. Este é um caso em que o sudo pode fornecer mais segurança. Se alguém roubasse suas chaves ssh, elas ainda seriam impedidas de fazer algo significativo em sua caixa se ainda precisassem forçar com força a senha da sua conta a usar o sudo. As senhas não devem ser uma palavra, mas uma frase secreta. Pense em uma frase e use-a. Isso geralmente fornece algo com mais de 8 caracteres, fornecendo bastante entropia, mas também é mais fácil de lembrar do que uma senha aleatória. Obviamente, boas práticas de senha dizem usar uma senha aleatória gerada por máquina para enganar ferramentas de cracking como John the Ripper, que rasgará a maioria das frases e senhas. Não, alterar E com 3 não funciona, John também recebe essas permutações.

SnakeDoc
fonte
Obrigado por uma resposta abrangente! Definitivamente, preciso usar todos esses conselhos para proteger minhas caixas. Ainda aceitarei a resposta da EEAA, pois ela é um pouco mais específica do que estava perguntando.
Dmitry Pashkevich
1
@DmitryPashkevich, OK, EEAA tem uma resposta boa e adequada. Você me pediu para detalhar meu comentário acima, então eu fiz. Não se preocupe :)
SnakeDoc
Quanto a sudo su -variações, sudoreplaypode ser útil.
nyuszika7h
3

Em alguns casos, é necessário fazer isso. por exemplo, algumas APIs do hypervisor precisam de login sem senha e sem senha sudo. Mas você ainda pode restringir isso sem quebrar.

Pelo que você está tentando alcançar. Eu diria, acostume-se a digitar uma senha. A segurança é mais conveniente que a conveniência aqui. Além disso, se você realmente precisar de acesso root, poderá usá sudo-lo e ele armazenará em cache as credenciais por um tempo, de modo que, se você executar vários comandos sudo seguidos, solicitará a senha apenas pela primeira vez. Portanto, não é um inconveniente tão grande como você supõe.

Além disso, se você estiver digitando muitos comandos com privilégios de root e não quiser colocar o sudo na frente deles o tempo todo, poderá fazê- lo suou sudo -sobter um shell raiz. Você digitará sua senha uma vez e é isso.

Matt
fonte
2

Fui mordido pelo sudo sem senha uma vez. Era um script de shell, algum instalador que chamava sudo em meu nome , e não apenas o sudo ou um erro.

Criação de imagens digitando 'make' e o script executando a parte 'sudo make install' para você, sem definir ou exibir o caminho base, e o script sendo tão inovador em primeiro lugar que você não tem certeza de que eles sabem sobre / usr / local e então você começa a verificar / usr para modificações ...

Prometi nunca usar o NOPASSWD novamente e também alterei a configuração de tempo limite para 0.

aib
fonte
1

Embora não responda estritamente à sua pergunta, outra opção pode ser definir um tempo mais longo timestamp_timeoutpara que você não precise digitar sua senha com tanta frequência. Isso impedirá que qualquer pessoa obtenha privilégios de administrador, mas reduza seu aborrecimento.

Na página do manual sudoers :

timestamp_timeout

O número de minutos que pode decorrer antes do sudo solicitará uma senha novamente. O tempo limite pode incluir um componente fracionário se a granularidade minuto for insuficiente, por exemplo 2.5. O padrão é 5. Defina como 0 para sempre solicitar uma senha. Se definido como um valor menor que 0, o carimbo de hora do usuário nunca expirará. Isso pode ser usado para permitir que os usuários criem ou excluam seus próprios carimbos de hora através de "sudo -v" e "sudo -k", respectivamente.

Este post mostra alguns exemplos usando visudopara definir o tempo limite em minutos, tais como:

Defaults timestamp_timeout=60

Talvez este seja um meio termo feliz entre segurança e facilidade de uso?

daveharris
fonte
Obrigado pela contribuição! Minha pergunta original era sobre nunca ter que usar (e lembre-se) de uma senha, pois você pode usar as teclas para ssh na máquina, e não sobre quantas vezes sou obrigado a inseri-la. Outras pessoas deixaram claro que isso é uma péssima idéia.
Dmitry Pashkevich
1

As outras respostas aqui são ótimas e abordam a maioria dos pontos importantes. Uma coisa que eu não vi mencionado é o fato de que qualquer tipo de autenticação que você faz ao fazer o login pode ser capturado por um invasor remoto que já estabeleceu uma posição na sua conta. Eles podem modificar seus arquivos de login do shell ou PATH para instalar um keylogger, para que tudo que você digitar, incluindo sua senha sudo, seja enviado a eles. Eles podem adicionar um binário sudo hackeado ao seu PATH para coletar sua senha. Eles podem seqüestrar a conexão do agente ssh de volta à sua máquina de conexão para derrotar o pam_ssh_agent_auth e tornar-se root assim que você se conectar. Portanto, em termos de segurança absoluta, não vejo diferença entre usar uma senha para sudo e não. É claro que o torna um ataque mais complicadoj,

Em resumo, acredito que a única maneira de impedir absolutamente que uma conta de usuário comprometida se torne raiz, se você tiver acesso ao sudo, é remover o acesso ao sudo de si mesmo ou nunca usá-lo. Se você não concordar, me avise, pois eu adoraria estar errado!

Ian Hinder
fonte