Projet

Général

Profil

Fat Client without desktop » Historique » Version 18

« Précédent - Version 18/19 (diff) - Suivant » - Version actuelle
Laurent Flori, 15/01/2018 15:54


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

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

Préparer le serveur

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

ssh-keygen -t rsa

Installer les paquets nécessaires

apt-get install dnsmasq pxelinux squashfs-tools nbd-server ltsp-server debootstrap systemd-journal-remote

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:

mkdir -p /var/log/journal/remote
chown -R systemd-journal-remote /var/log/journal/remote/

Créer un fichier /root/make_certs avec le contenu suivant

#!/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

Générer les certficats

chmod +x make_certs && ./make_certs

Mettre en place les clefs pour le serveur

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/

Editer la configuration du service systemd-journal-remote:

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

Redémarrer le serveur systemd-journal-remote

systemctl restart systemd-journal-remote

Configuration (très minimale) du serveur dnsmasq

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

Créer les répertoires tftp

mkdir -p /var/lib/tftpboot/ltsp/Eole

Redémarrer le server dnsmasq
systemctl restart dnsmasq

Configuration de l'environement de construction des images lstp

Se rendre dans le répertoire /usr/share/ltsp/plugins/ltsp-build-client/:

cd /usr/share/ltsp/plugins/ltsp-build-client/
cp -a Ubuntu Eole && cd Eole

Supprimer un plugin (on ne veut jamais de serveur graphique)

rm 030-artwork

On crée trois plugins:

- Gérer correctement le path nbdroot au boot
- Créer et gérer l'option

cat > 040-manage-boot-options << 'EndPlugin'
#Gestion du path nbd pour l'image embarquée
#Adding option for push to ram and option for ram_size if push_toram
case "$MODE" in
    commandline)
            add_option "push-toram" "`eval_gettext "push squashfs to ram"`" "advanced" "false" 
            add_option "ram-size" "`eval_gettext "ram size for /cow"`" "advanced" "true" 
            ;;
    configure)
            if [ -n "$option_push_toram_value" ]; then
                PUSH_TORAM=true
            fi
            if [ -n "$option_ram_size_value" ]; then
                RAM_SIZE=$option_ram_size_value
            else
                RAM_SIZE=600M
            fi
            ;;
    after-install)
        #CMDLINE_LINUX_DEFAULT
        if [ $PUSH_TORAM ];then
                sed -i 's?CMDLINE_LINUX_DEFAULT="init=/sbin/init-ltsp forcepae"?CMDLINE_LINUX_DEFAULT="init=/sbin/init ltsp LTSP_NBD_TO_RAM=true"?' $BASE/$CHROOT/etc/ltsp/update-kernels.conf
        sed -i "s?mount -t tmpfs -o mode=0755 tmpfs /cow?mount -t tmpfs -o mode=0755,size=${RAM_SIZE} tmpfs /cow?" /usr/share/initramfs-tools/scripts/init-bottom/ltsp
        fi
        sed -i 's?CMDLINE_NBD.*$?CMDLINE_NBD="root=/dev/nbd0 nbdroot='$NBDSERVER${BASE%/}/$CHROOT'"?' $BASE/$CHROOT/etc/ltsp/update-kernels.conf
        ;;
esac

EndPlugin

- Paramétrer le serveur ssh

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
                    sed -i 's?^root?#root?' /etc/ltsp/ltsp-update-image.excludes
            fi
        ;;
esac

EndPlugin

- Paramétrer le remote logging

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


Préparer un fichier de construction pour le client:
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 systemd-journal-remote" 
LATE_PACKAGES="openssh-server libvirt-bin bridge-utils iproute2 ebtables dnsmasq" 
EOF

Lancer la génération de l'image

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

Lancer la consultation des logs sur le le serveur

journalctl -D /var/log/journal/remote/ -f

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