Ceci est une ancienne révision du document !
Table des matières
< retour à la page de l'administration technique
Chaque serveur de FedeRez est configuré pour être mis à jour via apt-dater.
Infos générales
En speed
Ajouter une clef pour un admin sur une machine managée par apt-dater
Sur chaque machine(s) concernée(s) (en gros hexagon, quigon et baldrick):
Attention ici exemples de zertrin et David_5.1, adapter les clefs et les IP autorisées à votre cas !
# en tant que root cat << EOF >> ~aptdater/.ssh/authorized_keys no-agent-forwarding,no-port-forwarding,no-X11-forwarding,no-user-rc,no-X11-forwarding,from="127.0.0.0/8,91.121.177.109,2001:41d0:1:f26d::1" ecdsa-sha2-nistp521 AAAAE2VjZHNhLXNoYTItbmlzdHA1MjEAAAAIbmlzdHA1MjEAAACFBADNkXj0+teRl15r6PasiFBCSy4TPIzBQwpyR+DqDwkd4l6B23wY0A/psfZMoSPV6c2PxgOh7WKZMMrturZTR4wUBAACUHVxJCvroLwbaJvJNqVRBqUhNluWoNLSVpSIskoGOEf9E1dtAM24nZdqThBUFTnK7Ws2umPtiybncpUJOL/UPg== david@sinquin/ks51 no-agent-forwarding,no-port-forwarding,no-X11-forwarding,no-user-rc,no-X11-forwarding,from="127.0.0.0/8,91.121.136.69,2001:41d0:1:b745::1" ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIO2O2dQgm7g2/M2Jg9xkSKhPqjHTK/Jx0pOIVP/CDSuv zertrin@gluon EOF
Installer apt-dater sur une machine de management
Installation du paquet (exemple Debian, pour les autres distros, débrouillez vous !):
apt-get install apt-dater
En tant qu'utilisateur normal, lancer une première fois apt-dater
et quittez immédiatement. Cela aura pour effet de créer les fichiers de configuration d'apt-dater dans $XDG_CONFIG_HOME/apt-dater
(c'est à dire en général ~/.config/apt-dater
).
Modifier ~/.config/apt-dater/hosts.conf
:
Ajouter (ou remplacer l'entrée d'exemple IBH
par) :
[FedeRez] Hosts=aptdater@hexagon.federez.net;aptdater@quigon.federez.net;aptdater@baldrick.federez.net;
Relancer apt-dater, les serveurs seront dans la section Unknown
. Rafraichir les serveurs avec la commande g
. En cas de soucis, la commande e
aide au diagnostic.
Mise en place initiale d'apt-dater sur les machines managées
Note: toutes les étapes ci-dessous se font en tant que superutilisateur.
Installation
Installation du paquet :
apt-get install apt-dater-host
Configuration initiale
La config suivie ici s'inspire très fortement de celle disponible sur https://sdeziel.info/apt-dater/index.html.
Ajout d'un utilisateur dédié
adduser --quiet --system --home /var/lib/aptdater --group --shell /bin/sh aptdater adduser aptdater ssh
Configuration de SSH pour apt-dater
On n'autorise que des connexions par clef depuis certaines IPs et on n'autorise que l'exécution d'un wrapper de sécurisation:
mkdir -m 0700 ~aptdater/.ssh
Ajout de la clef d'un admin dans le authorized_keys d'aptdater:
Attention ici exemple de David_5.1, adapter la clef et les IP autorisées à votre cas !
touch ~aptdater/.ssh/authorized_keys chown aptdater: -R ~aptdater/.ssh cat << EOF >> ~aptdater/.ssh/authorized_keys no-agent-forwarding,no-port-forwarding,no-X11-forwarding,no-user-rc,no-X11-forwarding,from="127.0.0.0/8,91.121.177.109,2001:41d0:1:f26d::1" ecdsa-sha2-nistp521 AAAAE2VjZHNhLXNoYTItbmlzdHA1MjEAAAAIbmlzdHA1MjEAAACFBADNkXj0+teRl15r6PasiFBCSy4TPIzBQwpyR+DqDwkd4l6B23wY0A/psfZMoSPV6c2PxgOh7WKZMMrturZTR4wUBAACUHVxJCvroLwbaJvJNqVRBqUhNluWoNLSVpSIskoGOEf9E1dtAM24nZdqThBUFTnK7Ws2umPtiybncpUJOL/UPg== david@sinquin/ks51 EOF
Configuration de sudo pour apt-dater
cat << "EOF" >> /etc/sudoers.d/apt-dater-host # package installation is denied aptdater ALL = (root) NOPASSWD: /usr/bin/apt-get update aptdater ALL = (root) NOPASSWD: /usr/bin/apt-get clean aptdater ALL = (root) NOPASSWD: /usr/bin/apt-get dist-upgrade aptdater ALL = (root) NOPASSWD: /usr/bin/apt-get --assume-yes dist-upgrade aptdater ALL = (root) NOPASSWD: /usr/bin/apt-get dist-upgrade --assume-yes aptdater ALL = (root) NOPASSWD: /usr/bin/apt-get --quiet --simulate --fix-broken --allow-unauthenticated dist-upgrade aptdater ALL = (root) NOPASSWD: /usr/bin/apt-get dist-upgrade --quiet --simulate --fix-broken --allow-unauthenticated aptdater ALL = (root) NOPASSWD: /usr/sbin/needrestart EOF
chmod 0440 /etc/sudoers.d/apt-dater-host
Demande de validation des mise à jour
Pour qu'une demande de confirmation de la liste des paquets à mettre à jour soit faite, il faut modifier /etc/apt-dater-host.conf
pour qu'il contienne ASSUMEYES=0;
:
sed -i 's/^$ASSUMEYES=1;$/$ASSUMEYES=0;/' /etc/apt-dater-host.conf
Limitation de la priorité d'apt-dater apt-dater (optionnel)
printf "aptdater\t-\tpriority\t10\n" > /etc/security/limits.d/aptdater.conf
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.
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
- Site officiel : http://www.ibh.de/apt-dater/
- Référence pour la config et la sécurisation d'apt-dater : https://sdeziel.info/apt-dater/index.html