Projet

Général

Profil

Fat Client without desktop » Historique » Version 13

Version 12 (Laurent Flori, 21/12/2017 10:38) → Version 13/19 (Laurent Flori, 21/12/2017 10:39)

h1. Client lourd sans bureau graphique et log centralisés sur le serveur

* Démarrer une machine en pxe
* Monter le root filesystem depuis ndb
* Installer et configurer ssh-server
* Gestion des logs centralisés

Pour reproduire instancier une machine aca eolebase 2.6.2 (NON instanciée) avec une seconde interface sur le réseau pédago1
<pre>
cat >> /etc/network/interfaces << EOF
auto ens5
iface ens5 inet static
address 10.1.2.254
netmask 255.255.255.0
EOF
ifup ens5
Query-Auto
</pre>

h3. Préparer le serveur

Génrérer une pare de clefs ssh pour root

<pre>
ssh-keygen -t rsa
</pre>

Installer les paquets nécessaires

<pre>
apt-get install dnsmasq pxelinux squashfs-tools nbd-server ltsp-server debootstrap systemd-journal-remote
</pre>

Configuration du serveur de log

- Créer et donner les droits adéquats au répertoire de destination pour les logs des hôtes distants:
<pre>
mkdir -p /var/log/journal/remote
chown -R systemd-journal-remote /var/log/journal/remote/
</pre>

Créer un fichier /root/make_certs avec le contenu suivant
<pre>
#!/bin/bash

SERVER=10.1.2.254
CLIENT=client

mkdir -p certs/{server,client} && cd certs

openssl req -newkey rsa:2048 -days 3650 -x509 -nodes -out ca.pem -keyout ca.key -subj '/CN=Certificate authority/'

cat >ca.conf <<EOF
[ ca ]
default_ca = this

[ this ]
new_certs_dir = .
certificate = ca.pem
database = ./index
private_key = ca.key
serial = ./serial
default_days = 3650
default_md = default
policy = policy_anything

[ policy_anything ]
countryName = optional
stateOrProvinceName = optional
localityName = optional
organizationName = optional
organizationalUnitName = optional
commonName = supplied
emailAddress = optional
EOF

touch index
echo 0001 >serial

#Server
openssl req -newkey rsa:1024 -nodes -out ./server/$SERVER.csr -keyout ./server/$SERVER.key -subj "/CN=$SERVER/"
openssl ca -batch -config ca.conf -notext -in ./server/$SERVER.csr -out ./server/$SERVER.pem

#Client
openssl req -newkey rsa:1024 -nodes -out ./client/$CLIENT.csr -keyout ./client/$CLIENT.key -subj "/CN=$CLIENT/"
openssl ca -batch -config ca.conf -notext -in ./client/$CLIENT.csr -out ./client/$CLIENT.pem
</pre>

Générer les certficats
<pre>
chmod +x make_certs && ./make_certs
</pre>

Mettre en place les clefs pour le serveur

<pre>
mkdir /etc/ssl/journal
cp /root/certs/ca.pem /etc/ssl/journal/
cp /root/certs/server/10.1.2.254{.key,.pem} /etc/ssl/journal/
</pre>

Editer la configuration du service systemd-journal-remote:
<pre>
cat > /etc/systemd/journal-remote.conf << EOF
[Remote]
Seal=false
SplitMode=host
ServerKeyFile=/etc/ssl/journal/10.1.2.254.key
ServerCertificateFile=/etc/ssl/journal/10.1.2.254.pem
TrustedCertificateFile=/etc/ssl/journal/ca.pem
EOF
</pre>

Redémarrer le serveur systemd-journal-remote
<pre>
systemctl restart systemd-journal-remote
</pre>

Configuration (très minimale) du serveur dnsmasq

<pre>
cp /etc/dnsmaq.conf /etc/dnsmasq.conf.orig
cat > /etc/dnsmasq.conf << EOF
dhcp-boot=pxelinux.0
dhcp-range=10.1.2.10,10.1.2.50,12h
enable-tftp
interface=ens5
tftp-root=/var/lib/tftpboot/ltsp/Eole
EOF
</pre>

Créer les répertoires tftp
<pre>
mkdir -p /var/lib/tftpboot/ltsp/Eole
</pre>
Redémarrer le server dnsmasq
<pre>
systemctl restart dnsmasq
</pre>

h4. Configuration de l'environement de construction des images lstp

Se rendre dans le répertoire /usr/share/ltsp/plugins/ltsp-build-client/:
<pre>
cd /usr/share/ltsp/plugins/ltsp-build-client/
cp -a Ubuntu Eole && cd Eole
</pre>

Supprimer un plugin (on ne veut jamais de serveur graphique)
<pre>
rm 030-artwork
</pre>
On crée trois plugins:

- Gérer correctement le path nbdroot au boot

<pre>
cat > 031-nbd-root << 'EndPlugin'
#Gestion du path nbd pour l'image embarquée
case "$MODE" in
after-install)
sed -i 's?CMDLINE_NBD.*$?CMDLINE_NBD="root=/dev/nbd0 nbdroot='$NBDSERVER${BASE%/}/$CHROOT'"?' $BASE/$CHROOT/etc/ltsp/update-kernels.conf
;;
esac

EndPlugin

</pre>

- Paramétrer le serveur ssh

<pre>
cat > 050-ssh-custom << 'EndPlugin'
#Gestion du serveur ssh:
# - activation
# - connexion du root par clef
# - copie de la clef du root
case "$MODE" in
commandline)
add_option "root-ssh-pubkey" "`eval_gettext "enable root access pubkey"`" "advanced" "true"
;;
configure)
if [ -n "$option_root_ssh_pubkey_value" ]; then
ROOT_SSH_PUBKEY="$option_root_ssh_pubkey_value"
fi
;;
finalization)
if [ $ROOT_SSH_PUBKEY ];then
echo "Enabling SSH server"
sed -i 's/^ssh/#ssh/' $BASE/$CHROOT/usr/share/ltsp/init-ltsp.d/50-rm-system-services
sed -i 's/^#PermitRootLogin/PermitRootLogin/' $BASE/$CHROOT/etc/ssh/sshd_config
mkdir $BASE/$CHROOT/root/.ssh
cat $ROOT_SSH_PUBKEY > $BASE/$CHROOT/root/.ssh/authorized_keys
sed -i 's?^etc/ssh/?#etc/ssh/?' /etc/ltsp/ltsp-update-image.excludes
fi
;;
esac

EndPlugin

</pre>

- Paramétrer le remote logging

<pre>
cat > 060-systemd-journal-upload << 'EndPlugin'
case "$MODE" in
commandline)
add_option "remote-journald" "`eval_gettext "send logs to server"`" "advanced" "true"
;;
configure)
if [ -n "$option_remote_journald_value" ]; then
REMOTE_JOURNALD="$option_remote_journald_value"
fi
;;
after-install)
if [ $REMOTE_JOURNALD ];then
mkdir -p $ROOT/etc/ssl/journal/
cp /root/certs/ca.pem $ROOT/etc/ssl/journal/
cp /root/certs/client/client{.pem,.key} $ROOT/etc/ssl/journal/
cat > $ROOT/etc/systemd/journal-upload.conf << EOF
[Upload]
URL=$REMOTE_JOURNALD
ServerKeyFile=/etc/ssl/journal/client.key
ServerCertificateFile=/etc/ssl/journal/client.pem
TrustedCertificateFile=/etc/ssl/journal/ca.pem
EOF
chroot $ROOT systemctl enable systemd-journal-upload
fi
;;
esac

EndPlugin

</pre> <pre>
Préparer un fichier de construction pour le client:

<pre>
cat > /etc/ltsp/ltsp-build-client.conf << 'EOF'
VENDOR=Eole
ARCH=amd64
BASE=/opt/ltsp
CHROOT=${VENDOR}
MIRROR="http://test-eole.ac-dijon.fr/ubuntu/"
EXTRA_MIRROR="http://eole.ac-dijon.fr/eole eole-2.6.2 main cloud"
APT_KEYS="/etc/apt/trusted.gpg.d/eole-archive-keyring.gpg"
DIST=artful
APT_GET_OPTS="-y --no-install-recommends"
FAT_CLIENT_DESKTOPS="tmux"
EARLY_PACKAGES="ltsp-client-core"
LATE_PACKAGES="openssh-server systemd-journal-remote"
EOF
</pre>

Lancer la génération de l'image

<pre>
ltsp-build-client --config /etc/ltsp/ltsp-build-client.conf --remote-journald=10.1.2.254 --root-ssh-pubkey=/tmp/id_rsa.pub
</pre>

Lancer la consultation des logs sur le le serveur
<pre>
journalctl -D /var/log/journal/remote/ -f
</pre>

Démarrer une machine en PXE et regarder les logs arriver sur le serveur