• [^] # Re: Intéressant

    Posté par . En réponse au journal Des ciseaux à bouts ronds pour gérer nos ordis - Wrappers on Linux Workstations. Évalué à 5.

    Pour rester très général, les trucs qu'on fait :

    Pour ce qui est en script bash (la majorité), on utilise par défaut des options comme bash -p, et set +euf -o pipefail, qu'on désactive sur les parties qui ont besoin. Par exemple si on veut pouvoir faire un truc comme rm coincoin/*), on va faire :

    set +f
    rm "${dir}"/*
    set -f
    

    sans quoi l'étoile ne sera pas remplacée par une liste de fichiers.

    Ensuite, on limite et on valide tous les paramètres, soit avec une liste fixe (pour les claviers, c'est une liste limitative prédéfinie), soit avec des expressions régulières. Par exemple, pour le wrapper systemctl, on autorise seulement start, stop, restart comme commandes, et on autorise pas toutes la syntaxe. Systemd permet d'avoir des \ et des . dans les noms de services. Ben nous, on ne l'autorise pas, car ça complique énormément la validation. Ça implique de devoir réfléchir à ce qu'on veut permettre, et comment ça se valide (par exemple, apt-get a beaucoup de possibilités, avec des pièges comme apt install lolcat -puppet qui supprime puppet, il faut le détecter, c'est expliqué dans l'article comment on fait).

    Quand on peut, on a donc une liste autorisée, mais parfois ce n'est pas possible. On fait alors une liste de trucs interdits. Par exemple, avec systemctl, il y a des services qui sont "protégés" et ne peuvent pas être coupés. cron, puppet, l'antivirus... Ce genre de choses importantes.

    Comme les scripts tournent en root via sudo, quand on doit lancer une sous-commande, si possible on la lance avec nobody si ce sont des droits suffisants. Par exemple, pour résoudre les alias de services systemd, on lance systemctl show -P Names en noboby depuis le wrapper.

    Et puis on teste, on essaye de contourner les bridages qu'on met en place... Et des fois on trouve, c'est amusant :). Exemple simple : sur le wrapper de nmcli, on avait naïvement bloqué les paramètres -s et --show-secrets. Mais on pouvait le contourner avec --show-se par exemple, car nmcli sait deviner que c'est --show-secrets qu'on voulait dire.

    Les configs sudo ne vont pas dire :

    (ALL: ALL) le_wrapper
    (ALL: ALL) le_wrapper *
    

    mais plutôt quelque chose comme :

    (ALL: ALL) le_wrapper start *
    (ALL: ALL) le_wrapper stop *
    (ALL: ALL) le_wrapper restart *
    (ALL: ALL) le_wrapper --help

    pour filtrer un peu avant que l'exécution commence.

    Ah et bien sûr l'option NOPASSWORD de sudo est interdite ;).

    Enfin, on passe des outils comme shellcheck, qui donnent des conseils utiles, comme mettre en guillemets les paramètres qui peuvent contenir des étoiles (ça arrive qu'on oublie de le faire).

    Finalement, le truc sur lequel perso je vais le plus attention, c'est la validation des paramètres.