Skip to content →

Fabien Vincent Posts

Rsyslog : Dériver les messages syslog dans un fichier particulier

Depuis pas mal de temps, je me casse les dents sur la dĂ©rivation des logs envoyĂ©s au dĂ©mon rsyslog, utilisĂ©s pas dĂ©faut dans Ubuntu. En effet, j’ai installĂ© un tvheadend sur mon serveur / media center pour avoir Ă  la TV dans tous mes XBMC/Kodi, et le mode debug est un peu trop verbeux Ă  mon goĂ»t.

La configuration de base de rsyslog est fait par dĂ©faut dans “/etc/rsyslog.d/50-default.conf”. Pour qu’un fichier particulier soit traitĂ© en premier, comme dans Apache, il faut en crĂ©er un nouveau.

Par exemple, j’ai crĂ©er les fichiers suivants :

[19:54 user@home ~] > ll /etc/rsyslog.d/*
-rw-r--r-- 1 root root  483 Apr  9 21:40 /etc/rsyslog.d/10-tvheadend.conf
-rw-r--r-- 1 root root  465 Apr  9 21:40 /etc/rsyslog.d/11-dhcpd.conf
-rw-r--r-- 1 root root  469 Apr  9 21:50 /etc/rsyslog.d/12-postfix.conf
-rw-r--r-- 1 root root  311 Mar 17  2012 /etc/rsyslog.d/20-ufw.conf
-rw-r--r-- 1 root root 1.7K Apr  9 21:52 /etc/rsyslog.d/50-default.conf

Ces fichiers contiennent les dérivations suivantes :

[19:54 user@home ~] > cat /etc/rsyslog.d/10-tvheadend.conf
# Put tvheadend log in a specific log file
if $programname == 'tvheadend' then /var/log/tvheadend/tvheadend.log
& stop

[19:54 user@home ~] > cat /etc/rsyslog.d/11-dhcpd.conf
# Put isc-dhcpd-server log in a specific log file
if $programname == 'tvheadend' then /var/log/dhpcd.log
& stop

[19:54 user@home ~] > cat /etc/rsyslog.d/12-postfix.conf
# Put postfix log in a specific log file
if $programname == 'tvheadend' then /var/log/postfix.log
& stop

Il faut ensuite simplement reloader/restarter le service rsyslog pour prendre en compte ces changements, et vérifiez que vos fichiers sont bien crées (il peut subsister des problÚmes de droits, surtout lorsque vous avez créer un dossier spécifique comme dans le cas de tvheadend).

A noter qu’il existe beaucoup d’options pour filtrer par programname, severity, ou de maniĂšre plus puissante par regex. Dans le cas ou vous souhaiteriez faire ceci, RFTM !

Ensuite, il ne faut oublier de configurer la rotation des logs (dans mon cas, j’ajoute un restart du process, car je n’ai pas de ‘status‘ pour le dĂ©mon tvheadend dans mon init.d) :

[20:05 user@home ~] > cat /etc/logrotate.d/tvheadend
/var/log/tvheadend/*.log {
        daily
        missingok
        rotate 7
        compress
        delaycompress
        notifempty
        create 640 syslog adm
        sharedscripts
        postrotate
                /etc/init.d/tvheadend restart
        endscript
}

Puis forcer la rotation (-f) ou débuguer (-d)

[20:09 user@home ~] > sudo logrotate -d /etc/logrotate.conf
reading config file /etc/logrotate.conf
[...]
reading config file tvheadend
[...]

rotating pattern: /var/log/tvheadend/*.log  after 1 days (7 rotations)
empty log files are not rotated, old logs are removed
switching euid to 0 and egid to 104
considering log /var/log/tvheadend/tvheadend.log
  log does not need rotating
not running postrotate script, since no logs were rotated
switching euid to 0 and egid to 0

Vous trouvez alors la rotation des logs :

[20:11 user@home ~] > ll /var/log/tvheadend/
 
-rw-r----- 1 syslog adm  12K Apr 11 20:11 tvheadend.log
-rw-r----- 1 syslog adm  48K Apr 11 09:50 tvheadend.log.1

Bon amusement !

Comments closed

Passer de Cisco IOS à IOS-XR, une nouvelle façon de penser !

Pour industrialiser des nouveaux Ă©quipements ASR 99xx sous Cisco IOS-XR, j’ai Ă©crit un script pour convertir rapidement la configuration des interfaces L3 IPv4 / IPv6, l’IGP OSPF/OSPFv3 et ses costs, ainsi que le routage BGP depuis une configuration de Cisco 6K sous IOS. Ceci afin principalement d’Ă©viter les erreurs de ctrl+c / ctrl+v (ou l ‘effet PEBKAC) .

La majoritĂ© des changements est facile Ă  apprĂ©hender entre IOS et IOS-XR, mĂȘme si parfois les choix technologiques entrainent de changer sa maniĂšre de corrĂ©ler la technique rĂ©seau et la configuration des Ă©quipements. Exemple : la MTU n’est plus considĂ©rĂ©e au niveau 3 sur un IOS-XR, mais comme la MTU niveau 2, voir ASR9000/XR: Understanding MTU calculations ou
MTU Behavior on Cisco IOS XR and Cisco IOS Routers).

Mais le changement majeur de IOS-XR, c’est l’arrivĂ©e des route-policies. Pour ceux qui ont l’habitude des SUP720 /  SUP2T, lorsque l’on configure une session BGP, on configure 3 Ă©lĂ©ments communs en IN / OUT :

  • filter-list [AS_PATH] (in|out) : On configure ici la liste des AS / AS_PATH BGP autorisĂ©s ou interdits en in et out
  • prefix-list [PFX_LIST] (in|out) : On configure ici la liste des prĂ©fixes annoncĂ©s ou interdits en in et out
  • route-map [ROUTEMAP] (in|out) : On configure ici la route-map in et out qui permettra de modifier les attributs BGP, les next-hop …. Tout un ensemble d’élĂ©ments nĂ©cessaires pour maitriser la rĂ©partition de trafic, les commits en fonction des transitaires, l’acceptation des default routes ou de la DFZ, etc ….

Sur Cisco IOS-XR, plus besoin de lire 1000 lignes Ă©parpillĂ©es dans la configuration pour comprendre la logique de tel ou tel neighbor BGP ! On peut avoir le tableau d’Ă©quivalences suivant:

Cisco IOS Cisco IOS-XR
Sets d’AS Paths ip as-path access-list as-path-set
Sets de préfixes ip prefix-list prefix-set
Configuration neighbor BGP filter-list
prefix-list
route-map
route-policy

 

DĂ©sormais, les annonces, les filtres et la modification des attributs BGP se rĂ©alisent dans un seul et mĂȘme endroit : la route-policy.

Ces route-policies sont un peu dĂ©routantes au dĂ©but, car il fait penser Ă  tout. Plus possible de changer les annonces avec la modification rapide d’un prefix-list en out avec un clear ip bgp soft.

La logique de ces routes policies est beaucoup plus “programmatique” qu’avant :

  • Par dĂ©faut, on interdit tout (deny / drop implicite). Il n’y a donc plus de deny non plus dans les prefix-set ou les as-path-set, car il faut utiliser le mot clĂ© “not” avant un test.
  • Les conditions sont faites par des conditions “if  then” > “elseif then” > “else” > “endif”, comme en bash. L’ordre des conditions remplace les numĂ©ros de sĂ©quences bien connues des route-maps.
  • L’exĂ©cution d’une route-policy se fait Ă  l’aide d’un “ticket” qui peut changer de valeur en fonction des conditions :
    • mot clĂ© “PASS” : L’exĂ©cution continue et on autorise, tant que le reste de la RPL ne drop pas (le deny implicite ne s’applique pas)
    • mot clĂ© “SET” : MĂȘme usage que “PASS”, mais on ajoute la modification des attributs BGP
    • mot clĂ© “DONE” : L’exĂ©cution s’arrĂȘte avec un “PASS”
    • mot clĂ© “DROP”: L’exĂ©cution s’arrĂȘte avec un deny explicite.

Exemple simple et stupide !

route-policy example
    # On autorise les AS_PATH dans allowed-ases
    # On évite la default route dans default-route
    if (as-path in allowed-ases and not destination in default-route) then
         pass
    # On set le local-pref Ă  20 si on tombe sur la default-route
    elseif (destination in default-route) then
         set local-preference 20
    # Sinon on laisse passer le reste avec un local-preference a 10
    else 
         set local-preference 10
    endif
# Ici, on a un drop implicite, d'oĂč le dernier set
end-policy

On peut aussi faire un appel à des routes-policies de maniÚre imbriqué, en passant des variables :

route-policy set_localpref($pref)
  set local-pref $pref
end-policy

Dans la route-policy précédente, il nous suffit donc de faire

    else 
         apply set_localpref(10)
    endif

L’exemple ci-dessus n’est pas forcĂ©ment le plus intelligent, mais en Ă©largissant Ă  des exemples concrets, on prend conscience de la puissance des route-policies sous IOS-XR. Il est mĂȘme possible Ă  priori d’appeler une route-policy avec un argument dans la configuration d’un neighbor BGP.

Cette nouvelle maniĂšre de penser / Ă©crire les optimisations et actions sur le routage est trĂšs percutante, mĂȘme si le changement est difficile Ă  apprĂ©hender et nĂ©cessite de la rĂ©flexion.

En effet, dans la rĂ©alisation de mon script de migration, j’ai pu convertir les as-path access-list, les prefix-list, et les route-maps, mais le nombre de combinaisons possibles pour les neighbors BGP m’a empĂȘcher d’automatiser leur conversion de maniĂšre simple. Le changement dans l’application des paramĂštres de configuration du neighbor BGP nĂ©cessite une revue complĂšte et manuelle des paramĂštres de configuration du neighbor BGP.

Pour en savoir plus, je vous engage Ă  lire ce trĂšs bon article sur le supportforums cisco, qui m’a permis de dĂ©marrer et automatiser la conversion des routes-maps : ASR9000/XR: Understanding and using RPL (Route Policy Language)

De nombreux articles sont disponibles sur le net, et la pratique vaut forcĂ©ment mieux que l’exemple.

Bon courage à ceux qui doivent migrer des milliers de lignes à la main 😉

Comments closed

Laverna, une application web de Notes

En cherchant une application pour auto-hĂ©berger mes notes et remplacer EverNote, j’ai Ă©tĂ© sĂ©duit par l’application Laverna.

Les fonctionnalitĂ©s qui m’ont attirĂ©es sont les suivantes :

  • GĂ©rer vos notes, mĂȘme lorsque vous ĂȘtes dĂ©connectĂ©
  • Cryptage sĂ©curisĂ© cĂŽtĂ© client (AES)
  • PossibilitĂ© de synchroniser avec DropBox – ce que je ne ferais pas bien entendu 🙂
  • Boutons de contrĂŽle WYSIWYG
  • Coloration syntaxique 
  • Raccourcis clavier

Pour une démonstration : https://laverna.cc/

Pour l’installation, il suffit de faire un git clone du repository dans un Virtual Host sĂ©curisĂ© : https://github.com/Laverna/laverna

Bref, une application web de plus auto-hébergée !

One Comment

Perfect Forward Secrecy pour Postfix/Dovecot

AprĂšs mon article sur PFS pour Apache, j’ai mis Ă©galement en place PFS sur mon serveur de messagerie Postfix/Dovecot, le client K9-Mail pour Android supportant dĂ©sormais des versions plus rĂ©centes de TLS, TLSv1.1 et v1.2.

Voici ici quelques éléments pour réaliser cette configuration et augmenter la sécurisation des flux chiffrés.

One Comment

Perfect Forward Secrecy pour Apache

Lors de l’utilisation d’un protocole comme SSL/TLS pour le chiffrement et la sĂ©curisation des donnĂ©es sur des rĂ©seaux non sĂ»rs, il est important de garantir la confidentialitĂ© totale des communications, mĂȘme en cas de capture du trafic chiffrĂ©.

TLS n’est en effet pas un protocole unique, mais une multitude de briques permettant la sĂ©curisation des Ă©changes, grĂące Ă  :

  • L’authentification du serveur (et optionnellement du client). On utilise en gĂ©nĂ©ral un certificat x509v3 dĂ©livrĂ© par une autoritĂ© de certification.
  • La confidentialitĂ© des donnĂ©es, en utilisant les suites de chiffrement disponibles dans les CipherSpecs.
  • L’intĂ©gritĂ© des donnĂ©s, en utilisant des fonctions de hachage disponibles dans les CipherSpecs.

Un des problĂšmes de TLS est que pour que cela fonctionne, il faut bien un clĂ© master symĂ©trique dĂ©finie dans l’Ă©tape client key exchange. Heureusement, celle-ci est chiffrĂ©e par la clĂ© publique du certificat serveur, empĂȘchant sa lecture par un tiers autre que le serveur.

Un des problĂšmes est que si l’on rĂ©cupĂšre la clĂ© master et la clĂ© privĂ©e du serveur, mĂȘme Ă  postĂ©riori, il est techniquement possible (mĂȘme si cela n’est pas Ă  la portĂ© de quiconque !) de dĂ©chiffrer l’ensemble d’une capture du trafic par exemple. On perd ainsi la confidentialitĂ© des donnĂ©es transmises, ce qui n’est pas acceptable pour un protocole de sĂ©curisation de donnĂ©es. Quand on connait les impacts potentiels de la faille HeartBleed, on se rend compte que l’obtention de la clĂ© privĂ©e est possible (mĂȘme si encore une fois, cela reste une attaque trĂšs complexe et non garantie, cela reste possible et envisageable).

Afin d’Ă©viter cela, nous allons utiliser la propriĂ©té Perfect Forward Secrecy, qui va faire appel Ă  des suites de chiffrement basĂ©es sur les Ă©changes de clĂ© DH (au lieu de RSA) qui ne sont pas faillibles (en thĂ©orie) Ă  ce principe, car les clĂ©s Ă©changĂ©es sont Ă©phĂ©mĂšres et signĂ©es. Cette propriĂ©tĂ© permet d’Ă©viter le dĂ©chiffrement Ă  postĂ©riori d’une capture, mĂȘme en possession de la clĂ© privĂ©e du serveur. Attention, ceci est vrai si le groupe DH est suffisamment grand et valide, et uniquement sur des communications antĂ©rieures Ă  l’obtention de la clĂ© privĂ©e.

Il est possible de renforcer ce mĂ©canisme de Perfect Forward Secrecy en utilisant la cryptographie basĂ©e sur des courbes elliptiques (ECDHE pour l’Ă©change de clĂ©s Ă©phĂ©mĂšres, et ECDSA pour l’authentification du serveur), rĂ©putĂ©e plus sĂ»re que la cryptographie par factorisation.

Par exemple, sur le logiciel Apache, on peut utiliser les CipherSuites suivantes pour renforcer la sécurité de nos échanges basés sur TLS :

# Activation du mod_ssl dans Apache
SSLEngine on

# On désactive SSLv2 et SSLv3 pour n'utiliser que TLS v1.x
SSLProtocol all -SSLv2 -SSLv3

# Au lieu de préférer les suites du client (mécanisme par défaut), on privilégie les suites proposées par le serveur
SSLHonorCipherOrder on

# On propose les suites avec ECDHE, ECDSA uniquement pour PFS
SSLCipherSuite "EECDH+ECDSA+AESGCM EECDH+aRSA+AESGCM EECDH+ECDSA+SHA384 EECDH+ECDSA+SHA256 EECDH+aRSA+SHA384 EECDH+aRSA+SHA256 EECDH+aRSA+RC4 EECDH EDH+aRSA RC4 !aNULL !eNULL !LOW !3DES !MD5 !EXP !PSK !SRP !DSS !RC4"
 
# On autorise les clients non compatibles SNI à accéder à ce vhost
SSLStrictSNIVHostCheck on

# Certificat, clé et chßne de certification
SSLCertificateFile      /etc/ssl/certs/cert_beufa.net.cert
SSLCertificateKeyFile   /etc/ssl/private/cert_beufa.net.key
SSLCertificateChainFile /etc/ssl/certs/CAcert_chain.pem

Ces options sont bien sĂ»r Ă  activer avec prĂ©caution en cas de forte charge sur vos serveurs Apache. En effet, la baisse de performances liĂ©es Ă  l’usage de la propriĂ©tĂ© Perfect Forward Secrecy entraĂźne des baisses de performances importantes, de l’ordre de 15% Ă  20% en fonction de la longueur des clĂ©s et CipherSpecs utilisĂ©s.

Comments closed
en_USEN