Use um binário de invólucro
Para esse caso de uso específico (consulte a observação importante abaixo), uma possibilidade é criar um usuário (por exemplo support-ssh
) especificamente para essas conexões SSH de saída e instalar um binário pequeno do wrapper que os executivos executam /usr/bin/ssh
.
- Não copie + chmod o
ssh
próprio binário, porque você não se lembrará de copiá-lo toda vez que aplicar atualizações de segurança.
- E não use
root
como o usuário mais privilegiado, por razões que confio que são óbvias.
Essa é uma alternativa funcionalmente equivalente à utilização sudo
para elevar privilégios à support-ssh
conta com as seguintes compensações:
- Como é menor e mais enxuto do que
sudo
há, há menos risco de um erro de configuração abrir mais do que você pretendia.
- É de sua responsabilidade codificá-lo corretamente - somente faça isso se você for extremamente cuidadoso e (idealmente) tiver experiência em codificação crítica à segurança.
- Ele pode ser adaptado para ser mais específico do que
sudo
(mas quanto mais código você escreve, mais você precisa auditar para segurança).
O binário do invólucro deve ser definido HOME
como o support-ssh
diretório inicial do usuário, para ssh
selecionar a ssh_config
chave privada e apropriada . Mas o usuário que está chamando não deve ter permissão para ler ~support-ssh/.ssh/
ou seu conteúdo.
O wrapper pode ser tão simples quanto:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main(int argc, char **argv)
{
setenv("HOME", "/home/support-ssh", 1);
/* allow only a single, non-option argument */
if (argc!=2 || *argv[1]=='-') {
fprintf(stderr, "Usage: %s <hostname>", argv[0]);
exit(EXIT_FAILURE);
}
execv("/usr/bin/ssh", argv);
return EXIT_FAILURE;
}
Você pode querer ser mais restritivo e verificar se o argumento argv[1]
está em um conjunto de nomes de host permitidos. Ou menos restritivo e permita (um subconjunto de) argumentos de opção. Você pode querer substituir completamente variáveis de ambiente (mas manter os importantes, tais como TERM
, LC_*
, etc); note que LD_LIBRARY_PATH
e LD_PRELOAD
são particularmente perigosos.
Um programa de wrapper semelhante pode ser fornecido, scp
se necessário.
Uma nota sobre aplicabilidade
Esta resposta aborda as circunstâncias específicas da pergunta, em que os usuários são contratualmente obrigados a seguir procedimentos e há sanções (por exemplo, demissão) por violá-las. Supõe que você deseja impedir que os funcionários copiem casualmente as chaves privadas, em vez de impedir que um invasor determinado obtenha acesso não autorizado.
Considero que a segurança é alcançada por meio de defesas técnicas e não técnicas e que o equilíbrio alcançado aqui ou pelo uso sudo
é apropriado para a situação apresentada.