Linux: configurado para sysadmin remoto

51

De vez em quando, recebo uma solicitação estranha para fornecer suporte remoto, solução de problemas e / ou ajuste de desempenho em sistemas Linux.

As empresas maiores geralmente já possuem procedimentos bem estabelecidos para fornecer acesso remoto a vendedores / fornecedores, e eu só preciso cumpri-los. (Por bem ou por mal.)

Por outro lado, pequenas empresas e indivíduos invariavelmente recorrem a mim para instruí-los com o que precisam fazer para me constituir. Normalmente, seus servidores estão conectados diretamente à Internet e as medidas de segurança existentes consistem nos padrões de qualquer distribuição Linux.

Quase sempre, precisarei de acesso no nível raiz e quem quer que esteja configurando o acesso para mim não é um administrador de sistemas especializado. Não quero a senha de root e também tenho certeza de que minhas ações não serão maliciosas, mas que instruções razoavelmente simples devo dar para:

  • configurar uma conta e trocar credenciais com segurança
  • configurar acesso root (sudo)
  • restringir o acesso à minha conta
  • fornecer trilha de auditoria

(E sim, eu estou ciente e sempre aviso aos clientes que, uma vez que eu tenha acesso de administrador, ocultar qualquer ação maliciosa é trivial, mas vamos supor que não tenho nada a esconder e participar ativamente da criação de uma trilha de auditoria.)

O que pode ser melhorado nas etapas abaixo?


Meu conjunto de instruções atual:

configurar uma conta e trocar credenciais com segurança

Eu forneço um hash de senha e solicito que minha conta esteja configurada com essa senha criptografada, para que não precisemos transmitir uma senha de texto não criptografado, serei o único que conhece a senha e não começamos com uma senha fraca previsível.

sudo useradd -p '$1$********' hbruijn

Eu forneço uma chave pública SSH (par de chaves específico por cliente) e solicito que eles configurem minha conta com essa chave:

sudo su - hbruijn
mkdir -p ~/.ssh
chmod 0700 ~/.ssh
echo 'from="10.80.0.0/14,192.168.1.2" ssh-rsa AAAAB3NzaC1y***...***== hbruijn@serverfault' >> ~/.ssh/authorized_keys
chmod 0600 ~/.ssh/authorized_keys 

configurar acesso root (sudo)

Peço ao cliente que configure o sudo para mim com sudo sudoeditou usando seu editor favorito e acrescente a /etc/sudoers:

hbruijn ALL=(ALL) ALL

restringir o acesso à minha conta

Normalmente, o cliente ainda permite logins com base em senha e peço que eles adicionem as duas linhas a seguir /etc/ssh/sshd_configpara pelo menos restringir minha conta apenas às chaves SSH:

Match user hbruijn
PasswordAuthentication no

Dependendo do cliente, roteará todo o meu acesso SSH através de um único host bastião para sempre fornecer um único endereço IP estático (por exemplo, 192.168.1.2) e / ou fornecer o intervalo de endereços IP que meu ISP usa (por exemplo, 10.80. 0,0 / 14). O cliente pode precisar adicioná-los a uma lista de desbloqueio de firewall se o acesso SSH for restrito (o ssh, na maioria das vezes, não é filtrado).

Você já viu esses endereços IP como a from=restrição no ~.ssh/authorized_keysarquivo que limita os hosts a partir dos quais minha chave pode ser usada para acessar seus sistemas.

fornecer trilha de auditoria

Até agora, nenhum cliente me pediu isso, e eu não fiz nada específico além do seguinte para cobrir minha bunda:

Eu tento usar consistentemente sudocom comandos individuais e tento impedir o uso de sudo -iou sudo su -. Eu tento não usar, sudo vim /path/to/file mas em sudoeditvez disso.

Por padrão, todas as ações privilegiadas serão registradas no syslog (e /var/log/secure):

Sep 26 11:00:03 hostname sudo:  hbruijn : TTY=pts/0 ; PWD=/home/hbruijn ; USER=jboss ; COMMAND=sudoedit /usr/share/jbossas/domain/configuration/domain.xml  
Sep 26 11:00:34 hostname sudo:  hbruijn : TTY=pts/0 ; PWD=/home/hbruijn ; USER=root ; COMMAND=/usr/bin/tail -n 5 /var/log/messages

Na maioria das vezes, desisto de personalizar meus ambientes de trabalho, a única coisa que realmente faço é definir o seguinte no ~/.bash_profileaumento do histórico do bash e incluir carimbos de data / hora:

export HISTSIZE=99999999999
export HISTFILESIZE=99999999999
export HISTIGNORE="w:ls:ls -lart:dmesg:history:fg"
export HISTTIMEFORMAT='%F %H:%M:%S  '
shopt -s histappend
HBruijn
fonte
8
Você pode fazer logon (fácil de alterar após o fato) e até compartilhar sessões screen, portanto, em casos extremos, seu cliente pode assistir ao vivo o que você está fazendo.
Sven
Se você deseja adicionar uma trilha de auditoria melhor, instrua-os a habilitar o log remoto, se houver a possibilidade #
Fredi Fredi

Respostas:

24

A única coisa que vem à mente seria adicionar --expiredateà adduserchamada.
Com isso, o cliente sabe que seu acesso expirará automaticamente em uma data fixa.

Ele ainda precisa confiar em você, pois você tem acesso root e ainda pode remover o sinalizador de vencimento.

falsificador
fonte
15

Você pode gravar suas sessões com o utilitário script (1) .

$ script session.log
Script started, file is session.log
$ ls
file1  session.log
exit
Script done, file is session.log

então tudo está em session.log.

user9517 suporta GoFundMonica
fonte
Você recomendaria executar isso em seu próprio host, antes de iniciar a sessão ssh em um sistema remoto ou incluí-la como parte do meu perfil no sistema remoto?
HBruijn
11
Eu acho que você poderia fazer qualquer um - eu só o usei uma vez que a maioria das pessoas não se importa.
user9517 suporta GoFundMonica
7

Como você já está efetuando login com uma chave pública SSH, isso aumentaria um pouco as coisas se você não fornecesse um hash de senha; em vez disso, diga para eles usarem adduser --disabled-password(equivalente, useradd -p '!'eu acho), o que é efetivamente equivalente a PasswordAuthentication noessa conta, além de não haver chance de alguém bisbilhotar seu email poder forçar com força o hash da senha e fazer login como você.

zwol
fonte
3
A adição de Match user hbruijn \n PasswordAuthentication noao sshd_config deve impedir que qualquer pessoa efetue login remotamente com minha senha descriptografada (usuários potencialmente locais podem usá-la su - hbruijn), mas até onde eu sei, ainda preciso ter uma senha válida para sudofins. Talvez eu devesse simplesmente redefinir minha senha depois de fazer login?
HBruijn
Oh, bom argumento sobre o sudo. Não tenho certeza se uma conta no --disabled-passwordestado pode receber uma senha executando a passwdpartir dessa conta.
Zwol 26/09/16
Além disso, o que impede alguém de ouvir o hash de senha que você fornece? Essa parte é um elo fraco que prejudica o uso de chaves ssh, onde não importa se sua chave pública é interceptada.
precisa saber é o seguinte
3
Esse link fraco poderia ser resolvido com o cliente também adicionando uma linha no arquivo sudoers como hbruijn ALL=(ALL) NOPASSWD: /usr/bin/passwd hbruijn?
Dezza
2

Por que fornecer uma senha quando você usará chaves públicas / privadas.

As chaves públicas devem ser compartilhadas; portanto, é isso que você deve usar para trocar credenciais com segurança, não senhas com hash.

sudo useradd --disabled-password hbruijn

Ao enviar sua chave pública, verifique a impressão digital em um segundo canal, como uma ligação telefônica, para que você saiba que ninguém a alterou no caminho.

Como você não terá uma senha agora para usar o sudo, também precisará alterar sua linha no arquivo sudoers para

hbruijn ALL=(ALL) NOPASSWD:ALL

Se você não se sente confortável em não ter senha para o sudo e realmente deseja uma senha, ainda não há necessidade de enviar sua senha com hash, deixe a conta ser criada sem senha, defina sua chave pública e, assim que a conta for configuração, você pode efetuar login no ssh e executar passwdpara definir sua própria senha.

Jens Timmerman
fonte