Introducción

Configurando un contenedor con Borgbackup para facer copias de seguridade, cheguei á necesidade de precisar configurar un servidor SFTP. De entrada estaba a seguir o camiño coñecido e a priori máis sinxelo, configurando SSH para o acceso remoto e usar SSHFS para montar a unidade na que facer as copias. Pero resulta que aínda que dende o contenedor podo chegar ao outro equipo, non podo montar deste xeito as unidades. Xa que ao parecer nos contenedores, a lo menos no de Alpine, non se inclúe FUSE. Polo que para ter esta posibilidade, tería que correr o contenedor con privilexios. O cal supón un problema, xa que este tería permisos para modificar prácticamente todo no host.
Outra opción era montar a unidade no host e compartila coma se fose un volume. Pero tampouco me convencía, xa que para programar copias periódicas debería facer configuracións nos equipos a salvar. A miña idea co contenedor de Borgbackup é que sexa o máis autosuficiente posible. De xeito que poida levalo a varios equipos sen configuracións locais, ou a lo menos cas mínimas.
Por isto vin que a mellor opción é crear un SFTP no destino e que Borgbackup traballe con isto.

Así que aproveitando esta necesidade, recollo como crear un SFTP en Raspberry Pi OS. Descartando FTP e FTP/s por ser menos seguros. Xa que transmiten toda ou parte da información sen cifrar.

Comprobando a instalación

Para configurar SFTP, precisamos ter instalados os paquetes OpenSSH. Xeralmente case toda-las distrubucións o traen instalado, pero se non é así podemos obtelo dende os paquetes oficiais con apt install ssh, para Debian e derivadas.

Comprobaremos se está instalado executando:

dpkg -l | grep ssh

Que no meu caso amosa a seguinte saída, con Raspberry Pi OS:

ii  libpam-chksshpwd:arm64               1.5.2-6+rpt2+deb12u1             arm64        PAM module to enable SSH password checking support
ii  libssh2-1:arm64                      1.10.0-3+b1                      arm64        SSH2 client-side library
ii  openssh-client                       1:9.2p1-2+deb12u3                arm64        secure shell (SSH) client, for secure access to remote machines
ii  openssh-server                       1:9.2p1-2+deb12u3                arm64        secure shell (SSH) server, for secure access from remote machines
ii  openssh-sftp-server                  1:9.2p1-2+deb12u3                arm64        secure shell (SSH) sftp server module, for SFTP access from remote machines
ii  ssh                                  1:9.2p1-2+deb12u3                all          secure shell client and server (metapackage)
ii  ssh-import-id                        5.10-1                           all          securely retrieve an SSH public key and install it locally

Así que todo ben.

Configuración: grupo e usuario

Crearemos a continuación un grupo para SFTP, para asignarllo aos usuarios que queremos que poidan conectar co servidor, pero que non terán acceso a SSH, por seguridade. Así evitaremos que alguén que teña os datos para conectar ao SFTP, en troques se conecte ao servidor por SSH e tente gañar privilexios.

sudo groupadd sftpgroup

No meu caso xa teño o usuario creado, como expliquei neste artigo para crear usuarios restrinxidos. En lugar de crear un novo usuario, usarei ese mesmo. Así que asignareille ao usuario o novo grupo:

sudo usermod -aG sftpgroup $USER

Aquí mudaremos $USER polo nome do usuario que creamos.

Como resumo e sen complicar moito a cousa, para non ter que ir ao outro artigo. Para crear un usuario e asignalo ao grupo, executaremos:

sudo useradd -m -s /bin/bash -G sftgroup usuario

Creamos o usuario, xunto ca sua home co parámetro -m, indicando que traballará con bash con esta parte -s /bin/bash. Dicímoslle que tamén queremos que teña o grupo existente sftpgroup usando -G, e por último o nome do usuario.

Configurando SFTP

Escribiremos no ficheiro /etc/ssh/sshd_config/sftpgroup.config, con permisos de administrador, para engadir ao final o seguinte:

Subsystem sftp internal-sftp

Match Group sftpgroup
     ChrootDirectory /directorio/sftp
     X11Forwarding no
     AllowTCPForwarding no
     ForceCommand internal-sftp

NOTA: En lugar de modificar o ficheiro de configuración de sshd_config, engadiremos un novo no directorio /etc/ssh/sshd_config.d/, que vai ser o que conteña os cambios. Se queremos desfacelos só precisaremos borrar o arquivo. Tamén hai que ter coidado xa que no directorio /etc/ssh/ hai dúas configuracións. Están as do cliente de ssh e as do servidor. Estas últimas son as que queremos agora, e son as que comezan por sshd.

NOTA 2: tanto na configuración de ssh_config como sshd_config, impórtanse os ficheiros que creemos nas carpetas ssh_config.d e sshd_config.d. Sempre que non comecen por punto ou por ~.

Nesta configuración estamos a evitar que o usuario se conecte por ssh, mentres lle forzamos a conectar por SFTP e indicamos a que directorio.

Aplicamos a configuración, reiniciando o servizo sshd:

sudo systemctl restart sshd

Conectando ao SFTP

Para conectarse ao servidor, usaremos o seguinte:

sftp ftpuser@server-ip

Se temos varias claves e queremos escoller a que utilizar, executaremos:

sftp -i /path/to/key ftpuser@server-ip

-i /path/to/key: indica a clave que queremos usar.

Xestionando varias conexións con distintas claves

No caso de que teñamos distintas claves almacenadas, para conectar a distintos servidores, como vimos podemos conectar utilizando a bandeira -i. Pero en canto a cousa medre un pouco, xa se fai máis complicado. Xa que teremos que lembrar as distintas claves, cal corresponde a onde, a qué usuario, etc.

Por sorte para nós, hai unha forma de resumir isto no noso sistema favorito. Creando configuracións. Para facelo, chega con crear un ficheiro config na carpeta .ssh da nosa home. Por exemplo con:

vim ~/.ssh/config

O contido deste ficheiro serán os distintos hosts aos que queiramos conectar. Como por exemplo o seguinte:

Host rp4
    Hostname 192.168.1.100
    IdentityFile ~/.ssh/id_rsa
    IdentitiesOnly yes
    User pi
    Port 22

Aquí definimos un destino chamado rp4, apuntando a unha IP. Seleccionando que ficheiro de clave privada usar. Con IdentitiesOnly yes indicamos que só se use ca identidade que proveemos. Evitando que ssh probe con outras. Por último dicimos que o usuario será pi e porto a utilizar será o 22.

Un exemplo máis complexo pode ser o seguinte:

Host rp4
    Hostname 192.168.1.100
    User pi
Host rp3
    Hostname 192.168.1.101
    User angel
Host *
    IdentityFile ~/.ssh/id_rsa
    IdentitiesOnly yes
    Port 22

Agora estamos a definir dous destinos rp4 e rp3. Cada un con cadanseu usuario e dirección IP. Pero a parte interesante deste ficheiro son as catro últimas liñas.
Con Host * estamos a marcar calquer host. Polo que as seguintes liñas aplicarán a todo-los hosts. Así evitamos ter que repetir as configuracións, por cada un deles. Neste caso ambos destinos compartirían o ficheiro de claves, evitamos que probe con outras identidades e marcamos o porto 22.

NOTA: Estes ficheiros están copiados directamente do blog de uGeek, no artigo Simplifica o abrevia tus conexiones ssh.

Por último, para conectar agora a algún destes servidores, basta executar:

ssh rp4

Ou se queremos facelo por SFTP, basta:

sftp rp3

Conclusión e peche

Ter distintos usuarios, con distintas responsabilidades e permisos no sistema, é un bo xeito de protexernos. Evitando ter que usar un usuario con demasiados permisos, por exemplo un administrador. Neste artigo creamos un usuario, que non terá acceso á unha shell, tan só acceso FTP a un directorio. Polo que no caso de verse comprometido, o dano estará contido. Isto non quere dicir que nos descoidemos. Compre revisar de cando en cando os logs, para detectar intentos de intrusión, con este ou calquer outro usuario do noso sistema.

No seguinte artigo veremos como crear unha copia de seguridade utilizando este FTP, co programa Borgbackup.

Fontes

Howtoforge: https://howtoforge.es/como-instalar-y-utilizar-sftp-en-servidores-linux/
uGeek: Simplifica o abrevia tus conexiones ssh