Système d'automatisation

Ce module couvre les principaux objectifs de script pour l'examen LPI 201. Vous n'avez pas besoin d'apprendre un nouveau langage comme perl ou bash. Tout ce qui est attendu est de décrire avec précision ce qu'est un script. La connaissance de la syntaxe exacte pour une langue spécifique de script n'est pas prévu.

La meilleure façon de s'entraîner pour cela est de passer par quelques exemples. Pour cela, nous allons mettre en œuvre les tâches automatisées suggérées dans les objectifs LPI.

État : {a_reli}

Retour au document principal

Pré-requis

1. Rédaction de simples scripts perl (utilisation de modules)

La documentation en ligne pour perl est contenue dans le paquet perldoc.Les pages de manuel sont divisées en sections. Par exemple, la section perlintro peut être consulté avec:

man perlintro

Ou

perldoc perlintro

Voici un résumé de ce perldoc:

Un script Perl doit être en lecture et exécutable. La première ligne du script doit pointer vers l'interpréteur.
Par exemple si vous voulez pointer sur ''/usr/bin/perl'', la première ligne dans le script doit être :  

#!/usr/bin/perl

Il existe trois types de variables qui peuvent être déclarées et référencé comme dans le script qui suit:

# Scalars (scalaire)
my $VARIABLE = “value”; #déclare la VARIABLE
print (“$VARIABLE \n”); #affiche VARIABLE

# Arrays (tableau)
my @ARRAY = (“color1”,”color2”,”color3”); # déclare le tableau
$index=0 # print ARRAY
while ($index < @ARRAY) {
print (“element of $index is @ARRAY[$index] \n”);
$index++;
}

# Hashes or Associative Arrays (hachage ou tableau associé ) ({key,value} pairs)
my %HASH=(“color1”, “blue”,”color2”, “red”, “color3”, “white”);
foreach $key (keys %HASH) {
print (“The key $key corresponds to the value $HASH{$key} \n”);
}
@color_rank = sort keys %HASH; # assign the keys to an array

2.En utilisant le module Perl taint pour sécuriser les données

Le module taint est utilisé pour vérifier que les variables externes fournies par l'utilisateur ne peuvent pas être utilisés pour exploiter le système. Ce module est automatiquement utilisé lors de l'exécution des scripts qui ont le bit setuid ou setgid activé. Il est possible de forcer un script perl pour passer le module taint avec l'option -T.

Par exemple l'appel système ci-dessous permettra à tout utilisateur de lire des fichiers avec un accès en lecture:

insecure.pl

$FILENAME=ARGV[0] # C'est l'équivalent de  $1 en bash
system(“/usr/bin/less”, $FILENAME);

Si le script est par le SUID root ou si l'option -T est utilisée, alors le module taint sera appelé et ce script ne s'exécutera pas.

check-secure.pl

$FILENAME=ARGV[0] # this is the equivalent to $1 in bash
system(“/usr/bin/less”, $FILENAME);

En fait, le script check-secure.pl n'est pas sécurisé, il aura tout simplement pas fonctionner avec le SUID root ou l'option -T. Ici cette version de insecure.pl qui travaillent autour du mécanisme taint et vraiment PAS Sécurisé !!!

if (open (FILE,"$FILENAME")) {
  $line = <FILE>;
  while ($line ne "") {
          print ($line);
          $line = <FILE>;
          }
}

3.Installation du module Perl (CPAN)

Lisez les pages suivantes de perldoc pour informations sur les modules perl :

man perlmod

Un ensemble de fonctions spécifiques peuvent être écrites sous forme de modules et importés dans les nouveaux scripts avec la directive:

use module

Il y a deux méthodes disponibles pour télécharger, compiler et installer des modules de www.cpan.org

Méthode 1: Les modules peuvent être téléchargés a partir de www.cpan.org et construit de la manière suivante :

Décompresser l'archive et écrire :

perl Makefile.pl
make
make test
make install

Méthode 2: Utiliser l'outil cpan

Nous pouvons configurer interactivement CPAN de la manière suivante :

cpan

CPAN is the world-wide archive of perl resources. It consists of about
100 sites that all replicate the same contents all around the globe.
Many countries have at least one CPAN site already. The resources
found on CPAN are easily accessible with the CPAN.pm module. If you
want to use CPAN.pm, you have to configure it properly
Are you ready for manual configuration? [yes]

This can also be done with the commandline

CPAN build and cache directory? [/root/.cpan]

How big should the disk cache be for keeping the build directories
with all the intermediate files?
Cache size for build directory (in MB)? [10]

Where is your gzip program? [/bin/gzip]
Where is your tar program? [/bin/tar]
Where is your unzip program? [/usr/bin/unzip]
Where is your make program? [/usr/bin/make]
Where is your links program? [/usr/bin/links]
Where is your wget program? [/usr/bin/wget]
Warning: ncftpget not found in PATH
Where is your ncftpget program? [] /usr/bin/lftpget

Now we need to know where your favorite CPAN sites are located.
[...]
(1) Africa
(2) Asia
(3) Central America
(4) Europe
(5) North America
(6) Oceania
(7) South America
Select your continent (or several nearby continents) [] 4
[...]

cpan shell -- CPAN exploration and modules installation (v1.7601)
ReadLine support available (try 'install Bundle::CPAN')

cpan> install
[...]

Une fois que CPAN est configuré, nous pouvons installer des modules en ligne de commande

perl -MCPAN -e “install MODULENAME”

Les modules sont installés dans les sous-répertoires de /usr/lib/perl. On peut vérifier si un module spécifique est installé avec:

perl -MMODULENAME -e 1

Pour un exemple d'application utilisant des modules perl voir l'annexe.

4.Vérifier l'exécution des processus

Une recherche dans la sortie de ps pour un processus en utilisant grep retourne parfois un état positif, même si le processus ne fonctionne pas!

Cela est dû au fait que le processus lui-même, ici grep est parfois imprimé par ps. Comme dans l'exemple ci-dessous:

ps au|grep junk
root 13643 0.0 0.2 1724 600 pts/1 S 11:22 0:00 grep junk

Inutile de dire qu'il n'y a pas d'outils pré-installés appelé junk en général, de sorte que la ligne ci-dessus reviendrait à une évaluation positive dans un script!

Il y a un travail autour de ce problème.

Utilisation de pgrep

Cet outil recherche les sortie de ps pour les PIDs des processus qui correspondent à la recherche des critères. Par exemple:

ps aux | pgrep -u root httpd

Ceci correspondra à tous les processus httpd géré par l'utilisateur root. On peut également utiliser pgrep comme grep avec un seul mot clé.

Use |grep -v grep

En canalisant la sortie de ps en grep -v grep peut empêcher grep de se trouver. Cela ne fonctionnera pas toutefois si le processus que vous surveillez contient la chaîne grep.

ps aux | grep smbd | grep -v grep

5.Le contrôle des processus et générer des alertes

Cet objectif nous donne l'occasion d'utiliser les capacités de contrôle de flux avec bash pour faire un choix lors de la vérification de l'état d'un processus donné.

Disons que nous voulons vérifier que le démon smbd est en cours d'exécution, puis redémarrez-le et envoyez un message si il est arrêtée, et ne rien faire si il est toujours en cours d'exécution. Le script suivant sera:

PROCESS=smb
if ps aux | grep "$PROCESS" | grep -v grep >/dev/null ; then
         echo Process $PROCESS is running
else
         echo Process $PROCESS is stopped – Restarting it ...
         /etc/rc.d/init.d/smb start > /dev/null
fi

Vérification de la réponse d'un hôte à l'aide de ping:

while (true)
do

#obtenir le temps de 10 sorties de ping
    x=$(ping -c 10 $1 | cut -d"=" -f4 | tail +2|head | sed "s/ms//")
#Vérifie dans une boucle ceux qui sont plus long que 14ms 
    for times in $x
       do
            dectimes=$(echo $times | cut -d. -f1) # obtenir un nombre entier
            if [ $(($dectimes-14)) -gt 0 ]; then
               echo Time exceeded 14ms: $times
            fi
      done
done

Script annexe pour analyser les fichiers journaux et les envoyer par courriel

Nous pouvons utiliser un script perl pour exécuter un ordre de lecture dans /var/run/utmp et obtenir une recherche qui correspondent à tous les utilisateurs connectés et envoyer la ligne a root.

$LOGFILE="/tmp/lastlog";
$line="0";
system("last> $LOGFILE");

open (MAIL, "| mail root");

if (open (FILE,"$LOGFILE")) {

     while ($line ne "") {
       $line=<FILE>;
         if ($line =~ still) {
           print MAIL $line;
              }
       }
}
close MAIL;

Si ce script doit s'exécuter toutes les heures et qu'il est appelé /usr/bin/last-log.pl, alors vous pouvez créer un lien symbolique dans /etc/cron.hourly pointant vers lui.

Surveiller les fichiers modifiés et de générer des alertes e-mail

Une empreinte digitale de 128 bits (ou "message-digest) pour un fichier peut être calculée avec md5sum.

Le script suivant va vérifier le checksum MD5 de tous les fichiers dans /etc et comparer les sortie avec diff. S'il y a des différences, les fichiers modifiés sont envoyés à l'utilisateur root.

touch /tmp/md5old
touch /tmp/md5new
mv /tmp/md5new /tmp/md5old

for files in $(find /etc -type f )
do
       md5sum $files >> /tmp/md5new
done

x=$(diff /tmp/md5old /tmp/md5new)

if [ -z "$x" ]; then
       break
else
       echo $x |mail root
fi

Notez que la première fois que vous exécutez ce script tous les fichiers seront considérés comme changés!

La vérification de fingerprint MD5 valide peut être effectuer a partir de l'entrée standard (STDIN) ou a partir d'une liste pré-calculé utilisant md5sum -c (--check). Nous avons d'abord calculer ces montants avec :

find /etc -type f | xargs md5sum > etc-md5.dat

Nous allons ensuite transmettre le contenu de etc-md5.dat à md5sum -c.

Si par exemple on supprime quelques lignes vides dans /etc/sysctl.conf, nous pouvons voir que quelque chose a changé avec :

md5sum -c etc-md5.dat | grep -v OK

/etc/sysctl.conf: FAILED
md5sum: WARNING: 1 of 1906 computed checksums did NOT match

Écrire un script qui avertit les administrateurs lorsque quelqu'un connecte ou se déconnecte

Il n'est pas une bonne idée de poster toutes ces informations, mais il est possible de les rassembler et, éventuellement, les formater en utilisant XML ou HTML.

Ici, nous lisons à partir d'une liste d'utilisateurs que nous voulons suivre le fichier /etc/checks et envoyer un e-mail dès qu' ils sont connectés.

Cela peut fonctionner grâce à un cron toutes les minutes. Cela signifie que quand quelqu'un de la liste est connecté, un e-mail à chaque minute sera envoyé!

for luser in $(cat /etc/checks)
 do
   x=$(last |grep $luser|grep still)
   if [ -n "$x" ]; then
     echo User $luser is logged in | mail root;
   fi
 done

6.Utiliser Rsync

Rsync fonctionne comme une commande rcp ou scp optimisé. Il permet de copier seulement dans le répertoire de destination, les fichiers qui sont manquants ou ont été modifiés dans le répertoire source. Même avec des fichiers modifiés rsync enverra seulement la différence entre les deux fichiers.

Les syntaxes sont :

rsync SRC HOST:/DEST

rsync HOST:/SRC DEST

On peut changer la valeur de la variable de shell distant RSYNC_RSH utilisé par rsync:

export RSYNC_RSH=ssh

Voici un exemple de script utilisant rsync pour garder "Fedora à jour" par des mises à jour sur le serveur local:

cd /var/ftp/pub/updates/fedora

(
date
echo
echo "=== Sync Files ==="
rsync -vaz --delete --delete-excluded --exclude="*/debug/*"
rsync://rsync.mirror.ac.uk:873/download.fedora.redhat.com/pub/fedora/linux/core/up
dates/1/
linux/core/updates/1/ 2>&1
echo "=== Sync Files Done ==="
echo
date
) | mail -s "Fedora Updates Sync Results" andrew@anvil.org