まこと の ブログ

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

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…

mercredi, 8 septembre 2010

Serveur internet @ la maison -2-

Suite du premier épisode

Commençons cette série de billets de notes d'installation et configuration du serveur, par l'installation du LAMP (Linux/Apache/Mysql/Php)

1 - Amorçage de l'installation de GNU/Linux Debian Stable avec une clé USB :

  • La méthode facile et rapide, mais non sans danger avec la commande dd !
dd if=chemin-et-nom-de-l'iso of=/dev/sdX bs=4M; sync

Puis retirer la clé.

Attention à utiliser le nom correct pour la clé. Soyez sûr de vous, en cas d'erreur sur ce point le risque d'effacer son disque dur est probable !!!
Frileux ?? Alors préférez la méthode ci-dessous :

1.1 - Partitionner :

un périphérique USB en FAT16 ou FAT32.

1.2 - Rendre la clé bootable :

installer au préalable les paquets syslinux et mtools, et lancer :

#syslinux /dev/sdX1

Attention à utiliser le nom correct pour la clé. La partition ne doit pas être montée au lancement de syslinux. Cette procédure écrit un secteur d'amorçage sur la partition et crée le fichier ldlinux.sys qui contient le code du programme d'amorçage.

1.3 - Ajouter les fichiers de boot :

Les fichiers de boot se trouvent à cette adresse
http://www.debian.org/releases/stable/i386/ch04s02.html.fr#wherefiles
Dans le dossier hdmedia/

Montez la partition (mount /dev/sdX1 /mnt) et copier les fichiers suivants à la racine de la clé :

  • vmlinuz, noyau binaire
  • initrd.gz, image du disque virtuel initial
  • syslinux.cfg ,fichier de configuration de SYSLINUX qui doit contenir :
                                             default vmlinuz
                                             append initrd=initrd.gz

Copiez une image ISO de type « netinst ». Démontez la clé (umount /mnt) et voilà, c'est fait !

1.4 - BOOT :

Si le système refuse de s'amorcer à partir de la clé, il se peut que le secteur principal d'amorçage de la clé soit défectueux. Le corriger avec le programme installmbr qui se trouve dans le paquet mbr :

#installmbr/dev/sdX


2 - Installation du système :

- Renseigner Hostname : debianbox Domaine : mondomaine.fr
- Si besoin, pour modifier, éditer /etc/hostname => debianbox
- éditer /etc/hosts => 127.0.1.1 debianbox.mondomaine.fr debianbox
- La commande hostname -f renvoie donc debianbox.mondomaine.fr

Arrivé à l’étape du choix des logiciels, Tout décocher.

3 - Installation de logiciels utiles :

#apt-get install lmsensors opensshserver hddtemp bzip2 unzip ntpdate host pciutils vim rsync less ccze


4 - Installation d'apache, php et Mysql :

#apt-get install apache2 php5 php5mysql mysqlserver5.0 php5gd php5cli

À suivre…

lundi, 6 septembre 2010

Maintenance périodique du serveur

dsc07041.jpg Outre les sauvegardes régulières des données des sites web et les mises à jours du système, j'éteins le serveur environ tous les 6 mois pour le soumettre à un petit dépoussiérage en règle, rendant alors plus efficace le refroidissement des composants.


J'ai aussi profité de cet arrêt pour ajouter la grille de ventilation extérieure… cette pièce manquait pour achever le boitier.



dsc07042.jpg dsc07046.jpg dsc07047.jpg

samedi, 24 avril 2010

Fail2Ban, ça marche !!

Que faire lorsqu'en matant nonchalamment ses logs apache ou mail, on aperçoit des activités suspectes et inquiétantes ?

Apr  1 03:59:06 debianbox postfix/smtpd[23214]: warning: 112.104.64.66: hostname 112-104-64-66.adsl.dynamic.seed.net.tw verification failed: Name or service not known
Apr  1 03:59:06 debianbox postfix/smtpd[23214]: connect from unknown[112.104.64.66]
Apr  1 03:59:07 debianbox postfix/smtpd[23214]: NOQUEUE: reject: RCPT from unknown[112.104.64.66] 554 5.7.1 <vbibiorm@gmail.com>: Relay access denied; from=<wendy67510@gmail.com> to=<vbibiorm@gmail.com> proto=SMTP helo=<212.198.153.217>
Apr  1 03:59:07 debianbox postfix/smtpd[23214]: lost connection after RCPT from unknown[112.104.64.66]
Apr  1 03:59:07 debianbox postfix/smtpd[23214]: disconnect from unknown[112.104.64.66]
Apr  1 04:02:27 debianbox postfix/anvil[23217]: statistics: max connection rate 1/60s for (smtp:112.104.64.66) at Apr  1 03:59:06
Apr  1 04:02:27 debianbox postfix/anvil[23217]: statistics: max connection count 1 for (smtp:112.104.64.66) at Apr  1 03:59:06
Apr  6 13:53:43 debianbox postfix/smtpd[11331]: warning: 117.93.116.180: hostname 180.116.93.117.broad.yc.js.dynamic.163data.com.cn verification failed: Name or service not known
Apr  6 13:53:43 debianbox postfix/smtpd[11331]: connect from unknown[117.93.116.180]
Apr  6 13:53:44 debianbox postfix/smtpd[11331]: lost connection after AUTH from unknown[117.93.116.180]
Apr  6 13:53:44 debianbox postfix/smtpd[11331]: disconnect from unknown[117.93.116.180]
Apr  7 17:02:13 debianbox postfix/smtpd[19164]: connect from 123-205-233-194.adsl.dynamic.seed.net.tw[123.205.233.194]
Apr  7 17:02:14 debianbox postfix/smtpd[19164]: NOQUEUE: reject: RCPT from 123-205-233-194.adsl.dynamic.seed.net.tw[123.205.233.194] 554 5.7.1 <vbibiorm@gmail.com>: Relay access denied; from=<wendy67510@gmail.com> to=<vbibiorm@gmail.com> proto=SMTP helo=<212.198.153.217>
Apr  7 17:02:14 debianbox postfix/smtpd[19164]: lost connection after RCPT from 123-205-233-194.adsl.dynamic.seed.net.tw[123.205.233.194]
Apr  7 17:02:14 debianbox postfix/smtpd[19164]: disconnect from 123-205-233-194.adsl.dynamic.seed.net.tw[123.205.233.194]
Apr  8 13:08:00 debianbox postfix/smtpd[10575]: connect from 118-166-210-124.dynamic.hinet.net[118.166.210.124]
Apr  8 13:08:00 debianbox postfix/smtpd[10575]: lost connection after CONNECT from 118-166-210-124.dynamic.hinet.net[118.166.210.124]
Apr  8 13:08:00 debianbox postfix/smtpd[10575]: disconnect from 118-166-210-124.dynamic.hinet.net[118.166.210.124]
Apr  9 22:56:46 debianbox postfix/smtpd[8262]: connect from 118-166-208-126.dynamic.hinet.net[118.166.208.126]
Apr  9 22:56:47 debianbox postfix/smtpd[8262]: NOQUEUE: reject: RCPT from 118-166-208-126.dynamic.hinet.net[118.166.208.126] 554 5.7.1 <vkihwpdh@yahoo.com.tw>: Relay access denied; from=<z2007tw@yahoo.com.tw> to=<vkihwpdh@yahoo.com.tw> proto=SMTP helo=<212.198.153.217>
Apr  9 22:56:47 debianbox postfix/smtpd[8262]: lost connection after RCPT from 118-166-208-126.dynamic.hinet.net[118.166.208.126]
Apr  9 22:56:47 debianbox postfix/smtpd[8262]: disconnect from 118-166-208-126.dynamic.hinet.net[118.166.208.126]

Rien pourrait'-on se dire, «les ports sont ouverts» :(
Et pourtant il est possible de bannir pour un temps donné ces malotrus !!

«yaka» installer Fail2Ban (nécessite iptables pour NetFilter)

#apt-get install fail2ban


Vérifier le fichier de configuration : /etc/fail2ban/fail2ban.conf

      [Definition]
      loglevel = 1
      logtarget = /var/log/fail2ban.log
      socket = /var/run/fail2ban/fail2ban.sock

Et il va donc nous faire ça !! du moins c'est ce qu'on croit…

En effet des filtres sont chargés de repérer les IP des malandrins, pour ensuite les transférer à la prison.
C'est donc valable pour les filtres donnés par défaut, mais en cas d'autres activités suspectes, il va falloir créer ses propres filtres !

On crée donc un fichier «.conf» à l'emplacement prévu ! attention , ne pas utiliser de majuscules !

#vi /etc/fail2ban/filter.d/dynamicseed.conf

et on le remplit avec ça :

[Definition]
failregex = warning: <HOST>: hostname *.* verification failed
            NOQUEUE: reject: RCPT from unknown[[]<HOST>[]] *.* Relay access denied
            NOQUEUE: reject: RCPT from *.*[[]<HOST>[]] *.* Relay access denied
            connect from *.*dynamic*.*[[]<HOST>[]]
            disconnect from *.*dynamic*.*[[]<HOST>[]]
ignoreregex =

«Ça», ça tombe pas du ciel, c'est basé sur l'observation des log précédents.

Le but du jeux, c'est de copier une partie du log qui contient l'adresse IP et de la remplacer par <HOST>
Attention cependant, la syntaxe est spécifique quand l'IP est encadrée dans le log

[118.166.208.126] devient [[]<HOST>[]]

De même, si un espace est présent, il faut aussi le respecter !
La où il faut être malin, c'est qu'il faut mettre des *.* aux endroits où le texte change au fil des log.
En effet, même si le filtre fonctionne à l'instant T, il risque de ne plus rien filtrer la fois suivante, alors que la forme du log aura changé…
Donc, plus on a d'attaques, plus on peut affiner la syntaxe du filtre et petit à petit l'étau se resserre, pour que le filtre choppe à tous les coups niark!
D'autant plus qu'on peut mettre plusieurs lignes contenant l'IP…

Il faut maintenant tester ce filtre avant de l'indiquer à la prison.
Pour ce faire, on inscrit en premier le chemin du log qu'on veut filtrer et ensuite le chemin du filtre

#fail2ban-regex /var/log/mail.log /etc/fail2ban/filter.d/dynamicseed.conf

Donne :

Running tests
=============

Use regex file : /etc/fail2ban/filter.d/dynamicseed.conf
Use log file   : /var/log/mail.log


Results
=======

Failregex
|- Regular expressions:
|  [1] warning: <HOST>: hostname *.* verification failed
|  [2] NOQUEUE: reject: RCPT from unknown[[]<HOST>[]] *.* Relay access denied
|  [3] NOQUEUE: reject: RCPT from *.*[[]<HOST>[]] *.* Relay access denied
|  [4] connect from *.*dynamic*.*[[]<HOST>[]]
|  [5] disconnect from *.*dynamic*.*[[]<HOST>[]]
|
`- Number of matches:
   [1] 1 match(es)
   [2] 1 match(es)
   [3] 7 match(es)
   [4] 2 match(es)
   [5] 1 match(es)

Ignoreregex
|- Regular expressions:
|
`- Number of matches:

Summary
=======

Addresses found:
[1]
    66.11.228.136 (Thu Apr 22 10:18:43 2010)
[2]
    205.209.161.50 (Thu Apr 22 12:25:27 2010)
[3]
    123.204.200.199 (Wed Apr 21 03:38:08 2010)
    205.209.161.50 (Thu Apr 22 12:25:27 2010) (already matched)
    64.57.183.77 (Sat Apr 24 14:28:37 2010)
    64.57.183.77 (Sat Apr 24 14:28:37 2010)
    64.57.183.77 (Sat Apr 24 14:28:37 2010)
    64.57.183.77 (Sat Apr 24 14:28:38 2010)
    64.57.183.77 (Sat Apr 24 14:28:38 2010)
[4]
    123.204.200.199 (Wed Apr 21 03:38:07 2010)
    123.204.200.199 (Wed Apr 21 03:38:09 2010)
[5]
    123.204.200.199 (Wed Apr 21 03:38:09 2010) (already matched)

Date template hits:
764442 hit(s): Month Day Hour:Minute:Second
0 hit(s): Weekday Month Day Hour:Minute:Second Year
0 hit(s): Weekday Month Day Hour:Minute:Second
0 hit(s): Year/Month/Day Hour:Minute:Second
0 hit(s): Day/Month/Year Hour:Minute:Second
0 hit(s): Day/Month/Year:Hour:Minute:Second
0 hit(s): Year-Month-Day Hour:Minute:Second
0 hit(s): Day-Month-Year Hour:Minute:Second[.Millisecond]
0 hit(s): TAI64N
0 hit(s): Epoch
0 hit(s): ISO 8601

Success, the total number of match is 12

Ça marche !!! les adresses ont été trouvées

Maintenant, on va ajouter le filtre au fichier prison

#vi /etc/fail2ban/jail.conf

En ajoutant ça à la fin

[dynamicseed]

enabled = true
bantime = 3600000
filter = dynamicseed
action   = iptables[name=dynamicseed, port=smtp]
          sendmail-whois[name=dynamicseed, dest=xxxx@mondomaine.net]
logpath = /var/log/mail.log
maxretry = 1

Respectivement :

  • On active le filtre.
  • Pour une durée de 41 jours (en secondes).
  • Le nom du filtre, qui correspond au nom du fichier sans .conf. ! attention , ne pas utiliser de majuscules !
  • Les deux lignes action vont permettre d'indiquer le port et l'envoie d'un mail pour prévenir en cas d'activation de la prison.
  • Donner le chemin du fichier log à surveiller.
  • Et enfin, le nombre de fois au bout duquel on coffre le suspect.


Et pour finir on va, soit recharger les prisons :

#fail2ban-client reload

Soit redémarrer fail2ban :

#/etc/init.d/fail2ban restart


Et Vérifier qu'il n'y ait pas d'erreur… parfois je ne sais pourquoi, certaines prisons ne se lancent pas, et il est nécessaire de relancer à nouveau le démon.

#tail -f /var/log/fail2ban.log


«yapuka» attendre… jusqu'au jour ou on reçoit un mail

Objet 	[Fail2Ban] dynamicseed: banned 205.209.161.50
De 	Fail2Ban         À 	xxxx@mondomaine.net
Date 	Jeu 11:25

Hi,

The IP 205.209.161.50 has just been banned by Fail2Ban after
1 attempts against dynamicseed. […]


On peut alors aller voir les adresses bloquées

#iptables -L
Chain fail2ban-dynamicseed (1 references)
target     prot opt source               destination
DROP       all  --  205.209.161.50       anywhere
DROP       all  --  66-11-228-136.managemyvps.com  anywhere
DROP       all  --  123-204-200-199.adsl.dynamic.seed.net.tw  anywhere
RETURN     all  --  anywhere             anywhere


Voici une version modifiée de la prison, pour pouvoir bloquer les adresse IP sur plusieurs port à la fois

[dynamicseed]

enabled = true
bantime = 3600000
filter = dynamicseed
action = iptables-multiport[name=dynamicseed, port="smtp,ssmtp,imap2,imap3,imaps,pop3,pop3s"]
         sendmail-whois[name=dynamicseed, dest=xxxx@mondomaine.net]
logpath = /var/log/mail.log
maxretry = 1

- page 5 de 8 -