Les regex -> expression régulière

expression régulière

Les expressions régulières … cette phrase me hantait à l’époque…
Il m’était quasiment impossible d’effectuer une recherche dans des fichiers de logs…
Voici ce qu’il faut retenir !

Voici un extrait de la definition de  Wikipedia:

 Une expression rationnelle ou expression régulière est en informatique une chaîne de caractères que l’on appelle parfois un motif et qui décrit un ensemble de chaînes de caractères possibles selon une syntaxe précise. Les expressions rationnelles sont issues des théories mathématiques des langages formels des années 1940

Pas évident non plus comme approche … alors que ce ne sont que des expressions que l’on retrouve regulièrement !
On les retrouve dans tous les langages : Perl, awk, Python, vi, grep, C++, Java, sed, avec le mod_rewrite d’apache, règles nginx…

1- La Théorie

Symbole   Description
n’importe quel caractère
[…] tout caractère parmis ceux énumérés
[^…] tout caractère exepté ceux énumérés
^ la position en début de ligne
$ la position en fin de ligne
< la position en début de mot
la position en fin de mot
| (pipe) reconnaît l’un ou l’aure des termes qu’il sépare
? 0 ou 1 occurence du caractère ou de l’expression régulière précédé
* 0 ou n occurences du caractère ou de l’expression régulière précédé

2- La Pratique avec egrep

Recherche les mots dont q n’est pas suivi de u :

egrep 'q[^u]' wordlist.txt

Recherche toute ligne qui commence par ‘From:, Subject:’ ou Date dans le fichier de mail :

egrep '^(From|Subject|Date):' mailbox

Liste toute les lignes du fichier money commençant avec le caractère $

egrep '^\\$' money

Liste tous les fichiers et répertoires dans le répertoire courant qui ne se terminent pas avec .tex

ls -l | egrep '\[^.tex\]$'

Liste tous les fichiers et répertoires dans le répertoire courant qui se terminent avec .tex

ls -l | egrep '\[.tex\]$'

3- La Pratique avec Vi

Remplace un espace ou plus par un espace.

:1,$s/ */ /g

Supprime les espaces en fin de ligne.

:1,$s/ *$//

Supprime tous les numéros en début de ligne.

:1,$s/^\[0-9\]\[0-9\]* //

4- La Pratique avec les autres outils

 sed

Supprime toutes les lignes vides du fichier

$ sed 's/^$/d' toto.txt

Supprime tous les guillemets dans le fichier

$ sed 's/"//g' toto.txt

awk

Affiche le fichier sans prendre en compte les lignes vides du fichier.

$ awk ‘$0 !~ /^$/’ phonelist.txt
$ awk ‘NF > 0’ toto.txt

grep

Soit le fichier phone2.txt suivant :

Durand, Sophie 4-5471
Bigard, Jean-Marie 8-7463
Roumanoff, Anne 3-8456
Satriani, Joe 7-1554
Saintlazar, Rob 5-8451
Vai, Steve 7-9547
Maiden, Iron 9-6669

Affiche les lignes dont le numéro de téléphone commence par un 5 et se termine par un 1

grep '5-...1' phone2.txt

Affiche les lignes dont le nom de famille commence par un S et dont le prénom commence par un R

$ grep '^S\[^ \]* R' phone2.txt

Affiche les lignes dont le nom de famille commence avec les lettres allant de M à Z

$ grep '^\[M-Z\]' phone2.txt

Affiche les lignes dont le prénom est composé de quatre caractères

$ grep ',....\t' phone2.txt

Si vous en voulez encore :

L’article de Wikipedia

Pfsense: changer le port de l’interface web

pfsense port interface

Si pour des raisons de sécurité ou autres… Vous souhaitez changer le port de l’interface web de Pfsense, voici la procédure :

C’est très simple, il faut déjà avoir l’accès à l’interface.
Ensuite « System » -> « Advanded » et de mettre le numéro de port choisi dans la case « TCP Port« .

Enfin on sauvegarde avec « save » et quelques secondes plus tard vous pouvez vous relogguer (en oubliant pas de changer le port sans le navigateur).

Pfsense: mettre l’interface web sur le wan

pfsense wan

Par défaut, l’interface web de pfsense n’est accessible que depuis le LAN.

Attention ce qui va suivre désactive quelques principes de sécurité. On pourra pour compenser filtrer sur une adresse ip par exemple.

La méthode est assez simple ! car il suffit simplement de créer une nouvelle règle dans le firewall.

Nous allons aller dans « Firewall » > « Rules » et se placer dans l’onglet « WAN » et cliquez sur le « + »

Nous allons créer la nouvelle règle :

Action : "Pass"
Interface : "WAN"
Source : Soit vous mettez toutes les ips soit une seule pour plus de sécurité.
Destination : "WAN Address"
Destination port range : "HTTP"
Log : Oui ou non cela dépend si vous voulez des logs
Description : Votre choix

Enfin on clique sur « Save » puis « Apply changes »

Vous pouvez alors accéder à l’interface depuis http://WAN/

Liste des codes http

codes http

Voici une liste des codes HTTP… En français :

* 100 : OK pour continuer
* 101 : le serveur a changé de protocoles
* 200 : requête effectuée avec succès
* 201 : document créé (raison : nouvelle URI)
* 202 : requête achevée de manière asynchrone (TBS)
* 203 : requête achevée de manière incomplète
* 204 : aucune information à renvoyer
* 205 : requête terminée mais formulaire vide
* 206 : requête GET incomplète
* 300 : le serveur ne peut pas déterminer le code de retour
* 301 : document déplacé de façon permanente
* 302 : document déplacé de façon temporaire
* 303 : redirection avec nouvelle méthode d’accès
* 304 : le champ ‘if-modified-since’ n’était pas modifié
* 305 : redirection vers un proxy spécifié par l’entête
* 307 : HTTP/1.1
* 400 : erreur de syntaxe dans l’adresse du document
* 401 : pas d’autorisation d’accès au document
* 402 : accès au document soumis au paiement
* 403 : pas d’autorisation d’accès au serveur
* 404 : la page demandée n’existe pas
* 405 : méthode de requête du formulaire non autorisée
* 406 : requête non acceptée par le serveur
* 407 : autorisation du proxy nécessaire
* 408 : temps d’accès à la page demandée expiré
* 409 : l’utilisateur doit soumettre à nouveau avec plus d’infos
* 410 : cette ressource n’est plus disponible
* 411 : le server a refusé la requête car elle n’a pas de longueur
* 412 : la précondition donnée dans la requête a échoué
* 413 : l’entité de la requête était trop grande
* 414 : l’URI de la requête était trop longue
* 415 : type de média non géré
* 500 : erreur interne du serveur
* 501 : requête faite au serveur non supprimée
* 502 : mauvaise passerelle d’accès
* 503 : service non disponible
* 504 : temps d’accès à la passerelle expiré
* 505 : version HTTP non gérée

La même liste en anglais :

* 200 : request completed
* 201 : object created, reason = new URI
* 202 : async completion (TBS)
* 203 : partial completion
* 204 : no info to return
* 205 : request completed, but clear form
* 206 : partial GET furfilled
* 300 : server couldn’t decide what to return
* 301 : object permanently moved
* 302 : object temporarily moved
* 303 : redirection w/ new access method
* 304 : if-modified-since was not modified
* 305 : redirection to proxy, location header specifies proxy to use
* 307 : HTTP/1.1: keep same verb
* 400 : invalid syntax
* 401 : access denied
* 402 : payment required
* 403 : request forbidden
* 404 : object not found
* 405 : method is not allowed
* 406 : no response acceptable to client found
* 407 : proxy authentication required
* 408 : server timed out waiting for request
* 409 : user should resubmit with more info
* 410 : the resource is no longer available
* 411 : the server refused to accept request w/o a length
* 412 : precondition given in request failed
* 413 : request entity was too large
* 414 : request URI too long
* 415 : unsupported media type
* 500 : internal server error
* 501 : required not supported
* 502 : error response received from gateway
* 503 : temporarily overloaded
* 504 : timed out waiting for gateway
* 505 : HTTP version not supported

Jenkins : installation sur Centos, Debian ou Ubuntu

jenkins install

Jenkins est un outil open source d’intégration continue. C’est sans doute le plus connu de sa catégorie. Il est écrit en JAVA et embarque son propre serveur web. L’intégration continue apporte de nombreux avantages comme l’automatisation de taches ou encore la possibilité de délivrer une version fonctionnelle de votre application régulièrement.

Jenkins (anciennement appelé Hudson), dont la réputation n’est plus à faire, s’est formé tout un éco-système et dispose à ce jour plus de 1000 Plugins. Nous allons voir comment l’installer sur les distributions linux les plus standard avec Nginx en reverse proxy.

Centos / RedHat

1. Mise en place du repository

wget -O /etc/yum.repos.d/jenkins.repo http://pkg.jenkins-ci.org/redhat/jenkins.repo
rpm --import https://jenkins-ci.org/redhat/jenkins-ci.org.key

2. Installation

yum install jenkins

3. Activation du service

Pour s’assurer que le service soit démarrer au lancement du serveur :

systemctl enable jenkins

On démarre le service :

systemctl start jenkins

Debian / Ubuntu

1. Mise en place du repository

wget -q -O - https://jenkins-ci.org/debian/jenkins-ci.org.key | sudo apt-key add -
sudo sh -c 'echo deb http://pkg.jenkins-ci.org/debian binary/ > /etc/apt/sources.list.d/jenkins.list'

2. Installation

sudo apt-get update
sudo apt-get install jenkins

3. Activation du service

Pour s’assurer que le service soit démarrer au lancement du serveur :

systemctl enable jenkins

On démarre le service :

systemctl start jenkins

Mise en place du reverse proxy avec Nginx

Nous allons créer un nouveau virtual host pour notre Jenkins.

 vi /etc/nginx/conf.d/jenkins.conf

et y mettre ceci :

upstream app_server {
    server 127.0.0.1:8080 fail_timeout=0;
}

server {
    listen 80;
    server_name jenkins.cloud-devops.fr;

    location / {
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $http_host;
        proxy_redirect off;

        proxy_pass http://app_server;
        }
}

On relance le service nginx :

systemctl restart nginx

et on peut accéder à Jenkins via l’url http://jenkins.cloud-devops.fr/

Notre Jenkins est maintenant installé. Nous verrons par la suite comment le paramétrer pour

Linux : lister les paquets installés

package-managers

Il peut être intéressant de pouvoir lister les paquets installés sur notre distribution linux.
Par exemple pour en connaitre la version, vérifier si besoin de l’installer.
Nous allons voir comment les lister sur différentes distributions.

Debian

Avec l’outil dpkg

 dpkg --list

On peut utiliser aussi l’outil apt

 apt list --installed

Centos/Redhat

Avec les distribution à base de rpm on utilise yum

yum list installed

Archlinux

Sur Arch, c’est l’utilitaire pacman qui nous permet de gérer nos paquets

 pacman -Q

WordPress : Restreindre l’accès de l’admin par ip

restreindre admin wordpress

Si vous avez une adresse IP statique, chez vous ou au bureau, ou peut-être votre propre VPN, vous avez la chance de pouvoir augmenter votre sécurité. La technique consiste à restreindre les accès à l’admin de wordpress par une ou plusieurs ip.

Nous allons voir comment le mettre en place sur Nginx.

1. Création d’un bloc map

Nous allons créer un bloc map pour y inclure la liste des adresses ip autorisées.

map $remote_addr $allowed_ip {

1.2.3.4 1;
1:: 1;
5.6.7.8 1;

default 0;
}

On assigne la valeur 1 aux adresses ip que l’on veut autoriser et 0 pour le reste.

2. Modification du bloc server

Nous allons modifier notre « bloc server » pour y inclure nos conditions. Nginx ne supporte pas les opérateurs logiques dans les bloc if , nous allons donc devoir contourner le problème en mettant plusieurs if.

server {
... 
set $check ''; #initialisation de la variable  

if ( $allowed_ip = 0 ) {
  set $check "A";
}

if ( $request_uri ~ ^/wp-(login\.php|admin/) )  {
  set $check "${check}B";
}

if ( $check = "AB" ) {
return 403;
}
...
}

Donc si l’adresse n’est pas dans la liste du bloc map « check = A » et si l’uri correspond à /wp-login.php ou wp-admin/ « check = AB ». Si nous avons $check = AB nous retournons une 403 ( forbidden ).

Nginx : Installer la dernière version / mainline

Nginx

Chaque nouvelle version de Nginx apporte son lot de nouveauté. Par exemple la version 1.9.7 apporte le support du protocole http2. Vous pouvez trouver les différents changements ainsi que les corrections de bug sur le changelog.

J’avais l’habitude d’utiliser la version « stable » de Nginx sur mes serveurs, mais je voulais vraiment offrir le support de http2. J’ai donc décidé de mettre à jour ma version pour passer sur la version « mainline« . Attention si vous utilisez des modules dit de « third-party » ils peuvent devenir incompatible ou apporter des nouveaux bugs.

Nous allons voir une méthode pour passer sur cette version tout en conservant le gestionnaire de paquets de ma distribution linux (apt, yum).

1. Installation de la version mainline sur Centos/Redhat

Nous allons créer le fichier /etc/yum.repos.d/nginx.repo avec ce contenu :

[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/mainline/OS/OSRELEASE/$basearch/
gpgcheck=0
enabled=1

Il faut modifier OS par rhel ou centos suivant votre distribution et OSRELEASE par 5,6 ou 7 suivant votre version.
Ensuite il faut mettre à jour le paquet Nginx :

 yum update

2. Installation de la version mainline sur Debian/Ubuntu

Pour Debian/Ubuntu nous devons identifier le repository à l’aide d’une clé. Cela va aussi permettre d’eliminer tous les messages d’alertes.

curl http://nginx.org/keys/nginx_signing.key | apt-key add -

On ajoute ensuite le repository. Il faut ajouter ces lignes à la fin du fichier /etc/apt/sources.list.

Pour Debian :

deb http://nginx.org/packages/mainline/debian/ codename nginx
deb-src http://nginx.org/packages/mainline/debian/ codename nginx

Il faut remplacer « codename » par wheezy pour la version 7.x ou jessie pour la version 8.x.

Pour Ubuntu :

deb http://nginx.org/packages/mainline/ubuntu/ codename nginx
deb-src http://nginx.org/packages/mainline/ubuntu/ codename nginx

On remplace « codename » par precise pour la version 12.04, trusty pour la version 14.04, vivid pour la version 15.04 et wily pour la version 15.10

Il ne reste plus qu’à mettre à jour :

apt-get update
apt-get install nginx

3. Test de la version

nginx -v
nginx version: nginx/1.9.10

On peut bien sur, garder ce numéro de version pour nous et ne pas l’afficher dans nos headers http.

Centos7 / RedHat7 : installer les vmware tools

vmware tools

Les VMwareTools ont maintenant leur version open source OpenVM tools.
C’est une suite d’outils qui améliore les fonctionnalités de la VM par une meilleur communication avec l’hyperviseur.

Pour cela on va ajouter un nouveau repo :

cat > /etc/yum.repos.d/vmware-tools.repo <<EOF
[vmware-tools]
name = VMware Tools
baseurl = http://packages.vmware.com/packages/rhel7/x86_64/
enabled = 1
gpgcheck = 1
EOF

On passe un update :

yum update

Et on installe les VMwareTools

 yum install open-vm-tools-deploypkg

Voilà !

Haproxy: activer les logs avec rsyslog

haproxy rsyslog

Il est très intéressant de pouvoir écrire dans un fichier de log les erreurs de HAProxy. Cela peut aussi servir dans le cas d’un debug.

Les logs de HAProxy peuvent être activés en ajoutant cette ligne dans le fichier de configuration haproxy.cfg.

log 127.0.0.1 local0

Il suffit ensuite de créer ce fichier /etc/rsyslog.d/10-haproxy.conf avec le contenu suivant :

$ModLoad imudp
$UDPServerRun 514 
$template Haproxy,"%msg%\n"
local0.=info -/var/log/haproxy.log;Haproxy
local0.notice -/var/log/haproxy.notice;Haproxy

local0.* ~ 

On relance Rsyslog :

/etc/init.d/rsyslog restart

Avec ceci, tous les logs de type info vont être écrit dans le fichier /var/log/haproxy.log.
Les types notice iront dans le fichier /var/log/haproxy.notice.

Pour finir, les fichiers de logs peuvent être tournés via rotatelog, il faut ajouter cette configuration dans /etc/logrotate.d/haproxy :

/var/log/haproxy.log {
    missingok
    notifempty
    sharedscripts
    rotate 14
    daily
    compress
    postrotate
        reload rsyslog >/dev/null 2>&1 || true
    endscript
}