Vários administradores de sistema Linux trabalhando como root

40

Em nossa equipe, temos três administradores de sistema Linux experientes que precisam administrar algumas dezenas de servidores Debian. Anteriormente, todos trabalhamos como root usando a autenticação de chave pública SSH. Mas discutimos qual é a melhor prática para esse cenário e não conseguimos concordar com nada.

A chave pública SSH de todos é colocada em ~ root / .ssh / allowed_keys2

  • Vantagem: fácil de usar, o encaminhamento de agente SSH funciona com facilidade, pouca sobrecarga
  • Desvantagem: falta de auditoria (você nunca sabe qual "raiz" fez uma alteração), os acidentes são mais prováveis

Usando contas personalizadas e sudo

Dessa forma, entraríamos em contas personalizadas usando chaves públicas SSH e usaríamos o sudo para executar tarefas únicas com permissões de root . Além disso, poderíamos nos dar o grupo "adm" que nos permite exibir arquivos de log.

  • Vantagem: boa auditoria, o sudo nos impede de fazer coisas idiotas com muita facilidade
  • Desvantagem: o encaminhamento do agente SSH é um aborrecimento, pois quase nada pode ser feito como não raiz

Usando vários usuários do UID 0

Esta é uma proposta muito exclusiva de um dos administradores de sistema. Ele sugere criar três usuários no / etc / passwd, todos com UID 0, mas com nomes de login diferentes. Ele afirma que isso não é realmente proibido e permite que todos sejam UID 0, mas ainda possam auditar.

  • Vantagem: o encaminhamento de agente SSH funciona, a auditoria pode funcionar (não testada), sem problemas com o sudo
  • Desvantagem: parece bastante sujo - não foi possível encontrá-lo documentado em nenhum lugar como uma maneira permitida

O que você sugeriria?

Signum
fonte
2
Sobre a sua declaração "não foi possível encontrá-la documentada em nenhum lugar como um caminho permitido": consulte a -obandeira na useraddpágina de manual. Este sinalizador existe para permitir que vários usuários compartilhem o mesmo uid.
Jlliagre
6
Você pode explicar o que você quer dizer com "quebras de encaminhamento de agente SSH" na segunda opção? Usamos isso no meu trabalho e o encaminhamento de agente ssh funciona muito bem.
214 Patrick
4
Você deve fazer o ssh da sua conta não raiz, e não do sudo.
Random832
4
Outra consequência do método sudo: Você não pode mais SCP / FTP como root. Qualquer transferência de arquivo precisará primeiro ser movida para o diretório pessoal da pessoa e depois copiada no terminal. Esta é uma vantagem e uma desvantagem, dependendo da perspectiva.
User606723
11
Por que os sistemas do tipo fantoche / chef / ansioso não estão sendo considerados?
Alex Holst

Respostas:

64

A segunda opção é a melhor IMHO. Contas pessoais, acesso sudo. Desative completamente o acesso root via SSH. Temos algumas centenas de servidores e meia dúzia de administradores de sistema, é assim que fazemos.

Como o encaminhamento do agente é interrompido exatamente?

Além disso, se for tão complicado usar sudona frente de todas as tarefas, você poderá chamar um shell sudo com sudo -sou alternar para um shell raiz comsudo su -

thepearson
fonte
10
Em vez de desativar completamente o acesso root pelo SSH, recomendo que o acesso root exija chaves, criando uma chave com uma frase-chave muito forte e mantendo-a bloqueada apenas para uso emergencial. Se você tiver acesso permanente ao console, isso será menos útil, mas, se não tiver, pode ser muito útil.
EightBitTony
17
Eu recomendo desativar o login raiz sobre SSH por questões de segurança. Se você realmente precisar fazer login como root, faça login como usuário não root e su.
taz 21/05
+1 .. Eu iria além do que dizer "A segunda opção é a melhor". Eu seria a única opção razoável. As opções um e três diminuem bastante a segurança do sistema contra ataques e erros externos. Além disso, o nº 2 é como o sistema foi projetado para ser usado principalmente.
Ben Lee
2
Por favor, elabore sudo -s. Estou correto ao entender que sudo -inão há diferença em usar su -ou basicamente fazer login como root, além da entrada de log adicional em comparação com o login de raiz simples? Se isso for verdade, como e por que é melhor que o login root simples?
precisa saber é o seguinte
9

Com relação à 3ª estratégia sugerida, além da leitura das useradd -o -u userXXXopções recomendadas por @jlliagre, não estou familiarizado com a execução de vários usuários com o mesmo uid. (portanto, se você continuar com isso, eu estaria interessado em atualizar a postagem com quaisquer problemas (ou sucessos) que surjam ...)

Acho que minha primeira observação sobre a primeira opção "A chave pública SSH de todos é colocada em ~ root / .ssh / allowed_keys2", é que, a menos que você nunca trabalhe em outros sistemas;

  1. pelo menos uma parte do tempo , você terá que trabalhar com contas de usuário esudo

A segunda observação seria que, se você trabalha em sistemas que aspiram a HIPAA, conformidade com PCI-DSS ou coisas como CAPP e EAL, terá que contornar as questões do sudo porque;

  1. É um padrão do setor fornecer contas de usuário individuais não raiz, que podem ser auditadas, desativadas, expiradas, etc., geralmente usando algum banco de dados centralizado do usuário.

Tão; Usando contas personalizadas e sudo

É lamentável que, como administrador de sistemas, quase tudo que você precise fazer em uma máquina remota exija algumas permissões elevadas, no entanto, é irritante que a maioria das ferramentas e utilitários baseados em SSH sejam bloqueados enquanto você estiver sudo

Por isso, posso passar alguns truques que uso para contornar os aborrecimentos sudomencionados. O primeiro problema é que, se o login root for bloqueado PermitRootLogin=noou se você não tiver a raiz usando a chave ssh, isso tornará os arquivos SCP uma espécie de PITA.

Problema 1 : Você deseja scp arquivos do lado remoto, mas eles exigem acesso root, no entanto, você não pode efetuar login diretamente na caixa remota como root.

Solução chata : copie os arquivos para o diretório inicial, o chown e o scp.

ssh userXXX@remotesystem, sudo su -etc, cp /etc/somefilespara /home/userXXX/somefiles, chown -R userXXX /home/userXXX/somefilesuse scp para recuperar arquivos do controle remoto.

Muito chato mesmo.

Solução menos chata : o sftp suporta o -s sftp_serversinalizador, portanto, você pode fazer algo como o seguinte (se você configurou o sudo sem senha /etc/sudoers);

sftp  -s '/usr/bin/sudo /usr/libexec/openssh/sftp-server' \
userXXX@remotehost:/etc/resolv.conf 

(você também pode usar esse hack-around com sshfs, mas não tenho certeza se é recomendado ... ;-)

Se você não possui direitos sudo sem senha ou, por algum motivo configurado, o método acima está quebrado, posso sugerir mais um método de transferência de arquivos menos chato, para acessar arquivos raiz remotos.

Método Ninja de encaminhamento de porta :

Efetue login no host remoto, mas especifique que a porta remota 3022 (pode ser qualquer coisa livre e não reservada para administradores, ou seja,> 1024) deve ser encaminhada de volta para a porta 22 no lado local.

 [localuser@localmachine ~]$ ssh userXXX@remotehost -R 3022:localhost:22
Last login: Mon May 21 05:46:07 2012 from 123.123.123.123
------------------------------------------------------------------------
This is a private system; blah blah blah
------------------------------------------------------------------------

Faça root da maneira normal ...

-bash-3.2$ sudo su -
[root@remotehost ~]# 

Agora você pode scp os arquivos na outra direção, evitando a etapa chata de fazer uma cópia intermediária dos arquivos;

[root@remotehost ~]#  scp -o NoHostAuthenticationForLocalhost=yes \
 -P3022 /etc/resolv.conf localuser@localhost:~
localuser@localhost's password: 
resolv.conf                                 100%  
[root@remotehost ~]#  

 

 

Problema 2: Encaminhamento de agente SSH : Se você carregar o perfil raiz, por exemplo, especificando um shell de logon, as variáveis ​​de ambiente necessárias para o encaminhamento de agente SSH, como SSH_AUTH_SOCKsão redefinidas, portanto, o encaminhamento do agente SSH é "quebrado" sudo su -.

Resposta meio assada :

Qualquer coisa que carregue corretamente um shell raiz, redefinirá o ambiente corretamente, no entanto, há uma pequena solução alternativa que você pode usar quando precisar de ambas as permissões de root E a capacidade de usar o Agente SSH, AO MESMO TEMPO

Isso atinge um tipo de perfil de quimera, que realmente não deve ser usado, porque é um hack desagradável , mas é útil quando você precisa SCP arquivos do host remoto como root, para algum outro host remoto.

De qualquer forma, você pode permitir que seu usuário preserve suas variáveis ​​ENV, definindo o seguinte em sudoers;

 Defaults:userXXX    !env_reset

isso permite que você crie ambientes de login híbridos desagradáveis ​​como esse;

faça o login normalmente;

[localuser@localmachine ~]$ ssh userXXX@remotehost 
Last login: Mon May 21 12:33:12 2012 from 123.123.123.123
------------------------------------------------------------------------
This is a private system; blah blah blah
------------------------------------------------------------------------
-bash-3.2$ env | grep SSH_AUTH
SSH_AUTH_SOCK=/tmp/ssh-qwO715/agent.1971

crie um shell bash, que execute /root/.profilee /root/.bashrc. mas preservaSSH_AUTH_SOCK

-bash-3.2$ sudo -E bash -l

Portanto, este shell tem permissões de root e root $PATH(mas um diretório inicial com borked ...)

bash-3.2# id
uid=0(root) gid=0(root) groups=0(root),1(bin),2(daemon),3(sys),4(adm),6(disk),10(wheel) context=user_u:system_r:unconfined_t
bash-3.2# echo $PATH
/usr/kerberos/sbin:/usr/local/sbin:/usr/sbin:/sbin:/home/xtrabm/xtrabackup-manager:/usr/kerberos/bin:/opt/admin/bin:/usr/local/bin:/bin:/usr/bin:/opt/mx/bin

Mas você pode usar essa chamada para fazer coisas que exijam raiz sudo remota, mas também o acesso ao agente SSH assim;

bash-3.2# scp /root/.ssh/authorized_keys ssh-agent-user@some-other-remote-host:~
/root/.ssh/authorized_keys              100%  126     0.1KB/s   00:00    
bash-3.2# 
Tom H
fonte
11
Eu gosto dos hacks.
sjbotha
2

A 3ª opção parece ideal - mas você realmente experimentou para ver o que está acontecendo? Embora você possa ver os nomes de usuário adicionais na etapa de autenticação, qualquer pesquisa inversa retornará o mesmo valor.

Permitir o acesso ssh direto à raiz é uma má ideia, mesmo que suas máquinas não estejam conectadas à Internet / usem senhas fortes.

Normalmente eu uso 'su' em vez de sudo para acesso root.

symcbean
fonte
4
Adicionar vários usuários com o mesmo UID adiciona problemas. Quando os aplicativos procuram o nome de usuário para um número UID, eles podem procurar o nome de usuário errado. Os aplicativos executados no root podem pensar que estão executando como o usuário errado, e muitos erros estranhos começarão a aparecer (tentei uma vez).
213 Patrick
8
A terceira opção é apenas uma péssima idéia . Você está basicamente quebrando a relação 1: 1 entre UIDs e nomes de usuário, e literalmente tudo no unix espera que essa relação seja mantida. Só porque não há uma regra explícita para não fazer isso não significa que é uma boa ideia.
Shadur
Desculpe, mas a terceira opção é uma ideia horrível. Ter várias pessoas no UID 0 fazendo login é apenas pedir que os problemas sejam multiplicados. A opção número 2 é a única sã.
Doug
A terceira opção não merece tantos votos negativos. Não há nenhum comando no Unix que eu saiba que está confuso com esse truque, as pessoas podem estar, mas os comandos não devem se importar. É apenas um nome de login diferente, mas, assim que você estiver logado, o primeiro nome encontrado correspondente ao uid no banco de dados de senhas será usado. Apenas verifique se o nome de usuário real (aqui root) aparece primeiro lá.
Jlliagre
@Patrick Você viu isso na prática? Por mais que eu testei, os aplicativos escolhem o rootusuário se o rootusuário for o primeiro /etc/passwdcom o UID 0. Eu costumo concordar com o jlliagre. A única desvantagem que vejo é que cada usuário é um rootusuário e, às vezes, pode ser confuso entender quem fez o que.
Martin
2

Eu uso (1), mas por acaso digitei

rm -rf / tmp *

em um dia infeliz. Posso ver que é ruim o suficiente se você tiver mais do que alguns administradores.

(2) É provavelmente mais desenvolvido - e você pode se tornar um root completo através do sudo su -. Acidentes ainda são possíveis.

(3) Eu não tocaria com um poste de barcaça. Usei-o no Suns, para ter uma conta raiz não-barebone-sh (se bem me lembro), mas nunca foi robusta - além disso, duvido que seja muito auditável.

Forma de vida alienígena
fonte
2

Definitivamente responda 2.

  1. Significa que você está permitindo o acesso SSH como root. Se esta máquina estiver de alguma forma voltada para o público, essa é apenas uma péssima idéia; Quando eu executei o SSH na porta 22, meu VPS recebeu várias tentativas a cada hora para se autenticar como root. Eu tinha um IDS básico configurado para registrar e banir IPs que faziam várias tentativas com falha, mas eles continuavam chegando. Felizmente, eu havia desativado o acesso SSH como usuário raiz assim que tinha minha própria conta e sudo configurados. Além disso, você praticamente não tem trilha de auditoria fazendo isso.

  2. Fornece acesso root como e quando necessário. Sim, você quase não possui privilégios como usuário padrão, mas isso é exatamente o que você deseja; se uma conta for comprometida, você deseja que ela seja limitada em suas habilidades. Você deseja que qualquer acesso de superusuário exija uma reinserção de senha. Além disso, o acesso ao sudo pode ser controlado através de grupos de usuários e restrito a comandos específicos, se você desejar, oferecendo mais controle sobre quem tem acesso a quê. Além disso, os comandos executados como sudo podem ser registrados, portanto, fornece uma trilha de auditoria muito melhor se as coisas derem errado. Ah, e não apenas execute "sudo su -" assim que você fizer login. Essa é uma prática terrível.

  3. A ideia do seu administrador de sistemas é ruim. E ele deveria se sentir mal. Não, as máquinas * nix provavelmente não impedirão você de fazer isso, mas o sistema de arquivos e praticamente todos os aplicativos esperam que cada usuário tenha um UID exclusivo. Se você começar a seguir esse caminho, posso garantir que você terá problemas. Talvez não imediatamente, mas eventualmente. Por exemplo, apesar de exibir bons nomes amigáveis, arquivos e diretórios usam números UID para designar seus proprietários; se você se deparar com um programa que tem um problema com UIDs duplicados no final da linha, não pode simplesmente alterar um UID no arquivo de senha mais tarde, sem ter que fazer uma limpeza manual séria no sistema de arquivos.

sudoé o caminho a seguir. Isso pode causar problemas adicionais com a execução de comandos como root, mas fornece uma caixa mais segura, tanto em termos de acesso quanto de auditoria.

Rohaq
fonte
1

Definitivamente, opção 2, mas use grupos para dar a cada usuário o máximo de controle possível, sem precisar usar o sudo. O sudo na frente de cada comando perde metade do benefício, porque você está sempre na zona de perigo. Se você tornar os diretórios relevantes graváveis ​​pelos administradores de sistema sem o sudo, retornará o sudo à exceção que faz com que todos se sintam mais seguros.

Julian
fonte
1

Antigamente, o sudo não existia. Como conseqüência, ter vários usuários do UID 0 foi a única alternativa disponível. Mas ainda não é tão bom, principalmente com o log baseado no UID para obter o nome de usuário.

Atualmente, o sudo é a única solução apropriada. Esqueça qualquer outra coisa.

Plop
fonte
0

Está documentado permitido de fato. Os departamentos do BSD têm sua conta de usuário por um longo tempo e os usuários do bashroot tendem a ser uma prática aceita em sistemas onde o csh é padrão (má prática aceita;)

rackandboneman
fonte
0

Talvez eu seja esquisito, mas o método (3) é o que me veio à mente primeiro também. Prós: você teria todos os nomes de usuários nos logs e saberia quem fez o que como root. Contras: cada um deles tem raízes o tempo todo, para que os erros possam ser catastróficos.

Gostaria de questionar por que todos os administradores precisam ter acesso root. Todos os três métodos que você propõe têm uma desvantagem distinta: uma vez que um administrador executa uma coisa sudo bash -lou outra sudo su -, você perde a capacidade de rastrear quem faz o que e depois disso, um erro pode ser catastrófico. Além disso, em caso de possível mau comportamento, isso pode acabar muito pior.

Em vez disso, você pode querer considerar outro caminho:

  • Crie seus usuários administradores como usuários regulares
  • Decida quem precisa fazer qual trabalho (gerenciamento de apache / gerenciamento de postfix etc.)
  • Adicione usuários a grupos relacionados (como adicionar "martin" a "postfix" e "mail", "amavis" se você o usar, etc.)
  • Corrigir permissões (chmod -R g + w postfix: postfix / etc / postfix)
  • forneça apenas poderes sudo relativos: (visudo -> deixe martin usar /etc/init.d/postfix, / usr / bin / postsuper etc.)

Dessa forma, martin seria capaz de lidar com segurança com o postfix e, em caso de erro ou mau comportamento, você perderia apenas o sistema postfix, não o servidor inteiro.

A mesma lógica pode ser aplicada a qualquer outro subsistema, como apache, mysql, etc.

Obviamente, isso é puramente teórico neste momento e pode ser difícil de configurar. Parece uma maneira melhor de ir embora. Pelo menos para mim. Se alguém tentar isso, informe-me como foi.

Tuncay Göncüoğlu
fonte
Devo acrescentar que lidar com conexões SSH é bastante básico nesse contexto. Qualquer que seja o método que você use, não permita logins raiz sobre SSH, permita que usuários individuais façam ssh com suas próprias credenciais e lide com sudo / nosudo / etc a partir daí.
Tuncay Göncüoğlu 30/11