28/07/2015

Emile "iMil" Heitor 's home >> I’m an Architect B****!

Par : iMil
Tags:
AWS Certified Solutions Architect
Blogroll

So this happened :)

AWS Certified Solutions Architect - Associate Level

The post I’m an Architect B****! appeared first on Emile "iMil" Heitor 's home.


26/07/2015

Weblog de Natacha >> Expatriation

Par : Natacha Kerensikova
Tags:
Site

Je ne sais pas à quel point vous suivez l'actualité, mais il y a eu récemment des développement assez misérables pour le numérique français. La loi dite « renseignement » a fini son parcours législatif et elle a été promulguée presque intacte, en instituant ainsi la surveillance de masse en France.

D'autres en parlent mieux que moi, si vous n'êtes pas au courant je vous invite à utiliser votre moteur de recherche préféré pour vous renseigner sur ce sujet que je trouve grave. Si tout ça ne vous intéresse pas, si vous vous imaginez ne rien avoir à cacher, si vous ne voyez pas le problème d'une société panoptique, je ne vais pas essayer de vous convaincre, j'ai mieux à faire de mon temps.

Cela étant, faute de pouvoir logistiquement quitter ce pays qui commence à puer sérieusement, comme je l'ai fait par le passé, je peux au moins expatrier une bonne partie de mes ressources numériques.

Le présent site est donc à présent hébergé en Allemagne.

J'en ai profité pour faire un sérieuse évolution du moteur qui sert ce site, si vous rencontrez le moindre problème n'hésitez pas à me le signaler. Et si votre méthode préférée de signalement se trouve être cassée, l'ancien site restera accessible pendant quelques temps en utilisant les mêmes adresses, mais le TLD fr à la place de eu.

J'ai évidemment fait des tests moi-même en pré-production, j'avais même l'ambition de reproduire exactement les mêmes sorties que le site précédent. Et puis j'ai trouvé quelques défauts à corriger, quelques incohérences de mise en forme, jusqu'à arriver à plus de soixante-dix lignes de script sed. Les tests sont tous au vert, mais à ce point on peut douter de leur pertinence…

Au passage, j'ai détruit la pensée du jour, parce que je n'avais pas l'impression que ça avait beaucoup de succès. Si ça manque à quelqu'un, n'hésitez pas à le demander, je la rétablirai (et la mettrai à jour avec plus d'assiduité que ces dernières semaines) volontiers si je sais qu'elle sera lue.


07/07/2015

Philpep's blog >> Rspamd: un antispam performant

Par : Philippe Pepiot
Tags:
Debian

Depuis maintenant plus de six ans j'héberge mon propre serveur de mail et depuis tout ce temps là mon infrastructure n'a pas changée:

Dspam fonctionnait très bien, je l'utilisais avec le plugin dovecot-antispam qui permet de faire l'apprentissage de dspam, faux positifs et faux négatifs, simplement en déplacant les message depuis ou vers le dossier de spams.

Seulement depuis l'été 2014, le seul développeur de dspam a annoncé qu'il abandonnait le projet et en conséquence dspam a été supprimé de debian jessie. Il me fallait donc un antispam pour remplacer dspam et j'ai décidé d'utiliser rspamd.

Rspamd, comme dspam, fait du filtrage bayésien basé sur de l'apprentissage mais pas seulement:

Rspamd s'interface avec postfix comme un milter.

L'installation est très facile sur debian jessie:

apt-get install rspamd rmilter

rmilter fait interface entre rspamd et postfix, ma configuration peut se résumer à:

pidfile = /run/rmilter.pid;
spamd {
        # rspamd écoute sur le port 11333
        servers = r:localhost:11333;
        connect_timeout = 1s;
        results_timeout = 20s;
        error_time = 10;
        dead_time = 300;
        maxerrors = 10;
        reject_message = "Spam message rejected; If this is not spam contact abuse";
        whitelist = 127.0.0.1/32, 192.168.0.0/16;
        rspamd_metric = "default";
};
# rmilter écoute sur le port 11000
bind_socket = inet:11000@localhost;
tempdir = /tmp;
max_size = 10M;
use_dcc = no;

Ensuite on configure postfix pour qu'il transmette tous les mail entrant à rmilter:

smtpd_milters = inet:localhost:11000
milter_protocol = 6
milter_mail_macros = i {mail_addr} {client_addr} {client_name} {auth_authen}
milter_default_action = accept

Si vous suivez bien, voilà le parcours d'un mail entrant:

La configuration de rspamd est très efficace par défaut, chaque critère (RBL, SPF etc) a un poids et le mail entrant obtient donc une note, si la note dépasse un certain seuil paramétrable il va rejeter le message, l'accepter avec un header X-Spam ou l'accepter tout court. Voyez le fichier /etc/rspamd/metrics.conf.

Maintenant on veut que les mails qui ont un header X-Spam: yes soient mis automatiquement dans le dossier Spam, c'est dovecot qui va le faire avec un filtre sieve:

# dovecot.conf
plugin {
    sieve_before = /etc/dovecot/rspamd.sieve
}

# /etc/dovecot/rspamd.sieve
require ["fileinto"];

if header :is "X-Spam" "Yes" {
    fileinto "Spam";
}

On compile le filtre sieve avec la commande sievec /etc/dovecot/rspamd.sieve.

Mais maintenant on veut aussi interfacer l'apprentissage du filtrage bayésien de rspamd en déplaçant depuis/vers le dossier Spam avec le plugin dovecot-antispam:

# dovecot.conf
plugin {
    antispam_backend = pipe
    antispam_pipe_program = /usr/bin/rspamc
    antispam_pipe_program_args =
    antispam_pipe_program_spam_arg = learn_spam
    antispam_pipe_program_notspam_arg = learn_ham
    antispam_spam = Spam
    antispam_trash_pattern_ignorecase = trash;deleted *
}

Pour finir, une petite note sur mon passage effectif de dspam à rspamd, dans ma config précédente postfix passait le mail à dspam en LMTP et c'est dspam qui à son tour appelait dovecot pour délivrer le mail. Avec la nouvelle config postfix doit passer le mail directement à dovecot:

# /etc/postfix/main.cf
virtual_transport = dovecot

# /etc/postfix/master.cf
# vmail et mail sont respectivement l'utilisateur et le groupe de mon
# utilisateur virtuel de mail
dovecot unix - n n - - pipe
  flags=DRhu user=vmail:mail argv=/usr/lib/dovecot/deliver -f ${sender} -d ${user}@${nexthop}

Cerise sur le gâteau, rspamd a des logs très utiles et une interface en ligne de commande très sympathique, on peut par exemple obtenir des statistiques:

% rspamc stat
Messages scanned: 1289
Messages with action reject: 262, 20.32%
Messages with action soft_reject: 0, 0.00%
Messages with action rewrite_subject: 0, 0.00%
Messages with action add_header: 265, 20.55%
Messages with action greylist: 45, 3.49%
Messages with action no_action: 717, 55.62%
Messages treated as spam: 527, 40.88%
Messages treated as ham: 762, 59.11%
[...]

Pour conclure je suis très content de mon passage à rspamd, il a été immédiatement plus efficace que mon dspam entrainé depuis plus de six ans !


05/07/2015

Emile "iMil" Heitor 's home >> Using pkgsrc on debian GNU/Linux

Par : iMil
Tags:
Blogroll
Debian
pkgsrc

While I tend to appreciate debian GNU/Linux, its tendency to be quite late on software versionning is sometimes annoying. Also, as a pkgsrc developer, I am used to have greater control over the packages I install, for example regarding the options I’d like to include.

For these reasons and a couple more, I sometimes choose to use pkgsrc along with apt to deal with particular packages. In this article, I’ll show how to achieve that task.

First install build pre-requisite packages:

# apt-get install cvs libncurses5-dev gcc g++ zlib1g-dev zlib1g libssl-dev

Then fetch pkgsrc:

# cd /usr && cvs -d anoncvs@anoncvs3.de.NetBSD.org:/cvsroot co pkgsrc

export the SH environment variable to /bin/bash:

# export SH=/bin/bash

And bootstrap pkgsrc:

# cd /usr/pkgsrc/bootstrap
# ./bootstrap

From now on, you’ll have a /usr/pkg directory filled with necessary bits for building packages from pkgsrc.

If you are to install services from pkgsrc packages, you’ll have to copy NetBSD‘s /etc/rc.subr to debian‘s /etc directory:

# wget -O/etc/rc.subr "http://cvsweb.netbsd.org/bsdweb.cgi/~checkout~/src/etc/rc.subr?rev=1.96&content-type=text/plain"

Create an ad-hoc rc.d directory:

# mkdir /usr/pkg/etc/rc.d

Let’s say you’d like to install nginx out of pkgsrc, possibly because debian‘s version is outdated or it does not contain your favorite module. Add the desired option to pkgsrc's options file, /usr/pkg/etc/mk.conf:

PKG_OPTIONS.nginx+= naxsi spdy

Build the software:

# cd /usr/pkgsrc/www/nginx
# /usr/pkg/bin/bmake install clean clean-depends

Copy the startup script:

# cp /usr/pkg/share/examples/rc.d/nginx /usr/pkg/etc/rc.d/

Enable the service:

# echo "nginx=YES" >> /etc/rc.conf

And start it:

# /usr/pkg/etc/rc.d/nginx start

Now, how you integrate services start to your favorite init system is up to you!

The post Using pkgsrc on debian GNU/Linux appeared first on Emile "iMil" Heitor 's home.


30/06/2015

Weblog de Natacha >> Autres temps, autres supports

Par : Natacha Kerensikova
Tags:
Site

Ça fait déjà six ans et demi que ce weblog fonctionne, et ceci en est le cent trente huitième article. C'est un temps raisonnable pour remettre en question sa façon de fonctionner, et peut-être essayer de nouvelles choses.

J'imagine que ce n'est pas le meilleur moment pour sonder un lectorat, mais je vais quand même essayer, pour voir.

J'ai déjà quelques idées en tête, mais elles sont loin d'être révolutionnaires. Comme j'ai l'ambition de faire de ce site plus qu'un simple préchoir dans le désert, j'aimerais beaucoup avoir votre avis sur les différentes façons de vous faire parvenir mon contenu habituel, et en bonus votre avis sur quelques idées de nouveau contenu.

Parmi les nouvelles idées de contenu, j'ai surtout retenu :

Merci de répondre à chaque point de ce petit sondage en postant un commentaire ci-dessous, ou dans le champ « message » si préférez que votre réponse ne soit pas publiée, ou par le formulaire de contact, ou par tout autre support à votre convenance.

Même une lettre en braille pour démonter l'idée d'un blog-BD serait bienvenue, c'est dire…


23/06/2015

Olivier's Blog >> Serial-PXE-TFTP install of FreeBSD(BSDRP,Xsense,NAS4Free)/OpenBSD/Centos

Tags:
BSDRP
FreeBSD
english
linux

Objectives

Remote  installation of multiples Operating systems using only:

I didn't found an easy way for PXE+TFTP (only!) serial remote installation for NetBSD or DragonFly.
FreeBSD was very complex too (need to recompile bootloader for TFTP and serial usage), but hopefully mfsBSD hides this problem.
OpenBSD and CentOS, by providing ramdisk natively and easy way of configuring their bootloader, were the most admin-friendly.

dnsmasq

This step will install an all-in-once DHCP/TFTP server:
pkg install dnsmasq
Then, create a small configuration file (example with "bce1" as NIC and local subnet in 192.168.1.0/24)
cat > /usr/local/etc/dnsmasq.conf <<EOF
interface=bce1
dhcp-range=192.168.1.80,192.168.1.85
pxe-service=x86PC, "pxelinux", pxelinux
enable-tftp
tftp-root=/tftpboot
EOF


And start it:
sysrc dnsmasq_enable=yes
service dnsmasq start

pxelinux

This step will install pxelinux binaries and configure PXE menu:
mkdir /tftpboot
cd /tftpboot
fetch https://www.kernel.org/pub/linux/utils/boot/syslinux/syslinux-6.03.zip
unzip -d syslinux syslinux-6.03.zip
cp syslinux/bios/memdisk/memdisk /tftpboot
cp syslinux/bios/core/pxelinux.0 /tftpboot
cp syslinux/bios/com32/elflink/ldlinux/ldlinux.c32 /tftpboot
cp syslinux/bios/com32/menu/menu.c32 /tftpboot
cp syslinux/bios/com32/libutil/libutil.c32 /tftpboot
cp syslinux/bios/com32/modules/pxechn.c32 /tftpboot
cp syslinux/bios/com32/lib/libcom32.c32 /tftpboot

cp syslinux/bios/com32/chain/chain.c32 /tftpboot
cp syslinux/bios/com32/modules/reboot.c32 /tftpboot/
rm syslinux-6.03.zip
rm -rf syslinux
mkdir /tftpboot/pxelinux.cfg
cat > /tftpboot/pxelinux.cfg/default <<EOF

SERIAL 0 115200
CONSOLE 0
UI menu.c32
TIMEOUT 300
MENU TITLE PXE BOOT MENU
LABEL freebsd
 MENU DEFAULT
 MENU LABEL mfsbsd (FreeBSD, pfSense, BSDRP, NAS4Free, etc...)
 KERNEL memdisk
 APPEND initrd=/mfsbsd-10.1-RELEASE-amd64.img harddisk raw
LABEL openbsd
 MENU LABEL OpenBSD
 KERNEL pxechn.c32
 APPEND ::/openbsd/pxeboot
LABEL netbsd
 MENU LABEL NetBSD
 KERNEL pxechn.c32
 APPEND ::/netbsd/pxeboot_ia32_com0.bin
LABEL centos
 MENU LABEL Centos 7
 kernel centos/vmlinuz
 append initrd=centos/initrd.img method=http://mirror.centos.org/centos/7/os/x86_64/ devfs=nomount ip=dhcp console=ttyS0,115200 earlyprint=serial,ttyS0,115200
LABEL local
 MENU LABEL local disk
 KERNEL chain.c32
 APPEND hd0

LABEL reboot
 MENU LABEL reboot
 KERNEL reboot.c32
EOF

FreeBSD

Download mfsBSD image and enable serial port:
fetch -o /tftpboot/mfsbsd-10.1-RELEASE-amd64.img http://mfsbsd.vx.sk/files/images/10/amd64/mfsbsd-10.1-RELEASE-amd64.img
mdconfig -a -t vnode -f mfsbsd-10.1-RELEASE-amd64.img
mount /dev/md0a /mnt/
echo "-S115200 -h" > /mnt/boot.config

umount /mnt
mdconfig -d -u 0

OpenBSD

Download OpenBSD's pxeboot and RamDisk image, then enable serial port:
mkdir /tftpboot/openbsd/
fetch -o /tftpboot/openbsd/pxeboot http://ftp.openbsd.org/pub/OpenBSD/5.7/amd64/pxeboot
fetch -o /tftpboot/openbsd/bsd.rd http://ftp.openbsd.org/pub/OpenBSD/5.7/amd64/bsd.rd
mkdir /tftpboot/etc
cat > /tftpboot/etc/boot.conf <<EOF
stty com0 115200
set tty com0
boot tftp:/openbsd/bsd.rd
EOF

CentOS

Download CentOS kernel and RamDisk:
mkdir /tftpboot/centos
fetch -o /tftpboot/centos/initrd.img ftp://ftp.free.fr/mirrors/ftp.centos.org/7.1.1503/os/x86_64/images/pxeboot/initrd.img
fetch -o /tftpboot/centos/vmlinuz ftp://ftp.free.fr/mirrors/ftp.centos.org/7.1.1503/os/x86_64/images/pxeboot/vmlinuz

Installing BSDRP, pfSense, OPNsense, NAS4Free, or any nanoBSD

From mfsbsd, just dd their serial nanobsd/embedded image to the local hard drive.
For installing FreeBSD: just uses bsdinstall

Debugging PXE/TFTP process

From the server, start a tcpdump accepting only bootps and tftp packets:
tcpdump -ni bce1 -vv port bootps or port tftp


15/06/2015

Philpep's blog >> Changer l'adresse IP d'un serveur

Par : Philippe Pepiot
Tags:
iptables
linux

Aujourd'hui il n'est pas rare d'avoir à changer l'adresse IP d'un serveur, par exemple si vous changez de fournisseur.

Dans mon cas je devais migrer tout mes services, à savoir du web, du mail et du dns, d'un serveur à un autre sans avoir la possibilité de garder mon adresse IP. L'occasion pour moi de vous donner quelques bons conseils sur cette opération toujours un peu délicate. Le but étant d'avoir un minimum de temps de coupure.

Donc la première bonne chose à faire c'est de baisser le TTL de vos enregistrement DNS, c'est tout simplement le temps en secondes pendant lequel l'enregistrement pourra rester en cache sur les serveurs DNS récursifs, comme ça le jour où vous changez l'enregistrement DNS la propagation ira beaucoup plus vite.

Moi je suis passé de 1 jour, ou 86400 secondes, à 5 minutes, soit 300 secondes:

mail 300 IN A 178.33.42.27

Évidement dans mon cas il faudrait attendre un jour le temps que le nouveau TTL se propage et ensuite espérer n'avoir que 5 minutes de problèmes. Mais ça suppose que le serveur DNS de vos visiteurs respecte bien le TTL que vous avez indiqué, et ce n'est pas toujours le cas et puis 5 minutes c'est déjà trop long pour un perfectioniste comme vous non ?

Donc les idées qui viennent ensuite sont de rendre accessible le service depuis l'ancien serveur même si le service tourne sur le nouveau serveur. Surtout si vous avez un VPN entre vos deux serveurs. On peut par exemple monter des proxy inverses voire même faire du NAT mais ces deux solutions ont le désavantage de modifier l'adresse IP source des requêtes, ce qui peut être très gênant si comme moi vous utilisez des antispam basés sur l'adresse IP comme le DNSBL.

La solution que j'ai utilisée c'est tout simplement de faire du routage à travers mon VPN, l'idée est simple mais dans les faits c'est assez compliqué. Voilà un schéma simplifié du réseau:

                 +----------------+                                    +-----------------+
<- 1.2.3.4 eth0 -| Ancien serveur | vpn0 10.0.0.1 <---> 10.0.0.2 vpn0 -| Nouveau serveur |- eth0 5.6.7.8 ->
                 +----------------+                                    +-----------------+

Ce que l'on veut c'est qu'un visiteur qui se connecte sur 1.2.3.4 soit routé dans le VPN jusqu'au service qui tourne sur le nouveau serveur (et qui écoute sur 10.0.0.2 et sur 5.6.7.8).

Une redirection comme ça est un cas d'école avec iptables, par exemple pour le port http:

vieux:~# iptables -t nat -A PREROUTING -i eth0 -p tcp --dport http -j DNAT --to 10.0.0.2

Là le paquet va bien arriver sur 10.0.0.2, mais les paquets retour vont repartir avec l'IP source 5.6.7.8 car c'est la route par défaut pour répondre à l'IP de votre visiteur. Du coup il faut faire une table de routage dédiée à ce traffic pour faire en sorte que tout ce qui arrive sur 10.0.0.2 reparte sur 10.0.0.1

nouveau:~# echo "200 VPN" >> /etc/iproute2/rt_tables
nouveau:~# ip route add default via 10.0.0.1 dev vpn0 table VPN
nouveau:~# iptables -t mangle -A PREROUTING -i vpn0 -p tcp -m connmark --cstate NEW -j CONNMARK --set-mark 1
nouveau:~# iptables -t mangle -A PREROUTING -j CONNMARK --restore-mark
nouveau:~# ip rule add fwmark 1 table VPN

Ici on crée une table de routage "VPN" qui a une route par défaut vers 10.0.0.1. Ensuite avec iptables on matche les connexions tcp qui arrivent sur l'interface vpn0 (CONNMARK) avec le numéro arbitraire 1.

La deuxième règle iptables sert à marquer les paquets qui ont CONNMARK à 1 avec MARK à 1, c'est équivalent à iptables -t mangle -A PREROUTING -m connmark --mark 1 -j MARK --set-mark 1. CONNMARK marque les connections et MARK les paquets mais iproute (la commande suivante) ne comprends que le marquage des paquets.

La dernière commande ip rule add fwmark 1 table VPN permet de dire au système de routage d'utiliser la table de routage "VPN" quand les paquets sont marqués à 1.

À ce stade les paquets retour reviennent bien sur l'ancien serveur, il ne reste plus qu'à faire du source NAT pour qu'ils repartent avec l'IP 1.2.3.4:

vieux:~# iptables -t nat -A POSTROUTING -s 10.0.0.2 -o eth0 -j SNAT --to-source 1.2.3.4

Et voilà, le service est accessible depuis les deux adresses publiques, et dans les deux cas le service verra la vraie adresse source du client.


11/06/2015

There is no spoon. >> Keyboard issues with i3wm on Ubuntu 15.04

Par : kAworu
Tags:
i3wm Logo

Since the update to 15.04 "Vivid Vervet" I've experienced some new input issues: I could not input some characters, most notably those requiring a combination of key to press. With a swiss-french layout I could not input stuff like ` ^ ~ and use my configured compose key. The culprit was unknown to me until then: IBus.

To solve this issue, you can either launch im-config(8) as user and select the "none" Input Method or simply do:

% echo "run_im none" > ~/.xinputrc
Now restart X and enjoy your keyboard back.
06/06/2015

Emile "iMil" Heitor 's home >> EC2 VPN connection informations (updated)

Par : iMil
Tags:
AWS
Blogroll
VPC
VPN
XML
python

For a mysterious reason, EC2 VPN connection informations are stored in XML within the JSON data retrieved by either boto or the awscli command line tool.

Here’s a quick python snippet to convert those datas in a convenient, easily parsable dict:

#!/usr/bin/env python

import sys
import boto3
import xmltodict

profile = sys.argv[1]

s = boto3.Session(profile_name=profile)
ec2 = s.client('ec2')

vpn = ec2.describe_vpn_connections()
x = vpn['VpnConnections'][0]['CustomerGatewayConfiguration']

d = xmltodict.parse(x)

# ...

Combining this piece of code with jinja2 could help you generate racoon (or whatever IPSec software you use) on the fly.

Update

here‘s a complete example of an automatic generation for racoon / ipsec configuration files using the previous snippet, along with jinja2.

The post EC2 VPN connection informations (updated) appeared first on Emile "iMil" Heitor 's home.


04/06/2015

Emile "iMil" Heitor 's home >> Latency based Alias DNS record in Route53

Par : iMil
Tags:
AWS
Blogroll
CloudFormation
Route53
python
troposphere

Yes, I know I write a lot about AWS these days, but you know, obsession is my thing.

So as I wrote earlier, I generate my CloudFormation templates using troposphere, and the one thing I had to finish today was to register a latency based Alias record on Route53 for an ELB. While Route53 GUI is fairly easy to use, I’ve been stuck on its programmatic emanation for quite a while, so here’s a troposphere definition of such a CloudFormation object:

if scheme == 'internal':
    # for details about this condition, read:
    # http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-elb.html
    canonzn = 'DNSName'
else:
    canonzn = 'CanonicalHostedZoneName'

name = 'foo'
profile = 'eu-west-1'

fooDNSRecord = t.add_resource(RecordSetType(
    'fooDNSRecord'.format(name),
    HostedZoneName = Join('', [Ref('SubZone'), '.']),
    Comment = '{0} DNS Name'.format(name),
    Name = Join('', ['{0}.'.format(name), Ref('SubZone'), '.']),
    Type = 'A',
    Region = region,
    SetIdentifier = '{0}-{1}'.format(name, profile),
    AliasTarget = AliasTarget(
        GetAtt('{0}LoadBalancer'.format(name), 'CanonicalHostedZoneNameID'),
        GetAtt('{0}LoadBalancer'.format(name), canonzn)
    )
))

Note the catch, you can’t use Ref('AWS::Region') for the Region parameter or your CloudFormation will fail at the DNS entry creation with the Invalid request error. Do not forget to declare the SetIdentifier parameter which is mandatory for a latency-type record.

The post Latency based Alias DNS record in Route53 appeared first on Emile "iMil" Heitor 's home.