Table des matières

< retour à la page de l'administration technique

Chaque serveur de FedeRez est configuré pour être mis à jour via apt-dater.

Comment faire les mises à jour ?

Le contrôleur se trouve actuellement sur carlosgon.

On se connecte au contrôleur en tant qu'user apt-dater via SSH.
Pour cela, on se crée une clé SSH personnelle (évidemment protégée par une passphrase), que l'on ajoute aux clés autorisées pour l'user apt-dater sur le contrôleur :

user@carlosgon : ssh-keygen -t ecdsa -b 521

en root (on peut utiliser la commande suivante pour passer en root : sudo -Es; on sort ensuite avec exit / Ctrl+D) :

cat ~$USER/.ssh/id_ecdsa.pub >> ~apt-dater/.ssh/authorized_keys

On peut alors faire :

ssh apt-dater@localhost

et utiliser apt-dater.

L'interface en ncurses est relativement simple, et il ne faut pas hésiter à lire la documentation en cas de doute.
Les machines sont triées par catégories, et il est conseillé de toujours commencer par mettre à jour des VM non critiques en premier, puis les VM critiques (passerelle, parefeu, BDD…), et enfin les hôtes de machines virtuelles.

À savoir : le R devant un hôte apt-dater signifie que cette machine nécessite un reboot.
Il faut soit s'y connecter et lancer un reboot dessus, soit le faire (pour une VM) depuis le virtualiseur, ce qui est moins propre mais plus pratique si il faut faire un reboot de masse.

On peut lancer une mise à jour d'un groupe de serveurs avec u et passer d'un serveur à l'autre avec n puis Ctrl+a, d pour sortir de chaque screen associé à un serveur.

Raccourci

Pour éviter de saisir toutes les commandes de connexion et d'avoir une clé sur era, on peut créer deux clés sur le client SSH. L'une servira pour une connexion classique au serveur, l'autre pour apt-dater. Dans le fichier de configuration SSH locale ~<you>/.ssh/config, mettre :

Host apt-dater
Hostname carlosgon.federez.net
User <you>
ForwardAgent yes
IdentityFile ~/.ssh/<identité_apt-dater_(rsa)>

Host carlosgon
Hostname carlosgon.federez.net
User <you>
IdentityFile ~/.ssh/<identité_serveurs>

L'option ForwardAgent transmet la clé utilisée pour la première connexion à l'agent du proxy pour pouvoir l'utiliser lors de la seconde connexion. C'est ainsi que l'on se passe d'une clé apt-dater sur era.

Ensuite, on demande à era de d'exécuter certaines actions lorsque l'on offre la première clé. Dans ~<you>/.ssh/authorized_keys sur carlosgon, en plus de mettre les deux clés publiques, on ajoute l'option command à la première.

command="ssh -t apt-dater@localhost apt-dater" ssh-rsa ...

Installation sur les hosts

Il est nécessaire de configurer chaque host pour que apt-dater puisse s'y connecter et le mettre à jour.

Installation manuelle

On installe tout simplement apt-dater-host

sudo apt-get install apt-dater-host

Puis on crée un utilisateur pour apt-dater

sudo useradd -r -m apt-dater
sudo adduser apt-dater ssh
sudo mkdir /home/apt-dater/.ssh
sudo chmod 700 /home/apt-dater/.ssh/ && sudo chown apt-dater:apt-dater /home/apt-dater/.ssh

On va ensuite donner le droit à cet utilisateur de faire juste ce dont on a besoin qu'il fasse

sudo visudo # pour éditer /etc/sudoers

Dans ce fichier on s'assure qu'il y ai

apt-dater ALL=NOPASSWD: /usr/bin/apt-get, /usr/sbin/needrestart

Pour que apt-dater puisse lancer apt-get et needrestart.

On va ensuite ajouter la clé ssh du contrôleur

sudo vim /home/apt-dater/.ssh/authorized_keys

La clé à copier est la suivante (à l'heure de l'écriture de cette doc, le contrôleur est sur carlosgon)

ecdsa-sha2-nistp521 AAAAE2VjZHNhLXNoYTItbmlzdHA1MjEAAAAIbmlzdHA1MjEAAACFBABiFSxq4uwdxLv6PoR3yDots5thriIXRWl2+2h1PVLfF2OhpoijdcOedKKATHlvbq5J7m8vwYV7kscEICMS1KoG1gA0E56aR47yY1e3XN1OnqmXQ/XbglsAaWouygURcevEQoPxso/Kei3wXTGFOcnjzQA311CMBUrOsZmqEy0lp84nrg== apt-dater@carlosgon

Ne pas oublier de changer l'owner du fichier…

sudo chown apt-dater:apt-dater /home/apt-dater/.ssh/authorized_keys

Il ne faut pas oublier d'ajouter la nouvelle machine au contrôleur !

Installation via Ansible

Il y a un rôle ansible pour faire ça : https://gitlab.federez.net/federez/ansible-apt-dater/. Il se lance avec le ansible federez.

Création d'un wrapper pour sécuriser apt-dater

Ce qui suit n'a jamais été aperçu en état de marche, il est donc déconseillé de l'appliquer sans autre forme de procès.

À placer dans /usr/local/bin/apt-dater-host-wrapper

#!/bin/sh
 
set -e
set -u
 
# Explicitly set the PATH to that of ENV_SUPATH in /etc/login.defs and unset
# various other variables. For details, see:
# https://wiki.ubuntu.com/SecurityTeam/AppArmorPolicyReview#Execute_rules
export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
export ENV=
export CDPATH=
 
LOGGER="/usr/bin/logger"
APT_DATER_HOST="$(which apt-dater-host)"
KILL="/bin/kill"
SLEEP="/bin/sleep"
 
# Install command allowed?
INSTALL_ALLOWED="false"
if [ "$#" -eq 1 ]; then
  if [ "$1" = "--install-allowed" ]; then
    INSTALL_ALLOWED="true"
  fi
fi
 
illegal_command() {
  # Do not log SSH_ORIGINAL_COMMAND for security reasons
  $LOGGER "$(basename $0) illegal command denied"
  # Default deny
  $KILL -9 $PPID
  exit 0
}
 
check_ssh_command() {
  if [ "$#" -lt 2 ]; then
    # not in the form of apt-dater-host upgrade
    illegal_command
  fi
 
  if [ "$1" != "apt-dater-host" ]; then
    # not invoking apt-dater-host
    illegal_command
  else
    # Remove the 1st arg with later replace it with the
    # fully qualified path to apt-dater-host
    shift
  fi
 
  COMMAND="$1"
  shift
 
  if [ "$COMMAND" = "refresh" -o "$COMMAND" = "kernel" ]; then
    $APT_DATER_HOST $COMMAND
  elif [ "$COMMAND" = "upgrade" ]; then
    # Don't kill the shell session right away when
    # upgrading/installing to please apt-dater
    $APT_DATER_HOST $COMMAND && $SLEEP 0.5
  elif [ "$COMMAND" = "install" ]; then
    if [ "$INSTALL_ALLOWED" = "true" ]; then
      # Don't kill the shell session right away when
      # upgrading/installing to please apt-dater
      $APT_DATER_HOST $COMMAND $* && $SLEEP 0.5
    else
      illegal_command
    fi
  fi
}
 
if [ -z "$SSH_ORIGINAL_COMMAND" ]; then
  illegal_command
fi
 
case "$SSH_ORIGINAL_COMMAND" in
  *\&*)
    illegal_command
    ;;
  *\(*)
    illegal_command
    ;;
  *\{*)
    illegal_command
    ;;
  *\;*)
    illegal_command
    ;;
  *\>*)
    illegal_command
    ;;
  *\`*)
    illegal_command
    ;;
  *\|*)
    illegal_command
    ;;
  apt-dater-host\ refresh)
    check_ssh_command $SSH_ORIGINAL_COMMAND
    ;;
  apt-dater-host\ upgrade)
    check_ssh_command $SSH_ORIGINAL_COMMAND
    ;;
  apt-dater-host\ install\ *)
    check_ssh_command $SSH_ORIGINAL_COMMAND
    ;;
  apt-dater-host\ kernel)
    check_ssh_command $SSH_ORIGINAL_COMMAND
    ;;
  *)
    illegal_command
    ;;
esac

En oubliant pas de le rendre exécutable:

chmod 0755 /usr/local/bin/apt-dater-host-wrapper

Le contrôleur

Le contrôleur se trouve sur carlosgon.

Note : cette section est fortement inspiré de la doc du Rézo Metz

Installation du contrôleur

sudo apt-get install apt-dater

On crée l'user apt-dater :

useradd -r -m apt-dater -g apt-dater
mkdir /home/apt-dater/.ssh
chmod 700 /home/apt-dater/.ssh/ && chown apt-dater:apt-dater /home/apt-dater/.ssh

On crée une clef SSH sur le contrôleur :

ssh-keygen -t ecdsa -b 521

Ensuite, on restreint l'utilisation du compte apt-dater à carlosgon en éditant /etc/security/access.conf pour avoir :

+ : apt-dater : localhost 127.0.0.1 ::1 carlosgon.federez.net
- : apt-dater : ALL

et /etc/pam.d/sshd pour décommenter :

account  required     pam_access.so

Ainsi, il sera nécessaire de rebondir sur carlosgon pour utiliser apt-dater.

Configuration du contrôleur, ajout d'hôtes

Quelques éléments de configuration du contrôleur, notamment en ce qui concerne l'ajout d'hosts. Le fichier qui nous intéresse est dans /etc/apt-dater/hosts.xml. Sa structure est assez simple à comprendre. Il faut juste penser à y ajouter les nouveaux hosts.

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hosts SYSTEM "file:///usr/share/xml/schema/apt-dater/hosts.dtd">
<hosts xmlns:xi="http://www.w3.org/2001/XInclude">
  <group name="Virtualiseurs">
  	<host name="ronderu.federez.net" comment="Virtualiseur VR"/>
  	<host name="kdell.federez.net" comment="Virtualiseur au Crans"/>
  </group>
  <group name="Kdell (conteneurs et machines virtuelles)">
	  <host name="gitlab-runner.federez.net" />
	  <host name="myriagon.federez.net" />
	  <host name="nonagon.federez.net" />
	  <host name="octogon.federez.net" />
	  <host name="parangon.federez.net" />
	  <host name="pentagon.federez.net" />
  </group>
  <group name="Ronderu (conteneurs et machines virtuelles)">
	  <host name="argon.federez.net" />
	  <host name="chiliagon.federez.net" />
	  <host name="hendecagon.federez.net" />
	  <host name="icosagon.federez.net" />
	  <host name="federez-test.federez.net" />
	  <host name="dragon.federez.net" />
	  <host name="memoragon.federez.net" />
	  <host name="carlosgon.federez.net" />
  </group>
  <group name="Serveurs externes">
	  <host name="dodecagon.federez.net"/>
	  <host name="coronagon.federez.net"/>
	  <host name="saigon.federez.net"/>
  </group>
</hosts>

Utiliser apt-dater sur le contrôleur

Le contrôleur se trouve actuellement sur carlosgon.

On se connecte au contrôleur en tant qu'user apt-dater via SSH.
Pour cela, on se crée une clé SSH personnelle (évidemment protégée par une passphrase), que l'on ajoute aux clés autorisées pour l'user apt-dater sur le contrôleur :

user@carlosgon : ssh-keygen -t ecdsa -b 521

en root (on peut utiliser la commande suivante pour passer en root : sudo -Es; on sort ensuite avec exit / Ctrl+D) :

cat ~$USER/.ssh/id_ecdsa.pub >> ~apt-dater/.ssh/authorized_keys

On peut alors faire :

ssh apt-dater@localhost

et utiliser apt-dater.

L'interface en ncurses est relativement simple, et il ne faut pas hésiter à lire la documentation en cas de doute.
Les machines sont triées par catégories, et il est conseillé de toujours commencer par mettre à jour des VM non critiques en premier, puis les VM critiques (passerelle, parefeu, BDD…), et enfin les hôtes de machines virtuelles.

À savoir : le R devant un hôte apt-dater signifie que cette machine nécessite un reboot.
Il faut soit s'y connecter et lancer un reboot dessus, soit le faire (pour une VM) depuis le virtualiseur, ce qui est moins propre mais plus pratique si il faut faire un reboot de masse.

On peut lancer une mise à jour d'un groupe de serveurs avec u et passer d'un serveur à l'autre avec n puis Ctrl+a, d pour sortir de chaque screen associé à un serveur.

Raccourci

Pour éviter de saisir toutes les commandes de connexion et d'avoir une clé sur era, on peut créer deux clés sur le client SSH. L'une servira pour une connexion classique au serveur, l'autre pour apt-dater. Dans le fichier de configuration SSH locale ~<you>/.ssh/config, mettre :

Host apt-dater
Hostname carlosgon.federez.net
User <you>
ForwardAgent yes
IdentityFile ~/.ssh/<identité_apt-dater_(rsa)>

Host carlosgon
Hostname carlosgon.federez.net
User <you>
IdentityFile ~/.ssh/<identité_serveurs>

L'option ForwardAgent transmet la clé utilisée pour la première connexion à l'agent du proxy pour pouvoir l'utiliser lors de la seconde connexion. C'est ainsi que l'on se passe d'une clé apt-dater sur era.

Ensuite, on demande à era de d'exécuter certaines actions lorsque l'on offre la première clé. Dans ~<you>/.ssh/authorized_keys sur carlosgon, en plus de mettre les deux clés publiques, on ajoute l'option command à la première.

command="ssh -t apt-dater@localhost apt-dater" ssh-rsa ...

Liens (potentiellement) utiles