11 Jul 2020, 00:00

Logrotate

Doc ubuntu

Config de la rotation stockée dans /etc/logrotate.d/mon-journal-a-rotater

De cette forme :

/path/to/my/logfile {
	monthly        # can be daily, weekly
	rotate 12      # keep 12 history files
	compress       # gzip the old logs
	delaycompress  # gzip old logs except the more recent one
	missingok      # does not stop if a file is missing
	notifempty     # does not rotate if file is empty
	create 644 root root # permissions, user and group for the newly created file
}

Pour Docker :

/var/lib/docker/containers/*/*.log {
  rotate 30
  daily
  compress
  size=10M
  missingok
  delaycompress
  copytruncate  # does not replace, but truncate the file, so the the docker process is not disturbed by a missing file
}

Force rotation :
logrotate -fv /etc/logrotate.d/mon-journal-a-rotater (force, and verbose)
On peut spécifier directement le fichier de configuration général, /etc/logrotate.conf, qui inclue tout ce qui se trouve dans /etc/logrotate.d/ si on veut rotater l’ensemble des logs.

20 Jun 2020, 00:00

Nmap

Ping scan : nmap -sn 10.0.0.1-255

Nmap est plus efficace lorsqu’il est lancé avec les droits root, car il peut aller directement consulter la table ARP, alors que sans les droits root, il tente la connection sur un/des ports courants.

https://security.stackexchange.com/questions/74493/different-results-using-nmap-with-without-sudo

Parfois, même ainsi, tous les appareils en ligne ne sont pas listés (genre 10 resultats maximum). Il semble que passer l’option -v pour augmenter la verbosité aide à les visualiser tous.

Pour n’avoir que les IP affichées, on peut poser ça après notre commande nmap : | grep report | awk '{print $5}'

29 May 2020, 00:00

Live-USB 64b Hybrid Debian Buster avec secureboot
sudo aptitude install live-build live-tools
mkdir buster_live && cd buster_live
mkdir auto && cp /usr/share/doc/live-build/examples/auto/* ./auto/

Editer le fichier auto/config pour qu’il contienne ceci :

#!/bin/sh

set -e

lb config noauto \
	--architectures 'amd64' \
	--archive-areas 'main contrib non-free' \
	--bootappend-live 'boot=live config locales=fr_FR.UTF-8 keyboard-layouts=fr' \
	--binary-images 'iso-hybrid' \
	--distribution 'buster' \
	--linux-flavours 'amd64' \
	--source 'false' \
	"${@}"

Entrer la commande lb config, puis aller éditer le fichier config/package-lists/live.list.chroot et ajouter les paquets désirés. Je propose ceci :

live-boot
live-config
live-config-systemd
#FIRMWARE
firmware-linux firmware-atheros firmware-b43-installer firmware-bnx2x firmware-brcm80211 firmware-intelwimax firmware-iwlwifi firmware-libertas firmware-myricom firmware-netxen firmware-qlogic firmware-realtek broadcom-sta-dkms

#UTILS
nmap rcconf gparted hfsprogs ntfs-3g hfsplus hfsutils dosfstools lightdm bash-completion chntpw dcfldd bootlogd less mesa-utils numlockx ethtool grub2 ssh gdisk testdisk python-tk iftop nethogs pm-utils dmraid aptitude apt-file smartmontools debootstrap pciutils usbutils cifs-utils e2fsprogs mtools screen lvm2 net-tools mdadm lsscsi haveged rng-tools cryptsetup efibootmgr efivar ncdu wireless-tools

# TEAMVIEWER
libqt5webkit5 qml-module-qtquick2 qml-module-qtquick-controls qml-module-qtquick-dialogs

# DESKTOP
hplip system-config-printer xsane simple-scan mate-desktop-environment caja-open-terminal mesa-utils chromium-l10n pulseaudio pavucontrol pavumeter mate-media-common mate-media mate-settings-daemon-dev mate-settings-daemon-common mate-settings-daemon chromium engrampa unrar pluma bluez blueman pulseaudio-module-bluetooth gddrescue ddrescueview vlc rdesktop conky network-manager-gnome

Puis entrer la commande sudo lb build.

A noter qu’il est possible de décomposer la commande sudo lb build en la succession suivante :

sudo lb bootstrap
sudo lb chroot
sudo lb binary

Il est possible d’aller modifier/ajouter manuellement des fichiers entre l’étape chroot et l’étape binary. Par exemple, pour créer /home/user/ , /home/user/Bureau/ et y ajouter des fichiers, qui seront disponibles directement sur le bureau du live.

Penser à copier /etc/skel/.bashrc et .profile dans le home, ils n’y sont pas si on crée le dossier à la main. Et le .inputrc tant qu’à faire.

Si on souhaite recommencer la création du live, on peut utiliser la commande sudo lb clean qui ne conserve que le cache des paquets, du bootstrap et la config. On peut aussi utiliser les options --binary ou bien --chroot pour conserver les étapes antérieures.

21 Dec 2019, 00:00

Compiler et installer inadyn sous Debian Buster

J’ai besoin du logiciel inadyn pour mettre à jours mes enregistrements dyndns chez OVH.
La version de Inadyn packagée par Debian est trop ancienne, et non compatible avec OVH, contrairement aux versions plus récentes dispos sur github.

Compilation et installation

## Prérequis
sudo aptitude install wget libssl-dev libgnutls28-dev autoconf libconfuse2 libconfuse-dev checkinstall pkg-config

## Répertoires nécessaires pour checkinstall
sudo mkdir /usr/local/share/doc
sudo mkdir /usr/local/share/man
sudo mkdir /usr/local/share/doc/inadyn


## libite
wget -c https://github.com/troglobit/libite/releases/download/v2.1.0/libite-2.1.0.tar.xz
tar -xvf libite-2.1.0.tar.xz
cd libite-2.1.0/
./configure
make -j5
sudo checkinstall ## Valider avec entrée plusieurs fois ; modifier les valeurs si souhaité
sudo dpkg -i libite_2.1.0-1_amd64.deb
sudo ldconfig	


## inadyn
cd ..
wget -c https://github.com/troglobit/inadyn/releases/download/v2.5/inadyn-2.5.tar.xz
tar -xvf inadyn-2.5.tar.xz
cd inadyn-2.5/
./configure
make
checkinstall
sudo dpkg -i inadyn_2.5-1_amd64.deb

Fichier de conf

/etc/inadyn.conf

provider default@ovh.com {
    ssl         = true
    username    = monsite-admin
    password    = superpassword
    hostname    = {domaine.monsite.fr}
    checkip-command = /root/.local/bin/scripts/checkIP.sh
}

provider default@ovh.com:2 {
    ssl         = true
    username    = monsite-admin
    password    = superpassword
    hostname    = {autredomaine.monsite.fr}
    checkip-command = /root/.local/bin/scripts/checkIP.sh
}

Pour que les utilisateurs du serveur ne puissent lire les identifiants :

sudo chmod 600 /etc/inadyn.conf

On peut ajouter autant de hostname qu’on veut, en changeant le chiffre après default@ovh.com:.
Les username/password doivent être définis sur l’interface OVH.

Script de reconnaissance d’IP (checkIP.sh)

#!/bin/sh
curl ipecho.net/plain; echo

Chemin à mettre en concordance avec inadyn.conf.
Ne pas oublier de sudo chmod +x checkIP.sh.

Crontab

Je préfère lancer le programme ponctuellement et régulièrement via cron que de le laisser tourner en demon.
Voici mon entrée dans le crontab pour ce faire :

# Lance inadyn toutes les 5 minutes
*/5 * * * * /usr/local/sbin/inadyn -1 -f /etc/inadyn.conf > /dev/null 2>&1

21 Dec 2019, 00:00

Mermaid
graph TB
SubGraph1 --> SubGraph1Flow
    subgraph "./debian-base-install.sh"
    SubGraph1Flow(Install Base Server)
    SubGraph1Flow -- apt install --> SubGraph1Flow1(Server with dependencies)
    SubGraph1Flow1 -- clone mmg-tools in /mmg --> SubGraph1Flow2(Repository)
    SubGraph1Flow2 -- create user mmg --> SubGraph1Flow3(installed application)
    SubGraph1Flow3 -- copy docker/$ENV/* docker/ --> SubGraph1Flow4(configured application)
    SubGraph1Flow4 -- docker-compose up --> SubGraph1Flow5(running dockers)
end

SubGraph2 --> SubGraph2Flow
    subgraph "./deploy_backend.sh"
    SubGraph2Flow(Install Back End Volume)
    SubGraph2Flow -- clone mmg-server in /tmp --> SubGraph2Flow1(Repository)
    SubGraph2Flow1 -- configure files --> SubGraph2Flow2(configured application)    
    SubGraph2Flow2 -- composer install --> SubGraph2Flow3(installed application)
    SubGraph2Flow3 -- mv /tmp /volumes --> SubGraph2Flow3(application deployed in volumes)    

end
SubGraph3 --> SubGraph3Flow
    subgraph "./deploy_frontend.sh"
    SubGraph3Flow(Install Front End Volume)
    SubGraph3Flow -- clone mmg-client in /tmp --> SubGraph3Flow1(Repository)
    SubGraph3Flow1 -- npm install $ENV --> SubGraph3Flow2(installed application)
    SubGraph3Flow2 -- build sass --> SubGraph3Flow3(generated css files)
    SubGraph3Flow3 -- npm run build --> SubGraph3Flow4(built application)
    SubGraph3Flow4 -- mv /tmp /volumes --> SubGraph3Flow5(application deployed in volumes)    

end
SubGraph4 --> SubGraph4Flow
    subgraph "Missing functionnality"
    SubGraph4Flow(Install Database Volume)
    SubGraph4Flow -- manually copy existing volume --> SubGraph4Flow1(Volume set)
end

SubGraph1[Install Server] --> SubGraph2[Install Back End]
SubGraph2 --> SubGraph3[Install Front End]
SubGraph3 --> SubGraph4[Install DATABASE]   

20 Dec 2019, 00:00

Vrac git

Interface graphique basique mais fonctionnelle : gitg

git config --global credential.helper "cache --timeout=3600"
#pour  mettre les identifiants du serveur distant en cache pendant 1h

git init : crée les fichiers nécessaires au fonctionnement de git (.git/)

HEAD : l’emplacement sur l’arbre où l’on se situe actuellement

git status

git add : pour tracker un dossier, fichier (ou plus fin ?)
git commit : valide le diff, -m pour message custom

git diff : liste les modifications depuis le dernier commit

git fetch : lit les nouvelles modification sur le serveur distant
git pull : applique ces modifications sur notre arborescence locale
git pull --rebase : pour ne pas faire de commmit lorsqu’on repositionne notre HEAD

git log : voir l’historique des commits

git branch : pour lister les branches (git branch new-feature pour créer une branche)
git checkout : changer de branche
git checkout -b new-feature : crée la branche new-feature et m’y positionne
git push --set-upstream origin new-feature : réplique la branche new-feature sur le serveur distant

git push : après avoir commit, envoie le(s) commit sur le serveur distant
git stash : met en “presse papier” les diffs actuel et se resync avec le commit le plus récent
git stash apply : réapplique ce “presse-papiers”
# le combo des 2 peut permettre de résoudre une situation “modifié des 2 côtés” en mettant de côté notre travail, récupérant les modifs sur le serveur distant puis réappliquant nos diff dessus

06 Dec 2019, 00:00

Serveur OpenVPN ponté sous Debian Buster

Mentionné sans aucun password, en rajouter si désiré.
Prévu pour permettre un lien avec le réseau local distant, mais sans redirection de l’ensemble du trafic via VPN.

Préparation générale

apt install bridge-utils openvpn

Création de la PKI et des certificats/clés

cd /etc/openvpn
make-cadir easy-rsa/
cd easy-rsa
nano vars

Trouver les lignes qui définissent les noms de notre organisation et les modifier comme souhaité ;
Passer la taille de clés à 4096b ;
Changer le temps d’expiration par défaut du CA et des certificats en nombre de jours(ici, 10 ans)

set_var EASYRSA_REQ_COUNTRY    "FR"
set_var EASYRSA_REQ_PROVINCE   "IDF"
set_var EASYRSA_REQ_CITY       "Paris"
set_var EASYRSA_REQ_ORG        "Ma badass orga"
set_var EASYRSA_REQ_EMAIL      "me@example.net"
set_var EASYRSA_REQ_OU         "Mon OU qui déchire"

set_var EASYRSA_KEY_SIZE        4096

set_var EASYRSA_CA_EXPIRE       3650

set_var EASYRSA_CERT_EXPIRE     3650

# Le CRL a aussi une date d'expiration, on la passe à 10 ans
set_var EASYRSA_CRL_DAYS        3650

Puis on lance toute la procédure

# Initier la PKI ;
# Supprime la PKI si déjà existante
./easyrsa init-pki

# Créer les params Diffie-Hellman
./easyrsa gen-dh

# Créer les fichier de l'autorité de certif
./easyrsa build-ca nopass  # nopass pour absence de mot de passe
# Génération et signature de la CSR (signing request) du server, avec définition du Common Name
./easyrsa gen-req mon-server-vpn nopass
./easyrsa sign-req server mon-server-vpn # le "server" indique le type
# Vérification si souhaitée
openssl verify -CAfile pki/ca.crt pki/issued/mon-server-vpn.crt

# Génération et signature d'un kit de connexion pour un client
./easyrsa gen-req mon-pc-client nopass
./easyrsa sign-req client mon-pc-client

Les certificats sont dans issued, les clés dans private.

Génération TLS
Ce fichier devra être présent sur chacun des clients

openvpn --genkey --secret ta.key
mv ta.key /etc/openvpn/easy-rsa/pki/

Réseau

Activer forward IPv4

echo 'net.ipv4.ip_forward = 1' >> /etc/sysctl.d/10-network.conf

Fichier /etc/network/interfaces qui crée le bridge et l’adaptateur TAP au démarrage ;
vérifier la cohérence des noms d’interface

auto lo
iface lo inet loopback

auto br0
iface br0 inet static
    pre-up openvpn --mktun --dev tap0
    post-down openvpn --rmmtun --dev tap0
    bridge_hw 00:11:22:aa:bb:cc
    bridge_ports eth0 tap0
    address 192.168.1.2
    netmask 255.255.255.0
    gateway 192.168.1.1

Les interfaces impliquées dans le bridge (eth0, tap0) n’ont pas besoin d’être configurées dans ce fichier.
La directive bridge_hw permet de spécifier l’adresse MAC du bridge (qui sera constatée depuis le réseau, le routeur etc). Par souci de simplicité, je conseille de la fixer à la même valeur que la carte réseau physique (eth0 par exemple). Sinon, il me semble qu’elle prendra la première valeur “alphabétique” entre les différentes cartes réseau impliquées, et l’adresse de la carte tap0 peut varier d’un démarrage à l’autre.

Définition du fichier de conf du server

On peut récupérer le fichier d’exemple ainsi :

cd /etc/openvpn/server
cp /usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz ./
gunzip ./server.conf.gz
mv server.conf mon-server-vpn.conf

En voici une version minimaliste, à mettre dans /etc/openvpn/server/ :

port 1194
proto udp
dev tap0 # doit être en accord avec le fichier interfaces
ca /etc/openvpn/easy-rsa/pki/ca.crt
cert /etc/openvpn/easy-rsa/pki/issued/mon-serveur-vpn.crt
key /etc/openvpn/easy-rsa/pki/private/mon-server-vpn.key  # This file should be kept secret
dh /etc/openvpn/easy-rsa/pki/dh.pem
server-bridge
keepalive 10 120
cipher AES-256-CBC
compress lz4-v2
persist-key
persist-tun
status /var/log/openvpn/openvpn-status.log
verb 3
explicit-exit-notify 1

# Pour TLS
tls-auth /etc/openvpn/easy-rsa/pki/ta.key 0  #" 0 pour le server, 1 pour les clients
#auth SHA256  ## ???

On peut vérifier qu’il se lance bien via

openvpn /etc/openvpn/server/mon-server-vpn.conf

Si “Initialization Completed”, c’est gagné.

Activation du service (donc démarrage automatique) via systemd

systemctl enable openvpn-server@mon-server-vpn.service

Le nom entre @ et .service doit correspondre au nom du fichier de configuration.

Client

Installer le client VPN souhaité selon la plateforme.
Le fichier de conf doit être en conformité avec le serveur.
Sous Windows, avec OpenVPN GUI, si on met les chemins complets, syntaxe de type :

"C:\\Users\\myuser\\OpenVPN\\ca.crt"

Si les fichiers sont dans le même dossier que la conf, on peut mettre simplement les noms de fichier.
Un fichier de conf client compatible avec le fichier de conf serveur ci-dessus :

client
dev tap
proto udp
remote example.com 1194
resolv-retry infinite
nobind
persist-key
persist-tun
ca ca.crt
cert mon-pc-client.crt
key mon-pc-client.key
cipher AES-256-CBC
compress lz4-v2
verb 3
tls-auth ta.key 1

Pour lancement auto via systemd :

systemctl enable openvpn-client@mon-pc-client.service

Révocation de certificat

cd /etc/openvpn/easy-rsa/
./easyrsa revoke mon-pc-client
./easyrsa gen-crl   ## Crée/update pki/crl.pem

## Ajouter le fichier dans la conf server
echo "crl-verify /etc/openvpn/easy-rsa/pki/crl.pem" >> /etc/openvpn/server/mon-server-vpn.conf

Puis restart le server ; la clé de mon-pc-client ne sera désormais plus acceptée.
Il faut relancer la commande ./easy-rsa gen-crl à chaque fois qu’un certificat est révoqué, pour mettre à jour le fichier crl.pem.

Attention : le CRL a aussi une durée d’expiration ! Elle peut être paramétrée dans le fichier vars. Pour la visualiser :
openssl crl -in pki/crl.pem -text | grep "Next Update"

Lister les clients connectés

cat /var/log/openvpn/openvpn-status.log | sed '/CLIENT_LIST/!d' | cut -d"," -f2 | sed '/CLIENT_LIST/d' | sort -d

20 Nov 2019, 00:00

Sed

https://www.grymoire.com/Unix/Sed.html#uh-61

Substitution

Lorsqu’on encadre la regex avec des apostrophes, son contenu est envoyé littéralement à sed.
Lorsqu’on l’encadre avec des guillements, les variables sont déployées par bash avant passage à sed.

L’option -r sert à passer en syntaxe d’expression régulières étendues. La seule différence est que, en mode étendu, les caractères ?+(){} servent par défaut de caractères spéciaux, et qu’ils faut les échapper pour les considérer en caractères littéraux.
Source

Un groupe encadré par des parenthèses signifie “cette suite de caractères précisément”.
On peut également accéder à ce contenu dans la partie remplacement. Le contenu des premières parenthèses sera accessible par \1, le contenu des deuxièmes par \2 etc (backreferences)
Par exemple,
echo azerty | sed -r 's/a(ze)r(ty)/\1 \2/'
renverra ze ty.

Un groupe de caractères entre crochet signifie “un caractère parmi ceux-là”. Le point doit être échappé pour y être placé. Si on souhaite placer les crochets eux-même dans ce groupe, il semble qu’il faille les mettre en premier, crochet fermant d’abord. On peut aussi y placer [:space:] pour inclure les espaces et tabulations. De même, il semble qu’il faille les mettre juste après les crochets (inclus dans les crochets).
Par exemple :
sed 's/[][[:space:](){}\._-]//g'

On peut choisir le nombre d’occurences d’un motif grâce à plusieurs opérateurs:
* : 0 ou + occurences
? : 0 ou 1 occurence
+ : 1 et +
{m} : m occurences
{m,n} : entre m et n occurences
{m,} : m occurences et plus

Suppression de lignes

Se fait avec la syntaxe sed '/PATTERN/d' qui supprimera les lignes qui contiennent le motif “PATTERN”.
À l’inverse, sed '/PATTERN/!d' supprimera les lignes qui ne contiennent PAS le motif “PATTERN”. Dans ce cas, les simples apostrophes semblent nécessaires, sinon le motif “!d” est transformé en la commande “date”.

Délimiteur via motif

On peut spécifier 2 motifs qui définiront l’intervalle d’action de sed.
sed '/startpattern/,/endpattern/ <sed-commands>' file

05 Nov 2019, 00:00

Let's encrypt / Certbot

Visualiser les certificats existants :

cerbot certificates

Il vaut mieux créer un certificat par domaine, plutôt qu’un pour tous les domaines (ce qui est le cas par défaut si non précisé) Pour créer un nouveau certificat pour un domaine précis :

sudo certbot --apache -d example.com --rsa-key-size 4096

Les fichiers se retrouvent dans /etc/letsencrypt/archive/ et sont linkés dans /etc/letsencrypt/live/

Pour rajouter un domaine à un certificat existant :

certbot --expand -d example.com,new.example.com

Pour supprimer un certificat, il semble qu’il n’y ait d’autre moyen que de supprimer les dossiers concernés dans les dossiers live, archive et renewal (dans /etc/letsencrypt/ )

Pour renouveler tous les certificats :

certbot renew

Pour renouveler seulement un domaine précis, au choix :

certbot certonly -d example.com

Vérifier la longueur d’une clé en appel direct d’un site web :

echo | openssl s_client -connect example:443 2>/dev/null | openssl x509 -text -noout | grep "Public-Key"

05 Nov 2019, 00:00

Notes sur les ACL Linux

Général

Les ACL (Access Control List) sont des autorisations qui permettent de gérer les droits de manière plus fine que les permissions UNIX traditionnelles.

Elles doivent être activées dans le noyau Linux (grep -i acl /boot/config*).

Elles doivent aussi être activées lors du montage de la partition, soit explicitement, soit via les options de montage par défaut (sudo tune2fs -l /dev/sdX1 | grep Default\ mount pour voir les options de montage par défaut d’une partition).

On vérifie que les outils sont installés : sudo apt install nfs4-acl-tools acl

On repère un dossier sur lequel des ACL sont positionnées via la présence d’un “+” à la fin des permissions. Par exemple :

ls -al ./DATA

donne

drwxr-x---+ 14 user     group      4096 oct.  31 12:44 .

Visualisation des ACL

On peut voir le détail avec la commande getfacl ./DATA

# file: DATA/
# owner: user
# group: group
user::rwx
user:www-data:r-x
group::---
mask::r-x
other::---

On y voit les permissions classiques via user::, group:: et other::. On peut voir que l’utilisateur “www-data” possède des droits de lecture positionnés via ACL.

Définition des ACL

On peut modifier les ACL via la commande setfacl. Par exemple, pour ajouter des droits RW à l’utilisateur “user2”, on lance :

setfacl -m u:user2:rwx ./DATA

Suppression des ACL

On peut supprimer les autorisations via setfacl -b ./DATA