Je souhaite restreindre l'accès SSH à une machine membre d'un domaine de type Active Directory (Samba 4 ADDC) à quelques utilisateurs (AllowUsers).
Problème : les identifiants complets sont de la forme « identifiant@domaine-smb.example ». Or, dans un AllowUsers, « @ » sert à restreindre l'accès à un utilisateur depuis une machine.
Solution : utiliser le joker « ? » pour capturer le « @ ». Exemple : AllowUsers guigui?domaine-smb.example.
À ce compte-là, ça fonctionne également avec AllowUsers guigui* :- (non, ça n'ouvre pas l'accès à toutes les personnes qui ont un compte dans notre domaine.
Pour éviter un laborieux ps aux | grep firefox | grep -v grep, il y a ps aux | grep [f]irefox. Merci, Duke. :)
Explication : on demande de chercher une ligne qui contient « f » puis la chaîne « irefox ». La ligne du processus « grep --color=auto [f]irefox » ne correspond pas, car c'est une chaîne qui contient « [ » + « f » + « ] » + « i » +. Il n'y a pas de chaîne qui commence par f et qui finit par « irefox » sur cette ligne, en gros.
On peut aller plus loin. 99 % du temps, quand je filtre la sortie de ps, c'est pour confirmer la présence d'un processus.
Si je veux acquérir une vision globale des processus, je préfère une vue dynamique à la htop / top.
Dans ce cas, ps -fC firefox-esr fait le boulot, si l'on connaît le nom du processus et si c'est exploitable. Genre chercher un programme Java est souvent vain puisque le nom de l'exécutable sera « java », le nom visuel du programme arrive dans les arguments, qui ne sont pas considérés par ps -fC.
On peut aller légèrement plus loin (autant de caractères mais plus simple, je trouve) : pgrep firefox, le copain de pkill. Merci Johndescs. :)
pgrep -x et ps -C sont très utiles dans des scripts : concis (plus que "ps | grep | grep -v grep") et la recherche se fait uniquement sur le nom des programmes, pas sur leurs arguments.
Ça évite qu'un script lancé par CRON ne fasse plus rien car ps aux | grep apt | grep -v grep trouve toujours un processus (alors qu'apt n'est pas en cours d'exécution) car il capture thermald --adaptative (« apt » dans « adaptative »). Oui, c'est du vécu.
Une petite astuce (sous-)shell qu'on oublie.
Supposons qu'on veut automatiser une causerie avec une interface interactive en ligne de commande. Par exemple : bconsole (pilotage de Bacula).
Facile : echo 'delete jobid=XXXX' | bconsole. On met ça dans une boucle for/while et hop.
Mais si l'on veut lancer plusieurs sauvegardes ? La commande « run » de bconsole attend une confirmation de type "yes/no" pour chaque tâche lancée (ce n'est pas tout à fait vrai, on peut « run job=nomdujob yes », mais il faut s'en souvenir :- ). Il faut introduire une temporisation entre la commande pour lancer la tâche et la saisie de la confirmation (pas vraiment, j'vais y revenir, c'est juste pour présenter le problème).
La problématique serait la même avec une interface qui attend un message de fin (« exit ») explicite pour se fermer (et donc rendre la main à une éventuelle boucle). La plupart des outils sont bien codés (flux d'entrée stocké dans un tampon consommé au fil de l'eau), donc un echo -e 'run job=nomdujob\nyes' | bconsole fonctionnera très bien. Mais, parfois, on n'a pas l'option « -e » à son echo (il faut se souvenir de dégainer printf…) ou on rencontre des programmes qui bossent en asynchrone.
Astuce : (echo 'run job=nomdujob' && sleep 1 && echo 'yes') | bconsole.
Causer dans une socket UNIX avec netcat (déclinaison netcat-openbsd) :
nc -U /tmp/socket #Connect to UNIX-domain stream socket
nc -uU /tmp/socket #Connect to UNIX-domain datagram socket
Exemple : l'interface de management d'OpenVPN (qui permet d'afficher des stats d'utilisation, de tuer une session fantôme, de diagnostiquer un problème, etc.) est une socket UNIX.
Nous avons un logiciel qui envoie des notifications par email à plusieurs adresses emails qui se révèlent être des adresses génériques (alias). Certains emails sont utiles, d'autres non. Le logiciel ne propose pas de désactiver certaines notifications. Les emails utiles sont tous destinés au même alias.
Comment dire à notre serveur email local configuré en relais, Exim, de jeter les emails destinés à un alias sans générer d'erreur et sans activer des transporteurs supplémentaires dans la conf' ?
Mettre :blackhole: comme destinataire de l'alias dans /etc/aliases. Genre ajeter: :blackhole:.
Nous voulions tester notre code Puppet sur Debian 11 qui était alors dans l'état release candidate (RC).
Dans notre code (et dans Hiera), nous utilisons le fact os/release/major pour agir en fonction de la version d'un système Debian GNU/Linux.
Pour agir sur plusieurs versions en même temps, nous convertissons le fact, qui est une chaîne de caractères, en nombre (if (0 + $facts['os']['release']['major']) >= 9 { […] }).
Or, quand une version de Debian est en RC, os/release/major ne contient pas un nombre mais un texte (« testing » ou « bullseye », je ne sais plus). Forcément, notre code échoue…
Facter permet d'utiliser des variables d'environnement pour créer un fact : FACTER_bonjour='Hello, World!' facter -p.
On peut également surcharger un fact avec une variable d'environnement : FACTER_kernel='GuiGuiOS' facter -p.
Le contenu surchargé est transmis à Puppet. Soit le code suivant :
Notify { $facts['kernel']:
}
puppet agent -t affichera : « Notice: Linux ». FACTER_kernel='GuiGuiOS' puppet agent -t affichera « GuiGuiOS ».
Mais cela ne fonctionne pas avec les facts structurés (tableaux, JSON, YAML). Reprenons notre fil rouge : surcharger os/release/major :
FACTER_os='{
architecture => "amd64",
distro => {
codename => "buster",
description => "Debian GNU/Linux 11 (bullseye)",
id => "Debian",
release => {
full => "11",
major => "11"
}
},
family => "Debian",
hardware => "x86_64",
name => "Debian",
release => {
full => "11.0",
major => "11",
minor => "11"
},
selinux => {
enabled => false
}
}' facter -p | grep major
Cela fonctionne. J'expliquerai à la fin pourquoi j'ai surchargé tout « os » alors qu'il est possible de surcharger uniquement os/release/major.
En revanche, Puppet n'en veut pas :
FACTER_os='{
architecture => "amd64",
distro => {
codename => "buster",
description => "Debian GNU/Linux 11 (bullseye)",
id => "Debian",
release => {
full => "11",
major => "11"
}
},
family => "Debian",
hardware => "x86_64",
name => "Debian",
release => {
full => "11.0",
major => "11",
minor => "11"
},
selinux => {
enabled => false
}
}' puppet agent -t
Résultat : « Error: Could not retrieve catalog from remote server: Error 500 on SERVER: Server Error: Evaluation Error: A substring operation does not accept a String as a character index. ».
On peut essayer de formater pour tout mettre sur une ligne ou de fournir un format JSON, ça ne fonctionne pas mieux. C'est connu.
On peut diffuser un fact personnalisé / externe via un module Puppet. Je n'ai pas envie car je veux juste faire un test sur une seule machine.
Un fact peut également être stocké en local sur une machine. L'emplacement des facts externes est mentionné dans la doc'.
Le dossier « /etc/facter/facts.d/ » n'existe pas, mais on peut le créer.
/etc/facter/facts.d/os.yaml :
os:
architecture: "amd64"
distro:
codename: "bullseye"
description: "Debian GNU/Linux 11 bullseye"
id: "Debian"
release:
full: "11"
major: "11"
family: "Debian"
hardware: "x86_64"
name: "Debian"
release:
full: "11.0"
major: "11"
minor: "11"
selinux:
enabled: false
Cela fonctionne. \o/
Pour les masos, on peut aussi l'faire en JSON. /etc/facter/facts.d/os.json :
{
"os": {
"architecture": "amd64",
"distro": {
"codename": "bullseye",
"description": "Debian GNU/Linux 11 bullseye",
"id": "Debian",
"release": {
"full": "11",
"major": "11"
}
},
"family": "Debian",
"hardware": "x86_64",
"name": "Debian",
"release": {
"full": "11.0",
"major": "11",
"minor": "11"
},
"selinux": {
"enabled": false
}
}
}
Il est possible de surcharger uniquement la variable désirée (os/release/major dans mon cas), mais je le déconseille : facter ne fusionnera pas ta variable avec le reste du fact structuré (dans mon cas, si je surcharge os/release/major, os/architecture ou os/distro ou os/release/full ou… n'existeront plus). Or, ton code ou un module peut vouloir récupérer un fact ignoré. Dans ce cas, l'exécution de puppet se terminera avec une erreur genre « Error 500 on SERVER: Server Error: Evaluation Error: Operator '[]' is not applicable to an Undef Value. ».
Besoin d'insérer littéralement « <% » ou « %> » dans un template EPP (genre dans un bacula-dir.conf) alors qu'ils représentent justement les tags EPP (et sont donc interprétés) ? <%% et %%>.
J'avais pas tilté, mais la commande pour afficher les facts personnalisés (custom facts / external facts, déposés par un module Puppet) sur un client Puppet change en fonction de la version de facter et des envies des mainteneurs Debian du paquet facter :
facter -p ou puppet facts ;facter -p --external-dir=/var/cache/puppet/facts.d/ ;facter -p --external-dir=/var/lib/puppet/facts.d/.Pour les facts natifs, la commande est invariable : facter -p.
Soutien au cloud français : le gouvernement met 667 millions d'euros sur la table
Macron : ‒ pour l'ordre, je mets quoi ? Microsoft ?
Gros +1. Voir les actus récentes : on se dirige vers les technos des grands acteurs ricains revendues par des sociétés commerciales françaises (On-premises / octroi de licences)… Aucun financement d'un écosystème local, absence d'une politique économique et numérique, etc. La valeur économique sera toujours captée par les mêmes géants… Les mêmes intermédiaires inutiles continueront de se goinfrer pour un travail nul (inexistant et/ou d'une qualité douteuse)… Un supplément de merde à gérer (les intermédiaires) pour l'adminsys lambda… Youpi sur toute la ligne.
Via https://www.nextinpact.com/article/48735/flock-senvole-dans-cloud .
Besoin de surligner ou d'annoter un PDF ? xournal. 0 prise de tête. Présent dans les dépôts officiels Debian.
ÉDIT DU 29/06/2023 : le surlignage se fait à main levée, donc imprécis. okular permet de surligner droit, mais uniquement du texte (xournal permet de travailler également sur un scan). Bref, toujours aucun outil libre parfait. FIN DE L'ÉDIT.
ÉDIT DU 15/04/2024 : okular permet de surligner sur des images (scan) en dessinant des rectangles (outil caché dans le menu « flèches » de la barre d'outils), en choisissant la même couleur de bordure et de remplissage des annotations (boutons de la barre d'outils), puis en choisissant l'opacité des annotations (icône « goutte » à côté des icônes pour choisir les couleur, toujours dans la barre d'outils). Plusieurs couleurs disponibles. C'est super pratique. Dans les deux cas (surligneur ou traçage de rectangles ou…), il s'agit d'une annotation, à laquelle on peut ajouter du texte. On peut supprimer une annotation en cliquant dessus dans le mode « Parcourir » (bouton dans la barre d'outils) ou via la visionneuse d'annotations (à gauche, à la place de la visionneuse de vignettes).
okular permet également d'insérer une signature manuscrite au format image. Tutoriel ici. FIN DE LÉDIT DU 15/04/2024.
Un questionnaire sur les raisons de l'abstention aux élections proposée par la mission d'information sur la participation électorale de l'Assemblée nationale.
Répondre avant le 30 octobre.
Je te laisse apprécier les biais comme les personnes auditionnées à ce jour (instituts de sondage, promoteurs du vote électronique, etc.) ou la présentation de la mission (« Ils porteront aussi plus largement sur les causes structurelles de l’augmentation de l’abstention en France et les réponses à leur apporter, s’agissant de l’organisation des scrutins comme des autres modalités permettant d’inciter à l’exercice du droit de vote. ») : qu'on se le dise dans les chaumières, il faut que ça vote, il faut légitimer la bourgeoisie.
Pour rappel : un questionnaire en ligne n'est pas représentatif et une mission d'information n'a pas de pouvoir de contrainte. ;)
ÉDIT DU 29/08/2023 : la synthèse des réponses est dispo ici. Rien de transcendant, les réponses sont basiques, et les réponses libres font l'objet des habituelles difficultés d'interprétation, de groupement et donc de prise en compte. FIN DE L'ÉDIT.
La direction interministérielle du numérique (DINUM) a adressé une note aux sinistères les informant qu'Office 365 n'est pas conforme à la nouvelle doctrine de l'État en matière de clown (cloud). Pour moi, il ne s'agit pas d'audace, mais de la suite logique aux décisions Schrems et Schrems 2 de la Cour de Justice de l'Union Européenne.
Évidemment, l'utilisation d'Office 365 et l'externalisation restent autorisées : version d'Office 365 déconnectée du clown de Microsoft, installation On-Premises (Office hébergé sur une infrastructure (co-)détenue par l'administration), les offres commerciales labelisées SecNumcloud par l'ANSSI (à ce jour : Oodrive, Outscale et OVH) et immunisées contre les législations impérialistes hors UE type Cloud Act ou Patriot Act (par quelle magie ?! quels moyens met-on en œuvre pour s'en assurer techniquement ?), le "clown" de l'État (SNAP), le clown Bleu (Orange, Capgemini, Microsoft, etc., ça va encore donner naissance à un mammouth ingérable et inutilisable en pratique), etc. ÉDIT DU 27/06/2022 : cloud Thales-Google. FIN DE L'ÉDIT.
Évidemment, il y aura des dérogations, et le pouvoir de prescription de la DINUM reste très limité : la note, comme celle où elle invitait les sinistrères à définir Qwant comme moteur de recherche par défaut, s'adresse exclusivement aux sinistères, et, d'une manière générale, les DSI des administrations sous tutelle ministérielle peinent à savoir s'ils sont concernés. Quelles sanctions ? Etc.
Évidemment, la note manque d'ambition. Pas de financement d'un écosystème concurrent complet (conception, maintenance, maîtrise, formation, etc.). On attend que le privé se bouge en balaçant des tonnes de yakafokon (oui, y'a l'offre interministérielle SNAP, lol) ce qui est l'un des symptômes d'une absence de politique en matière de numérique. Manque de volonté (combien de dirigeants d'administration locales et centrales, jusqu'au plus haut niveau de l'État, utilisent Zoom, WhatsApp, etc. ?!). Pour moi, la nouvelle doctrine du clown est uniquement là pour rafistoler à l'arrache le radeau suite aux décisions de la CJUE.
La note de la DINUM peut également être consultée ici.
Via https://twitter.com/emile_marzolf/status/1440673920332402705 via https://twitter.com/bayartb/status/144079246619445658.
‒ Tu n'oublieras pas tes 3 heures de Fortnite quotidiennes en rentrant de l'école. Si tu veux optimiser tes chances dans la vie, depuis Parcoursup jusqu'à devenir boss, autant t'entraîner dès le plus jeune âge à sniper tes camarades.
Tellement vrai.
Via https://www.nextinpact.com/article/48211/flock-tient-a-sa-reputation .
Comment insérer une page au format paysage dans un document (dont les autres pages sont au format portrait) ?
Sur l'interface web Aruba Mobility Master (v8.6), je génère une CSR. Je la communique à notre autorité de certification x509 (AC), et j'obtiens un certificat x509.
Je récupère ce certificat au format PEM, je l'uploade dans l'interface web Aruba Mobility Master, et je me mange l'erreur : « Cert public key did not match the private key in the CSR store ».
Non, je n'ai pas généré une autre CSR entre-temps. Oui, j'ai bien récupéré le certificat qui correspond à la CSR depuis l'interface web de notre AC.
Solution : récupérer le certificat au format PKCS#7 (ou PKCS#7 PEM) auprès de notre AC. L'upload fonctionne alors très bien… … …
Sur l'interface web d'Aruba Mobility Master v8.6, je tente d'uploader un nouveau certificat x509 : « Error : Expecting string of length 1 to 31 ». Il faut que la longueur du nom du fichier contenant le certificat n’excède pas 31 caractères… … …
J'étais au-dessus car, dans le nom du fichier, nous mettons le common name ainsi que le numéro de commande auprès de notre autorité de certification afin de superviser et de retrouver facilement un certificat. Dingue qu'Aruba ne prenne pas en charge un cas aussi banal.
Un collègue (merci, Maxime) m'a fait découvrir sshpass qui permet d'automatiser / scripter une connexion SSH par mot de passe. Paquet logiciel du même nom dans Debian.
Le mot de passe est transmis à sshpass en argument ou dans un fichier ou dans une variable d'environnement ou dans un descripteur de fichier.
Au final, sshpass fonctionne comme expect : il lance ssh (fork(), exec()), il lit la sortie standard, quand ssh demande le mot de passe, il l'envoie sur l'entrée standard. « -P » permet d'ailleurs de changer la chaîne de caractères à laquelle sshpass réagit.
Ça signifie aussi que toute demande imprévue de ssh est bloquante genre vérification de l'empreinte de la clé du serveur ou demande de la passphrase d'une clé SSH si l'on a une directive « IdentityFile » dans son ssh_config. « -v » permet de visualiser ce qui bloque.
Je préfère l'authentification par clé SSH sans passphrase dédiée à un compte utilisateur sur le serveur lui-même dédié à un script / à un ensemble de scripts d'un même périmètre / giron (cela permet une traçabilité des accès sans contrainte excessive) avec droits d'accès limités (droits fichiers ou droits sudo précis), mais c'est intéressant de savoir que sshpass existe pour les cas où l'auth par clé n'est pas en place.
Sur notre parc Ubuntu 20.04, chromium ne fonctionne pas. Chromium est installé avec snap. L'ensemble pose deux problèmes :
/etc/apparmor.d/tunables/home.d, lire ci-dessous pour les détails) ;On notera également que le dossier Téléchargements se trouve dans ~/snap/chromium/current/Téléchargements. Super pratique pour un utilisateur !
Au final, on a installé Google Chrome (qui n'est pas diffusé via snap) et basta. :( On a autre chose à faire que de compiler chromium régulièrement depuis les sources et on n'a pas trouvé de dépôt apt à jour et de confiance (ce qui permettrait de nous passer de snap).
Démarche (tests effectués) et découverte d'AppArmor :
Chemin vers homedir = /home/$uid + absence de NFS : chromium démarre ;
Chemin vers homedir = /home/$uid + NFS : chromium ne démarre pas, erreur « cannot open path of the current working directory: Permission denied » ;
cd /tmp/ && chromium-browser : chromium démarre (+ snap écrit dans $HOME/snap ! Je croyais que t'arrivais pas à y accéder ?!) ;cd /tmp && chromium-browser : chromium ne démarre pas, erreur « cannot create user data directory: /home/$nas/$categorie/$uid/snap/chromium/1753: Permission denied ». En fonction de la configuration d'AppArmor (voir ci-dessous), l'erreur peut aussi être « cannot create user data directory: /home/$nas/$categorie/$uid/snap/chromium/1753: Stale file handle ».
Le dernier point est lié au profil AppArmor /var/lib/snapd/apparmor/profiles/snap-confine.snapd.12883.
apparmor=0 dans GRUB_CMDLINE_LINUX_DEFAULT dans /etc/default/grub puis lancer update-grub2 puis redémarrer), je n'ai plus de problème pour lancer chromium depuis /tmp (ou autre endroit sans NFS). Sur le web, on lit que la commande systemctl disable apparmor et un redémarrage permettent de désactiver AppArmor : ce n'est pas exact ;aa-complain /snap/snapd/12883/usr/lib/snapd/snap-confine sort en erreur « Profile for /snap/snapd/12883/usr/lib/snapd/snap-confine not found, skipping » (idem avec « /var/lib/snapd/apparmor/profiles/snap-confine.snapd.12883 »). Pour passer outre : ln -s /var/lib/snapd/apparmor/snap-confine.snapd.12883 /etc/apparmor.d/ && aa-complain /snap/snapd/12883/usr/lib/snapd/snap-confine. Quid de la pérennité ? « 12883 » dans le nom du profil est la révision de snapd… qui changera lors des mises à jours… ;/home/ r, et /home/$nas/ r, dans le profil. Pour NFS, il faut ajouter une ligne network, dans le profil. Puis je recharge le profil avec apparmor_parser -r /var/lib/snapd/apparmor/profiles/snap-confine.snapd.12883 (on lit souvent que systemctl reload apparmor fait le job, mais c'est incorrect). Quid de la pérennité ? « 12883 » dans le nom du profil est la révision de snapd, donc le nom du profil (et/ou son contenu) changera lors des mises à jours… ;ln -s /var/lib/snapd/apparmor/profiles/snap-confine.snapd.12883 /etc/apparmor.d/disable/ + reboot), le lancement de chromium génerera l'erreur « snap-confine has elevated permissions and is not confined but should be. Refusing to continue to avoid permission escalation attacks » ;Si t'as une VM Aruba Mobility Master v8.6 (ArubaOS) sur un hyperviseur Proxmox + KVM, convertie depuis l'image disque VMWare livrée par Aruba, il faut la configurer pour utiliser le chipset q35 (au lieu de i440fx par défaut) sinon l'interface web Aruba freezera très régulièrement (affichage partiel + aucune réaction aux clics dans les menus).
J'ai aucune idée de la fonctionnalité du chipset q35 dont ArubaOS a besoin (PCI-E ? :D Secure Boot ? :D AHCI ? vIOMMU ?).
Je rappelle qu'il faut également choisir un modèle de CPU qui prend en charge les instructions SSSE3 sinon Aruba Mobility master ne démarre pas.
Dans un annuaire LDAP genre OpenLDAP, l'attribut « userPassword » est multi-valué (plusieurs valeurs), cf le RFC 2829.
Il est donc possible d'avoir plusieurs mots de passe pour un même utilisateur.
Une application qui fait de l'authentification LDAP effectue une seule requête BIND et le serveur LDAP itère sur l'ensemble des attributs userPassword pour tester le mot de passe, donc le comportement ne dépend pas de l'application. (Évidemment, y'a toujours des applications qui tentent d'authentifier un utilisateur sur un annuaire LDAP sans faire de BIND, genre en récupérant l'attribut userPassword, dont le comportement face à plusieurs mots de passe est imprévisible).
Quand on veut diagnostiquer une authentification ou une autorisation (droits dans un logiciel / site web) sans connaître le mot de passe de l'utilisateur qui se plaint d'un problème, sans lui réinitialiser son mot de passe et sans mettre en place tout un processus pour qu'il se rende disponible pour reproduire le problème devant toi, il suffit donc d'ajouter une valeur supplémentaire l'attribut « userPassword ». L'utilisateur continuera d'utiliser son mot de passe et toi, tu utiliseras celui que t'as ajouté. Quand t'as terminé, tu retires ton mot de passe additionnel.
C'est, pour moi, l'équivalent adminsys des frameworks web genre Symfony qui permettent de se faire passer pour un utilisateur et d'obtenir ainsi les mêmes droits.