Accesso a repository APT privato con SSH » Cronologia » Versione 5
« Precedente |
Versione 5/9
(diff)
| Successivo »
Simone Piccardi, 18-03-2021 17:07
Accesso a repository APT privato con SSH¶
Esistono casi in cui può essere necessario fornire accesso a terzi ad un repository APT privato, ad esempio per fare utilizzare pacchetti sperimentali che non devono essere distribuiti pubblicamente.
In tal caso però restringere gli accessi ad un repository APT per l'usuale scaricamento dei pacchetti via HTTP comporta il problema di come autenticare gli utenti, con l'ulteriore problema di dover passare all'uso di HTTPs per evitare di trasmettere le credenziali di accesso in chiaro. Per risolvere il problema in maniera più pulita si può sfruttare una funzionalità poco nota di APT: la distribuzione dei pacchetti via SSH.
Il vantaggio dell'uso di SSH come metodo di scaricamento è che è possibile fare utilizzare ai client una autenticazione a chiavi, evitando la necessità di creare e gestire utenze e credenziali di autenticazione sul server.
Per evitare però di fornire ai client un accesso utente in shell sul server occorrerà configurare il servizio in modo che l'utente prescelto sia utilizzabile soltanto per eseguire il download dei pacchetti tramite APT.
La configurazione di un utente dedicato in una chroot¶
Per realizzare questo requisito predisporremo un utente dedicato al servizio, readrepo
operante all'interno di un chroot in cui verrà installato esclusivamente lo stretto necessario. Il primo passo è creare l'utente con:
useradd -m readrepo
e non si deve impostare una password, perché l'accesso sarà possibile soltanto tramite autenticazione a chiavi.
Il passo successivo è la preparazione di /home/readrepo/
come gabbia chroot, anzitutto occorre rendere la directory di proprietà di root
e non dell'utente stesso, con:
chown -R root.root /home/readrepo/
si dovranno poi creare le sottodirectory necessarie ai programmi da installare nel chroot con:
mkdir /home/readrepo/{debian,dev,lib,lib64,bin,lib/x86_64-linux-gnu}
ed i file di dispositivo con:
mknod -m 666 /home/readrepo/dev/null c 1 3 mknod -m 666/home/readrepo/dev/tty c 5 0 mknod -m 666 /home/readrepo/dev/zero c 1 5 mknod -m 666 /home/readrepo/dev/random c 1 8
Infine si dovranno copiare i binari e le librerie di sistema dei programmi usati da APT: questi sono sh
, bash
, dd
e find
, che andranno copiati sotto /home/readrepo/bin
. Le rispettive librerie possono essere trovate, per ciascuno di essi, con qualcosa del tipo:
root@archive:~# ldd $(which bash) linux-vdso.so.1 (0x00007fff497e5000) libtinfo.so.6 => /lib/x86_64-linux-gnu/libtinfo.so.6 (0x00007f7291b3b000) libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f7291b36000) libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f7291975000) /lib64/ld-linux-x86-64.so.2 (0x00007f7291c9c000)
e per ciascuno si dovranno copiare le librerie mostrate dal comando (non linux-vdso.so.1
) nelle corrispondenti directory sotto /home/readrepo
.
Infine di dovrà creare la directory .ssh
ed il file .ssh/authorized_keys
con permessi adeguati per dare accesso all'utente, questo si può fare con:
mkdir -m 750 /home/readrepo/.ssh touch /home/readrepo/.ssh/authorized_keys chmod 640 /home/readrepo/.ssh/authorized_keys chgrp -R readrepo /home/readrepo/.ssh
le chiavi autorizzate all'uso dell'utente dovranno poi essere aggiunte manualmente (dall'amministratore) al file .ssh/authorized_keys
Tutta questa procedura può essere automatizzata usando lo script allegato che prende come argomento lo script sshaptchroot.sh
allegato alla pagina, che prende come argomento l'utente da creare ed effettua tutte le operazioni precedentemente descritte in maniera automatica (in particolare le copie delle librerie necessarie).
La configurazione di SSH sul server¶
Una volta creata la chroot si potrà indicare ad SSH di utilizzarla sfruttando la direttiva ChrootDirectory
da applicare all'utente prescelto.
Per questo occorre aggiungere in coda a /etc/ssh/sshd_config
le righe seguenti:
#Added for chroot test Match User readrepo ChrootDirectory /home/readrepo
Si tenga presente che l'indicazione di inserire le righe in coda al file è essenziale, perché l'uso della direttiva Match
usata per selezionare l'utente si applica a tutte le direttive seguenti, a meno che non si incontri un'altra Match
o una direttiva Host
, quindi se ci sono altre configurazioni generali da aggiungere a /etc/ssh/sshd_config
andranno inserite prima di questa.
Troubleshooting¶
Una volta completate le configurazioni precedenti si potrà provare ad accedere al nuovo utente.
Si dovrà aggiungere la propria chiave pubblica al file /home/readrepo/.ssh/authorized_keys
sul server, ed a quel punto ci si potrà collegare con SSH, ottenendo una shell, in cui verificare che sono utilizzabili solo i comandi indicati in precedenza (e i builtin di shell), ad esempio:
-bash-4.4$ pwd / -bash-4.4$ ls -bash: ls: command not found -bash-4.4$ find . ./lib64 ./lib64/ld-linux-x86-64.so.2 ... ./bin ./bin/sh ./bin/bash ./bin/dd ./bin/find ./.ssh ./.ssh/authorized_keys
La pubblicazione del repository¶
Per fornire ad APT l'accesso al repository con il nuovo utente occorre infine pubblicare lo stesso all'interno del chroot . Per questo abbiamo creato in precedenza la directory /home/readrepo/debian
, dove potremo copiare i file del repository, avendo comunque cura che questi non siano scrivibili dall'utente.
Se il repository è gestito in maniera indipendente (ad esempio usando reprepro
con un altro utente) la cosa più semplice è effettuare un bind mount della directory dello stesso su /home/readrepo/debian
con:
mount --bind /directory/of/apt/repository /home/readrepo/debian/
che si potrà rendere permanente ad esempio inserendo in /etc/fstab
una voce del tipo:
/directory/of/apt/repository /home/readrepo/debian/ none bind 0 0
Configurazione delle sorgenti sul client¶
Per indicare ad APT di usare una fonte con SSH si dovrà utilizzare all'interno di sources.list
una indicazione dell'uso del repository con una riga nella forma:
deb ssh://readrepo@archive.truelite.it:/debian buster-truelite main
occorrerà inoltre abilitare la funzionalità di accesso ai repository via SSH aggiungendo in /etc/apt/apt.conf.d/99localssh
un contenuto del tipo:
Dir::Bin::Methods::ssh "ssh";
Configurazione dell'accesso all'utente per il repository¶
Per poter utilizzare l'accesso precedente occorre che l'utente che esegue APT sul client (root) sia in grado di collegarsi con autenticazione a chiavi verso il server indicato, il vantaggio di usare SSH è che, oltre a poter usare solo una chiave pubblica, è che si possono sfruttare anche funzionalità funzionalità avanzate di SSH. In particolare si può fornire ai client una coppia chiavi specifica da utilizzare solo per questa connessione, fornire un accesso ad una macchina in una rete privata tramite "rimbalzo" da un'altra macchina (come illustrato su Accesso SSH a rete interna tramite bastion host), ecc.
Per questo è sempre opportuno predisporre una opportuna configurazione in .ssh/config
sul client, necessaria anche qualora si voglia utilizzare una porta non standard, mantenendo identica la sintassi dentro sources.list
, ad esempio:
... Host archive.truelite.it Port 2222 IdentityFile .ssh/archive_repo_key ...
Aggiornato da Simone Piccardi oltre 3 anni fa · 5 revisions