Qual é a maneira mais segura de obter privilégios de root: sudo, su ou login?

119

Eu gostaria de ter a conta root em segurança, mesmo que meu usuário sem privilégios esteja comprometido.

No Ubuntu, você só pode usar o sudo por "motivos de segurança" por padrão. No entanto, não tenho certeza se é mais seguro do que apenas usar o login em um console no modo de texto. Há muitas coisas que podem dar errado se um invasor puder executar o código como meu usuário normal. Por exemplo, adicionando aliases, adicionando coisas ao meu PATH, configurando os keyloggers LD_PRELOAD e X11 só para mencionar alguns. A única vantagem que posso ver é o tempo limite, então nunca esqueço de sair.

Eu tenho as mesmas dúvidas sobre o su, mas não tem limite de tempo. Algumas operações (especialmente o redirecionamento de IO) são mais convenientes com o su, mas isso parece pior para a segurança.

O login em um console no modo de texto parece ser o mais seguro. Como é iniciado pelo init, se um invasor puder controlar PATH ou LD_PRELOAD, ele já é root. Os eventos de pressionamento de tecla não podem ser interceptados por programas executados no X. Eu não sei se programas rodando em X podem interceptar [ctrl] + [alt] + [f1] (e abrir uma janela de tela cheia que se parece com um console) ou é seguro como [ctrl] + [alt] + [del] no Windows. Além disso, o único problema que vejo é a falta de tempo limite.

Então, estou sentindo falta de algo? Por que os caras do Ubuntu decidiram permitir apenas o sudo? O que posso fazer para melhorar a segurança de qualquer um dos métodos?

E o SSH? Tradicionalmente, o root não pode efetuar login através do SSH. Mas usando a lógica acima, isso não seria a coisa mais segura a fazer:

  • permitir root por meio do SSH
  • mudar para o modo de texto
  • faça login como root
  • ssh para a outra máquina
  • logar como root?
por stribika 04.03.2011 / 18:02

8 respostas

104

A segurança é sempre sobre fazer concessões. Assim como o servidor proverbial que está em um local seguro, desconectado, no fundo do oceano, root seria mais seguro se não houvesse nenhuma maneira de acessá-lo.

Os ataques LD_PRELOAD e PATH, como aqueles que você descreve, supõem que já existe um invasor com acesso à sua conta ou, pelo menos, aos seus dotfiles. O Sudo não protege muito bem disso - se eles têm sua senha, afinal, não é necessário tentar enganá-lo para mais tarde ... eles podem usar apenas sudo agora .

É importante considerar o que o Sudo foi projetado originalmente: delegação de comandos específicos (como aqueles para gerenciar impressoras) para "sub-administradores" (talvez alunos de graduação em um laboratório) sem dar raiz completamente. Usar o sudo para fazer tudo é o uso mais comum que vejo agora, mas não é necessariamente o problema que o programa deveria resolver (daí a sintaxe de arquivo de configuração ridiculamente complicada).

Mas, sudo-for-root irrestrito faz resolver outro problema de segurança: gerenciamento de senhas de raiz. Em muitas organizações, elas tendem a ser passadas como doces, escritas em quadros brancos e deixadas para sempre. Isso deixa uma grande vulnerabilidade, já que revogar ou alterar o acesso torna-se um grande número de produção. Mesmo manter o controle de qual máquina tem qual senha é um desafio - e muito menos rastrear quem sabe qual delas.

Lembre-se de que a maioria dos "crimes cibernéticos" vem de dentro. Com a situação da senha de root descrita, é difícil rastrear quem fez o quê - algo que o sudo com o log remoto lida muito bem.

No seu sistema em casa, acho que é mais uma questão da conveniência de não precisar lembrar de duas senhas. É provável que muitas pessoas estivessem simplesmente configurando-as para serem as mesmas - ou pior, configurando-as para serem as mesmas inicialmente e depois deixando-as fora de sincronia, deixando a senha de root para apodrecer.

Usar senhas em tudo para SSH é perigoso, já que os daemons ssh trojan com senhas de sniffing são colocados em algo em algo como 90% dos comprometimentos de sistemas do mundo real que eu vi. É muito melhor usar chaves SSH, e isso também pode ser um sistema viável para acesso remoto à raiz.

Mas o problema agora é que você mudou do gerenciamento de senhas para o gerenciamento de chaves, e as chaves ssh não são muito gerenciáveis. Não há como restringir cópias, e se alguém fizer uma cópia, terá todas as tentativas que deseja para forçar a frase secreta. Você pode fazer uma política dizendo que as chaves devem ser armazenadas em dispositivos removíveis e montadas somente quando necessário, mas não há como aplicá-las - e agora você introduziu a possibilidade de um dispositivo removível ser perdido ou roubado.

A maior segurança será obtida através de chaves únicas ou tokens criptográficos baseados em tempo / contador. Isso pode ser feito em software, mas o hardware resistente a violações é ainda melhor. No mundo do código aberto, há WiKiD , YubiKey , ou LinOTP e, claro, há também o peso pesado proprietário RSA SecurID . Se você está em uma organização de médio a grande porte, ou mesmo em uma organização pequena preocupada com a segurança, recomendo enfaticamente que você analise uma dessas abordagens para acesso administrativo.

É provavelmente um exagero para o lar, no entanto, onde você não tem os problemas de gerenciamento, desde que siga práticas de segurança sensatas.

    
por 04.03.2011 / 19:20
29

Esta é uma questão muito complexa. mattdm já cobriu muitos pontos .

Entre su e sudo, quando você considera um único usuário, su é um pouco mais seguro, pois um invasor que encontrou sua senha não pode obter privilégios de root imediatamente. Mas tudo o que é preciso é que o invasor encontre um buraco na raiz local (relativamente incomum) ou instale um trojan e espere que você execute o su.

O Sudo tem vantagens até mesmo em um login de console quando há vários usuários. Por exemplo, se um sistema estiver configurado com logs remotos invioláveis, você sempre poderá descobrir quem executou o sudo pela última vez (ou cuja conta foi comprometida), mas não sabe quem digitou a senha raiz no console.

Eu suspeito que a decisão do Ubuntu foi em parte no interesse da simplicidade (apenas uma senha para lembrar) e em parte no interesse de segurança e facilidade de distribuição de credenciais em máquinas compartilhadas (negócios ou família).

O Linux não possui uma chave de atenção segura ou outra interface de usuário segura para autenticação. Até onde eu sei, o OpenBSD não tem nenhum. Se você está preocupado com o acesso root, você pode desativar o acesso root de um sistema em funcionamento: se você quer ser root, você precisa digitar algo no prompt do bootloader. Isso obviamente não é adequado para todos os casos de uso. (O securelevel do * BSD funciona assim: em um nível de alta segurança, há coisas que você não pode fazer sem reinicializar, como diminuindo o nível de segurança ou acessando dispositivos brutos montados diretamente.)

Restringir as maneiras pelas quais alguém pode se tornar root nem sempre é um ganho de segurança. Lembre-se do terceiro membro da tríade de segurança : confidencialidade , integridade , disponibilidade . Bloquear-se fora do seu sistema pode impedir que você responda a um incidente.

    
por 04.03.2011 / 21:04
9

Os designers da distribuição segura do OpenWall GNU / * / Linux também expressaram opiniões críticas sobre su (para se tornar root) e sudo . Você pode estar interessado em ler este tópico:

... infelizmente su e sudo são subtis mas fundamentalmente falho.

Além de discutir as falhas de su e outras coisas, o Solar Designer também segmenta um motivo específico para usar su :

Yes, it used to be common sysadmin wisdom to "su root" rather than login as root. Those few who, when asked, could actually come up with a valid reason for this preference would refer to the better accountability achieved with this approach. Yes, this really is a good reason in favor of this approach. But it's also the only one. ...(read more)

Em sua distro, eles "se livraram completamente dos programas-raiz da SUID no padrão instalar " (ou seja, incluindo su ; e eles não usam recursos para isso):

For servers, I think people need to reconsider and, in most cases, disallow invocation of su and sudo by the users. There's no added security from the old "login as non-root, then su or sudo to root" sysadmin "wisdom", as compared to logging in as non-root and as root directly (two separate sessions). On the contrary, the latter approach is the only correct one, from a security standpoint:

http://www.openwall.com/lists/owl-users/2004/10/20/6

(For accountability of multiple sysadmins, the system needs to support having multiple root-privileged accounts, like Owl does.)

(For desktops with X, this gets trickier.)

You also absolutely have to deal with...

BTW, eles deviam substituir sulogin por msulogin para permitir a configuração com várias contas raiz: msulogin permite digitar o nome do usuário também quando entrar no modo de usuário único (e preservar a "responsabilidade") (essa informação vem de esta discussão em russo ).

    
por 05.03.2011 / 19:47
4

Você parece estar assumindo que usar sudo sempre preserva variáveis de ambiente, mas nem sempre é esse o caso. Aqui está um trecho da sudo manpage:

There are two distinct ways to deal with environment variables. By default, the env_reset sudoers option is enabled. This causes commands to be executed with a minimal environment containing TERM, PATH, HOME, SHELL, LOGNAME, USER and USERNAME in addition to variables from the invoking process permitted by the env_check and env_keep sudoers options. There is effectively a whitelist for environment variables.

If, however, the env_reset option is disabled in sudoers, any variables not explicitly denied by the env_check and env_delete options are inherited from the invoking process. In this case, env_check and env_delete behave like a blacklist. Since it is not possible to blacklist all potentially dangerous environment variables, use of the default env_reset behavior is encouraged.

In all cases, environment variables with a value beginning with () are removed as they could be interpreted as bash functions. The list of environment variables that sudo allows or denies is contained in the output of sudo -V when run as root.

Portanto, se env_reset estiver habilitado (o padrão), um invasor não poderá substituir seu PATH ou outras variáveis de ambiente (a menos que você as adicione especificamente a uma lista de variáveis que deve ser preservada).

    
por 04.03.2011 / 18:41
4

A abordagem mais segura é o login ssh usando (pelo menos) 2048 chaves longas (com o login com senha desativado) usando um dispositivo físico para armazenar a chave.

    
por 04.03.2011 / 19:13
3

Eu só quero adicionar algo um pouco fora do tópico. (para o tópico um marque '/ bin / su -' aqui depois)

Acho que a "segurança" acima também deve estar vinculada a os dados reais que queremos proteger.

Vai e deve ser diferente se quisermos garantir: my_data, my_company_data, my_company_network.

Normalmente, se falo de segurança, também falo de "segurança de dados" e backup. Também podemos adicionar sistemas tolerantes a falhas e afins.

Perante isto, penso que a segurança como um todo é um equilíbrio entre a usabilidade, a "segurança de dados" e o esforço necessário para implementar um sistema seguro.

O alvo do Ubuntu era, e ainda é, o usuário final: o Sudo é o padrão.

O Fedora é a versão gratuita do RedHat, que por sua vez é mais orientada para servidores: O Sudo costumava ser desativado.

Para as outras distribuições, não tenho informações diretas.

Eu estou usando agora, principalmente, fedora. E como um usuário de estilo antigo eu nunca digitei 'su'. Mas eu posso digitar "/ bin / su -" em um tempo muito curto, mesmo que eu não esteja exatamente um datilógrafo. A variável PATH não deve ser um problema (eu digito o caminho). Além disso, o "-" (menos), em princípio, deve remover minhas variáveis de ambiente do usuário e carregar apenas as raízes. isto é, evitando alguns problemas extras possíveis. Provavelmente também o LS_PRELOAD.

Para o resto, acho que o @mattdm foi muito preciso.

Mas vamos colocá-lo na caixa correta. Suponha que um kit inteligente de script tenha acesso aos meus dados. O que diabos você acha que ele vai fazer com isso?  - Publicar minhas fotos? minha?  - Tentando descobrir o nome da minha namorada e dizer a ela que eu visito sites pornôs?

Na foto de usuário único, as duas situações mais graves são:  - O garoto excluir todos os meus dados: por diversão ou por engano  - O garoto usa minha máquina para criar um novo ataque a alguma outra entidade.    Ou metas semelhantes.

Para o primeiro caso, eu mencionei acima, colocando melhor os esforços em um backup do que na segurança da rede. Sim, você está salvo. Quero dizer, um acidente de hardware é não tão diferente.

O segundo caso é mais sutil. Mas há sinais sobre essas atividades. Em qualquer caso, você pode fazer o possível, mas eu não iria configurar meu PC em casa ser protegido de ataques terroristas!

Vou pular os outros cenários.

felicidades F

    
por 08.03.2011 / 22:38
2

Se a preocupação for que uma conta de usuário comprometida possa ser usada para capturar a senha usada para sudo ou su , use uma senha única para sudo e su .

Você pode forçar o uso de chaves para usuários remotos, mas isso pode não ser aprovado para fins de conformidade. Pode ser mais eficaz configurar uma caixa de gateway SSH que requer autenticação de dois fatores e, em seguida, permitir o uso de chaves a partir daí. Aqui está o documento sobre essa configuração: Proteja sua implantação SSH com a autenticação de dois fatores WiKID .

    
por 07.03.2011 / 18:03
0

Você também pode dar uma olhada em privacyIDEA , que não oferece apenas a possibilidade de usar OTP para fazer login na máquina (ou para fazer su / sudo), mas também pode fazer OTP offline.

Além disso, é capaz de gerenciar suas chaves SSH. Ou seja Se você tiver muitas máquinas e vários usuários root, todas as chaves SSH serão armazenadas centralmente. Assim, é fácil "revogar" / excluir uma chave SSH, se a chave não puder mais ser confiável.

Claro que existem tarefas organizacionais e fluxos de trabalho para proteger o sistema.

    
por 28.05.2015 / 11:44