Monter une connexion VPN Fortinet sur debian ou ubuntu

Fortinet fournit un paquet client clé en main mais il n’est pas open source et pas forcément compatible avec votre version de distrib. En revanche le paquet openfortivpn est open source (sur GIT) et disponible dans les dépôts debian et ubuntu.

sudo apt install openfortivpn

Voici un exemple d’utilisation dans le cadre d’une authentification username/password :

openfortivpn <ip_gateway_forti>:<port_forti> -u <username> --use-syslog --pppd-ifname=<network_interface> --trusted-cert <cert>

le <cert> est délivré :

  • soit par l administrateur
  • soit lors d’un premier appel sans l’option cert et l’option use-syslog. (dans ce cas assurez-vous que votre réseau n’est pas détourné)

Pour simplifier la chose vous pouvez enregistrer votre configuration dans le fichier /etc/openfortivpn/config

Intégration dans le network-manager

En prime, il est possible de l’intégrer dans le network manager. Pour cela, installez les paquets suivants :

sudo apt install network-manager-fortisslvpn

Avec ce paquet, la configuration du VPN est possible via l’interface graphique et il est possible de monter/démonter le VPN en 1 clic et d’inclure des options de configuration DNS spécifiques pour chaque VPN.

Problème lors de la création d’une nouvelle connexion

si le bouton « save » est grisé, c’est probablement qu’il vous manque une lib. Pour identifier le problème, lancez l’editeur de connexion via une console, vous verrez passer les logs d’erreur dans la console.

sudo nm-connection-editor

Mémo postgresql

Quelques raccourcis sur le client psql

\l : lister toutes les bases

\c <base> : se connecter à la base <base>

\dt : lister les tables de la base courante

\d : quitter le client

\du : lister les roles

Créer une base et son utilisateur

CREATE DATABASE my_db;
CREATE USER my_username WITH encrypted password 'my_pass';
GRANT ALL ON DATABASE my_db to my_username;

Requête dynamique en plsql

Le but est de requêter une table dont le nom est récupéré depuis la colonne d’une autre table.

CREATE OR REPLACE FUNCTION ressource.getRessource(integer)
  RETURNS character varying AS
$BODY$
DECLARE
    ressource RECORD;
    name_list RECORD;
BEGIN
  BEGIN
    FOR name_list IN (SELECT id, name FROM table_index)
    LOOP
     EXECUTE 'SELECT * FROM  ressource.' || quote_ident(name_list.name) || ' as t where t.id = '|| $1 
     INTO ressource;
     EXIT WHEN FOUND;
    END LOOP;
  END;
RETURN ressource;
END
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;

Get rid of « error PANIC: could not locate a valid checkpoint record »

Sur Postgresql 9.6, il est possible de forcer la suppression des xlogs (avec une possible perte des transactions) :
pg_resetxlog -f DATADIR
En s’assurant que DATADIR est le chemin vers le repertoire de la bdd.
Sur Debian Strech :

  • il faut lancer pg_resetxlog en étant connecté avec le user « postgres »
  • pg_resetxlog n’est pas dans le PATH du user
  • pg_resetxlog se trouve dans /usr/lib/postgresql/9.6/bin

Pour plus de détails : http://www.postgresql.org/docs/current/interactive/app-pgresetxlog.html

Faire un full backup sans interruption client sur un serveur standalone

Il est important de comprendre que postgresql bufferise les transactions et qu’une copie brute force des données du disque (avec un dd ou autre) ne suffit pas à garantir la cohérence d’un backup. Ces buffers sont liés à la notion de checkpoint, ceux sont eux qui permettent d’identifier quand un ensemble de transaction a été effectivement écrit sur le disque. Avec l’activation de l’archivage dans des WAL, on peut récupérer l’ensemble des transactions qui sont en attente dans un fichier (le WAL).

Donc un backup complet doit se composer des données brutes et des WAL qui se sont accumulées pendant la copie des données brutes. Avec une réplication sur un standby on reste sur la même philosophie.

Cette solution est basée sur un export des backups sur une machine distante via rsync, il faut donc avoir préparé les accès ssh pour le user postgres entre les machines pour que tout fonctionne.

Voici les paramètres du fichier de conf postgresql.conf qui sont nécessaires :

wal_level = replica                     # minimal, replica, or logical
checkpoint_timeout = 1min               # à règler en fonction de la charge de la base
max_wal_size = 1GB
min_wal_size = 80MB
checkpoint_completion_target = 0.5      # checkpoint target duration, 0.0 - 1.0
checkpoint_flush_after = 256kB          # à règler en fonction du type de disque (SAN, disque virtuel...)
checkpoint_warning = 30s                
archive_mode = on
archive_command = 'test ! -f /var/lib/postgresql/backup_in_progress || (test ! -f /data/db_backup/archive/%f && cp %p /data/db_backup/archive/%f)'
# si vous voulez gzipper les WAL: (attention a bien dezipper lors du restore sinon postgres ne verra pas les WAL
# archive_command = 'test ! -f /var/lib/postgresql/backup_in_progress || (test ! -f /data/db_backup/archive/%f && gzip < %p > /data/db_backup/archive/%f)'

Ensuite voici un script qui lance le backup à bas niveau et la copie les WAL en attente. Voir les commentaires pour les explications :

#!/bin/bash
set -x

SYNCUSER=postgres
TARGET=backup_server
TARGET_BACKUP_FOLDER_NAME=backup_b

OLD_PWD=`pwd`
# fichier drapeau qui indique a postgres si il doit archiver ou non les WAL, fichier defini dans le parametre archive_command lui meme defini dans postgresql.conf
FLAG_FILE=/var/lib/postgresql/backup_in_progress

BACKUP_PATH=/data/db
DATA_FOLDER_NAME=main
DATA_PATH=/var/lib/postgresql/9.6/$DATA_FOLDER_NAME
# idem le repertoire d'archive est defini dans le archive_command
ARCHIVE_FOLDER_NAME=archive

DATE=`date +%F%T`

echo "Démarrage backup $DATE"
# demarre l'archivage des fichiers WAL
touch $FLAG_FILE

# demarre le buffering des transactions dans des WAL 
psql -c "select pg_start_backup('backup_$DATE');"

echo "Copie des données"
# copie bas niveau de tous les fichiers de données de postgresql sur le distant 
cd $DATA_PATH/..
rsync -aivz --delete --exclude postmaster.pid --exclude postmaster.opts --exclude pg_xlog $DATA_FOLDER_NAME/ $SYNCUSER@$TARGET:$BACKUP_PATH/$TARGET_BACKUP_FOLDER_NAME/ 

# Decommentez la ligne ci-dessous pour simuler un temps d'attente (cela permet de tester que l'injection d'une transaction pendant le backup est bien stocké dans le WAL et effectivement restauré par le script de restoration
# read

# arrete le buffering des transactions
psql -c "select pg_stop_backup();"

echo "copie terminée"
# arrete l'archivage des WAL
rm $FLAG_FILE 

echo "Sauvegarde des transactions en attentes"
# ajout des WAL archivés lors du backup dans le repertoire pg_xlog du backup distant

cd $BACKUP_PATH
rsync -aivz $ARCHIVE_FOLDER_NAME/ $SYNCUSER@$TARGET:$BACKUP_PATH/$TARGET_BACKUP_FOLDER_NAME/pg_xlog/


echo "Base de donnée et WAL sauvegardées sur $TARGET dans $BACKUP_PATH"
DATE=`date +%F%T`
echo "Fin de backup $DATE"
cd $OLD_PWD

Restaurer le backup

Avec une version 9.6 et un standalone, il suffit de lancer ce script pour restaurer la base sauvegardée.

Procédure :

  1. arrêter le service postgresql (il devrait l’être vu que vous voulez faire une restauration)
  2. Lancer le script en tant que user postgres
  3. relancer le service postgresql
#!/bin/bash
#set -x

echo "Make sure postgresql server is down, if not press CTRL+C"
read

SYNCUSER=postgres
TARGET=backup_server
TARGET_BACKUP_FOLDER_NAME=backup_b

OLD_PWD=`pwd`
# fichier drapeau qui indique a postgres si il doit archiver ou non les WAL, fichier defini dans le parametre archive_command lui meme defini dans postgresql.conf
FLAG_FILE=/var/lib/postgresql/backup_in_progress

BACKUP_PATH=/data/db
DATA_FOLDER_NAME=main
DATA_PATH=/var/lib/postgresql/9.6/$DATA_FOLDER_NAME

DATE=`date +%F%T`

echo "Restauration du dernier backup"

echo "Déplacement du repertoire data"
cd $DATA_PATH/..
tar -c $DATA_FOLDER_NAME | gzip > $DATA_FOLDER_NAME_$DATE.tar.gz

echo "Restauration des données"
# copie bas niveau de tous les fichiers de données de postgresql sauvegardés sur le local (inlcus les WAL, cf. script de backup)
rsync -aivz --delete $SYNCUSER@$TARGET:$BACKUP_PATH/$TARGET_BACKUP_FOLDER_NAME/ $DATA_FOLDER_NAME/

DATE=`date +%F%T`
echo "Base de donnée restaurée $DATE, vous pouvez redémarrer le service"

cd $OLD_PWD

Erreur stupide : s’assurer que les WAL ne sont pas compressés quand vous les restaurez dans le répertoire pg_xlog, sinon postgres vous indiquera que le backup n’est pas valide. En effet le WAL pointé par le backup_label porte bien l’id du WAL mais il sera illisible pour postgresql.

Architecte et expert technique freelance

Il aura fallu un peu plus de 3 ans pour que la solution de la « serrure connectée » soit autonome, et je la laisse entre de bonnes mains.

Il est temps pour moi de proposer mes services à de nouvelles structures. Avec 10 d’expériences de conception et de développement et 10 ans d’architecture applicative et système ; mes connaissances couvrent un spectre assez large : analyse et conception (IAF), développement backend (Java, PHP), développement mobile (Android et IOS), définition et mise en œuvre d’infrastructure cloud (AWS, python), sécurisation (TLS, X509…), expertise système linux (debian, ubuntu), cryptographie (AES, RSA), conception de protocole et contrat d’interface (M2M), customisation d’Android (AOSP), amélioration des performances des systèmes existants (Mysql, MariaDB, nginx, analyse de complexité…).

 

Je suis joignable par email : chrystophe.vergnaud [at] gmail.com pour discuter de votre futur projet ou d’une problématique en production.

Drawing ASCII dans le message de bienvenue d’une debian

Le fichier /etc/motd est bien pratique pour customiser le message de bienvenue et éviter de se mélanger les pinceaux lorsque l’on administre un petit lot de serveur.

L’outil Figlet permet de faire un drawing ASCII en une ligne de commande :

$ figlet Mon-Serveur

l’option -f permet de choisir le style de la police utilisée. Ajoutez les polices « contrib » si vous voulez avoir du choix.

Multi-écran et raccourci openbox sur Lxde

Un petit mémo pour définir des raccourcis clavier sur LXDE afin de basculer d’une config multi-écran à une autre.

Pré-requis:

Installation de arandr pour créer les config xrandr (ca evite de se cogner la doc xrandr et l’ecriture des commandes xrandr)

 sudo aptitude install arandr

Lien vers xrandr pour approfondir

Définition et sauvegarde des layout d’écran

Créez les scripts xrandr avec arandr. Pour cela définissez l’organisation des écrans et faites « enregistrer sous », cela sauvegarde un script xrandr que l’on pourra executer via le raccourci.

Pour l’exemple je les ai stocké dans ~/.screenlayout/.

Définition des touches de raccourci

Editez le fichier .config/openbox/lxde-rc.xml

ajoutez par exemple :

   <keybind key="W-C-Up">
     <action name="Execute">
       <command>~/.screenlayout/vga_top_edp_bottom.sh</command>
     </action>
   </keybind>
   <keybind key="W-C-Down">
     <action name="Execute">
       <command>~/.screenlayout/edp_only.sh</command>
     </action>
   </keybind>

ca permet de lancer une config dual-screen (vga+edp) avec les touches CTRL+WIN+up et de revenir a l’ecran EDP seul avec CTRL+WIN+down

plus d’info sur les config openbox ici

Enregistrer la sortie audio sur debian

Installation

Installer pulseaudio et sox,

Lancer pulseaudio :

 pulseaudio start

Récupérer la liste des entrée/sortie disponibles

 pactl list

Enregistrement

Enregistrer l’entrée monitor qui est une copie de la sortie audio dans un fichier wav 44kHz, 16 bit (entier signé) sur 2 canaux

 parec -d alsa_output.pci-0000_01_00.1.hdmi-stereo.monitor |sox -t raw -r 44k -b 16 -e signed-integer -c 2 - music.wav

Pour cibler le maximum de qualité en sortie, on peut passer sur du 64bit a virgule flotante:

 
 parec -d alsa_output.pci-0000_01_00.1.hdmi-stereo.monitor |sox -t raw -r 44k -b 64 -e float -c 2 - music.wav

Exim4 on ubuntu : startup options and queue timing

On ubuntu, xim4′ ‘configuration is based on template stored in /etc/exim4 (splitted or one block configuration template depending on your choice).
The real configuration file s’ ‘generated on the fly in /var/lib/exim4/config.autogenerated

Instead of using generated configuration, you can copy paste the configuration file from /usr/hare’/’doc/exim4-base in /etc/exim4, or use the generated one.

More over the /etc/init.d/exim4 load additional setting that control the option used to launch xim4 that’ ‘are as important as the configuration file.

So you should have a look to /etc/default/exim4, there you can find the queue start frequency for’ instance.

Double écran sous debian et le debug d’un serveur X

Quelques commandes et notes sur le debug d’un serveur X, utile pour l’installation d’un double écran ou de deux cartes vidéo.

Avoir un peu plus d’info sur le démarrage des cartes et les modes découverts:

$ startx -- -logverbose 6

Xinerama:

il est vieillissant mais il a l’avantage de faire tourner un écran virtuel sur cartes vidéo avec chacune leur écran. c’est une bonne alternative à  xrandr 1.3.

Section « ServerLayout »

   Identifier     "HDMI_and_LCD"
   Screen      0  "Screen0" 0 0
   Screen      1  "Screen1" Below "Screen0"
   Option "Xinerama" "1"

EndSection

Section « Screen »

   Identifier     "Screen0"
   Device         "card_330M"
   Monitor        "Philips"
       Option "ConnectedMonitor"       "DFP-0"
       Option "CustomEDID"     "DFP-0:/etc/X11/xorg.conf.d/philips"
   SubSection     "Display"
       Viewport    0 0
       Depth       24
       Modes "1920x1200"
   EndSubSection

EndSection

Section « Screen »

   Identifier     "Screen1"
   Device         "card_intel"
   Monitor        "Sony LCD"
   SubSection     "Display"
       Viewport    0 1200
       Depth       24
       Modes "1600x900"
   EndSubSection

EndSection

Xrandr 1.4:

avec xrandr 1.4 les multi cartes sont gérés mais il faut une distri qui l’embarque (ce n’est pas le cas de la debian Wheezy).

Section « ServerLayout »

   Identifier     "HDMI_and_LCD"
   Screen      0  "Screen0"
   Screen      1  "Screen1"
   Option "Xinerama" "0"

EndSection

Section « Screen »

   Identifier     "Screen0"
   Device         "card_330M"
   Monitor        "Philips"
       Option "ConnectedMonitor"       "DFP-0"
       Option "CustomEDID"     "DFP-0:/etc/X11/xorg.conf.d/philips"
       Option "MetaModes"      "DFP-0:1920x1200 +0+0"
   SubSection     "Display"
       Depth       24
       Modes "1920x1200"
   EndSubSection

EndSection

Section « Screen »

   Identifier     "Screen1"
   Device         "card_intel"
   Monitor        "Sony LCD"
   Option      "MetaModes"     "eDP-2:1600x900 +0+1200"
   SubSection     "Display"
       Depth       24
       Modes "1600x900"
   EndSubSection

EndSection

Gestion des EDID

Certaines cartes (c’est le cas sur le VAIO serie Z) n’accepte aucune description de moniteur manuel, elle cherche l’EDID du moniteur connecté, dans le cas ou le moniteur ne publie pas ou que la carte n’arrive à découvrir cet EDID on se retrouve bloqué avec soit le X server en vrac soit la carte montée mais aucune sortie vidéo. Pour remettre cela debout, il faut récupérer l’EDID du moniteur à  la mano au format binaire et l’identifier lors du démarrage de X.

Récupérer l’EDID:

Soit utiliser un outil (attention il ne voit pas toujours l’écran qu’on veut) pour afficher la liste des ecran vu:

$ get-edid | parse-edid

pour avoir le fichier binaire

$ get-edid>/etc/X11/xorg.conf.d/ecran.edid

Si l’ecran n’est pas list, il faut passer par le log de Xorg qui en mode verbose 6 affichera la chaine hexa des EDID decouvert. il faut ensuite copier et transformer cette chaine hexa en binaire. un petit coup de python ou php fait l’affaire.

Force l’EDID dans Xorg

dans la section screen, (je prefere dans screen car ca correspond avec la vision xorg: screen = quel moniteur avec quel carte)

       Option "CustomEDID"     "DFP-0:/etc/X11/xorg.conf.d/ecran.edid"

le DFP-0 est l’identifiant de la sortie vidéo de la carte, on la découvre dans le log de xorg avec le verbose 6.

Running i386 application in a debian 7 running amd64 architecture and the skype example

For instance, Skype that they themselves entitled multi-arch does not install correctly on debian amd64 if i386 arch is not enabled. This a quick « how to » make skype runs.

First check your main architecture:

 $ dpkg --print-architecture
 amd64

Display other accepted architecture:

 $ dpkg --print-foreign-architectures
 (it should display nothing)

Add the i386 architecture

 $ dpkg --add-architecture i386

now you can see the :i386 packages in your apt-get search

Download the .deb of the skype application

ok you know where to go…

Install GDebi

This application is particularly useful when you have a .deb that have lots of missing dependencies. it will install everything at once.

 $ apt-get install gdebi

Run GDebi on the .deb file

it will install the package and the dependencies

Enjoy !

Another method was to install the ia32lib that provides a bridge from 32bits to 64bits arch but it won’t help regarding the architecture dependies warning.

Compilation de PHP 5.3 sur debian lenny

Les paquets utiles:

  • g++
  • libstdc++
  • apache2
  • apache2-mpm-prefork
  • apache2-mpm-prefork-dev
  • automake
  • mcrypt
  • libmcrypt-dev
  • libpng
  • libpng-dev
Le configure

Methode oldfashion du tout ce qui est non standard dans /opt donc :

./configure --prefix=/opt/php --exec-prefix=/opt/php --with-apxs2=/usr/bin/apxs2 --with-config-file-path=/etc/php/ --disable-ipv6 --with-curl --enable-ftp --with-gd --enable-intl --enable-mbstring --with-mcrypt --with-mhash --with-mysql=/opt/mysql --with-mysqli=/opt/mysql/bin/mysql_config --with-pdo-mysql=/opt/mysql --enable-soap --with-pear --with-xsl --with-zlib --with-openssl
Build
make
make test
Installation

Installation un peu forcée car l’installeur plante sur une modification de la conf apache (il faudra la faire manuellement).

make install --ignore-errors