Wiki Ubuntu-it

Indice
Partecipa
FAQ
Wiki Blog
------------------
Ubuntu-it.org
Forum
Chiedi
Chat
Cerca
Planet
  • Pagina non alterabile
  • Informazioni
  • Allegati

RoadHouse - Progetto

Ho effettuato alcune configurazioni sul nuovo server RoadHouse. Vertono principalmente su due punti: creazione di container per l'installazione di servizi in ambienti isolati e frontend caching proxy per smistare il traffico web ai vari container.

Struttura

  • RoadHouse.png

I vari container comunicano in una loro rete interna abbinata all'interfaccia lxcbr0. Il server Varnish riceve le richieste dall'esterno e fa da proxy verso i vari container. I container non sono accessibili direttamente dall'esterno (hanno un ip privato interno)

LXC

LXC (Linux Containers http://lxc.sourceforge.net/ ) è un progetto che permette, utilizzando chroot e le funzionalità del kernel denominate cgroups, di creare degli ambienti di esecuzione totalmente isolati dal resto del sistema. Nel nostro progetto l'idea è di dedicare ad ogni singolo servizio un container separato, in modo da poter procedere in modo indipendente ad aggiornamenti, patch ecc ecc senza impattare sugli altri servizi.

Rete

E' stata creata un interfaccia lxcbr0, un bridge interno alla macchina alla cui rete si collegheranno tutti i container, partecipando alla rete 10.78.88.0/24.

I container hanno accesso all'esterno, attraverso NAT effettuato dal firewall di RoadHouse.

Accesso

L'accesso ai container creati si ha prima collegandosi a RoadHouse e poi effettuando ssh verso l'ip privato del container (TODO: nattare le porte ssh verso l'esterno per evitare questo salto?)

Container attivi

  • bromuro: sito web di prova
  • custer: cdimages
  • mail: ?
  • spock: gitlab
  • xpocalypse: progetto xpocalypse

Tools

Le macchine sono create con lo script lxc-debootstrap che a partire da un semplice file di configurazione, crea la macchina a partire da una root creata con debootstrap ed effettuando alcune modifiche per girare in lxc.

Il tool deve essere eseguito da root. Per maggiori informazioni si rimanda al README abbinato.

**da completare** attualmente ho creato dei volumi su file per fare dei container con filesystem limitato. Partito da questo link mounting a file as filesystem e mknod permanent

L'avvio e lo stop delle macchine virtual può essere fatto da root con i comandi che trovate nella guida ufficiale di LXC nel wiki di ubuntu (o qualsiasi altra guida).

Varnish

Varnish è un caching proxy frontend server. Il suo scopo nel progetto sarà di ricevere dall'esterno le connessioni degli utenti e passare le richieste al container appropriato. Inoltre effettuerà caching dei, riducendo quindi la quantità di risorse necessarie specialmente per la riesecuzione di pagine dinamiche (es. php o python) che non sono nel frattempo variate.

Isolamento degli utenti

Gli utenti che dovranno connettersi ai container dovranno prima di tutto collegarsi a roadhouse, poi da li fare ssh verso l'host a cui sono autorizzati. Per evitare di dare un ambiente troppo aperto sulla macchina roadhouse gli utenti saranno isolati in un ambiente ristretto con shel rbash (restricted bash).

L'utente viene creato in questo modo

useradd --comment "Restricted shell user" --shell /bin/rbash --create-home --home-dir /home/newuser newuser

e poi ne viene impostata la password as usual con passwd

Nella home verranno poi cancellati tutti i file contenuti (anche quelli nascosti) e creato una cartella bin e un file .profile.

.profile:

export PATH=$HOME/bin
export PS1="[\u@\h \W]$ "

La cartella bin invece deve essere fatta in questo modo:

mkdir bin
ln -s /usr/bin/ssh bin/ssh
ln -s /usr/bin/ssh-keygen bin/ssh-keygen
ln -s /usr/local/bin/take-my-key bin/take-my-key
# Se serve dare accesso diretto ssh a delle macchine backend (esempio per git) linkare anche nc
ln -s /bin/nc bin/nc

In questo modo i comandi ammessi saranno solo ssh, ssh-keygen e take-my-key

take-my-key

lo script take-my-key non fa altro che copiare la propria chiave pubblica in /keys/username.pub

Distribuzione delle chiavi

Per distribuire le chiavi nei container c'è uno script che si chiama synkeys. La configurazione di questo file è fatta nel file CSV /keys/authorizations con la seguente struttura:

User,server1,server2,server3
remixtj,root,helios,,

dove remixtj e il nome dell'utente roadhouse (con corrispondente chiave /keys/remixtj.pub), e i campi successivi sono l'utente che può impersonare nel server remoto. In questo caso quindi remixtj può loggarsi come: root@server1, helios@server2, nessun accesso al server3.

Una volta eseguito lo script verranno lanciati i relativi comandi ssh-copy-id per allineare le chiavi.

TODO: manca un meccanismo per evitare i duplicati negli authorized_keys remoti, fare in modo che la chiave dell'utente con ci gira synkeys sia distribuita in tutti gli utenti creati nei container (nel template precise.amd64 è già caricata la chiave di root@roadhouse in /root/.ssh/authorized_keys), costruire il file authorizations a partire da una pagina del wiki.