Adoro a ideia de acessar servidores por meio de chaves, para não precisar digitar minha senha toda vez que ssh
entrar 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 sudo
comandos. 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
- Eu estou falando sobre o uso de
sudo
em uma sessão interativa do usuário aqui, não para serviços ou scripts administrativos - 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)
- Eu sei que
sudo
há 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 sudo
falta 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_config
para que você ainda precise ter uma chave para fazer login, posso usar uma senha mais simples apenas para sudo
facilitar a digitação? Essa é uma estratégia válida?
Acompanhamento 2
Se eu também tiver uma chave para fazer 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 à root
conta , ignorando o sudo
caminho. Qual deve ser a política para acessar a root
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.Respostas:
Você está desabilitando logons baseados em senha da maneira errada. Em vez de bloquear a conta de um usuário, defina o
PasswordAuthentication no
seu/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
NOPASSWD
no 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:
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.
O acesso raiz via ssh deve estar desativado. Período. Situado
PermitRootLogin no
no seusshd_config
.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 .
fonte
PasswordAuthentication
afetar todos os usuários, você sempre pode usar asMatch
seções em sshd_config para ativá-lo novamente para determinados usuários ou grupos.Geralmente, restrito o uso de
NOPASSWORD
comandos 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
NOPASSWORD
comandos 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.
fonte
Eu usaria isso apenas em duas circunstâncias:
Por padrão, a maioria das
sudo
configuraçõ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 atimestamp_timeout
configuração.A
sudo
falta de senha não é tão perigosa quanto asssh
chaves 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:
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!).
fonte
root
diretamente, 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?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/sudo
ou equivalente ao seu sistema: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:
fonte
sudo
comandos ou uso a mesma que foi usada para autenticação SSH?~/.ssh/authorized_keys
, poderia gerenciar outro arquivo,~/.ssh/authorized_keys_sudo
por exemplo, ou/etc/ssh/authorized_keys_sudo
.Desde que você perguntou, aqui está o meu conselho geral sobre como resolver o
sudo
problema.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) ALL
configuraçã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 osudo 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 osudo 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 no
configuraçã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
AllowUsers
configuraçã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/directory
abrir 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):
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.
fonte
sudo su -
variações,sudoreplay
pode ser útil.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
su
ousudo -s
obter um shell raiz. Você digitará sua senha uma vez e é isso.fonte
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.
fonte
Embora não responda estritamente à sua pergunta, outra opção pode ser definir um tempo mais longo
timestamp_timeout
para 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 :
Este post mostra alguns exemplos usando
visudo
para definir o tempo limite em minutos, tais como:Talvez este seja um meio termo feliz entre segurança e facilidade de uso?
fonte
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!
fonte