まこと の ブログ

MaKoTo no burogu — Journal de bord…

Aller au contenu | Aller au menu | Aller à la recherche

informatique › Auto-Hébergement internet

Votre site perso, votre blog, vos mails, etc... tout çà chez vous, çà c'est internet !
Sinon vous faites du minitel 2.0

Historique de mon expérience sur un petit serveur web perso

Fil des billets - Fil des commentaires

jeudi, 23 septembre 2010

Serveur internet @ la maison -6-

Suite du cinquième épisode

Continuons cette série de billets de notes d'installation et configuration du serveur…
Maintenant que le serveur est prêt, il va pouvoir accueillir les différents logiciels afin de fournir les services désirés.

  • Doctlear est un CMS pour faire un ou plusieurs blog, au lieu d'utiliser canalblog, skyblog, over-blog, blogspot, etc.
  • SPIP est un CMS pour faire un site internet dynamique.
  • Piwigo associé au plugin «Piwishack» est une galerie de photo qui remplacera avantageusement des trucs comme photobucket, hiboox, imageshack, flicker, etc.
  • Tiny Tiny RSS est un lecteur de flux RSS en ligne qui remplacera iGoogle ou Google reader et ses petits camarades…
  • Roundcube est un client e-mail en ligne pour lire et envoyer ses messages de partout, directement depuis son serveur. Il remplacera donc gmail, hotmail, live, etc.
  • Piwik fournira des statistiques de visites complètes et détaillées du site et du blog. Il remplacera par exemple Google Analytics.
  • iTheora est un player vidéo qui permettra de palier à l'obsolescence de certains navigateurs internet, afin de faire une transition douce vers la vidéo lue nativement par les navigateurs web, grace aux nouveau standard «html5».

En effet, beaucoup d'entre eux ne sont pas encore capable de lire des vidéos ogv (codec video theora + audio Vorbis) ou WebM, rendant indispensable cet outil capable de basculer sur un plugin ou un lecteur alternatif .
iTheora permettra alors d'héberger soit même ses vidéos en restant interopérable, plutôt que d'utiliser les sempiternels Youtube & Dailymotion dévoreurs de bande passante et en partie responsable du filtrage du contenu et de la vitesse par certains fournisseurs d'accés internet…

samedi, 18 septembre 2010

Serveur internet @ la maison -5-

Suite du quatrième épisode

Continuons cette série de billets de notes d'installation et configuration du serveur, avec l'installation et la configuration du Firewall logiciel.

iptables pour netfilter :


  • Créer le fichier : /etc/init.d/makotoiptables
#!/bin/bash
########################
# MaKoTo - 14/12/2009
# Regle de Firewall
# Serveur hebergeant:
# - SSH
# - HTTP
# - HTTPS
# - IMAP
########################
# Debut

#Autoriser le trafic des packets entrants relatifs à des connexions déjà établies
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

#Autoriser le trafic local
iptables -I INPUT 2 -i lo -j ACCEPT

# Autoriser les pings 
iptables -A INPUT -p icmp -j ACCEPT

#------------------------------
# Autorise les flux entrant
#------------------------------
# SSH serveur déporté en 1025
iptables -A INPUT  -p tcp -i eth0 --dport 1025 -j ACCEPT

# Web serveur en 80
iptables -A INPUT  -p tcp -i eth0 --dport http -j ACCEPT

# Web serveur sécurisé en 443
iptables -A INPUT  -p tcp -i eth0 --dport https -j ACCEPT

# serveur de reception de messagerie en 143
iptables -A INPUT  -p tcp -i eth0 --dport imap2 -j ACCEPT

#ajout sinon reception de mail marche pas malgres le 143 ouvert
iptables -A INPUT -p tcp -i eth0 --dport 25 -j ACCEPT

#---------------------------------------
# Bloquer les flux entrant restants
#---------------------------------------
iptables -P INPUT DROP

# Fin


  • Appliquer les règles au démarrage :

Rendre ce script exécutable :

#chmod +x /etc/init.d/makotoiptables

Éditer /etc/rc.local pour ajouter la ligne (juste avant exit 0) :

#/etc/init.d/makotoiptables
  • Vérification :
# iptables -L  (ou #iptables -L -v -n)
Chain INPUT (policy DROP)
target     prot opt source               destination
ACCEPT     all  --  anywhere             anywhere            state RELATED,ESTABLISHED
ACCEPT     all  --  anywhere             anywhere
ACCEPT     icmp --  anywhere             anywhere
ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:666
ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:www
ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:https
ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:imap2
ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:smtp

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination



fail2ban :

#apt-get install fail2ban

Démarrer fail2ban :

#/etc/init.d/fail2ban start
  • Vérifier le fichier de configuration : /etc/fail2ban/fail2ban.conf
[Definition]
loglevel = 1
logtarget = /var/log/fail2ban.log
socket = /var/run/fail2ban/fail2ban.sock
  • Configurer les règles des prisons dans le fichier : /etc/fail2ban/jail.conf
[DEFAULT]

# IP à ne pas bannir
ignoreip = 127.0.0.1 192.168.0.0/24
#temps de bannissement en seconde
bantime  = 3600
# nombre d’essais max avant bannissement
maxretry = 3
backend = polling
# le mail qui recevra les alertes fail2ban
destemail = root@localhost
# l’action par défaut quand on ban
banaction = iptables-multiport
# la commande pour envoyer des mail (ici avec sendmail ou postfix)
mta = sendmail
# le protocole a surveiller
protocol = tcp
#
# JAILS
#
[ssh]
# activé ou non (false)
enabled = true
# le port sur lequel le service écoute
port    = 1025
# le fichier .conf présent dans filter.d
filter  = sshd
# le fichier de log a analyser
logpath  = /var/log/auth.log
maxretry = 3

[xinetd-fail]

enabled   = false
filter    = xinetd-fail
port      = all
banaction = iptables-multiport-log
logpath   = /var/log/daemon.log
maxretry  = 2

[ssh-ddos]

enabled = true
port    = ssh
filter  = sshd-ddos
logpath  = /var/log/auth.log
maxretry = 1
#
# HTTP servers
#
[apache]

enabled = true
port    = http,https
filter  = apache-auth
logpath = /var/log/apache*/*error.log
maxretry = 1

[apache-multiport]

enabled   = true
port      = http,https
filter    = apache-auth
logpath   = /var/log/apache*/*error.log
maxretry  = 1

[apache-noscript]
#si true, video itheora deconnent!
enabled = false
port    = http,https
filter  = apache-noscript
logpath = /var/log/apache*/*error.log
maxretry = 1

[apache-overflows]

enabled = true
port    = http,https
filter  = apache-overflows
logpath = /var/log/apache*/*error.log
maxretry = 1
#
# FTP servers
#
[vsftpd]

enabled  = false
port     = ftp,ftp-data,ftps,ftps-data
filter   = vsftpd
logpath  = /var/log/vsftpd.log
maxretry = 6

[proftpd]

enabled  = false
port     = ftp,ftp-data,ftps,ftps-data
filter   = proftpd
logpath  = /var/log/proftpd/proftpd.log
maxretry = 6

[wuftpd]

enabled  = false
port     = ftp,ftp-data,ftps,ftps-data
filter   = wuftpd
logpath  = /var/log/auth.log
maxretry = 6
#
# Mail servers
#
[postfix]

enabled  = true
port     = smtp,ssmtp
filter   = postfix
logpath  = /var/log/mail.log

[couriersmtp]

enabled  = false
port     = smtp,ssmtp
filter   = couriersmtp
logpath  = /var/log/mail.log

[courierauth]

enabled  = false
port     = smtp,ssmtp,imap2,imap3,imaps,pop3,pop3s
filter   = courierlogin
logpath  = /var/log/mail.log

[sasl]

enabled  = false
port     = smtp,ssmtp,imap2,imap3,imaps,pop3,pop3s
filter   = sasl
logpath  = /var/log/mail.log

# DNS Servers

[named-refused-udp]

enabled  = false
port     = domain,953
protocol = udp
filter   = named-refused
logpath  = /var/log/named/security.log

[named-refused-tcp]

enabled  = false
port     = domain,953
protocol = tcp
filter   = named-refused
logpath  = /var/log/named/security.log

#MES REGLES

[apache-w00tw00t]
enabled = true
filter = apache-w00tw00t
action = iptables[name=Apache-w00tw00t,port=80,protocol=tcp]
logpath = /var/log/apache2/access*.log
maxretry = 1

[apache-scan]
enabled = true
filter = apache-scan
action = iptables[name=Apache-scan,port=80,protocol=tcp]
logpath = /var/log/apache2/access*.log
maxretry = 1

[dos]
enabled = true
port = 80,49152
filter = dos
logpath = /var/log/kern.log
maxretry = 1

[apache-admin]
enabled = true
port = http,https
filter = apache-admin
logpath = /var/log/apache2/*error.log
maxretry = 1

[apache-headers]
enabled = true
port = http,https
filter = apache-headers
logpath = /var/log/apache2/*error.log
maxretry = 1

[apache-invalid]
enabled = true
port = http,https
filter = apache-invalid
logpath = /var/log/apache2/*error.log
maxretry = 1

[dovecot-pop3imap]
enabled = true
filter = dovecot-pop3imap
action = iptables-multiport[name=dovecot-pop3imap, port="pop3,imap", protocol=tcp]
logpath = /var/log/maillog
maxretry = 20
findtime = 1200
bantime = 1200

Jail.conf est le fichier de définitions des services a surveiller. Il s’appuie sur des filtres préalablement définis dans /etc/fail2ban/filter.d

apache-w00tw00t.conf :

[Definition]
failregex = ^<HOST> -.*"GET \/w00tw00t\.at\.ISC\.SANS\.DFind\:\).*".*
ignoreregex =
apache-scan.conf :
[Definition]
failregex = ^<HOST> -.*"GET \/nonexistenshit.*".*
		^<HOST> -.*"GET .*xmlrpc\.php.*".*
		^<HOST> -.*"GET .*html2text\.php.*".*
ignoreregex =

dos.conf :

[Definition]
failregex = TCP: Treason uncloaked! Peer
ignoreregex =

apache-admin.conf :

[Definition]
failregex = [[]client <HOST>[]] File does not exist: .*(admin|PMA|mysql)
ignoreregex =

apache-headers.conf :

[Definition]
failregex = [[]client <HOST>[]] request failed: error reading the headers
ignoreregex =

apache-invalid.conf :

[Definition]
failregex = [[]client <HOST>[]] Invalid URI in request .*
ignoreregex =

dovecot-pop3imap.conf :

[Definition]
failregex = (?: pop3-login|imap-login): (?:Authentication failure|Aborted login \(auth failed|Disconnected \(auth failed).*rip=(?P<host>\S*),.*
ignoreregex =


À suivre…

mercredi, 15 septembre 2010

Serveur internet @ la maison -4-

Suite du troisième épisode

Continuons cette série de billets de notes d'installation et configuration du serveur, avec l'installation et la configuration du serveur e-mail (Postfix+dovecot)

Installation :

#apt-get install postfix dovecot-imapd mailutils


Configurer postfix :

#dpkg-reconfigure postfix

Répondre aux questions posées :

Configuration type du serveur de messagerie : Site Internet
Nom de courrier : mondomaine.fr (votre nom de domaine)
Destinataire des courriels de « root » et de « postmaster » : toto (un user unix)
Autres destinations pour lesquelles le courrier sera accepté : mondomaine.fr
Forcer des mises à jour synchronisées de la file d’attente des courriels : non (laisser par défaut)
Réseaux internes : 127.0.0.0/8, 192.168.0.0/24 (si votre réseau local est 192.168.0.x )
Utiliser procmail pour la distribution locale : non
Taille maximale des boîtes aux lettres (en octets) : (5Gio)
Caractère d’extension pour les adresse locales : + (laisser par défaut)
Protocoles internet à utiliser : ipv4

  • Fichier de Configuration : /etc/postfix/main.cf
# Nom de domaine de messagerie principal
mydomain = mondomaine.fr
# Nom d'hôte machine
myhostname = debianbox
alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases
# Nom de domaine utilisé pour les adresses incomplètes
#/etc/mailname doit contenir la valeur de mydomain
myorigin = /etc/mailname
mydestination = mondomaine.fr, debianbox, localhost.localdomain, localhost
relayhost =
mynetworks = 127.0.0.0/8, 192.168.0.0/24
mailbox_size_limit = 5368709120
recipient_delimiter = +
inet_interfaces = all
inet_protocols = ipv4
home_mailbox = Mail/

Ajouter home_mailbox = Maildir/ à la fin.

Relancer le serveur SMTP :

#/etc/init.d/postfix restart


  • Configuration en cas de refus des messages à destination de Gmail :

Éditer et ajouter dans : /etc/postfix/main.cf

transport_maps = hash:/etc/postfix/maps/transport

Créer le fichier : /etc/postfix/maps/transport

google.com smtp:smtp.monfai.fr
.google.com smtp:smtp.monfai.fr
gmail.com smtp:smtp.monfai.fr
.gmail.com smtp:smtp.monfai.fr

Relancer les démons :

#postmap /etc/postfix/maps/transport && postfix reload


Configurer dovecot :

  • Fichier de Configuration : /etc/dovecot/dovecot.conf
protocols = imap
mail_location = maildir:~/ Mail

Créer le dossier et les sous-dossiers (/usr/bin/maildirmake.dovecot ~/Maildir)

$maildirmake ~/Maildir
$maildirmake -f Sent ~/Mail
$maildirmake -f Queue ~/Mail
$maildirmake -f junkmail ~/Mail
$maildirmake -f Drafts ~/Mail
$maildirmake -f Trash ~/Mail

Relancer le serveur IMAP :

#/etc/init.d/dovecot restart


Configurer un client :

Réception :

Type de serveur : IMAP
Serveur : imap.mondomaine.fr
Nom d’utilisateur : user unix
Sécurité : Chiffrement TLS
Type d’authentification : Mot de passe

Envoi :

Type de serveur : SMTP
Serveur : smtp.mondomaine.fr
Nom d’utilisateur : votre login sur le serveur
Sécurité : Chiffrement TLS
Pas d’authentification.


Configuration pour webmail https : (par exemple roundcube)

Activer le mod ssl d’apache :

#a2enmod ssl

Modifier dans le fichier de config : /etc/php5/apache2/php.ini

date.timezone = 'Europe/Paris'

Créer un VirtualHost qui décrit à Apache le site qu’il doit héberger (le nom du site sur lequel il répond en http, quels répertoires doivent être accessibles, etc.).
Voici un modèle (qui correspond à mon VirtualHost), qui permet :

  • d’afficher le site contenu dans /var/www/webmail lorsqu’une requête arrive sur le port 443 (https), c’est-à-dire quand je tape https://mondomaine.fr dans un navigateur;
  • d’interdire l’accès aux répertoires config, temp et logs;
  • de rediriger automatiquement http://mondomaine.fr vers https://mondomaine.fr.

Fichier de config : /etc/apache2/sites-available/mondomaine.fr

NameVirtualHost *:443

<VirtualHost *:80>
         DocumentRoot    /var/www/webmail
         ServerName      mondomaine.fr
         Redirect        / https://mondomaine.fr/
</VirtualHost>

<VirtualHost *:443>
        DocumentRoot    /var/www/webmail
        ServerName      mondomaine.fr
        SSLEngine on
        SSLCertificateFile /etc/ssl/certs/ssl-cert-snakeoil.pem
        SSLCertificateKeyFile /etc/ssl/private/ssl-cert-snakeoil.key

        <Directory /var/www/webmail/>
                Options FollowSymLinks MultiViews
                AllowOverride All
                Order allow,deny
                allow from all
        </Directory>

        <Directory /var/www/webmail/config>
                Options -FollowSymLinks
                AllowOverride None
        </Directory>

        <Directory /var/www/webmail/temp>
                Options -FollowSymLinks
                AllowOverride None
        </Directory>

        <Directory /var/www/webmail/logs>
                Options -FollowSymLinks
                AllowOverride None
                Order allow,deny
                Deny from all
        </Directory>

        ErrorLog        /var/log/apache2/mail_error.log
        CustomLog       /var/log/apache2/mail_access.log combined

</VirtualHost>

Activer ce VirtualHost  :

#a2ensite mondomaine.fr

À suivre…

vendredi, 10 septembre 2010

Serveur internet @ la maison -3-

Suite du deuxième épisode

Continuons cette série de billets de notes d'installation et configuration du serveur, avec la configuration du LAMP (Linux/Apache/Mysql/Php)

php


  • Pour vérifier que Php fonctionne, déposer un fichier contenant

Fichier de vérification phpinfo.php : /var/www/phpinfo.php

<?php
phpinfo();
?>


apache


  • Sécurisation

Éditer : /etc/apache2/conf.d/security

ServerSignature Off
ServerTokens Prod


  • Empêcher le parcours des répertoires

Éditer : /etc/apache2/sitesavailable/default
ajouter l'option -Indexes:

<Directory /var/www/>
      Options Indexes
      FollowSymLinks MultiViews
      AllowOverride None
      Order allow,deny
      allow from all
</Directory>


  • Une Favicon commune à tous les vhosts, ajouter dans /etc/apache2/apache2.conf
## ajout favicon tous les vhosts
<Location "/favicon.ico">
     SetHandler none
</Location>
alias /favicon.ico /var/www/favicon.ico

donc favicon.ico placée dans /var/www/favicon.ico (un png renomé)
Redémarrer votre serveur Apache.

  • Si au démarrage d’apache, un message d'erreur de ce type apparaît,
apache2: Could not reliably determine the server's fully qualified domain name, using 127.0.1.1 for ServerName.

Taper ceci :

#echo "ServerName localhost" | tee /etc/apache2/conf.d/fqdn


  • Opérations utiles sur Apache :
#/etc/init.d/apache2 reload
#/etc/init.d/apache2 restart
#/etc/init.d/apache2 stop
#/etc/init.d/apache2 start


  • VirtualHost default : /etc/apache2/sites-available/default
<VirtualHost *:80>
        ServerAdmin webmaster@localhost

        DocumentRoot /var/www/
        <Directory />
                Options FollowSymLinks
                AllowOverride None
                Order Deny,Allow
                Deny from All
        </Directory>

# Autoriser la racine du site
        <Directory /var/www/>
                Options Indexes FollowSymLinks MultiViews
                AllowOverride None
                Order allow,deny
                allow from all
        </Directory>

# interdire la navigation dans ces sous-dossiers
        <Directory /var/www/site1>
                Options -Indexes
                AllowOverride None
                Order   deny,allow
                Deny from   all
        </Directory>
        <Directory /var/www/site2>
                Options -Indexes
                AllowOverride None
                Order   deny,allow
                Deny from   all
        </Directory>
        ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
        <Directory "/usr/lib/cgi-bin">
                AllowOverride None
                Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
                Order allow,deny
                Allow from all
        </Directory>

        ErrorLog /var/log/apache2/error.log

        # Possible values include: debug, info, notice, warn, error, crit,
        # alert, emerg.
        LogLevel warn

        CustomLog /var/log/apache2/access.log combined

    Alias /doc/ "/usr/share/doc/"
    <Directory "/usr/share/doc/">
        Options Indexes MultiViews FollowSymLinks
        AllowOverride None
        Order deny,allow
        Deny from all
        Allow from 127.0.0.0/255.0.0.0 ::1/128
    </Directory>

</VirtualHost>


  • VirtualHost site1 : /etc/apache2/sites-available/site1
<VirtualHost *:80>
        ServerName site1.makotoworkshop.org

        DocumentRoot /var/www/site1
        <Directory />
                Options FollowSymLinks
                AllowOverride None
        </Directory>
        <Directory /var/www/site1>
                Options -Indexes FollowSymLinks MultiViews
                AllowOverride None
                Order allow,deny
                allow from all
        </Directory>

        ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
        <Directory "/usr/lib/cgi-bin">
                AllowOverride None
                Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
                Order allow,deny
                Allow from all
        </Directory>

        ErrorLog /var/log/apache2/error_site1.log

        # Possible values include: debug, info, notice, warn, error, crit,
        # alert, emerg.
        LogLevel warn

        CustomLog /var/log/apache2/access_site1.log combined

    Alias /doc/ "/usr/share/doc/"
    <Directory "/usr/share/doc/">
        Options Indexes MultiViews FollowSymLinks
        AllowOverride None
        Order deny,allow
        Deny from all
        Allow from 127.0.0.0/255.0.0.0 ::1/128
    </Directory>

</VirtualHost>



Mysql


  • Pour déplacer les Bases :
#/etc/init.d/mysql stop

Créer le fichier contenant : /etc/mysql/conf.d/datadir.cnf

[mysqld]
datadir = /home/mysql

Créer le dossier :

#mkdir /home/mysql

Copier le contenu :

#cp -R /var/lib/mysql/* /home/mysql
#rm /home/mysql/ib*

Donner les droits :

#chown -R mysql:mysql /home/mysql
#/etc/init.d/mysql restart


  • Si, suite à une réinstallation de Debian, Mysql refuse de démarrer avec l’erreur :
/usr/bin/mysqladmin: connect to server at ‘localhost’ failed error: ‘Access denied for user ‘debiansysmaint’@'localhost’ (using password: YES)’

Debian crée un utilisateur spécifique (debiansysmaint) dans mysql pour que le système puisse automatiser certaines tâches. Le fichier /etc/mysql/debian.cnf (il appartient à root:root et est chmod 600) contient le mot de passe de cet utilisateur. Restaurer une sauvegarde du fichier (ou mettre le bon mot de passe) devrait suffire, sinon :

Mettre à jour le mot de passe MySQL du user debiansysmaint :

#mysql -uroot -p
GRANT ALL PRIVILEGES ON *.* TO 'debiansysmaint'@'localhost'
IDENTIFIED BY '' WITH GRANT OPTION;

(au besoin, tuer auparavant tous les démons mysql résiduels)

  • Opérations sur les bases :

Connecter MySQL :

#mysql -u root -p

Créer la base :

mysql> CREATE DATABASE base1;

Utiliser une base :

mysql> USE base1;

Créer l’utilisateur :

mysql> CREATE USER "toto"@"localhost";

Attribuer un mot de passe à l’utilisateur :

mysql> SET PASSWORD FOR "toto"@"localhost" = PASSWORD("mdp");

Donner tous les droits à l’utilisateur pour la base :

mysql> GRANT ALL ON base1.* TO toto@localhost;

Importer une sauvegarde de base :

#mysql -u root -p base1 < /home/…/Base1SavBdd.sql

Afficher les utilisateurs :

mysql>\u mysql
SELECT Host, User, Password FROM user;

Supprimer un Utilisateur :

mysql> DROP USER toto@localhost;

Supprimer une Base :

mysql> DROP DATABASE base1;

À suivre…

- page 4 de 8 -