Skip to main content

03-01 - Exploitation de SaltProject

A - Commandes de base :

1. Commande de base :

salt '*' grains.ls
salt '*' grains.items
    locale_info:
        ----------
        defaultencoding:
            UTF-8
        defaultlanguage:
            fr_FR
        detectedencoding:
            utf-8
        timezone:
            UTC
    lsb_distrib_description:
        Ubuntu 22.04.3 LTS
    mem_total:
        1963
    num_cpus:
        2

salt '*' sys.doc

2. Gestion des grains :

Source : https://docs.saltproject.io/en/latest/ref/modules/all/salt.modules.grains.html

salt -G 'os:CentOS' test.version
salt -G 'cpuarch:x86_64' grains.item num_cpus
salt -G 'ec2_tags:environment:*production*'

salt '*' grains.item os osrelease oscodename
salt '*' grains.item host sanitize=True
salt '*' grains.items
salt '*' grains.items sanitize=True

# Renvoie une liste de tous les grains disponibles
salt '*' grains.ls

1. Gestion des groupes de minions :

Sources

https://salt-zh.readthedocs.io/en/latest/topics/targeting/nodegroups.html
https://docs.saltproject.io/en/master/topics/targeting/compound.html#targeting-compound
https://docs.saltproject.io/en/master/topics/targeting/nodegroups.html#defining-nodegroups-as-lists-of-minion-ids

Gestion des groupes

Créer un fichier .conf dans le dossier /etc/salt/master.d contenant les informations de groupe :

# Création d'un groupe dans un fichier dédié :
nodegroups:
  grp-srv-authorized_keys-dev-apside:
    - 'proto-novo.v.sdem.fr'

# Test du groupe :
salt -N grp-srv-authorized_keys-dev test.version

3. Commandes simples :

# Effectuer un test de ping sur les minions
salt nextcloud.v.sdem.fr test.ping
salt '*' test.ping
salt '*.v.sdem.fr' test.ping

# Vérifier la version de Salt sur les minions :
salt '*' test.version

# Afficher la version des Distrib des minions :
salt '*' cmd.run 'uname -a'
salt '*' cmd.run 'lsb_release -a'
salt '*' grains.item os osrelease oscodename

# Afficher l'uptime des minions :
salt '*' cmd.run 'uptime'

# Afficher la configuration réseau :
salt '*' network.interfaces

# Lancer des commandes à distance :
salt '*' cmd.run 'ls -l /etc'
salt '*' cmd.run 'du -sh /*'
salt '*' cmd.run 'find /home/share/backup-si/* -ctime +1 -exec rm -rf {} \;'
salt '*' cmd.run 'shutdown -r now'

# Afficher les informations des disques des minions :
salt '*' disk.usage

# Afficher la conso de la RAM sur les minions :
salt '*' cmd.run 'free -m'

# Vérifiez le package bash à l'aide de la commande salt ci-dessous.
salt '*' pkg.show bash

# Installez un package sur tous les serveurs minion.
salt '*' pkg.install swaks
salt '*' pkg.install tree
salt '*' pkg.install postfix

# Afficher les référentiels disponibles sur tous les serveurs Minion.
salt '*' pkg.refresh_db

# Vérifiez la liste des référentiels sur tous les serviteurs du serveur.
salt '*' pkg.list_repos

# Consultez la liste des mises à jour de packages disponibles sur tous les serveurs Minion.
salt '*' pkg.list_upgrades

#### Un autre excellent exemple ici est le module de service qui vous permet de gérer des services sur plusieurs distributions Linux, y compris la distribution avec systemd.
# Vérifiez si le service apache2 est disponible ou non.
salt '*' service.available apache2

# Activez le service apache2 pour qu'il démarre au démarrage du système sur tous les serveurs minion.
salt '*' service.enabled apache2

# Vérification de la liste des services en cours d'exécution sur tous les serveurs.
salt '*' service.get_running

# Vérifiez la commande ExecStart= pour chaque service disponible sur tous les serveurs.
salt '*' service.execs

# Afficher le stockage BTRFS des Serveurs LXC :
salt -N grp-srv-lxc cmd.run 'btrfs filesystem show'

4. Copie d'un fichier vers un minion :

# Copier récursivement un répertoire depuis le salt master 
salt '*' cp.get_dir salt://path/to/dir/ /minion/dest

# Copier un fichier vers les minions :
salt '*' cp.get_file salt://path/to/file /minion/dest
salt '*' cp.get_file "salt://{{grains.os}}/vimrc" /etc/vimrc template=jinja
salt 'nextcloud*' cp.get_file salt:/srv/salt/files/test.txt /home/adminme/test.txt

salt 'nextcloud.v.sdem.fr' cp.get_file salt://files/ssh-key-pub-listing-infra.txt /home/adminme/.ssh/authorized_keys

5. Déploiement des clés SSH :

############# Préparation des fichiers de conf :

# Création du dossier sshd_config.d s'il n'existe pas, le fichier sshd_config utilise l'include du dossier sshd_config.d
salt '*' cmd.run "mkdir /etc/ssh/sshd_config.d"

# Déploiement du fichier de gestion des clés SSH :
salt '*' cmd.run "rm -rf /etc/ssh/sshd_config.d/authorizedKeysFile.conf"
salt '*' cmd.run "echo "#AuthorizedKeysFile\nAuthorizedKeysFile     .ssh/authorized_keys-infra .ssh/authorized_keys-dev .ssh/authorized_keys-dev-apside\n " >> /etc/ssh/sshd_config.d/authorizedKeysFile.conf"

# Pour les Ubuntu 18.04, le Include du dossier sshd_config.d ne fonctionne pas :
vi /etc/ssh/sshd_config
# JKT - Ajout AuthorizedKeys :
AuthorizedKeysFile     .ssh/authorized_keys-infra .ssh/authorized_keys-dev .ssh/authorized_keys-dev-apside 

# Déploiement du fichier de configuration dédié guacamole uniquement sur les Ubuntu 22.04 'Jammy' :
salt -G 'oscodename:jammy' cmd.run 'echo "# JKT-20220517 - Connexion Guacamole :\nHostkeyAlgorithms +ssh-rsa\nPubkeyAcceptedAlgorithms +ssh-rsa\n " >> /etc/ssh/sshd_config.d/guacamole-auth-ssh.conf'

# Redémarrer le deamon SSHD :
salt '*' cmd.run 'service sshd restart'

--------------------------------------------------------------------------------------------------------------------------------------------
############# Déploiement des clés SSH :
# Options 1 - Accès service INFRA uniquement - Fichier -> .ssh/authorized_keys-infra :
salt '*' cp.get_file salt://files/authorized_keys-infra /home/adminme/.ssh/authorized_keys-infra
salt '*' cmd.run 'chown adminme:adminme /home/adminme/.ssh/*'

# Options 2 - Accès service DEV - Fichier -> .ssh/authorized_keys-dev :
# Utilisation du groupe de minion grp-srv-authorized_keys-dev
salt -N grp-srv-authorized_keys-dev cp.get_file salt://files/authorized_keys-dev /home/adminme/.ssh/authorized_keys-dev
salt -N grp-srv-authorized_keys-dev cmd.run 'chown adminme:adminme /home/adminme/.ssh/*'

# Options 3 - Accès service Prestataire DEV-APSIDE - Fichier -> .ssh/authorized_keys-dev-apside :
# Utilisation du groupe de minion grp-srv-authorized_keys-dev-apisde
salt -N grp-srv-authorized_keys-dev-apside cp.get_file salt://files/authorized_keys-dev-apside /home/adminme/.ssh/authorized_keys-dev-apside
salt -N grp-srv-authorized_keys-dev-apside cmd.run 'chown adminme:adminme /home/adminme/.ssh/*'

# Suppression de l'ancien fichier de configuration après déploiement des clés spécifiques :
salt '*' cmd.run 'rm /home/adminme/.ssh/authorized_keys'

6. Salt avec VMware :

Source

https://docs.vmware.com/fr/VMware-vRealize-Automation-SaltStack-Config/8.6/use-manage-saltstack-config-guide.pdf
https://docs.saltproject.io/salt/extensions/salt-ext-modules-vmware/en/latest/ref/modules/saltext.vmware.modules.vm.html

B - Gestion par script :

1. Description :

L'ensemble des scripts sont installés sur le serveur admin-l.v.sdem.fr dans /srv/salt/scripts/

Les scripts sont disponible dans git

1. Script de déploiement de Lynis :

Lynis est un outil de scan de vulnérabilité. Il est déployé automatiquement avec Salt sur l'ensemble du parc.

Emplacement du script : /srv/salt/scripts/

Nom du script : salt-deploy-lynis.sh

##############################################################
# Auteur : jkermorvant
# Date de modification : 20231115
#
# Description : Script de déploiement de l'outil de sca de vulnérabilité Lynis
#
##############################################################
#! /bin/bash
#
##############################################################
# Variables :

###################################
# Déploiement de l'outil de scan de vulnérabiloté Lynis :
salt '*' cp.get_file salt://files/lynis-3.0.9/lynis-3.0.9.tar.gz /tmp
salt '*' cmd.run 'tar -xzf /tmp/lynis-3.0.9.tar.gz -C /usr/local'
salt '*' cmd.run 'chmod +x /usr/local/lynis/lynis'
salt '*' cmd.run 'ln -s /usr/local/lynis/lynis /usr/local/bin'

# Démarrage du scan de vulnérabilité :
salt '*' cmd.run 'sudo lynis audit system'

# Récupération des logs vers le dossier /var/cache/salt/master/minions/minion-id/files :
# Prérequis :
# Source : https://docs.saltproject.io/en/latest/ref/modules/all/salt.modules.cp.html#salt.modules.cp.push
# Allow minions to push files to the master. This is disabled by default, for security purposes.
# file_recv: False -> True
# Restart Salt-Master
salt '*' cp.push /var/log/lynis.log
salt '*' cp.push /var/log/lynis-report.dat

1. Script de déploiement de la supervision :

Ce script permet de déployer la supervision sur une machine spécifique Linux.

Emplacement du script : /srv/salt/scripts/

Nom du script : salt-deploy-supervision.sh

#############################################################
# Auteur : jkermorvant
# Date de modification : 20231115
#
# Description : Script de déploiement de la supervision NAGIOS
#
##############################################################
#! /bin/bash
#
##############################################################
# Variables :
ARG=N
DEST=grp-srv-deploy-labs

# Déclaration du serveur
SERVER=web01
DOMAIN=.v.sdem.fr

# Déclaration de l'adresse IP du serveur
IP1=192
IP2=168
IP3=1
IP4=219

# Déclaration du serveur de supervision
SUPERVISION=supervision.v.sdem.fr

###################################
# Installation et configuration de l'agent NRPE sur le serveur cible

# Installation du paquet NRPE :
salt ${SERVER}${DOMAIN} pkg.install nagios-nrpe-server nagios-plugins

# Déploiement des fichiers de configuration sur le serveur à superviser :
salt ${SERVER}${DOMAIN} cp.get_file salt://files/supervision/nrpe.cfg /etc/nagios
salt ${SERVER}${DOMAIN} cp.get_file salt://files/supervision/check_mem /usr/lib/nagios/plugins/

# Redémarrage du service nagios-nrpe :
salt ${SERVER}${DOMAIN} cmd.run 'service nagios-nrpe-server restart'

###################################
# Déployer le fichier de configuration Nagios sur le serveur de supervision

# Déploiement du fichier de configuration sur le serveur de supervision :
cp /srv/salt/files/supervision/template.v.sdem.fr.cfg /srv/salt/files/supervision/files-config/${SERVER}${DOMAIN}.cfg

# Paramétrage du fichier de configuration Nagios - Remplacement du nom :
for file in /srv/salt/files/supervision/files-config/${SERVER}${DOMAIN}.cfg
do
  echo "Traitement de ${file} ..."
  sed -i -e "s/template\.v\.sdem\.fr/${SERVER}\.v\.sdem\.fr/g" "${file}"
done

# Paramétrage du fichier de configuration Nagios - Remplacement de l'adresse IP :
for file in /srv/salt/files/supervision/files-config/${SERVER}${DOMAIN}.cfg
do
  echo "Traitement de $file ..."
  sed -i -e "s/192\.168\.1\.XXX/${IP1}\.${IP2}\.${IP3}\.${IP4}/g" "${file}"
done

# Déploiement du fichier de configuration sur le serveur de supervision :
salt ${SUPERVISION} cp.get_file salt://files/supervision/files-config/${SERVER}${DOMAIN}.cfg /usr/local/nagios/etc/objects/sdem/

# Application des droits sur le fichier :
salt ${SUPERVISION} cmd.run "chown sdem:sdem /usr/local/nagios/etc/objects/sdem/${SERVER}${DOMAIN}.cfg"

# Redémarrage du service nagios-nrpe :
salt ${SUPERVISION} cmd.run "sudo systemctl restart nagios.service"

1. Script de mise à jour de Metabase sur Dataviz :

Ce script permet de déployer la mise à jour de Metabase sur les serveurs 

Emplacement du script : /srv/salt/scripts/

Nom du script : salt-deploy-supervision.sh

##############################################################
# Auteur : jkermorvant
# Date de modification : 20231215
#
# Description : Script de mise à jour de Metabase
#
##############################################################
#! /bin/bash
#
##############################################################
# Variables :
SERVER=dataviz-dev.v.sdem.fr
VERSION=0.47.9

##############################################################
# 1 - Executer le script de dump postgresql
salt ${SERVER} cmd.run "sudo -u postgres pg_dump upciti_db > /backup/postgresql/upciti_db_bck"

# 2 - Stopper le service
salt ${SERVER} cmd.run "sudo systemctl stop metabase.service"

# 3 - Télécharger metabase.jar dans le répertoire d'installation (VERSION = 0.47.8 actuellement)
salt ${SERVER} cmd.run "sudo rm /data/metabase_data/metabase.jar"
salt ${SERVER} cmd.run "sudo wget -P /data/metabase_data https://downloads.metabase.com/v${VERSION}/metabase.jar"
salt ${SERVER} cmd.run "chown -R metabase_usr:metabase_grp /data/metabase_data/metabase.jar"

# 4 - Démarrer Metabase
salt ${SERVER} cmd.run "systemctl start metabase.service"
salt ${SERVER} cmd.run "systemctl status metabase.service"