vendredi 13 mars 2009

Mettre à l'heure automatiquement

Installer ntpdate
apt-get install ntpdate

Penser à ouvrir le port udp 123.

Puis
ntpdate ntp.tuxfamily.net && hwclock --systohc

Vous pouvez mettre ce script dans un cron qui se chargera de remettre les pendules à l'heure toutes les heures.

jeudi 12 mars 2009

Protections réseaux sous Linux

Exemple de fichier de protection réseau utilisant iptables et les fonctions reseau du noyau

======DEBUT FICHIER==========

#suppression des regles
iptables -F

#suppression des regles non standards
iptables -X

#par defaut tout est fermé sauf en sortie
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT

#la machine locale est sure
iptables -A INPUT -i lo -j ACCEPT

#DNS
#on autorise les connexion pour tous
#attention doit resoudre seulement pour les zones du DNS
iptables -A INPUT -i eth0 --protocol udp --dport 53 -j ACCEPT
iptables -A INPUT -i eth0 --protocol tcp --dport 53 -j ACCEPT

#NTP
iptables -A INPUT -i eth0 --protocol udp --sport 123 -j ACCEPT

#APACHE
#on autorise les connexions pour tous
iptables -A INPUT -p tcp --dport 80 -i eth0 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -i eth0 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT

#POP3 ET POP3S
#pour que les utilisateurs relevent leurs comptes
iptables -A INPUT -p tcp --dport 110 -i eth0 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -p tcp --dport 995 -i eth0 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT

#IMAP ET IMAPS
#pour que les utilisateurs relevent leurs comptes
iptables -A INPUT -p tcp --dport 143 -i eth0 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -p tcp --dport 993 -i eth0 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT

#SMTP et SMTPS
#on est serveur de courrier, doit etre ouvert à tous
iptables -A INPUT -p tcp --dport 25 -i eth0 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -p tcp --dport 465 -i eth0 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT

#SSH
#on l'ouvre aux visiteurs autorisés seulement
iptables -A INPUT -p tcp -s 192.168.1.250 --dport 666 -i eth0 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT

#VSFTPD (se renseigner sur ftp et ftp-data)
#on l'ouvre aux visiteurs autorisés seulement
iptables -t filter -A INPUT -p tcp -s 192.168.1.250 --dport 20 -i eth0 -j ACCEPT
iptables -t filter -A INPUT -p tcp -s 192.168.1.250 --dport 21 -i eth0 -j ACCEPT

#ON AUTORISE TOUTE CONNECTION DEJA ETABLIE, NECESSAIRE AU FTP
iptables -t filter -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

#PING
#on l'ouvre à quelques privilégiés seulement
iptables -A INPUT -p icmp -s 192.168.1.250 -i eth0 -m limit --limit 1/s -j ACCEPT

#INTERDIRE L'IPV6
ip6tables -P INPUT DROP
ip6tables -P OUTPUT DROP
ip6tables -P FORWARD DROP
ip6tables --flush
ip6tables --flush INPUT
ip6tables --flush OUTPUT
ip6tables --flush FORWARD
ip6tables --flush -t mangle
ip6tables --delete-chain

#LES PROTECTIONS NOYAUX

#interdire le source routing (evite le spoofing)
echo "0" > /proc/sys/net/ipv4/conf/all/accept_source_route

#pour enregistrer les paquets avec adresses falsifiées
echo "1" > /proc/sys/net/ipv4/conf/all/log_martians

#contre le spoofing
echo "1" > /proc/sys/net/ipv4/conf/all/rp_filter

#se proteger contre le syn packet flooding
echo "1" > /proc/sys/net/ipv4/tcp_syncookies

#Emule une reponse windows
echo "1" > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts

#interdit les redirections / forwardings
echo "0" > /proc/sys/net/ipv4/conf/all/accept_redirects
echo "0" > /proc/sys/net/ipv4/conf/all/secure_redirects

#FAIL2BAN
/etc/init.d/fail2ban restart

#on affiche tout
iptables -L

=====FIN DU FICHIER========

Pour executer ce fichier au demarrage
ln -s monfichier /etc/init.d/firewall
update-rc.d firewall defaults

Pour le retirer, vous pouvez utiliser la commande suivante :
update-rc.d -f firewall remove

Il vous suffira de redémarrez, ou exécutez /etc/init.d/firewall pour activer le filtrage.

Pour verifier une valeur de protection noyau
sysctl -A | grep tcp_syncookies

devra afficher
net.ipv4.tcp_syncookies=1

Pour afficher toutes les regles de iptables
iptables -L ou iptables -nL

Pour retablir les regles de iptables par defaut (tout autoriser)
iptables -F
iptables -X
iptables -P INPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -P OUTPUT ACCEPT

Pour aller plus loin:
http://www.linux-france.org/prj/inetdoc/guides/iptables-tutorial/
http://reseau.erasme.org/static/serveurs_linux/sect_02_03.html
http://ipsysctl-tutorial.frozentux.net/chunkyhtml/tcpvariables.html

mercredi 11 mars 2009

Se proteger des scans sous Linux

Installer fail2ban

Fail2ban permet d'etablir des regles du genre bannir pendant 600 secondes quiconque echouera à 3 tentatives d'identifications. Cela permet d'eviter les attaques par bruteforce. Il est disponible pour SSH, PAM, Xinetd, Apache, VsFTPD, ProFTPD, WuFTPD, Postfix, Courier et Bind. Mais vous pouvez egalement ecrire vos propres regles. Quiconque echouera plus de 3 fois sera bannit par une regle dans Iptable qui l'empechera de se connecter.

Pour installer fail2ban
apt-get install fail2ban

Creer jail.local qui aura autorité sur jail.conf et ne se fera pas ecraser à la prochaine mise à jour
cd /etc/fail2ban
cp jail.conf jail.local

Editer jail.local pour modifier l'adresse email de destination destemail puis activer les modules necessaires en bas de fichier.

Si vsftpd est utilisé avec pam, le log est /var/log/auth.log et non le vsftpd.log.

Redemarrer fail2ban
/etc/init.d/fail2ban restart

Utiliser portsentry

Installer le packet
apt-get install portsentry

Editer /etc/portsentry/portsentry.conf pour modifier ces valeurs
BLOCK_UDP="1";
BLOCK_TCP="1";

Et egalement decommenter KILL_ROUTE="/sbin/iptables -I INPUT -s $TARGET$ -j DROP"

Puis un /etc/init.d/portsentry restart.

Plein de ports bidons (netstat -an) seront alors créés. Tout tentative de scannage des ports provoquera un blacklistage du fautif. Attention d'autres logiciels de securité seront egalement leurrés et détecterons des faux positifs.

mardi 10 mars 2009

Detections d'intrusions sous Linux

Utilisation de A.I.D.E (Advanced Intrusion Detection Environment)

Aide permet de detecter les intrusions en envoyant des rapports en cas de detection d'anomalie.
Il etablie une base de signatures des fichiers, ce qui permet de detecter tout modification non voulue.

Installer le paquet
apt-get install aide

Creer les 2 bases
touch /var/lib/aide/aide.db
touch /var/lib/aide/aide.db.new

Dans /etc/defaults/aide, decommenter les 2 dernieres ligne
UPAC_CONFDIR="/etc/aide"
UPAC_CONFD="$UPAC_CONFDIR/aide.conf.d"

Mettre votre email ici
MAILTO=votremail

Il ne faut pas essayer d'utiliser l'executable aide -i par exemple, mais toujours passer par le cron /etc/cron.daily/aide

si vous avez un message du genre File database must have one db_spec specification
cp /var/lib/aide/aide.db.new /var/lib/aide/aide.db

cette commande permettra d'etablir la base initiale.

Après des modifications sur votre serveur, il sera bon d'executer les commandes suivantes afin que la base de signatures soit mise à jour
/etc/cron.daily/aide
cp /var/lib/aide/aide.db.new /var/lib/aide/aide.db

Pour aller plus loin
https://mailman.cs.tut.fi/pipermail/aide/2008-February/000903.html
http://www.hsc.fr/ressources/breves/aide.html.fr

Utiliser checksecurity

Checksecurity effectue des vérifications de sécurité basiques, telles que chercher les changements dans les programmes qui possèdent des permissions setuid et que les systèmes de fichiers distants ne soient pas autorisés à avoir des programmes exécutables setuid.

Installer le paquet
apt-get install checksecurity

Dans /etc/checksecurity.conf, decommenter CHECKSECURITY_EMAIL et mettre votre email

Pour lancer checksecurity
/etc/cron.daily/checksecurity

Utiliser rkhunter

Rkhunter permet la detection de rootkits

Installer le paquet
apt-get install rkhunter

Dans /etc/rkhunter.conf decommenter MAIL-ON-WARNING et mettre votre email

Pour lancer rkhunter
rkhunter -c ou --cronjob

Utiliser chkrootkit

Chkrootkit permet la detection de rootkits

Installer le paquet
apt-get install chkrootkit

Vous retrouverez toutes les options dans /etc/chkrootkit.conf

Pour le lancer tapez
chkrootkit

Pour aller plus loin:
http://softice.lakeland.usf.edu/wiki/index.php/How-to:install:chkrootkit

Après c'est à vous de configurer ces outils pour qu'ils soient efficacent sans vous noyer sous un nombre impressionant de faux positifs

Utiliser Logcheck

Logcheck lit les logs vous envoie ce qui lui parait suspect

Installer le paquet
apt-get install logcheck

Dans /etc/logcheck/logcheck.conf, mettre votre adresse email et reportlevel paranoid (du moins, au début)
Mettre les fichiers que l'on veut checker dans /etc/logcheck/logcheck.logfiles

Logcheck s'executera toutes les heures.

Utilisation de tiger

Tiger fournit des rapports sur la securité (1 par jour)
Normalement, il est installé par défaut sous Debian

Dans /etc/tiger/tigerrc mettre votre email à la ligne Tiger_Mail_RCPT

Utiliser la commande tigercron pour tester.

lundi 9 mars 2009

Utilisation de lsattr et chattr

chattr agit comme chmod mais avec plus d'attributs, notamment +i et +a que nous allons developpés ci-dessous.
lsattr permet de lister les attributs comme le fait la la commande ls mais avec plus d'attributs, notamment +i et +a.

L’attribut « i » (inchangeable, « immutable ») : un fichier ayant cet attribut ne peut-être ni modifié ni effacé ou encore renommé et aucun lien ne peut le référencer, même par le super- utilisateur.

L’attribut « a » (ajout, « append ») : cet attribut a le même effet que l’attribut « immutable », excepté que vous pouvez encore ouvrir le fichier en mode ajout. Ceci veut dire que vous pouvez encore ajouter plus de contenu au fichier, mais qu’il est impossible de modifier un
contenu précédent. Cet attribut est particulièrement utile pour les fichiers de log stockés dans /var/log/, bien que vous devez considérer qu’ils sont parfois déplacés à cause des scripts d’archivage.

Ces attributs ne sont habituellement pas sauvés quand vous sauvegardez le système, donc si vous changez l’un d’entre eux, il peux être utile de sauver les commandes chattr successives dans un script pour pouvoir les repositionner plus tard si vous avez à récupérer une sauvegarde.

Sur quels fichiers
Il est aisé de voir que l’attribut « a » améliore la sécurité, en donnant aux programmes qui ne fonctionnent pas en tant que super-utilisateur, la possibilité d’ajouter des données à un fichier sans pouvoir modifier son précédent contenu.

L'utilité des commandes est tout de meme discutable. Dans un soucis de securité, lcap a été supprimé de Debian. Hors en ajoutant lcap CAP_LINUX_IMMUTABLE au demarrage et lcap CAP_LINUX_IMMUTABLE apres modification des attributs, même le root ne pouvait plus modifié les attributs. Sans cette commande, il suffit au pirate de se retrouver root pour que l'attribut +i ne serve plus à rien. De plus en tant que root il lui serait facile de supprimer le script avant le redemarrage.

vendredi 6 mars 2009

Installer un antispam et un antivirus

Maintenant que vous avez un serveur mail pleinement fonctionnel (postfix et courier), il va vite s'averer indispensable d'installer un antispam et un antivirus.

Nous pourrons commencer par utiliser Postgrey.
Postgrey refuse systematiquement un mail 600 secondes avant de l'accepter. Un serveur de courrier correctement configurer re-tentera au dela de 600 secondes et le courrier sera delivré. Un serveur de spammeur mal configuré ou un virus lui ne re-tentera pas.

Installer postgrey
apt-get install postgrey

ajouter cette ligne
check_policy_service inet:127.0.0.1:10023,

pour les smtpd_recipient_restrictions. dans /etc/postfix/main.cf. Exemple:

smtpd_recipient_restrictions =
permit_mynetworks,
permit_sasl_authenticated,
check_policy_service inet:127.0.0.1:10023,
reject_rbl_client sbl-xbl.spamhaus.org,
reject_rbl_client zen.spamhaus.org,
reject_rbl_client bl.spamcop.net,
reject_unauth_destination

Redemarrer Postfix et normalement Postgrey est pris en compte. Regarder les logs pour s'assurer qu'il n'y a pas d'erreurs.

Installer un antivirus : Amavis/Clamav

Installer les paquets
apt-get install amavisd-new clamav clamav-daemon clamav-freshclam lha arj unrar zoo nomarch lzop unzip bzip2

Dans /etc/amavis/conf.d/05-node_id
$myhostname = "test.priv"

et supprimer le 1; qui genere des erreurs.

Redemarrer amavis
/etc/init.d/amavis restart

Installer un antispam : Spamassassin

Installer les paquets
apt-get install spamassassin libnet-dns-perl libmail-spf-query-perl libnet-ident-perl libio-socket-ssl-perl libsys-hostname-long-perl razor pyzor dcc-client

Dans /etc/default/spamassassin, mettre le ENABLED à 1

Redemarrer
/etc/init.d/spamassassin restart

Maintenant il va falloir interfacer l'antivirus et l'antispam avec Postfix.

Dans /etc/amavis/conf.d/15-content_filter_mode decommenter les regles.

Puis à la la fin de /etc/postfix/master.cf ajouter ceci:

vscan unix - n n - 10 pipe user=amavis argv=usr/sbin/amavis ${sender} ${recipient}
smtp-amavis unix - - n - 2 smtp
-o smtp_data_done_timeout=1200
-o smtp_send_xforward_command=yes
-o disable_dns_lookups=yes
127.0.0.1:10025 inet n - n - - smtpd
-o content_filter=
-o local_recipient_maps=
-o relay_recipient_maps=
-o smtpd_restriction_classes=
-o smtpd_client_restrictions=
-o smtpd_helo_restrictions=
-o smtpd_sender_restrictions=
-o smtpd_recipient_restrictions=permit_mynetworks,reject
-o mynetworks=127.0.0.0/8
-o strict_rfc821_envelopes=yes
-o smtpd_error_sleep_time=0
-o smtpd_soft_error_limit=1001
-o smtpd_hard_error_limit=1000


Puis à la fin de /etc/postfix/main.cf
content_filter = smtp-amavis:[127.0.0.1]:10024

Redemarrez le tout (amavis,spamassassin,postfix)

Si vous envoyez un message normal à compte local, cette ligne sera ajoutée dans les headers du message:
X-virus-scanned: Debian amavisd-new at test.priv

Si vous envoyez la chaine suivante (chaine servant à tester amavis):
XJS*C4JDBQADN1.NSBN3*2IDNEN*GTUBE-STANDARD-ANTI-UBE-TEST-EMAIL*C.34X)

Vous aurez un message de rejet de votre email.

Pour ne pas etre ennuyé avec les notifications qui peuvent engorger le serveur, modifier ceci dans /etc/amavis/conf.d/20-debian_defaults

$final_virus_destiny = D_DISCARD;
$final_banned_destiny = D_DISCARD;
$final_spam_destiny = D_DISCARD;
$final_bad_header_destiny = D_PASS;

Puis redemarrer le tout à nouveau

Pour aller plus loin:
http://www.queret.net/wiki/index.php/Linux/How-to/Postfix/Amavis
http://lindev.fr/index.php?post/2008/10/15/Passerelle-Anti-spam-sous-Debian
http://www.radical-spam.org/documentations/amavisd-new.html

Installer Courier avec support TLS/SSL

Courier est un serveur pop3/Imap. Il permet la distribution des emails afin que les utilisateurs puissent les recuperer. C'est en quelque sorte le facteur.

Il faut avoir préalablement installé Postfix de cette manière.

Installer les paquets necessaires
apt-get courier-authdaemon courier-authlib-mysql courier-pop courier-pop-ssl courier-imap courier-imap-ssl

Indiquer à Courier qu'il faut utiliser mysql en editant /etc/courier/authdaemonrc et changez la valeur de authmodulelist comme suit :
authmodulelist="authmysql"

Ensuite éditez /etc/courier/authmysqlrc. Il devrait ressembler à ceci :
MYSQL_SERVER localhost
MYSQL_USERNAME postfix
MYSQL_PASSWORD password
MYSQL_PORT 3306
MYSQL_DATABASE postfix
MYSQL_USER_TABLE mailbox
MYSQL_CRYPT_PWFIELD password
#MYSQL_CLEAR_PWFIELD password
MYSQL_UID_FIELD 5000
MYSQL_GID_FIELD 5000
MYSQL_LOGIN_FIELD email
MYSQL_HOME_FIELD "/var/mail/vmail"
MYSQL_MAILDIR_FIELD CONCAT(SUBSTRING_INDEX(email,'@',-1),'/',SUBSTRING_INDEX(email,'@',1),'/')
#MYSQL_NAME_FIELD
MYSQL_QUOTA_FIELD concat(quota,'S')


Pour le service POP3, editer les fichiers /etc/courier/pop3d et /etc/courier/pop3d-ssl puis modifier la (dernière) ligne :
MAILDIRPATH=.

Vérifier par la même occasion que POP3DSTART est bien à YES :
POP3DSTART=YES

Faire de même pour le service IMAP, editer fichiers /etc/courier/imapd et /etc/courier/imapd-ssl :
IMAPDSTART=YES
MAILDIRPATH=.

Redemarrer le tout
/etc/init.d/courier-authdaemon restart
/etc/init.d/courier-imap restart
/etc/init.d/courier-imap-ssl restart
/etc/init.d/courier-pop restart
/etc/init.d/courier-pop-ssl restart

Et voilà vous avez un service POP3/POP3S/IMAP/IMAPS actif pour deliver les emails.

Il ne vous reste plus qu'à tester tout cela avec un client email du type "Outlook" ou "Evolution".

Pop3 ecoute sur le port 110 et Pop3S sur le port 995
Imap ecoute sur le port 143 et ImapS sur le port 993
Pensez à regler vos firewalls en consequence.

En cas de soucis, consultez dans /var/log:
mail.log
mail.info
mail.err
mail.warn

Important: lorsqu'une nouvelle boite email est créée, envoyer automatiquement un email dans cette boite. Sinon l'utilisateur relevant ses mails aura un message d'erreur tant que aucun mail ne sera jamais arrivé dans sa boite.

Il sera maintenant bon d'activer fail2ban pour postfix, courrierauth, sasl.

Installation de Postfix avec authentification SASL et activation TLS/SSL

Postfix est un serveur SMTP. D'un côté il réceptionne le courrier en entrée et le stock. Il ne les distribue pas aux differents utilisateurs. De l'autre côté il permet d'expédier des emails en communiquant avec d'autres serveurs smtp. Nous allons installer Postfix avec le support MYSQL afin de pouvoir ajouter facilement des domaines et des boites emails.

En tant que root mysql, creons un utilisateur postfix qui aura le droit de seulement lire la base

mysql -u root -p
mysql>CREATE DATABASE `postfix`;
mysql>GRANT SELECT ON `postfix`.* TO 'postfix'@'127.0.0.1' IDENTIFIED BY 'password';

postfix.* signifie que vous appliquez les droits à toutes les tables de la base postfix.
postfix@127.0.0.1 signifie que autorisé postfix seulement depuis 127.0.0.1 (cad en local)
Password etant le mot de passe que vous attribuez à l'utilisateur postfix.

Pui, toujours tant que root, nous allons créer les tables mysql

USE postfix;

--
-- Structure de la table `domain`
--
CREATE TABLE `domain` (
`domain` varchar(255) NOT NULL default '',
`actif` tinyint(1) NOT NULL default '1',
PRIMARY KEY (`domain`)
) ENGINE=MyISAM COMMENT='Postfix Admin - Domaines Virtuels';

--
-- Structure de la table `mailbox`
--
CREATE TABLE `mailbox` (
`email` varchar(255) NOT NULL default '',
`password` varchar(255) NOT NULL default '',
`quota` int(10) NOT NULL default '0',
`actif` tinyint(1) NOT NULL default '1',
`imap` tinyint(1) NOT NULL default '1',
`pop3` tinyint(1) NOT NULL default '1',
PRIMARY KEY (`email`)
) ENGINE=MyISAM COMMENT='Postfix Admin - Boites Emails Virtuelles';

--
-- Structure de la table `alias`
--
CREATE TABLE `alias` (
`source` varchar(255) NOT NULL default '',
`destination` text NOT NULL,
`actif` tinyint(1) NOT NULL default '1',
PRIMARY KEY (`source`)
) ENGINE=MyISAM COMMENT='Postfix Admin - Alias Virtuels';

Maintenant nous sommes prêt du côté Mysql.

Postfix ne gere pas nativement les quotas.

Il y a 2 solutions : soit on telecharge les sources puis on applique un patch.
C'est le cas ici : http://doku.beyondhosting.fr/doku.php/howto:debian:postfix dans la section "Patch Quota pour Postfix". L'inconvenient est que le paquet ne sera plus mis à jour par le gestionnaire de paquets. Il faudra à chaque faille de securité decouverte re-compiler postfix.

Etant deja dans ce cas avec Mysql afin qu'il supporte SSL, j'ai donc plutot choisit de continuer à utiliser les paquets debian en ajoutant le dépot VDA (auteur du patch des quotas). Il faut juste s'assurer que vda sorte rapidement les mises à jour lorsqu'il y en a et qu'ils ne se fassent pas hacker...

Pour ajouter le depot, mettre ces lignes à la fin du fichier /etc/apt/sources.list
#postfix VDA
deb http://debian.home-dn.net/sarge postfix-vda/

On installe postfix avec le support mysql
apt-get update
apt-get install postfix postfix-mysql

L'installeur va alors vous poser quelques questions.

Pour un serveur dédié il faudra choisir "Systeme Internet", et pour le domaine votre domaine principale. Nous utiliserons test.priv pour les tests.

Ensuite, il est necessaire de creer un utilisateur pour les mails virtuels. Tous les mails virtuels arriveront dans /var/spool/Vmail/test.priv/user

groupadd -g 5000 vmail
useradd -g vmail -u 5000 vmail -d /var/spool/vmail/ -m

Puis editer /etc/postfix/main.cf

Modifier
myhostname = test.priv

#restrictions d'accès
# adresses d'expédition
# le "reject_unknown_sender_domain" verifie que le domaine existe
smtpd_sender_restrictions =
permit_mynetworks,
reject_unknown_sender_domain,
warn_if_reject reject_unverified_sender

# adresses de destination
smtpd_recipient_restrictions =
permit_mynetworks,
reject_unauth_destination,
reject_unknown_recipient_domain,
reject_non_fqdn_recipient

# client
smtpd_client_restrictions =
reject_unknown_client,
permit_mynetworks

Et ajouter ceci
disable_vrfy_command = yes
smtpd_helo_required = yes

virtual_alias_maps = mysql:/etc/postfix/mysql-virtual_aliases.cf,mysql:/etc/postfix/mysql-virtual_aliases_mailbox.cf
virtual_mailbox_domains = mysql:/etc/postfix/mysql-virtual_domains.cf
virtual_mailbox_maps = mysql:/etc/postfix/mysql-virtual_mailboxes.cf
virtual_mailbox_base = /var/spool/vmail/
virtual_uid_maps = static:5000
virtual_gid_maps = static:5000

virtual_create_maildirsize = yes
virtual_mailbox_extended = yes
virtual_mailbox_limit_maps = mysql:/etc/postfix/mysql-virtual_mailbox_limit_maps.cf
virtual_mailbox_limit_override = yes
virtual_maildir_limit_message = "Desole, la boite email de l'utilisateur est pleine, essayez plus tard."
virtual_overquota_bounce = yes

Ensuite creer les fichiers suivants dans /etc/postfix

# mysql-virtual_domains.cf
hosts = 127.0.0.1
user = postfix
password = pass
dbname = postfix
select_field = 'virtual'
table = domain
where_field = domain
additional_conditions = AND actif=1

# mysql-virtual_mailboxes.cf
hosts = 127.0.0.1
user = postfix
password = pass
dbname = postfix
select_field = CONCAT(SUBSTRING_INDEX(email,'@',-1),'/',SUBSTRING_INDEX(email,'@',1),'/')
table = mailbox
where_field = email
additional_conditions = AND actif=1

# mysql-virtual_aliases.cf
hosts = 127.0.0.1
user = postfix
password = pass
dbname = postfix
select_field = destination
table = alias
where_field = source
additional_conditions = AND actif=1

# mysql-virtual_aliases_mailbox.cf
hosts = 127.0.0.1
user = postfix
password = pass
dbname = postfix
select_field = email
table = mailbox
where_field = email
additional_conditions = AND actif=1

# mysql-virtual_mailbox_limit_maps.cf
hosts = 127.0.0.1
user = postfix
password = pass
dbname = postfix
select_field = quota
table = mailbox
where_field = email

Autoriser postfix à lire ces fichiers
chgrp postfix /etc/postfix/mysql-virtual_*.cf
chmod u=rw,g=r,o= /etc/postfix/mysql-virtual_*.cf

puis redemarrer postfix et checker la configuration
/etc/init.d/postfix restart
postfix check

regarder les logs dans /var/log
il y a mail.err, mail.info, mail.log, mail.warn

Avec mysql5, un probleme de connexion mysql peut survenir si vous avez activer skip-networking. Il suffit de le commenter, ecouter seulement sur 127.0.0.1 aura le même effet.

Maintenant nous allons ajouter la partie sasl et modifier la partie TLS dans /etc/postfix/main.cf

#sasl
smtpd_sasl_auth_enable = yes
smtpd_sasl_security_options = noanonymous
smtpd_sasl_local_domain = test.priv
broken_sasl_auth_clients = yes

# tls config
smtp_use_tls = yes
smtpd_use_tls = yes
smtp_tls_note_starttls_offer = yes
smtpd_tls_key_file = /etc/postfix/smtpd.pem
smtpd_tls_cert_file = /etc/postfix/smtpd.pem
smtpd_tls_CAfile = /etc/postfix/smtpd.pem
smtpd_tls_loglevel = 1
smtpd_tls_received_header = yes
smtpd_tls_session_cache_timeout = 3600s
tls_random_source = dev:/dev/urandom

Et ajouter ceci qui permet de limiter les spams et les scans
### Tarpit those bots/clients/spammers who send errors or scan for accounts
smtpd_error_sleep_time = 60
smtpd_soft_error_limit = 60
smtpd_hard_error_limit = 10

Enfin, nous allons modifier ceci dans /etc/postfix/main.cf pour autoriser les authentifications sasl

# adresses de destination
smtpd_recipient_restrictions =
permit_mynetworks,
permit_sasl_authenticated,
reject_unauth_destination,
reject_unknown_recipient_domain,
reject_non_fqdn_recipient

Comme nous avons activé TLS, il faut generer les certificats dans /etc/postfix
openssl req -new -x509 -nodes -out smtpd.pem -keyout smtpd.pem -days 3650

Autoriser Postfix à lire ces certificats
chgrp postfix /etc/postfix/smtpd.*
chmod u=rw,g=r,o= /etc/postfix/smtpd.*

Ensuite, decommenter ces lignes dans /etc/postfix/master.cf

smtps inet n - - - - smtpd
-o smtpd_tls_wrappermode=yes
-o smtpd_sasl_auth_enable=yes
-o smtpd_client_restrictions=permit_sasl_authenticated,reject
-o milter_macro_daemon_name=ORIGINATING

Pour utiliser les principales listes antispam dans /etc/postfix/main.cf, modifier ceci:

smtpd_recipient_restrictions =
permit_mynetworks,
permit_sasl_authenticated,
reject_rbl_client sbl-xbl.spamhaus.org,
reject_rbl_client zen.spamhaus.org,
reject_rbl_client bl.spamcop.net,
reject_unauth_destination,
reject_unknown_recipient_domain,
reject_non_fqdn_recipient

Installons maitenant sasl et le module mysql pour PAM
apt-get install libsasl2-2 libsasl2-modules libsasl2-modules-sql sasl2-bin libpam-mysql

Creer un dossier pour sasl
mkdir -p /var/spool/postfix/var/run/saslauthd

Editez /etc/default/saslauthd.
Remplacez START=no en START=yes puis modifiez le paramètre OPTION
OPTIONS="-c -m /var/spool/postfix/var/run/saslauthd -r"

Créez ensuite le fichier /etc/pam.d/smtp. Il ne doit contenir seulement ces deux lignes (changez les différents paramètre):

auth required pam_mysql.so user=postfix passwd=password host=127.0.0.1 db=postfix table=mailbox usercolumn=email passwdcolumn=password crypt=1
account sufficient pam_mysql.so user=postfix passwd=password host=127.0.0.1 db=mail table=mailbox column=email passwdcolumn=password crypt=1

Ensuite, créez le fichier /etc/postfix/sasl/smtpd.conf comme suit :

pwcheck_method: saslauthd
mech_list: plain login
allow_plaintext: true
auxprop_plugin: mysql
sql_hostnames: 127.0.0.1
sql_user: postfix
sql_passwd: password
sql_database: postfix
sql_select: select password from mailbox where email = '%u'

Coreection d'un bug
dpkg-statoverride --add root sasl 710 /var/spool/postfix/var/run/saslauthd
adduser postfix sasl

Puis redemarrer
/etc/init.d/postfix restart
postfix check
/etc/init.d/saslauthd restart

Regarder dans les logs si tout va bien comme vu precedemment

Maintenant nous allons tester que le smtp fait bien ce que nous voulons.

Vous aurez peut-etre besoin de telnet
apt-get install telnet-ssl

Ajoutons un domaine test2.priv, et un email test@test2.priv

mysql -u root -p
mysql>USE postfix
mysql>INSERT INTO domain VALUES ('test2.priv',1);
mysql>INSERT INTO mailbox VALUES ('test@test2.priv',ENCRYPT('secret'),0,1,1,1);

Creer une clée d'authentification pour ce serveur
% perl -MMIME::Base64 -e 'print encode_base64("\000test\@test2.priv\000secret")'
AGptczFAam1zMS5uZXQAbm90Lm15LnJlYWwucGFzc3dvcmQ

Depuis le serveur nous devons pouvoir envoyer vers l'exterieur ou vers un compte local.

Vers un compte local
telnet localhost 25
HELO test.priv
mail from: test@test.priv
250 ok
rcpt to: test@test2.priv
250 ok
data
354 go ahead
From: John
To: Nobody
Subject: test postfix
test postfix
.
250 ok 1113954693 qp 29052
quit

Vers exterieur, recommencer la manipulation precedente avec un compte wanadoo par exemple au lieu de test@test2.priv.Attention si vous essayez depuis un reseau domestique et non un serveur dédié, la plupart des FAI bloquent le port 25 et donc le mail ne partira reellement pas.

Si tout est ok vous devez retrouver des emails dans /var/spool/vmail/test2.priv/test.

Depuis l'exterieur, si nous ne sommes pas identifié nous pouvons seulement envoyer vers un compte local. Si nous sommes identifier nous pouvons envoyer vers l'exterieur egalement. Nous allons en profiter pour tester l'authentification SSL.

Pour tester l'envoi vers un compte local, faire la meme manipulation que ci-dessus avec un telnet ip.du.serv.eur 25.

Idem vers un compte exterieur (du type @wanadoo.fr). A ce moment après avoir tapé rcpt to: vous allez avoir un message du genre "relay denied". Ce qui est normal, il ne faut pas que n'importe qui puisse utiliser votre serveur pour spammer le monde entier.

Il faut vous authentifier avec la clé que l'on a créé plus haut. tapez ceci dans le telnet:
AUTH PLAIN AGptczFAam1zMS5uZXQAbm90Lm15LnJlYWwucGFzc3dvcmQ=
235 ok, go ahead (#2.0.0)

puis refaire:
mail from: test@test.priv
250 ok
rcpt to: test@wanadoo.fr
250 ok
data
354 go ahead
From: John
To: Nobody
Subject: test postfix
test postfix
.
250 ok 1113954693 qp 29052
quit

Maintenant vous pouvez envoyer vers l'exterieur.

Testons maintenant le SSL, le smtp SSL ouvre un port 465. Pensez à l'ouvrir sur votre firewall.
openssl s_client -crlf -connect ip.du.serv.eur:465

puis refaire les memes manipulations que ci-dessus, tester l'authentification etc...

Voici la manipulation pour tester le TLS egalement
openssl s_client -starttls smtp -crlf -connect ip.du.serv.eur:25

Pour l'administration des quotas (3eme colonne de la table mailbox), sachez que pour autoriser 2Mo il faudra indiquer 2048000. Les valeurs sont à donner en bytes.

En cas de besoin, pour configurer Postfix en tant que MX secondaire d'un autre serveur de mails, ajoutez ceci dans /etc/postfix/main.cf
relay_domains = domain1.tld

Il faudra configurer les DNS de domain1.tld de la facon suivante:
domain1.tld. IN MX 10 mx1.domain1.tld.
domain1.tld. IN MX 20 backup.example.tld.

backup.example.tld etant notre postfix secondaire.

Pour renvoyer un utilisateur local vers une boite que l'on peut relever, on pourra ajouter comme alias
root vers test@test2.priv
root@localhost vers test@test2.priv
root@test.priv vers test@test2.priv

Sans ajouter localhost et test.priv à la table domain.

Maintenant, vous savez tout sur le fonctionnement d'un serveur SMTP du type Postfix. Bon courage!

Pour aller plus loin:
http://www.lea-linux.org/documentations/index.php/Postfix-courier-mysql-quota-spamassassin-amavis
http://doku.beyondhosting.fr/doku.php/howto:debian:postfix
http://postfix.state-of-mind.de/patrick.koetter/smtpauth/smtp_auth_mailclients.html
http://ftp.traduc.org/doc-vf/gazette-linux/html/2007/142/lg142-C.html
http://www.yocum.org/faqs/postfix-tls-sasl.html
http://www.postfix.org/SASL_README.html
http://linuxfr.org/~Dinmax/10161.html
http://www.bxlug.be/articles/108

mercredi 4 mars 2009

Configuration d'un serveur bind

Nous allons commencer par mettre bind dans un environnement chrooté afin de limiter la casse en cas de hack

Stopper le serveur
/etc/init.d/bind9 stop

Editer le fichier /etc/default/bind9
OPTIONS="-u bind -t /var/lib/named"

Puis créer quelques dossiers
mkdir -p /var/lib/named/etc
mkdir /var/lib/named/dev
mkdir -p /var/lib/named/var/cache/bind
mkdir -p /var/lib/named/var/run/bind/run

Copier la configuration dans l'environnement chrooté
mv /etc/bind /var/lib/named/etc

Faire les liens symboliques
ln -s /var/lib/named/etc/bind /etc/bind

Le necessaire dans /dev
mknod /var/lib/named/dev/null c 1 3
mknod /var/lib/named/dev/random c 1 8

Donner les bons droits
chmod 666 /var/lib/named/dev/null /var/lib/named/dev/random
chown -R bind:bind /var/lib/named/var/*
chown -R bind:bind /var/lib/named/etc/bind

Et copier le fichier rndc.key
cp /etc/bind/bind/rndc.key /etc/bind

Puis editer le syslog /etc/default/syslogd
SYSLOGD="-a /var/lib/named/var/log"

Enfin, redemmarer le tout
/etc/init.d/sysklogd restart
/etc/init.d/bind9 start

Nous allons maintenant configurer bind dans cette environnement chrooté

Editer le fichier /etc/bind/bind/named.conf.options et ajouter les lignes suivantes dans options {}

#Bind resoudra les domaines du monde entier seulement pour la machine locale
#les autres n'auront le droit qu'aux seuls zones pour lesquelles le DNS est autoritaire

allow-recursion{
127.0.0.1;
192.168.1.1; #IP SERVEUR LOCAL
};

#On autorisera les transferts de zones uniquement pour les DNS secondaires

allow-transfer{
none; #SEULEMENT LES SECONDAIRES
};

#IP sur laquelle on ecoute, ici l'ip du serveur local

listen-on{
192.168.1.1; #IP SERVEUR
};

Puis pour creer une nouvelle zone, editer /etc/bind/bind/named.conf.local et inserer les lignes ci-dessous

zone "test.com" {
type master;
file "test.com.hosts";
};

Dans le fichier correspondant /var/lib/named/var/cache/bind/test.com.hosts, mettre ceci

@ IN SOA ns1.test.com postmaster.test.com (
2009030401 ; serial
21600 ; refresh after 6 hours
3600 ; retry after 1 hour
604800 ; expires after 1 week
86400 ) ; minimum TTL of 1 day

IN NS ns1.test.com.
IN NS ns2.test.com.
IN MX 10 mail.test.com.

IN A 192.168.1.1
ww1 IN A 192.168.1.1
mail IN A 192.168.1.1
ns1 IN A 10.0.1.2
ns2 IN A 10.0.1.3

Un peu d'explications

ns1.test.com est le dns primaire
postmaster.test.com signifie que postmaster@test.com est l'adresse principale pour ce domaine
le serial doit etre de la forme yyyymmdd0x où x est incrementé à chaque maj quotidienne

Pour tester sous linux sur la machine locale, ne pas oublier de mettre l'ip du serveur local en premier dans /etc/resolv.conf
un nslookup google.fr 192.168.1.1 fonctionnera en local et ne doit pas fonctionner depuis une autre ip du reseau
un nslookup test.com 192.168.1.1 doit dans les 2 cas (reseau & local) retourner 192.168.1.1

Ensuite nous pouvons proteger un peu plus Bind avec fail2ban contre une attaque DDOS (Distributed Denial of Service). Il faut que fail2ban soit déjà installé.

Dans /etc/bind/bind/named.conf.local ajouter ceci

logging {
channel security_file {
file "/var/log/named/security.log" versions 3 size 30m;
severity dynamic;
print-time yes;
};
category security {
security_file;
};
};

Puis dans /etc/fail2ban/jail.conf ou jail.local selon votre configuration, modifier les lignes suivantes

[named-refused-udp]
enabled = true

[named-refused-tcp]
enabled = true

Enfin pour terminer on reboote le tout

/etc/init.d/bind9 restart
/etc/init.d/fail2ban restart

Pour en savoir un peu plus sur la configuration de Bind:

http://www.cgsecurity.org/Articles/dns_bind.html
http://www.linux-kheops.com/doc/redhat72/rhl-rg-fr-7.2/s1-bind-configuration.html
http://www.alsacreations.com/tuto/lire/623-Bind-dns-chroot.html

mardi 3 mars 2009

Configurer correctement le SSH

Le ssh étant le seul moyen d'accès complet au serveur dédié (normalement...), il est important de le configurer correctement et de la manière la plus sécurisée possible.

La majeur partie des options se modifient dans le fichier /etc/ssh/sshd_config

ListenAddress 192.168.0.1
On doit indiquer ici une seule adresse où ssh écoute (le plus souvent sur eth0)

PermitRootLogin no
Il ne faut pas autoriser le root à se logguer directement, cela favoriserait encore plus les attaques par bruteforce. Avant d'interdire le root, assurez vous que vous avez un autre utilisateur qui pourra executer la commande su.

Port 666 (ou eventuellement ListenAddress 192.168.0.1:666)
Il est preferable de changer le port par defaut. Cela compliquera un peu la vie à ceux qui veulent rentrer dans votre machine.

PermitEmptyPasswords no
Les mots de passe vides sont un affront au système de sécurité.

AllowUsers alex@host.com jeff
Autorise alex seulement depuis tel domaine et jeff depuis partout. Evite que tous vos utilisateurs FTP aient un accès SSH par exemple. Nous verrons plus bas que cette fonction est également possible avec l'utilisation de l'authentification PAM.

AllowGroups wheel admin
Comme pour les utilisateurs, on peut autoriser seulement certains groupes.

Il existe aussi leurs pendants DenyUsers et DenyGroups.

PasswordAuthentication yes

Il vous appartient complètement de décider ce que vous voulez faire. Il est plus sûr d’autoriser l’accès à la machine uniquement aux utilisateurs avec des clés ssh placées dans le fichier ~/.ssh/authorized_keys. Si c’est ce que vous voulez, positionnez cette option à “no”.

Désactiver toute forme d’autorisation dont vous n’avez pas réellement besoin si vous n’utilisez pas, par exemple, RhostsRSAAuthentication, HostbasedAuthentication, KerberosAuthentication ou RhostsAuthentication, vous devriez les désactiver même s’ils le sont déjà par défaut.

Protocol 2
Désactiver le protocole version 1, car il a des défauts de conception qui facilite le crack.

Passer cette étape nous pouvons nous occuper de l'authentification PAM. Pam permet permet des authentification plus restrictives.

Nous allons commencer par créer le fichier /etc/.sshusers-allowed
touch /etc/.sshusers-allowed

Nous allons mettre dedans tous les utilisateurs autorisés à se connecter, séparés par des sauts de ligne. On voit ici la double-utilisation avec le parametre AllowUsers de sshd_config.

Ensuite à la fin du fichier /etc/pam.d/sshd nous allons ajouter ces 2 lignes
auth required pam_listfile.so onerr=fail item=user sense=allow file=/etc/.sshusers-allowed
password required pam_cracklib.so retry=3 minlen=6 difok=3

La premiere ligne fait que le serveur SSH exigera que l'utilisateur soint indiqué dans /etc/.sshusers-allowed pour pouvoir se connecter.

La seconde ligne fait que l'utilisateur ne pourra tenter plus de 3 mots de passes differents en cas d'erreur, et que les mots de passe devront faire au minimum 6 caracteres. Pour que cette methode soit efficace il sera bon de la coupler à fail2ban.

Si vous n'avez pas beaucoup d'utilisateurs ssh distants, ce qui normalement doit etre le cas, vous pouvez augmenter la securité en realisant un script d'authentification qui fera plusieurs choses:

1.-Ouvrir le firewall (iptables) seulement pour ces ip. Exemple si l'ip 192.168.1.250 est autorisée à se connecter.

iptables -A INPUT -p tcp -s 192.168.1.250 --dport 666 -i eth0 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
iptables -A OUTPUT -p tcp -d 192.168.1.250 --sport 666 -o eth0 -m state --state ESTABLISHED,RELATED -j ACCEPT

Ne pas utiliser ces commandes si vous ne connaissez pas iptables et son utilisation!

2-Autoriser seulement ces ip dans le tcpwrapper.

Dans /hosts.deny indiquer quelque chose qui ressemblerai à ceci
sshd : ALL EXCEPT 111.111.111.111, 222.222.222.222 : SPAWN echo "test %c" >> /var/log/test.txt &

Si l'ip n'est pas 111.111.111.111 ou 222.222.222.222 l'adresse ip sera logguée dans /var/log/test.txt. On peut imaginer à la place de echo "test %c" >> /var/log/test.txt & l'appel à un script iptables qui blacklisterait les indesirables (l'ip étant %c)

3.Autoriser seulement toto@111.111.111.111 dans AllowUsers de sshd_config

Avec fail2ban et portsentry le SSH devrait être suffisamment sécurisé pour décourager les petits malins si vous n'êtes pas la CIA ;) Pensez à faire le script qui fera l'inverse, cad qui dés-authentifiera un utilisateur pour une ip donnée.

Enfin, pour logguer tout ce qui se passe au niveau des logins, vous pouvez modifier dans le fichier fichier /etc/login.defs ces 2 lignes:
FAILLOG_ENAB=YES //loggue les erreurs
LOG_OK_LOGIN=YES //loggue les logins ok

et n'hesitez pas à utiliser la commande makepasswd pour generer vos mots de passe.

lundi 2 mars 2009

Les quotas utilisateurs sous Debian

Pour faire fonctionner les quotas, installer l'utilitaire adequat:
apt-get install quota

Ensuite dans /etc/fstab pour les partitions où l'on veut activer les quota, il faut renommer defaults en usrquota,grpquota

Puis creer ces 2 fichiers:
touch /[partition]/aquota.user
touch /[partition]/aquota.group

Si vous avez une seule et unique partition, c'est /aquota.user par exemple. Si c'est la partition /home, il faut creer le fichier /home/aquota.user

Donner les autorisations adequates à ces fichiers:
chmod 600 /[partition]/aquota.user
chmod 600 /[partition]/aquota.group

Puis un petit reboot
reboot

Pour afficher un rapport complet par utilisateur et par groupe:
repquota -a

Normalement tout est vierge

Pour definir un quota de 200Mb à l'utilisateur user en ligne de commande (remplacer hda2 par rapport à la ligne dans /etc/fstab où les quotas ont été activés)

/usr/sbin/setquota -u user 0 200000 0 0 /dev/hda2

Important, il faut ensuite redemarrer le service des quotas

/etc/init.d/quota off
/etc/init.d/quota on

Pour voir les quotas d'un utilisateur
quota -v toto

Pour editer le quota d'un utilisateur (sous vi si c'est l'editeur par defaut)
edquota -u toto

Pour dupliquer les quotas d'un utilisateur à une liste de nouveaux utilisateurs
edquota -p toto liste

Pour modifier la durée de la" grace" pour la limite soft
edquota -t

pour verifier les quotas

/etc/init.d/quota stop
quotacheck -avugm
/etc/init.d/quota start