Accesso a repository APT privato con SSH » Cronologia » Versione 9
Simone Piccardi, 21-04-2021 13:20
1 | 1 | Simone Piccardi | h1. Accesso a repository APT privato con SSH |
---|---|---|---|
2 | |||
3 | 9 | 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 | 9 | Simone Piccardi | Restringere gli accessi ad un repository APT con 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 | 9 | Simone Piccardi | Per realizzare questo requisito predisporremo un utente dedicato al servizio, @readrepo@, operante all'interno di una chroot in cui verrà installato esclusivamente lo stretto necessario. Il primo passo è creare l'utente con: |
14 | 2 | Simone Piccardi | |
15 | 1 | Simone Piccardi | <pre> |
16 | 2 | Simone Piccardi | useradd -m readrepo |
17 | 1 | Simone Piccardi | </pre> |
18 | 2 | Simone Piccardi | |
19 | 9 | Simone Piccardi | e non si deve impostare una password, perché l'accesso dovrà essere possibile soltanto tramite autenticazione a chiavi. |
20 | 2 | Simone Piccardi | |
21 | 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: |
||
22 | |||
23 | <pre> |
||
24 | chown -R root.root /home/readrepo/ |
||
25 | </pre> |
||
26 | |||
27 | si dovranno poi creare le sottodirectory necessarie ai programmi da installare nel chroot con: |
||
28 | |||
29 | <pre> |
||
30 | mkdir /home/readrepo/{debian,dev,lib,lib64,bin,lib/x86_64-linux-gnu} |
||
31 | </pre> |
||
32 | |||
33 | ed i file di dispositivo con: |
||
34 | |||
35 | <pre> |
||
36 | mknod -m 666 /home/readrepo/dev/null c 1 3 |
||
37 | 7 | Simone Piccardi | mknod -m 666 /home/readrepo/dev/tty c 5 0 |
38 | 2 | Simone Piccardi | mknod -m 666 /home/readrepo/dev/zero c 1 5 |
39 | mknod -m 666 /home/readrepo/dev/random c 1 8 |
||
40 | </pre> |
||
41 | |||
42 | 9 | Simone Piccardi | 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 usando il comando @ldd@, con qualcosa del tipo: |
43 | 2 | Simone Piccardi | |
44 | <pre> |
||
45 | root@archive:~# ldd $(which bash) |
||
46 | linux-vdso.so.1 (0x00007fff497e5000) |
||
47 | libtinfo.so.6 => /lib/x86_64-linux-gnu/libtinfo.so.6 (0x00007f7291b3b000) |
||
48 | libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f7291b36000) |
||
49 | libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f7291975000) |
||
50 | /lib64/ld-linux-x86-64.so.2 (0x00007f7291c9c000) |
||
51 | </pre> |
||
52 | |||
53 | 9 | Simone Piccardi | Il comando @ldd@ elenca tutte le librerie usate da un programma, che sono quelle che dovranno essere copiate all'interno del chroot. Questo significa che per ciascuna delle voci della lista precedente va copiato il file che viene indicato come contenente la libreria (riportato con il suo pathname assoluto dopo @=>@) nella corrispondente directory sotto @/home/readrepo@. Tutto questo con l'eccesione di @linux-vdso.so.1@ che in realtà non indica una libreria ma l'entry-point del kernel, ed è comunque disponibile (per questo nell'output non è accompagnato da nessun riferimento ad un file). L'operazione va ripetuta per tutti i comandi elencati in precedenza. |
54 | 2 | Simone Piccardi | |
55 | 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: |
||
56 | |||
57 | <pre> |
||
58 | mkdir -m 750 /home/readrepo/.ssh |
||
59 | touch /home/readrepo/.ssh/authorized_keys |
||
60 | chmod 640 /home/readrepo/.ssh/authorized_keys |
||
61 | chgrp -R readrepo /home/readrepo/.ssh |
||
62 | </pre> |
||
63 | |||
64 | 7 | Simone Piccardi | le chiavi autorizzate all'uso dell'utente dovranno poi essere aggiunte manualmente (dall'amministratore) al file @.ssh/authorized_keys@. |
65 | 2 | Simone Piccardi | |
66 | 9 | Simone Piccardi | Tutta questa procedura può essere automatizzata usando lo script @sshaptchroot.sh@ allegato alla pagina, che prende come argomento l'utente da creare ed effettua tutte le operazioni precedentemente descritte (in particolare automatizza la copia delle librerie necessarie). |
67 | 2 | Simone Piccardi | |
68 | 3 | Simone Piccardi | h2. La configurazione di SSH sul server |
69 | 1 | Simone Piccardi | |
70 | 3 | Simone Piccardi | Una volta creata la chroot si potrà indicare ad SSH di utilizzarla sfruttando la direttiva @ChrootDirectory@ da applicare all'utente prescelto. |
71 | 1 | Simone Piccardi | |
72 | 3 | Simone Piccardi | Per questo occorre aggiungere in coda a @/etc/ssh/sshd_config@ le righe seguenti: |
73 | |||
74 | 2 | Simone Piccardi | <pre> |
75 | #Added for chroot test |
||
76 | Match User readrepo |
||
77 | ChrootDirectory /home/readrepo |
||
78 | 1 | Simone Piccardi | </pre> |
79 | 2 | Simone Piccardi | |
80 | 4 | Simone Piccardi | 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. |
81 | 1 | Simone Piccardi | |
82 | 9 | Simone Piccardi | h2. Verifiche |
83 | 3 | Simone Piccardi | |
84 | 4 | Simone Piccardi | Una volta completate le configurazioni precedenti si potrà provare ad accedere al nuovo utente. |
85 | 1 | Simone Piccardi | |
86 | 4 | Simone Piccardi | 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: |
87 | |||
88 | 3 | Simone Piccardi | <pre> |
89 | -bash-4.4$ pwd |
||
90 | / |
||
91 | -bash-4.4$ ls |
||
92 | -bash: ls: command not found |
||
93 | -bash-4.4$ find |
||
94 | . |
||
95 | ./lib64 |
||
96 | ./lib64/ld-linux-x86-64.so.2 |
||
97 | ... |
||
98 | ./bin |
||
99 | ./bin/sh |
||
100 | ./bin/bash |
||
101 | ./bin/dd |
||
102 | ./bin/find |
||
103 | ./.ssh |
||
104 | ./.ssh/authorized_keys |
||
105 | </pre> |
||
106 | |||
107 | 1 | Simone Piccardi | |
108 | 3 | Simone Piccardi | h2. La pubblicazione del repository |
109 | 1 | Simone Piccardi | |
110 | 9 | Simone Piccardi | 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, per maggior precauzione, che questi non siano scrivibili dall'utente. |
111 | 3 | Simone Piccardi | |
112 | 9 | Simone Piccardi | Se il repository è gestito in maniera indipendente (ad esempio usando @reprepro@ con un altro utente) la cosa più semplice è effettuare un _bind mount_ in sola lettura della directory dello stesso su @/home/readrepo/debian@. In generale, assumendo di avere un repository debian già configurato in @/directory/of/apt/repository@, occorrerà eseguire il comando: |
113 | 4 | Simone Piccardi | |
114 | 1 | Simone Piccardi | <pre> |
115 | 8 | Simone Piccardi | mount -o ro --bind /directory/of/apt/repository /home/readrepo/debian/ |
116 | 3 | Simone Piccardi | </pre> |
117 | |||
118 | 9 | Simone Piccardi | Il _bind mount_ si potrà rendere permanente inserendo in @/etc/fstab@ una voce del tipo: |
119 | 3 | Simone Piccardi | |
120 | <pre> |
||
121 | 8 | Simone Piccardi | /directory/of/apt/repository /home/readrepo/debian/ none bind,auto,ro 0 0 |
122 | 3 | Simone Piccardi | </pre> |
123 | 2 | Simone Piccardi | |
124 | h2. Configurazione delle sorgenti sul client |
||
125 | |||
126 | 4 | Simone Piccardi | 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: |
127 | 2 | Simone Piccardi | |
128 | <pre> |
||
129 | 1 | Simone Piccardi | deb ssh://readrepo@archive.truelite.it:/debian buster-truelite main |
130 | </pre> |
||
131 | 2 | Simone Piccardi | |
132 | 9 | 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: |
133 | 1 | Simone Piccardi | |
134 | <pre> |
||
135 | Dir::Bin::Methods::ssh "ssh"; |
||
136 | </pre> |
||
137 | |||
138 | 4 | Simone Piccardi | h2. Configurazione dell'accesso all'utente per il repository |
139 | |||
140 | 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. |
||
141 | |||
142 | 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: |
||
143 | |||
144 | <pre> |
||
145 | ... |
||
146 | Host archive.truelite.it |
||
147 | Port 2222 |
||
148 | IdentityFile .ssh/archive_repo_key |
||
149 | ... |
||
150 | </pre> |