Progetto

Generale

Profilo

Accesso a repository APT privato con SSH » Cronologia » Versione 3

Simone Piccardi, 18-03-2021 16:43

1 1 Simone Piccardi
h1. Accesso a repository APT privato con SSH
2
3 2 Simone Piccardi
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. 
4 1 Simone Piccardi
5 2 Simone Piccardi
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. 
6 1 Simone Piccardi
7 2 Simone Piccardi
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. 
8
9
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. 
10
11
h2. La configurazione di un utente dedicato in una chroot
12
13
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.  
14
Il primo passo è creare l'utente con:
15
16 1 Simone Piccardi
<pre>
17 2 Simone Piccardi
useradd -m readrepo
18
</pre>
19
20
e non si deve impostare una password,perché l'accesso sarà possibile soltanto tramite autenticazione a chiavi.
21
22
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:
23
24
<pre>
25
chown -R root.root /home/readrepo/
26
</pre>
27
28
si dovranno poi creare le sottodirectory necessarie ai programmi da installare nel chroot con:
29
30
<pre>
31
mkdir /home/readrepo/{debian,dev,lib,lib64,bin,lib/x86_64-linux-gnu}
32
</pre>
33
34
ed i file di dispositivo con:
35
36
<pre>
37
mknod -m 666 /home/readrepo/dev/null c 1 3
38
mknod -m 666/home/readrepo/dev/tty c 5 0
39
mknod -m 666 /home/readrepo/dev/zero c 1 5
40
mknod -m 666 /home/readrepo/dev/random c 1 8
41
</pre>
42
43
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:
44
45
<pre>
46
root@archive:~# ldd $(which bash)
47
	linux-vdso.so.1 (0x00007fff497e5000)
48
	libtinfo.so.6 => /lib/x86_64-linux-gnu/libtinfo.so.6 (0x00007f7291b3b000)
49
	libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f7291b36000)
50
	libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f7291975000)
51
	/lib64/ld-linux-x86-64.so.2 (0x00007f7291c9c000)
52
</pre>
53
54
e per ciascuno si dovranno copiare le librerie mostrate dal comando (non @linux-vdso.so.1@) nelle corrispondenti directory sotto @/home/readrepo@. 
55
56
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:
57
58
<pre>
59
mkdir -m 750 /home/readrepo/.ssh
60
touch /home/readrepo/.ssh/authorized_keys
61
chmod  640 /home/readrepo/.ssh/authorized_keys
62
chgrp -R readrepo /home/readrepo/.ssh
63
</pre>
64
65
le chiavi autorizzate all'uso dell'utente dovranno poi essere aggiunte manualmente (dall'amministratore) al file @.ssh/authorized_keys@
66
67
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).
68
69 3 Simone Piccardi
h2. La configurazione di SSH sul server
70 1 Simone Piccardi
71 3 Simone Piccardi
Una volta creata la chroot si potrà indicare ad SSH di utilizzarla sfruttando la direttiva @ChrootDirectory@ da applicare all'utente prescelto. 
72 1 Simone Piccardi
73 3 Simone Piccardi
Per questo occorre aggiungere in coda a  @/etc/ssh/sshd_config@ le righe seguenti:
74
75 2 Simone Piccardi
<pre>
76
#Added for chroot test
77
Match User readrepo
78
ChrootDirectory /home/readrepo
79 1 Simone Piccardi
</pre>
80 2 Simone Piccardi
81 3 Simone Piccardi
Si tenga presente 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@.
82 1 Simone Piccardi
83 3 Simone Piccardi
h2. Troubleshooting
84
85
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@, 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:
86
87
<pre>
88
-bash-4.4$ pwd
89
/
90
-bash-4.4$ ls
91
-bash: ls: command not found
92
-bash-4.4$ find
93
.
94
./lib64
95
./lib64/ld-linux-x86-64.so.2
96
...
97
./bin
98
./bin/sh
99
./bin/bash
100
./bin/dd
101
./bin/find
102
./.ssh
103
./.ssh/authorized_keys
104
</pre>
105
106
107
h2. La pubblicazione del repository
108
109
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 dello stesso, 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:
110
111
<pre>
112
mount --bind /directory/of/apt/repository /home/readrepo/debian/
113
</pre>
114
115
che si potrà rendere permanente ad esempio inserendo in @/etc/fstab@ una voce:
116
117
<pre>
118
/directory/of/apt/repository  /home/readrepo/debian/       none    bind                      0       0
119
</pre>
120 2 Simone Piccardi
121
h2. Configurazione delle sorgenti sul client
122
123
In tal caso si dovrà utilizzare all'interno di @sources.list@ una indicazione dell'uso del repository con una riga del tipo: 
124
125
<pre>
126 1 Simone Piccardi
deb ssh://readrepo@archive.truelite.it:/debian buster-truelite main
127
</pre>
128
129 2 Simone Piccardi
occorrerà inoltre abilitare la funzionalità di accesso ai repository via SSH aggiungendo in  @/etc/apt/apt.conf.d/99localssh@ un contenuto del tipo:
130
131 1 Simone Piccardi
<pre>
132
Dir::Bin::Methods::ssh "ssh";
133
</pre>
134
135 2 Simone Piccardi
h2.