Essa resposta se desenvolve tanto na resposta escolhida , adicionando mais segurança.
Essa resposta discutiu a forma geral
<command that makes output> | \
ssh <user A>@<host A> <command that maps stdin to clipboard>
Onde a segurança pode faltar está nas ssh
permissões permitindo <user B>
sobre host B>
a ssh
em host A
e executar qualquer comando.
É claro B
que o A
acesso já pode ser bloqueado por uma ssh
chave e pode até ter uma senha. Mas outra camada de segurança pode restringir o escopo de comandos permitidos que B
podem ser executados A
, por exemplo, para que rm -rf /
não possam ser chamados. (Isso é especialmente importante quando a ssh
chave não possui uma senha.)
Felizmente, ssh
possui um recurso interno chamado restrição de comando ou comando forçado . Veja ssh.com , ou esta questão serverfault.com .
A solução abaixo mostra a solução geral do formulário junto com a ssh
restrição de comando imposta.
Exemplo de solução com restrição de comando adicionada
Esta solução aprimorada de segurança segue a forma geral - a chamada da ssh
sessão host-B
é simplesmente:
cat <file> | ssh <user-A>@<host A> to_clipboard
O restante mostra a configuração para que isso funcione.
Configuração da restrição de comando ssh
Suponha que a conta do usuário B
seja user-B
, e B tenha uma chave ssh id-clip
, criada da maneira usual ( ssh-keygen
).
Então no user-A
diretório ssh existe um arquivo
/home/user-A/.ssh/authorized_keys
que reconhece a chave id-clip
e permite a ssh
conexão.
Normalmente, o conteúdo de cada linha authorized_keys
é exatamente a chave pública que está sendo autorizada, por exemplo, o conteúdo de id-clip.pub
.
No entanto, para impor restrições de comando, o conteúdo da chave pública é anexado (na mesma linha) pelo comando a ser executado.
No nosso caso:
command="/home/user-A/.ssh/allowed-commands.sh id-clip",no-agent-forwarding,no-port-forwarding,no-user-rc,no-x11-forwarding,no-pty <content of file id-clip.pub>
O comando designado "/home/user-A/.ssh/allowed-commands.sh id-clip"
, e somente esse comando designado, é executado sempre que a chave id-clip
é usada para iniciar uma ssh
conexão host-A
- independentemente do comando que está escrito na ssh
linha de comando .
O comando indica um arquivo de script allowed-commands.sh
e o conteúdo desse arquivo de script é
#/bin/bash
#
# You can have only one forced command in ~/.ssh/authorized_keys. Use this
# wrapper to allow several commands.
Id=${1}
case "$SSH_ORIGINAL_COMMAND" in
"to-clipboard")
notify-send "ssh to-clipboard, from ${Id}"
cat | xsel --display :0 -i -b
;;
*)
echo "Access denied"
exit 1
;;
esac
A chamada original para ssh
a máquina B
foi
... | ssh <user-A>@<host A> to_clipboard
A sequência to-clipboard
é passada allowed-commands.sh
pela variável de ambiente SSH_ORIGINAL_COMMAND
. Além disso, passamos o nome da chave id-clip
, da linha na authorized_keys
qual é acessada apenas por id-clip
.
A linha
notify-send "ssh to-clipboard, from ${Id}"
é apenas uma caixa de mensagens pop-up para informar que a área de transferência está sendo gravada - provavelmente também é um bom recurso de segurança. ( notify-send
funciona no Ubuntu 18.04, talvez não outros).
Na linha
cat | xsel --display :0 -i -b
o parâmetro --display :0
é necessário porque o processo não possui sua própria exibição X com uma área de transferência; portanto, ele deve ser especificado explicitamente. Esse valor :0
funciona no Ubuntu 18.04 com o servidor de janelas Wayland. Em outras configurações, pode não funcionar. Para um servidor X padrão, esta resposta pode ajudar.
host-A
/etc/ssh/sshd_config
parâmetros
Finalmente, alguns parâmetros no /etc/ssh/sshd_config
host A
que devem ser configurados para garantir a permissão para conexão e permissão para usar ssh
-key apenas sem senha:
PubkeyAuthentication yes
PasswordAuthentication no
ChallengeResponseAuthentication no
AllowUsers user-A
Para fazer o sshd
servidor reler a configuração
sudo systemctl restart sshd.service
ou
sudo service sshd.service restart
conclusão
É um esforço para configurá-lo, mas outras funções além disso to-clipboard
podem ser construídas em paralelo na mesma estrutura.
:'<,'>w !ssh desktop pbcopy