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 sudoedit
ou 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_config
para 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_keys
arquivo 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 sudo
com comandos individuais e tento impedir o uso de sudo -i
ou sudo su -
. Eu tento não usar, sudo vim /path/to/file
mas em sudoedit
vez 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_profile
aumento 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
screen
, portanto, em casos extremos, seu cliente pode assistir ao vivo o que você está fazendo.Respostas:
A única coisa que vem à mente seria adicionar
--expiredate
àadduser
chamada.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.
fonte
Você pode gravar suas sessões com o utilitário script (1) .
então tudo está em session.log.
fonte
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 aPasswordAuthentication no
essa 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ê.fonte
Match user hbruijn \n PasswordAuthentication no
ao sshd_config deve impedir que qualquer pessoa efetue login remotamente com minha senha descriptografada (usuários potencialmente locais podem usá-lasu - hbruijn
), mas até onde eu sei, ainda preciso ter uma senha válida parasudo
fins. Talvez eu devesse simplesmente redefinir minha senha depois de fazer login?--disabled-password
estado pode receber uma senha executando apasswd
partir dessa conta.hbruijn ALL=(ALL) NOPASSWD: /usr/bin/passwd hbruijn
?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
passwd
para definir sua própria senha.fonte