.. vim:syn=rst:sts=3:sw=3:et:ai:tw=79 .. highlight:: text Secure Shell (SSH) =============================================================================== `SSH`_ és un protocol per accedir a màquines remotes i a altres serveis de xarxa de manera segura. Gairebé tots els sistemes operatius inclouen clients del protocol basats en la implementació `OpenSSH`_ com ara :dfn:`Linux`, :dfn:`macOS` i :dfn:`Windows 10`. .. _SSH: https://en.wikipedia.org/wiki/SSH_(Secure_Shell) .. _OpenSSH: https://en.wikipedia.org/wiki/OpenSSH .. sidebar:: Sobre aquesta guia Aquesta guia es basa en les utilitats d'OpenSSH. Els exemples estan fets per a sistemes GNU/Linux actuals. Les diferències amb altres sistemes Unix o Windows 10 es tracten en apartats específics, així com altres implementacions del protocol. .. contents:: Continguts :depth: 1 :local: :backlinks: none :program:`OpenSSH` ------------------------------------------------------------------------------- La *suite* :program:`OpenSSH` inclou, entre d'altres, els següents programes: .. list-table:: :widths: auto * - :program:`ssh` - Per accedir a màquines remotes i executar-hi programes, i molt més. * - :program:`scp` - Per copiar fitxers entre màquines remotes. * - :program:`ssh-keygen` - Per generar claus d'autenticació. * - :program:`ssh-copy-id` [#copy]_ - Per copiar claus entre màquines. * - :program:`ssh-agent` - Per gestionar l'autenticació amb clau. * - :program:`ssh-add` - Per afegir claus a l'agent d'autenticació. Connexió remota: :program:`ssh` ------------------------------------------------------------------------------- Serveix per a la connexió i execució de programes en màquines remotes:: ssh [-X] [user@]host [commmand] Cal indicar-hi el nom de la màquina (`host`) i, si no coincideix amb el nostre nom local, el nom de l'usuari remot (`user`). Si en comptes de obrir una :dfn:`shell` remota, volem executar només una comanda (`command`), també l'hi hem d'indicar. L'opció :code:`-X` permet executar aplicacions gràfiques reenviant la connexió al servidor X de la nostra màquina local. Exemple ^^^^^^^ .. code-block:: console me@home:~ $ ssh user@login3.lsi.upc.edu Password: Last login: Sat Mar 13 11:50:29 2021 from 147.83.29.5 Benvingut al Laboratori de Calcul de LSI: login3 user@login3:~ $ /usr/local/bin/passwd Identity validation... Enter your UNIX password: Changing UNIX and samba passwords for user New password: Retype new password: passwd: password updated successfully user@login3:~ $ logout Connection to login3 closed. me@home:~ $ ssh localhost "ddate ; ls -ld .ssh/" Today is Setting Orange, the 73rd day of The Aftermath in the YOLD 3185 drwx------ 2 user user 4096 Mar 13 13:10 .ssh/ me@home:~ $ Còpia remota: :program:`scp` ------------------------------------------------------------------------------- Serveix per a la còpia de fitxers entre màquines remotes. Per copiar un fitxer a una màquina remota:: scp [-r] source [user@]host:[path] Per copiar un fitxer d'una màquina remota:: scp [-r] [user@]host:path target Tant l'origen (`source`) com el destí (`target`) poden ser fitxers o directoris, i poden ser locals o remots. Han d'indicar, si cal, l'usuari (`user`), la màquina (`host`), i la ruta (`path`) al fitxer o directori. L'opció :code:`-r` permet copiar directoris recursivament, però compte: els *symbolic links* es resolen i es copien també de manera recursiva. Exemple ^^^^^^^ .. code-block:: console me@home:~ $ scp CrypTEC99.pdf user@login3.lsi.upc.edu:public_html/papers CrypTEC99.pdf 100% 905KB 7.5MB/s 00:00 me@home:~ $ ssh user@login3.lsi.upc.edu ls -l public_html/papers/Cry\* -rw-r--r-- 1 me me 926771 Mar 13 13:45 CrypTEC99.pdf me@home:~ $ Autenticació amb clau ------------------------------------------------------------------------------- La manera més segura de fer servir :program:`ssh` i :program:`scp` és fent servir `criptografia asimètrica o de clau pública `_. .. _PKC: https://en.wikipedia.org/wiki/Public-key_cryptography La criptografia de clau pública es basa en un parell de claus: una :dfn:`clau privada` i una :dfn:`clau pública`. La clau privada ens identifica i la clau pública ens reconeix. Cada cop que ens connectem a un servidor remot, ens hem d'identificar. Si fem servir un :dfn:`password`, aquest s'envia cada cop al servidor. Per evitar-ho, hem d'identificar-nos amb una :dfn:`clau`. D'aquesta manera, el nostre password mai no s'envia per la xarxa. Fer servir claus també evita haver d'escriure el nostre password cada cop que volem fer una connexió, com veurem més endavant. Generació de claus: :program:`ssh-keygen` ------------------------------------------------------------------------------- Per generar el parell de claus, pública i privada, hem de fer servir el programa :program:`ssh-keygen`. Per defecte, :program:`ssh-keygen` genera un parell de claus `RSA`_, i guarda la clau privada al fitxer :file:`id_rsa` i pública a :file:`id_rsa.pub`:: ssh-keygen .. _RSA: https://en.wikipedia.org/wiki/RSA_(cryptosystem) .. danger:: El :program:`ssh-keygen` ens demanarà que indiquem una *passphrase* per protegir la nostra clau privada. Serveix per xifrar la clau de manera que per fer-la servir és necessari indicar-la. És **molt important** que fem servir una passphrase prou segura. Per escollir-ne una, podeu consultar :doc:`passwords`. Per poder-nos identificar a un servidor remot amb la clau, cal que el servidor ens reconegui. Per fer-ho, cal que hi copiem la clau pública al fitxer :file:`~/.ssh/authorized_keys`:: ssh-copy-id -i ~/.ssh/id_rsa user@host .. note:: Si el vostre sistema no inclou :program:`ssh-copy-id`, podeu descarregar-lo o copiar la clau manualment, com s'explica :ref:`més endavant `. Ara ja podem accedir al servidor amb clau, sense password. Per fer-ho, cal indicar la clau que volem fer servir:: ssh -i ~/.ssh/id_rsa user@host Però hi ha una manera més senzilla i segura de fer servir la clau privada, com veurem tot seguit. Agent d'autenticació: :program:`ssh-agent` i :program:`ssh-add` ------------------------------------------------------------------------------- El programa :program:`ssh-agent` pot gestionar l'autenticació amb clau per nosaltres. Per començar a fer-lo servir, només cal executar:: eval `ssh-agent` .. note:: Si treballem amb una distribució Linux, normalment ja hi ha un agent executant-se i ens podem saltar aquest pas. Quan hi afegim una clau amb :program:`ssh-add`, se'ns demana la passphrase i l'agent emmagatzema la clau:: ssh-add ~/.ssh/id_rsa Ara ja podem accedir als servidors que reconeguin aquesta clau tants cops com sigui necessari sense haver de tornar a indicar el nostre password o la nostra passphrase. Gestió de claus ------------------------------------------------------------------------------- Si algú té accés a una de les nostres claus privades i pot obtenir la nostra passphrase, podrà accedir als servidors que ens reconeguin amb la nostra identitat. Per això és molt important seguir algunes regles: - Les claus privades no han de sortir mai de la màquina on s'han creat. Si ens cal accedir a un servidor des de diferents màquines, hem de crear diferents claus. Així, en cas que alguna de les màquines sigui compromesa, només caldrà eliminar una de les nostres claus públiques del servidor. - Les claus privades sempre han d'estar protegides per una bona passphrase. D'aquesta manera, si algú té accés a un dels fitxers de clau privada, serà molt difícil que tingui accés a la clau. - Idealment, cada clau ha de donar accés a un únic usuari en un únic servidor. Així minimitzem les possibles conseqüències d'una clau compromesa. En cas que gestionem un nombre de claus molt gran, hi ha un compromís evident entre la facilitat d'ús i la seguretat, com sempre. Però per simplificar-ne l'ús, podem configurar el SSH com veurem tot seguit. Configuració: :file:`~/.ssh/config` ------------------------------------------------------------------------------- Per facilitar-nos l'ús del SSH podem configurar els clients. Al fitxer :file:`config` hi podem indicar: àlies per servidors, noms d'usuari per connexió, mètodes d'autenticació... Per exemple:: # defaults Match all PreferredAuthentications publickey,password IdentityFile ~/.ssh/id_ed25519 IdentitiesOnly yes AddKeysToAgent yes Host *.lsi.upc.edu User barbara IdentityFile ~/.ssh/id_lsi Host liskov HostName liskov.lsi.upc.edu ForwardX11 yes PreferredAuthentications publickey IdentityFile ~/.ssh/id_liskov Host docs HostName docs.upc.edu User git PreferredAuthentications publickey IdentityFile ~/.ssh/id_barbara.liskov@upc.edu Algunes explicacions: .. list-table:: :class: wrap :widths: auto * - :code:`Match all` - Configuració que s'aplica a tots els casos * - :code:`Host ...` - Servidor(s) concrets, o àlies de servidors * - :code:`HostName ...` - Nom complet o adreça del servidor o àlies * - :code:`User ...` - Nom d'usuari al servidor * - :code:`PreferredAuthentications ...` - Tipus d'autenticació que volem fer servir * - :code:`IdentityFile ...` - Clau privada que fem servir * - :code:`AddKeysToAgent yes` - El primer cop que fem servir una clau, s'afegirà a l'agent * - :code:`IdentitiesOnly yes` - No volem que l'agent tracti de buscar la clau correcta (haurem d'indicar una clau per a cada cas a la configuració o comanda) * - :code:`ForwardX11 yes` - Redirigim els clients gràfics al nostre servidor X11 local. Quan executem :code:`ssh liskov` s'apliquen les següents configuracions: - :code:`Match all` - :code:`IdentitiesOnly yes` - :code:`AddKeysToAgent yes` - :code:`Host *.lsi.upc.edu` - :code:`User barbara` - :code:`Host liskov` - :code:`HostName liskov.lsi.upc.edu` - :code:`ForwardX11 yes` - :code:`PreferredAuthentications publickey` - :code:`IdentityFile ~/.ssh/id_liskov` És a dir, :code:`ssh liskov` és equivalent a (si fem servir l'agent):: ssh-add ~/.ssh/id_liskov ssh -X barbara@liskov.lsi.upc.edu Autorització: :file:`~/.ssh/authorized_keys` ------------------------------------------------------------------------------- El format del fitxer :file:`~/.ssh/authorized_keys` és molt senzill:: [options] keytype base64-encoded-key comment És molt semblant al format del fitxer de clau pública:: keytype base64-encoded-key comment El comentari que fa servir :program:`ssh-keygen` per defecte és :code:`user@host` i ens serveix per conèixer l'origen de la clau. Podem indicar-ne un altre amb l'opció :code:`-C` o simplement editant manualment el fitxer. El fitxer :file:`~/.ssh/authorized_keys`, a més, pot contenir línies en blanc o de comentari, si comencen amb el caràcter :code:`#`. Aquests comentaris, i les opcions, s'introdueixen manualment. Un exemple: .. parsed-literal:: # per apagar la màquina localment **command="sudo /sbin/poweroff",from="::1"** **ssh-ed25519** \ AAAAC3NzaC1lZDI1NTE 5AAAAIN+HqSfHgK6NMuzK7KlXFfUR3V4ZM78jReqWnR7OZkFZ **barbara@liskov** # només des de les màquines del domini **from="\*.lsi.upc.edu,!147.83.29.128/25"** **ecdsa-sha2-nistp256a** \ AAAAE2VjZHNh LXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBPlwDTBFUbq23h0DF5MYlJYnWgCaQ2fO l4/d64TI/VX0mXxx+mWUVqj3qJ3p4XGVcCtJ8OGJP3jwSarNDnKwkL8= **barbara@liskov** **ssh-rsa** \ AAAAB3NzaC1yc2EAAAADAQABAAABAQDDAw15mvA45lt8s86wj7S01/AFMNvmuHmB vRiFZWg55Ncxfq67HQK0TC2LK3BScjNuk43h5o73EPYl0EJw3wS2rzBrrd8Tl8NvbWB5TRxB l4IgWDYK7inlmgIovT/2rxs+UM89hkwM4Pn7pQbN3bolAmVvAka1immOzyKCXoeS8XXcKrz8 72g+ajCAyv5Qi0WOAaP0acuVdF7ulVSMNrfgjsqZe6SlSOwX6FHMyHulYzSXzRGTbB6wcNkU cYzNQ6VSJ7rZVUMzVFzamXVOx3W0RaUtVO5XGYSW0qVSdu2ZmZIXuwNrJJyWWpdg1sMzkRtJ YfbGu1027fiv5qO+FSwn **me@home** .. highlight:: shell-session .. _ssh-copy-id: Còpia de claus: :program:`ssh-copy-id` o manual ------------------------------------------------------------------------------- Com hem vist, l'script :program:`ssh-copy-id` copia claus públiques a màquines remotes per nosaltres. Però aquest script no està disponible a tots els sistemes. Concretament, no hi és a Windows 10 ni a macOS o BSD antics. En aquests casos el podeu descarregar, o bé podeu copiar les claus i manegar manualment el fitxer :file:`~/.ssh/authorized_keys`. Descarregar l'script ^^^^^^^^^^^^^^^^^^^^ Podeu descarregar l'script del repositori de la versió portable d':program:`OpenSSH` [#repo]_ o d'aquí, però per poder-lo executar necessitareu una shell compatible amb POSIX. A Windows us caldrà fer servir `Cygwin`_ o `WSL`_, per exemple. .. _Cygwin: https://en.wikipedia.org/wiki/Cygwin .. _WSL: https://en.wikipedia.org/wiki/Windows_Subsystem_for_Linux Versió: OpenSSH 8.5p1 (2021-03-03) - :download:`ssh-copy-id <_download/ssh-copy-id>` (script) - :download:`ssh-copy-id.1 <_download/ssh-copy-id.1>` (manual) Còpia manual de claus ^^^^^^^^^^^^^^^^^^^^^ Si preferiu gestionar les claus manualment, o no voleu descarregar l'script o instal·lar software addicional, cal tenir cura dels permisos: #. Si cal, creem el parell de claus:: me@home:~ $ ssh-keygen -a 100 -b 4096 -t rsa -f ~/.ssh/id_rsa_4 #. Si mai no hem fet servir SSH a la màquina remota, cal que hi creem el fitxer :file:`~/.ssh/authorized_keys` amb els **permisos correctes**:: me@home:~ $ ssh user@login3.lsi.upc.edu Password: user@login3:~ $ umask 77 user@login3:~ $ mkdir $HOME/.ssh user@login3:~ $ touch $HOME/.ssh/authorized_keys user@login3:~ $ ls -ld $HOME/.ssh $HOME/.ssh/authorized_keys drwx------ 2 user user 4096 Mar 13 13:10 /home/user/.ssh -rw------- 1 user user 0 Mar 13 14:03 /home/user/.ssh/authorized_keys #. Podem editar el fitxer, i copiar i enganxar la clau, o bé podem afegir-la des de la nostra màquina:: user@login3:~ $ logout me@home $ cat $HOME/.ssh/id_rsa_4.pub | > ssh user@login3.lsi.upc.edu 'cat >> $HOME/.ssh/authorized_keys' Password: #. Finalment, comprovem que ha funcionat:: me@home:~ $ ssh -i ~/.ssh/id_rsa_4 user@login3.lsi.upc.edu uname -srmp SunOS 5.10 sun4u sparc #. Opcionalment, podem configurar la connexió per simplificar-ne l'ús:: me@home:~ $ cat ~/.ssh/config ... Host login3 HostName login3.lsi.upc.edu User user PreferredAuthentications publickey IdentityFile ~/.ssh/id_rsa_4 IdentitiesOnly yes AddKeysToAgent yes Windows: :program:`OpenSSH` ------------------------------------------------------------------------------- A Windows 10 tenim accés a la suite OpenSSH. Els programes :program:`ssh`, :program:`scp` i :program:`ssh-keygen` funcionen sense cap configuració addicional. Per poder fer servir :program:`ssh-add` i :program:`ssh-agent` cal configurar l'\ *OpenSSH Authentication Agent*. [#w10a]_ Si fem servir altres versions de Windows, o volem poder fer servir un terminal amb moltes més funcionalitats, podem fer servir :program:`PuTTY`. Windows: :program:`PuTTY` ------------------------------------------------------------------------------- |PuTTY|_ és un emulador de terminal amb suport per al protocol SSH, entre d'altres. Inclou un conjunt d'eines similar a les d':program:`OpenSSH` i és molt configurable. .. |PuTTY| replace:: :program:`PuTTY` .. _`PuTTY`: https://en.wikipedia.org/wiki/PuTTY Els equivalents proximats de :program:`PuTTY` als programes d':program:`OpenSSH` que hem vist són: .. list-table:: :header-rows: 1 * - OpenSSH - PuTTY * - ssh - PuTTY (putty.exe) * - ssh-keygen - PuTTYgen (puttygen.exe) * - ssh-agent - Pageant (pageant.exe) * - scp - pscp.exe (CLI) * - sftp - psftp.exe (CLI) :program:`PuTTY` guarda les claus pública i privada en un únic fitxer. :program:`Pageant` carrega la clau privada simplement clicant al fitxer. :program:`PuTTYgen` permet generar les claus o extreure'n la clau pública. A més de l'instal·lador, si només en volem fer-ne un ús puntual, podem descarregar només el programa :program:`putty.exe` i executar-lo directament. - **Descàrregues:** https://www.chiark.greenend.org.uk/~sgtatham/putty/latest.html - **Documentació:** https://www.chiark.greenend.org.uk/~sgtatham/putty/docs.html OpenSSH: manuals ------------------------------------------------------------------------------- Aquí teniu un recull de les pàgines de manual dels programes que hem vist: - `ssh(1)`_ - `scp(1)`_ - `ssh-keygen(1)`_ - `ssh-copy-id(1)`_ - `ssh-agent(1)`_ - `ssh-add(1)`_ - `ssh_config(5)`_ - `authorized_keys(5)`_ .. _ssh(1): https://man.openbsd.org/ssh .. _scp(1): https://man.openbsd.org/scp .. _ssh-keygen(1): https://man.openbsd.org/ssh-keygen .. _ssh-copy-id(1): https://manpages.debian.org/buster/openssh-client/ssh-copy-id.1.en.html .. _ssh-agent(1): https://man.openbsd.org/ssh-agent .. _ssh-add(1): https://man.openbsd.org/ssh-add .. _ssh_config(5): https://man.openbsd.org/ssh_config .. _authorized_keys(5): https://man.openbsd.org/OpenBSD-current/man8/sshd.8#AUTHORIZED_KEYS_FILE_FORMAT ---- .. rubric:: Notes al peu .. [#copy] El programa :program:`ssh-copy-id` forma part de la distribució portable d':program:`OpenSSH`. .. [#repo] https://anongit.mindrot.org/openssh.git/plain/contrib/ssh-copy-id .. [#w10a] https://stackoverflow.com/a/53606760