qmail dkim

pfou, ça fait longtemps ..

et après un mailing plein de retours spams, je me suis dit qu’il fallait quand même implémenter dkim dans mon vieux qmail (et après .. dmarc)

les docs de qmailrock sont bien , les scripts domainkey qmail-remote sont lisibles, et sagredo.eu a une autre approche mais plus complexe, je choisis qmailrock car c’est assez simple de signer un message en mettant un shell à la place de qmail-remote.

…sauf que libdkimtest, version19 ou version21, ne fait pas des supercalculs, et je suis rejeté comme quoi le message est altéré.

heureusement ça existe en perl, et c’est bien plus facile que cpp mail::dkim. Comme j’ai fait quelques remix et simplifications , en gros je prends la méthode et les scripts de qmailrock, en remplaçant lidkimtest par le module perl :

 

le remplaçant de qmail-remote (qui lui est renommé qmail-remote-binary)

#!/bin/sh
# DKIM signing for qmail
# Author: Joerg Backschues + gyu kastenbaum
 
[ "$DKSIGN" ]   || DKSIGN="/etc/domainkeys/%/default"
[ "$DKREMOTE" ] || DKREMOTE="/var/qmail/bin/qmail-remote-binary"
[ "$DKIMPL" ]   || DKIMPL="/var/qmail/bin/dkim.pl"
# parent domains (see RFC 4871 3.8)
FQDN=${2##*@}
TLD=`echo $FQDN | awk 'BEGIN {FS = "."} {print $NF}'`
DOM=`echo $FQDN | awk 'BEGIN {FS = "."} {print $(NF-1)}'`
# get domainkey file
if [[ $DKSIGN == *%* ]] ; then
    DOMAIN=$DOM.$TLD
    DKSIGN="${DKSIGN%%%*}${DOMAIN}${DKSIGN#*%}"
fi
if [ -f "$DKSIGN" ] ; then
    # domain with domainkey # sign message
    cat - | $DKIMPL $DOMAIN | "$DKREMOTE" "$@"
    retval=$?
    echo "qmail-remote: domainkey for $2" | /var/qmail/bin/splogger qmail;
    exit $retval
else
    # domain without domainkey
    exec "$DKREMOTE" "$@"
fi

 

le bout de perl qui signe un message

#!/usr/bin/perl
 use Mail::DKIM::Signer;
 use Mail::DKIM::TextWrap;  #recommended
 
my $dom=$ARGV[0];
my $key="/etc/domainkeys/$dom/default";
if (! -f $key ) {
print  while (<STDIN>);exit;
}
 
  # create a signer object
  my $dkim = Mail::DKIM::Signer->new(
                  Algorithm => "rsa-sha256",
                  Method => "simple/relaxed",
                  Domain => $dom,
                  Selector => "default",
                  KeyFile => $key,
             );
  my $output="";
  while (<STDIN>)
  {
      $output=$output.$_;
      # remove local line terminators
      chomp;
      s/\015$//;
      # use SMTP line terminators
      $dkim->PRINT("$_\015\012");
  }
  $dkim->CLOSE;
 
  # what is the signature result?
  my $signature = $dkim->signature;
  my $outsign = $signature->as_string."\n";
  $outsign =~ s/\015$//gm;
  print $outsign;
  print $output;

 

bon… faudrait être plus fin sur la config, mais déjà ça passe…

merci aussi à qmailrocks.thibs.com/downloads/scripts/ , à http://dkimvalidator.com  et à https://www.altospam.com/actualite/2014/01/des-outils-de-verification-des-emails-pour-eviter-detre-considere-spammeur/

 

 

Pocket

Report des voix

Avec ce calculateur de report de voix, en bidouillant un peu :
si on dit que les voix de FF se reportent sur MLP en totalité,
que les voix diverses vont presque moitié moitié,
alors E.Macron utilisera une dernière fois son “quarante-neuf-trois%” …

 

report EM report MLP
EM
MLP
FF
JLM
BH
XX

EM :

MLP :

Pocket

plusieurs astuces elk/logstash

Tant qu’à fouiller dans des logs, autant s’amuser à tout mettre dans ELK ;

Je partage ici quelques astuces :

tracer le server-status d’apache httpd :

http_poller
kv

 

input {
http_poller {
urls => {
"custom_httpd_t0" => { url => "http://127.0.0.1:9680/server-status?auto"}
"custom_httpd_t1" => { url => "http://someserver:9681/server-status?auto"}
}
tags => apache_stats
type => xxxxxstatus
codec => plain
metadata_target => http_poller_metadata
interval => 5
}
 
if [http_poller_metadata] {
# Properly set the '@host' field based on the poller's metadat
mutate {
add_field => {
"@host" => "%{http_poller_metadata[name]}"
}
}
}
# Processed polled apache data
if "apache_stats" in [tags] {
# Apache stats uses inconsistent key names. Make sure all fields are camel cased, no spaces
mutate {
gsub => ["message", "^Total ", "Total"]
}
# Parse the keys/values in the apache stats, they're separated by ": '
kv {
source => message
target => apache_stats
field_split => "\n"
value_split => ":\ "
trim => " "
}
# We can make educated guesses that strings with mixes of numbers and dots
# are numbers, cast them for better behavior in Elasticsearch/Kibana
ruby {
code => "h=event['apache_stats']; h.each {|k,v| h[k] = v.to_f if v =~ /\A-?[0-9\.]+\Z/}"
}
mutate {
convert => {"BusyWorkers" => "integer"}
convert => {"IdleWorkers" => "integer"}
}
}

 

et aussi l’analyse des logs d’apache et weblogic

bon je ne montre que weblo, pour les astuces ignore_older, multiline  :

 

file {
type => "xxxxxfw"
path => "C:/xxxxx/logs-fw/xxxxx*"
sincedb_path => "C:/xxxxx/xxxxxfw.sincedb"
start_position => "beginning"
ignore_older => 8640000
codec => multiline {
pattern => "^2"
max_lines => 2000
negate => true
what => previous
}
tags => ["wlslog"]
}
et le filtre où je récupère dans le message le temps passé (1234 ms) ne pas oublier break_on_match
if [type] == "xxxxxfw" {
#2016-09-21 19:31:23,899 : WARN : com.xxxxxxxxxxxxxxValueStack:49 : warn() : Error setting expression 'dateFin' with value '[Ljava.lang.String;@29c00ac3'
#ognl.MethodFailedException: ConsulterSynthesexxxxx [java.lang.NoSuchMethod blablabla
# at xxxxxxxxntime.callAppropriateMethod(xxxxRuntime.java:125)
 grok {
 break_on_match => false
 match => [ "message" , "(?<timestamp>%{YEAR}-%{MONTHNUM}-%{MONTHDAY}%{SPACE}%{TIME})%{SPACE}:%{SPACE}%{WORD:verb}%{SPACE}:%{SPACE}%{GREEDYDATA:alertmessage}" ]
 match => [ "alertmessage" , "\(%{NUMBER:timespent} ms\)" ]
 }
 mutate {
 #remove_field => [ "message" ]
 convert => {"timespent" => "integer"}
 }
 date { match => [ "timestamp" , "yyyy-MM-dd HH:mm:ss,SSS" ] }
 }

ah si, aussi pour apache je découpe les cookies en cookies

(bon ça ne m’a pas servi, mais peut être un jour…)

kv {
source => cookie
target => cookies
field_split => ";"
value_split => "="
trim => " "
}

 

++

Pocket

AIX jruby

Logstash ça fait juste un tail | sed | perl | wget -post, vu de loin.

C’est écrit en ruby. sympa. ça s’exécute par jruby (cross compil de ruby en java). Chouette. Comme ça ça marche sur Solaris et AIX. presque.

Personne de moderne n’utilise AIX. pas de libcrypto SHA1 (je peux me tromper). Et concernant logstash, des erreurs surprenantes : tout n’a pas été écrit (!!). Mais ok je les comprends..

NotImplementedError: block device detection unsupported or native support failed to load
blockdev? at org/jruby/RubyFileTest.java:67
device? at …logstash/vendor/bundle/jruby/1.9/gems/filewatch-0.8.1/lib/filewatch/helper.rb:67

NotImplementedError: stat.st_gid unsupported or native support failed to load
gid at org/jruby/RubyFileStat.java:247
atomic_write at …logstash/vendor/bundle/jruby/1.9/gems/filewatch-0.8.1/lib/filewatch/helper.rb

idem

…logstash/vendor/bundle/jruby/1.9/gems/filewatch-0.8.1/lib/filewatch/watch.rb

Après avoir exploré les solutions propres : versions de java, versions de jruby (tiens ? ils passent de la version 1.7 à la version 9.1 ?!) je comprends que personne ne s’investi dans le portage de ruby pour AIX (pourtant chef.io marche ..) . ou alors c’est lié à ma version (aix6.1); les gestions de fichiers et devices sont en option.

Reste à faire les corrections dans les gems utilisées par logstash :

 

#gems/filewatch-0.8.1/lib/filewatch/helper.rb:67
def self.device?(file_name)
# AIX chardev?(file_name) || blockdev?(file_name)
chardev?(file_name)
end
end
 
#gems/filewatch-0.8.1/lib/filewatch/watch.rb
def self.win_inode(path, stat)
fileId = Winhelper.GetWindowsUniqueFileIdentifier(path)
[fileId, 0, 0] # dev_* doesn't make sense on Windows
end
def self.nix_inode(path, stat)
[stat.ino.to_s, 0, 0]
#AIX [stat.ino.to_s, stat.dev_major, stat.dev_minor] # dev doesnt work on AIX
end
 
#gems/filewatch-0.8.1/lib/filewatch/helper.rb , line 45
# Set correct uid/gid on new file
#AIX GK GDF GSIT TOO BAD ... chown(old_stat.uid, old_stat.gid, file_name) if old_stat
return_val

 

 

Yes, Sam, “quick-and-dirty guizmo” striked again

Pocket

recommended ciphersuite , and wget in bash

le ciphersuite recommandé provient du site https://cipherli.st/

qui est tenu à jour et qui contient les exemples de configuration pour plusieurs middlewares

EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH

 

le ciphersuite est une suite de protocoles autorisés , séparés par ‘:’ , le ‘+’ est un ‘et logique’ ;

le ‘-‘ n’est pas un signe de syntaxe, DHE-RSA-AES256-SHA désigne une seule combinaison

les ciphers concernent  : le protocole (SSL,TLS) , Kx key exchange, Au l’authentification  , Enc l’encryption , (Mac Digest plus rarement)

 

Commande pour vérifier les protocoles possibles :

 

openssl ciphers EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH -v
 
DHE-RSA-AES256-SHA      SSLv3 Kx=DH       Au=RSA  Enc=AES(256)  Mac=SHA1
 
DHE-DSS-AES256-SHA      SSLv3 Kx=DH       Au=DSS  Enc=AES(256)  Mac=SHA1

ici, AES256+EDH affiche les protocoles avec EDH (key exchange = DH) ET Encryption=AES256

voilà. c’était un condensé qui a l’air simple comme ça, mais quand on se retrouve devant un cipherlist à mettre, et un openssl cipher, on copie colle sans comprendre pourquoi cette formule magique marche, et on espère que personne ne va poser de question.

 

 

Maintenant le telnet en bash (merci JCC, corrigé par linuxjournal) avec un exec + canal tcp

exec 3<>/dev/tcp/www.google.com/80
echo -e "GET / HTTP/1.1\r\nhost: http://www.google.com\r\nConnection: close\r\n\r\n" >&3
cat <&3

ça sert pas et ça marche pas bien, mais c’est quand même fun …

Pocket

java jmx port and the rmi port

java, c’est désespérant. le port jmx est sympa mais il redirige vers un port rmi random, quand on n’est pas au courant ça énerve. Quand on est au courant on se demande pourquoi, et aussi on échafaude des tunnels ssh avec proxy -D. Finalement la solution simple est d’ajouter un fix du port rmi, sur le même port que jmx

-Dcom.sun.management.jmxremote.port=$PORTJMX \
-Dcom.sun.management.jmxremote.rmi.port=$PORTJMX \

(le même port ???!!!)

en comparaison, j’ai passé quelques semaines avec elasticsearch, nodejs, bower, yo, angularjs, etc, et je ne trouve pas de post à faire, autre que ‘whaou’.

 

Pocket

ELK : Elastic by design

Le titre ne veut rien dire. Juste ça jette.
Comme beaucoup, j’ai mis en place eliastic+logstash+kibana, comme indiqué dans la démo. On a choisi des logs, et assez vite visualisé les graphes dans kibana. C’est joli.

Ensuite on explore les contours de l’outil :
– logstash est un peu capricieux,
bien sûr ils veulent tous le dernier java(8) et leurs dernières versions E2L2k2, mais ils tournent sur jruby c’est bien plus la classe, du coup pas de souci sur Solaris. La syntaxe de conf de logstash est naze, pourquoi ils n’utilisent pas ruby(ou alors c’est du ruby??), json, ou yml, c’est batard. Et dans logstash l’astuce qui n’est pas dans la doc est qu’il faut un seul logstash qui tourne, qui charge les fichiers de log et qui les tague dans input{type=>’toto’ } , ensuite dans filter{} on ajoute un if [type]==’toto'{}.

elastic fait son job, il découpe tout en petit morceaux de mots, pour la recherche fulltext (moteur lucene). et il discute en REST et JSON.

Kibana fait un peu son minimum, et ça m’étonne qu’il n’y ait pas de remplaçant, avec de meilleures visualisations.
Apparemment c’est simple de faire une requete elastic, récupérer les data, et reformatter pour une visu D3JS. ça me tente d’essayer.

Petite déception quand on a deux logs genre apache+weblogic avec un java_session_id qui devrait regrouper plusieurs logs de chaque fichier. Eh ben c’est pas bien fait pour. il y a bien un lien parent-child qui existe mais pas possible pour le moment de l’utiliser dans kibana. On peut ruser quand on a des équivalences 1-1 ou 1-0 : forcer l’id et utiliser des actions update+upsert pour fabriquer un document avec les items des deux logs. bref.

Il faut voir ça comme un petit outil – big data little tool.

Pocket

wordpress to templates

Je commence à bien aimer wordpress,

même s’il range toutes les données dans post & post-meta,

même s’il galère sur l’import export,

et sur la gestion des langues.

Par contre ce qui me chiffonne c’est l’affichage du html.

J’avais pris les bonnes habitudes du templating (prestashop/smarty et mon template perso) et je constate que par défaut le code développeur et le code html sont toujours mélangés.

ça n’est pas qu’une question d’habitude, c’est une séparation du travail : l’un récupère du contenu (get_post ou select ou wget ou node etc) et le met en forme en vue de l’afficher, et l’autre (l’artiste) place les élément harmonieusement sur une page web.

Pour contourner toutes les fonctions de base de wordpress qui affichent un résultat au lieu de le rendre (the_title() = echo get_the_title() ) ce bout de code moche :

 

function m3d_the_get($fnc,$argf=array()){
ob_start();
//anything smarter ?
switch(count($argf)){
case 0: $fnc();break;
case 1: $fnc($argf[0]);break;
case 2: $fnc($argf[0],$argf[1]);break;
case 3: $fnc($argf[0],$argf[1],$argf[2]);break;
case 4: $fnc($argf[0],$argf[1],$argf[2],$argf[3]);break;
case 5: $fnc($argf[0],$argf[1],$argf[2],$argf[3],$argf[4]);break;
case 6: $fnc($argf[0],$argf[1],$argf[2],$argf[3],$argf[4],$argf[5]);break;
case 7: $fnc($argf[0],$argf[1],$argf[2],$argf[3],$argf[4],$argf[5],$argf[6]);break;
default: echo "ERR $fnc(args)";break;
}
return(ob_get_clean());
}
 
 
/*
example : 
$tt["header"]=m3d_the_get('get_header');
$tt["breadcrumb"]=m3d_the_get('get_template_part',array('includes/breadcrumb'));
while ( have_posts() ) { the_post();
 $tt["post"][]=m3d_something_to_tt($post->id);
}
print filtpl_compile("somepage.htm",$tt);
*/

je n’en suis qu’au début (bientôt les templates parts) et faudra ranger pour éviter les récursions, mais je sens que ça va me plaire..

inspiré de https://kovshenin.com/

 

Pocket

Solaris réactionnaire: sftp localhost -oPort=1988

Solaris est un vieux con.

On le savait, il met en avant son vieux grep qui ne fait pas de -r ni ne -E. Oh il veut bien des nouveauté, pour amuser les jeunes quand ils passent le week end. Cherchez où je l’ai rangé votre truc, chez xavier-pierre-gilles IV /xpg4/, ou sir frank william /sfw/ .

C’est bien les commandes unix, quand tu les tape sans argument ça de donne la doc :

 

bash-3.2$ sftp
Usage: sftp [-vC1] [-b batchfile] [-o option] [-s subsystem|path]
[-F config] [-P direct server path] [-S program] [-B buffer_size]
[-R num_requests] [user@]host[:file [file]]
 
bash-3.2$ sftp localhost -oPort=1988
Connecting to localhost...
Password:

Hey mais je n’ai rien qui tourne sur ce port ?

Eh oui, c’est auto-documenté, il faut mettre le port AVANT.
Non ça n’est pas une erreur, pas besoin de message.

note: sur la prochaine version de Solaris , la touche backspace va effacer le caractère avant le curseur. (no it’s a joke)

 

Pocket

microsoft phone virus : +78649873

C’est un archaïque et surprenant hacking social qui appelle le téléphone et se présente comme Microsoft (ben voyons..) pour m’avertir qu’il y a un virus sur mon PC personnel… (+78649873 est le numéro qui s’affiche)

La personne est une femme avec un accent trop américain. Comme je suis Européen elle fait l’effort d’être plus intelligible. Une fois devant le PC, je dois faire Windows-R eventvr , mais ça c’est déjà la version courte. “do you see the key with the label ‘ctrl’ ? what is the key on the right ? press it, keep it pressed, and hit the key ‘L’ like ‘Lobot’ ” c’est là que j’ai décelé un accent chinois… “‘R’ like ‘Robot'” . c’est assez ironique de choisir le mot ‘Robot’ …

Dans l’event viewer il te fait croire que les messages rouge de windows/application viennent de l’internet et signalent des virus.

Malheureusement je n’ai pas eu la patience de continuer pour voir quand on allait me demander ma CB ou un mot de passe ou d’installer un troyen (please install vnc, send spams, execute format c: ) la suite de l’histoire est sur le net : ils installent un troyen en passant par une page à visiter ou même teamviewer (!) .

https://www.google.fr/search?hl=fr&q=t%C3%A9l%C3%A9phone+se+fait+passer+pour+microsoft

microsoft fc-2010 rtl rtl.be dhnet luxembourg
(note : “chipoter” en belge se traduit par “bricoler” en français)

ça existe depuis 2010, ça revient à la mode en ce moment (aout 2015) : soyez vigilant et prévenez les personnes âgées ou “vulnérables” de votre entourage.

 

Pocket