Esta respuesta se desarrolla tanto sobre la respuesta elegida al agregar más seguridad.
Esa respuesta discutió la forma general
<command that makes output> | \
ssh <user A>@<host A> <command that maps stdin to clipboard>
Donde la seguridad puede estar ausente en los ssh
permisos que permite <user B>
el host B>
a ssh
en host A
y ejecutar cualquier comando.
Por supuesto B
que A
el acceso ya pueden estar cerrada por una ssh
clave, e incluso puede tener una contraseña. Pero otra capa de seguridad puede restringir el alcance de los comandos permitidos que se B
pueden ejecutar A
, por ejemplo, para que rm -rf /
no se pueda invocar. (Esto es especialmente importante cuando la ssh
clave no tiene una contraseña).
Afortunadamente, ssh
tiene una característica incorporada llamada restricción de comando o comando forzado . Consulte ssh.com o esta pregunta de serverfault.com .
La solución a continuación muestra la solución de forma general junto con la ssh
restricción de comandos impuesta.
Solución de ejemplo con restricción de comando agregada
Esta solución de seguridad mejorada sigue la forma general: la llamada de la ssh
sesión en adelante host-B
es simplemente:
cat <file> | ssh <user-A>@<host A> to_clipboard
El resto de esto muestra la configuración para que eso funcione.
Configuración de restricción de comando ssh
Supongamos que la cuenta de usuario en B
es user-B
, y B tiene una clave ssh id-clip
, que se ha creado de la manera habitual ( ssh-keygen
).
Luego, en user-A
el directorio ssh hay un archivo
/home/user-A/.ssh/authorized_keys
que reconoce la clave id-clip
y permite la ssh
conexión.
Por lo general, el contenido de cada línea authorized_keys
es exactamente la clave pública que se autoriza, por ejemplo, el contenido de id-clip.pub
.
Sin embargo, para imponer la restricción de comandos , el contenido que se ejecutará antepone el contenido de la clave pública (en la misma línea).
En nuestro 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>
El comando designado "/home/user-A/.ssh/allowed-commands.sh id-clip"
, y solo ese comando designado, se ejecuta cada vez que id-clip
se usa la tecla para iniciar una ssh
conexión host-A
, sin importar en qué comando se escriba la ssh
línea de comando .
El comando indica un archivo de script allowed-commands.sh
, y el contenido de ese archivo de script es
#/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
La llamada original a la ssh
máquina B
fue
... | ssh <user-A>@<host A> to_clipboard
La cadena to-clipboard
pasa a allowed-commands.sh
la variable de entorno SSH_ORIGINAL_COMMAND
. Además, hemos pasado el nombre de la clave id-clip
, desde la línea en la authorized_keys
que solo se accede por id-clip
.
La línea
notify-send "ssh to-clipboard, from ${Id}"
es solo un cuadro de mensaje emergente para hacerle saber que se está escribiendo el portapapeles; probablemente también sea una buena característica de seguridad. ( notify-send
funciona en Ubuntu 18.04, tal vez no en otros).
En la linea
cat | xsel --display :0 -i -b
el parámetro --display :0
es necesario porque el proceso no tiene su propia pantalla X con un portapapeles, por lo que debe especificarse explícitamente. Este valor :0
funciona en Ubuntu 18.04 con el servidor de ventana Wayland. En otras configuraciones, podría no funcionar. Para un servidor X estándar, esta respuesta podría ayudar.
host-A
/etc/ssh/sshd_config
parámetros
Finalmente, se deben configurar algunos parámetros en /etc/ssh/sshd_config
el host A
para garantizar el permiso de conexión y el permiso para usar la ssh
tecla solo sin contraseña:
PubkeyAuthentication yes
PasswordAuthentication no
ChallengeResponseAuthentication no
AllowUsers user-A
Para hacer que el sshd
servidor vuelva a leer la configuración
sudo systemctl restart sshd.service
o
sudo service sshd.service restart
conclusión
Es un esfuerzo configurarlo, pero otras funciones además to-clipboard
se pueden construir en paralelo en el mismo marco.
:'<,'>w !ssh desktop pbcopy