User Tools

Site Tools


formationsecurite:apache

20/04/05

Pré-requis

Slackware

Installer Slackware en sélectionnant le service httpd

Vérifier qu'il tourne: Soit avec Konqueror, soit avec lynx:

lynx http://127.0.0.1/

(Q pour sortir)

Désinstaller Apache:

removepkg apache-1.3.33-i486-1

Il faut qu'au démarrage, le serveur web ne soit pas lancé. On retire l'exécution du service:

chmod a-x /etc/rc.d/rc.httpd

Ubuntu

Vérifier qu'Apache n'est pas installé:

dpkg -l apache2
No packages found matching apache2.

Installer gcc et openssl:

sudo aptitude install gcc openssl libssl-dev

Installation

On va chercher les sources la version 2.0.54:

wget http://apache.belnet.be/httpd/httpd-2.0.54.tar.bz2

Notre gentil formateur a déjà récupéré les sources pour nous, nous allons donc les chercher sur sa machine:

scp salle3@10.10.3.100:/home/salle3/http* /root

Décompresser:

tar xjf httpd-2.0.54.tar.bz2

Compiler et installer:

cd httpd-2.0.54
./configure --enable-ssl
make && make install

Sous Slackware (enfin sous Ubuntu en faisant un chroot /mnt après avoir monté /dev/hda5 qui est la partition root sous Slackware), j'avais une erreur: endif dans server/exports.c ligne 127: j'ai dû commenter la ligne 115 (entourer de /* et */):

#end if

Configuration

cd /usr/local/apache2/conf
ls

httpd.conf est le fichier de configuration du serveur.

Listen 80

Ecoute sur le port 80 (le port 80 est le port pour HTTP).

DocumentRoot "/usr/local/apache2/htdocs"

C'est le répertoire root d'apache, là où il ira si je surfe sur http://localhost/

DirectoryIndex index.html index.html.var

Si on surfe sur un répertoir, il va chercher d'abord index.html. S'il existe, c'est cette page qu'il va servir. Sinon, il cherche index.html.var. Si cette page n'est pas, là, il affichera le contenu du répertoire si c'est permis.

Utilisation

Vérifier que la version qu'on a désinstallée ne tourne plus:

 ps ax | grep httpd

S'il y a un output, c'est qu'elle tourne encore.

La tuer:

killall /usr/sbin/httpd

(ça marche pas parce que /usr/sbin/httpd a été désinstallé)

kill -9 PID

où PID est le process id (le premier nombre de la ligne

netstat -a
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address           Foreign Address         State
tcp        0      0 localhost.localdoma:ipp *:*                     LISTEN
tcp        0      0 localhost.localdom:smtp *:*                     LISTEN
tcp        0      0 localhost.localdoma:ipp localhost.localdo:32771 ESTABLISHED
tcp        1      0 10.10.3.101:32806       213.248.112.109:www     CLOSE_WAIT
tcp        0      0 10.10.3.101:32831       www.hellea.be:5223      ESTABLISHED
tcp        0      0 localhost.localdo:32771 localhost.localdoma:ipp ESTABLISHED
tcp6       0      0 *:ssh                   *:*                     LISTEN
tcp6       0      0 ip6-localhost:smtp      *:*                     LISTEN
udp        0      0 *:bootpc                *:*
Active UNIX domain sockets (servers and established)
Proto RefCnt Flags       Type       State         I-Node Path
unix  2      [ ACC ]     STREAM     LISTENING     9814     private/verify
<snip>
netstat -na
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address           Foreign Address         State
tcp        0      0 127.0.0.1:631           0.0.0.0:*               LISTEN
tcp        0      0 127.0.0.1:25            0.0.0.0:*               LISTEN
tcp        0      0 127.0.0.1:631           127.0.0.1:32771         ESTABLISHED
tcp        1      0 10.10.3.101:32806       213.248.112.109:80      CLOSE_WAIT
tcp        0      0 10.10.3.101:32831       83.217.68.100:5223      ESTABLISHED
tcp        0      0 127.0.0.1:32771         127.0.0.1:631           ESTABLISHED
tcp6       0      0 :::22                   :::*                    LISTEN
tcp6       0      0 ::1:25                  :::*                    LISTEN
udp        0      0 0.0.0.0:68              0.0.0.0:*
Active UNIX domain sockets (servers and established)
Proto RefCnt Flags       Type       State         I-Node Path
unix  2      [ ACC ]     STREAM     LISTENING     9814     private/verify
<snip>

Ici, c'est un output sous ubuntulinux.

Quand on est certain qu'Apache ne tourne plus, on peut lancer celui qu'on a compilé:

/usr/local/bin/apachectl start

Exercice 1

Faire une page qui s'affiche quand on surfe sur http://127.0.01/

il suffit de sauver une page HTML comme /usr/local/apache2/htdocs/index.html

Directory

Pour mettre des permissions et des options sur des répertoires, on utilise la directive:

<Directory></Directory>

Si on ne définit pas ceci pour un répertoire, apache prend les paramètres du parents.

Error handling

On peut customiser les erreurs. Dans le fichier httpd.conf, vers la ligne 880, il y a un section avec des exemples, comme ceci:

ErrorDocument 404 /missing.html

Protection par mot de passe

Il faut rajouter dans le répertoire un fichier .htaccess. Exemple:

<Directory /var/www/iso>
                AllowOverride AuthConfig
                AuthType Basic
                AuthName "Restricted Files"
                AuthUserFile /usr/local/apache2/passwd/passwords
                Require user toto
</Directory>

Exercice 2

Créer un répertoire protégé.

Je crée un répertoire http://localhost/secret/ accessible uniquement par l'utilisateur joe.

./htpasswd -b -c /usr/share/htpasswd joe toto

Dans /usr/local/apache2/conf/httpd.conf, rajouter la section:

<Directory /usr/local/apache2/htdocs/secret>
                AllowOverride AuthConfig
                AuthType Basic
                AuthName "Uniquement pour Joe"
                AuthUserFile /usr/share/htpasswd
                Require user joe
</Directory>

Ensuite, tester la configuration:

root@forma301:/usr/local/apache2/bin # ./apachectl configtest
Syntax OK

Regarder la configuration:

root@forma301:/usr/local/apache2/bin # ./apachectl restart

Tester dans un browser en allant sur http://localhost/secret/

Il doit il avoir une demande d'identification.

Autre façon de faire: Dans /usr/local/apache2/htdocs/secret/, ajouter un fichier .htaccess:

AuthUserFile /usr/share/htpasswd
AuthName "Uniquement pour les utilisateurs autorises"
AuthType Basic
<Limit GET POST>
require valid-user
</Limit>

Ensuite, dans /usr/local/apache2/conf/httpd.conf, rajouter la section:

<Directory /usr/local/apache2/htdocs/secret>
                AllowOverride AuthConfig
</Directory>

21/04/05

Revision

Installer apache

  • télécharger tar.gz
  • décompresse
  • configure
  • make
  • make install

Configuration

Dans /usr/loca/apache2/httpd.conf

Section global environment

  • port
  • IP
  • nombre de connexions simultanées

Section main server configuration

  • document root
  • blocs directory: permissions et options de sous-répertoires de la racine (document root)

Limitation d'acces

Avec les fichiers .htaccess et htpasswd.

On peut spécifier un fichier comprenant les utilisateurs et les mots de passe encryptés permettant l'accès.

Pour créer un fichier avec un user et un mot de passe:

htpasswd -c /path/to/htpasswd username

ou

htpasswd -b -c /path/to/htpasswd username password

N.B: ne pas mettre le fichier htpasswd dans l'arborescence de la racine du serveur (sinon on pourrait y accéder en surfant).

La section définissant l'accès (l'authentification) peut se trouver soit dans le fichier httpd.conf, soit dans un fichier .htaccess qui est dans le répertoire dont on veut restreindre l'accès.


Configuration (suite)

Permissions

Order Allow,Deny
Allow All

Tout le monde peut accéder au site

Order Deny,Allow
Deny 123.123.123.123

Le serveur ne répond pas aux requêtes provenant de l'IP 123.123.123.123, il répond à toutes les autres.

Virtual Hosts

Hôtes virtuels:

Deux façons de faire:

  • plusieurs IPs pour la même machine (une IP par nom de domaine)
  • plusieurs noms de domaines pour une même IP

Par IP

<VirtualHost 10.101.10.221:80>
    ServerAdmin webmaster@dummy-host.example.com
    DocumentRoot /www/docs/dummy-host.example.com
    ServerName dummy-host.example.com
    ErrorLog logs/dummy-host.example.com-error_log
    CustomLog logs/dummy-host.example.com-access_log common
</VirtualHost>

Pour les autres, il suffit de changer l'IP et de mettre un autre ServerName.

N.B: Il faut avoir configuré les IP au niveau réseau.

Par nom

cf. exercice 3.

Exercice 3

Faire en sorte qu'Apache réponde à 2 sites web avec les URLs http://carl.salle3.be/ et à http://carl.toto.be/

N.B: on précise l'IP correspondant au nom de machine dans /etc/hosts.

Au niveau Apache:

  • dans le fichier /usr/local/apache2/conf/httpd.conf, ajouter:
NameVirtualHost *:80
<VirtualHost *:80>
    ServerAdmin carl@zongo.be
    DocumentRoot /usr/local/apache2/htdocs/site1/
    ServerName carl.salle3.be
    ErrorLog logs/carl.salle3.be-error_log
    CustomLog logs/carl.salle3.be-access_log common
</VirtualHost>
<VirtualHost *:80>
    ServerAdmin carl@zongo.be
    DocumentRoot /usr/local/apache2/htdocs/site2/
    ServerName carl.toto.be
    ErrorLog logs/carl.toto.be-error_log
    CustomLog logs/carl.toto.be-access_log common
</VirtualHost>
  • créer les répertoire et les fichiers index.html dans chacun des répertoires:
mkdir /usr/local/apache2/htdocs/site1
mkdir /usr/local/apache2/htdocs/site2
vi /usr/local/apache2/htdocs/site1/index.html
vi /usr/local/apache2/htdocs/site2/index.html
  • redémarrer le serveur pour prendre la nouvelle configuration en compte:
/usr/local/apache2/bin/apachectl restart

Au niveau résolution de nom, dans le fichier /etc/hosts, ajouter:

127.0.0.1       carl.salle3.be
127.0.0.1       carl.toto.be

Exercice 3bis

Ajouter une IP à sa carte réseau et mettre un 3e site:

  • monter une IP virtuelle (2e IP pour eth0)
ifconfig eth0:0 10.10.3.201
  • ajouter dans /etc/hosts:
10.10.3.201     carl.site.com
  • ajouter la section dans httpd.conf:
<VirtualHost 10.10.3.201:80>
    ServerAdmin carl@zongo.be
    DocumentRoot /usr/local/apache2/htdocs/site3/
    ServerName carl.site.com
    ErrorLog logs/carl.site.com-error_log
    CustomLog logs/carl.site.com-access_log common
</VirtualHost>
  • redémarre le serveur web:
/usr/local/apache2/bin/apachectl restart

Pour écouter sur 2 ports:

Listen 80
Listen 8888
...
NameVirtualHost *:80
NameVirtualHost *:8888

<VirtualHost 10.10.3.201:80>
    ServerAdmin carl@zongo.be
    DocumentRoot /usr/local/apache2/htdocs/site3/
    ServerName carl.site.com
    ErrorLog logs/carl.site.com-error_log
    CustomLog logs/carl.site.com-access_log common
</VirtualHost>
<VirtualHost 10.10.3.201:8888>
    ServerAdmin carl@zongo.be
    DocumentRoot /usr/local/apache2/htdocs/site4/
    ServerName carl.site2.com
    ErrorLog logs/carl.site2.com-error_log
    CustomLog logs/carl.site2.com-access_log common
</VirtualHost>

SSL

Secure socket layer. Les requêtes HTTPS sont encryptées.

  • installer openssl
  • compiler apache avec l'option ssl
  • création du certificat pour le serveur web
    • créer une autorité de certification (le serveur de certificats)
    • créer une requête de certificat (csr) à l'aide d'une clef privée (key)
    • envoyer la requête de certificat
    • le serveur de certificats signe la requête (crt)
    • rapatrier le certificat
    • installer le certificat

Quand on surfe sur un site sécurisé par SSL (avec le protocole

  • Connexion: qui es-tu? + clef publique
  • le serveur web envoie le certificat (crt) + clef publique
  • le browser génère une clef symétrique avec le CRT
  • la connexion est établie avec la clef symétrique le temps de la session

L'utilisation de clefs privées et publiques prend 1000 fois plus de ressources processeur que l'utilisation d'une clef symétrique.

Creation d'un certificat (serveur)

Pays et adresse email obligatoire.

On doit d'abord générer un certificat X509. On fait cela à l'aide de la commande openssl:

openssl req -nodes -new -x509 -keyout fichier.key -out fichier.crt
  • où fichier.key est la clef privée (qui est générée par la commande)
  • et fichier.crt est le certificat qu'on veut générer.
  • Les 2 sont sauvés dans le répertoire courant.

Ceci crée un certificat auto-signé. C'est le certificat du serveur de clefs.

Exemple:

carl@forma301:~/ssl$ openssl req -nodes -new -x509 -keyout ssl_carl.key -out ssl_carl.crt
Generating a 1024 bit RSA private key
..............................++++++
................................................................................++++++
writing new private key to 'ssl_carl.key'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:BE
State or Province Name (full name) [Some-State]:Hainaut
Locality Name (eg, city) []:Gosselies
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Technofutur3
Organizational Unit Name (eg, section) []:formation sécurité
Common Name (eg, YOUR name) []:Carl Devos
Email Address []:carl@gmail.com
carl@forma301:~/ssl$ ls -l
total 8
-rw-r--r--  1 carl carl 1363 2005-04-21 13:48 ssl_carl.crt
-rw-r--r--  1 carl carl   887 2005-04-21 13:48 ssl_carl.key

Ceci pour l'entité (= test CA root dans IIS qu'on a généré chez Thawte)

Creation d'une requête de certificat (client)

Ensuite, on génère une demande de certificat (sur le client, ici la même machine).

cf. Wizard demande de certificat dans Windows 2000.

openssl req -nodes -new -keyout site.wow.be.key -out site.wow.be.csr

csr = certificate request Ici, il faut absolument le common name. Mettre comme common name le nom de la machine (www.toto.com) pour éviter d'avoir ceci dans les logs: /usr/local/apache2/logs/carl.salle3.be-error_log

[Thu Apr 21 15:54:32 2005] [warn] RSA server certificate CommonName (CN) `Carl Devos' does NOT match server name!?

La commande génère deux fichiers: la clef (.key) et la requête de certificat (.csr).

Si on veut se faire certifier par un organisme tiers, seule cette commande suffit.

Exemple:

carl@forma301:~/ssl$ openssl req -nodes -new -keyout carl.salle3.be.key -out carl.salle3.be.csr
Generating a 1024 bit RSA private key
......................................++++++
.++++++
writing new private key to 'carl.salle3.be.key'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:BE
State or Province Name (full name) [Some-State]:Hainaut
Locality Name (eg, city) []:Gosselies
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Technofutur3
Organizational Unit Name (eg, section) []:Sécurité
Common Name (eg, YOUR name) []:Carl Devos
Email Address []:carl@gmail.com

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:toto
An optional company name []:Technofutur3

Signature de la requête (client) par le serveur

Finalement, on signe la requête pour qu'elle soit valide.

Par défaut, il utilise le fichier de configuration /et/ssl/openssl.cnf Ce fichier exige au préalable de faire les commandes suivantes:

mkdir demoCA
cd demoCA
touch index.txt
mkdir newcerts
echo "01" > serial
openssl ca -cert CA.wow.be.crt -keyfile CA.wow.be.key -out site.wow.be.crt -in site.wow.be.csr
  • où CA.wow.be.crt est le certificat du serveur,
  • CA.wow.be.key est la clef privée du serveur,
  • site.wow.be.crt est le certificat du client (site web)
  • et site.wow.be.csr est la requête pour le client (site web)

Exemple:

carl@forma301:~/ssl$ openssl ca -cert ssl_carl.crt -keyfile ssl_carl.key -out carl.salle3.be.crt -in carl.salle3.be.csr
Using configuration from /usr/lib/ssl/openssl.cnf
Check that the request matches the signature
Signature ok
Certificate Details:
        Serial Number: 1 (0x1)
        Validity
            Not Before: Apr 21 12:37:54 2005 GMT
            Not After : Apr 21 12:37:54 2006 GMT
        Subject:
            countryName               = BE
            stateOrProvinceName       = Hainaut
            organizationName          = Technofutur3
            organizationalUnitName    = S\C3\A9curit\C3\A9
            commonName                = Carl Devos
            emailAddress              = carl@gmail.com
        X509v3 extensions:
            X509v3 Basic Constraints:
                CA:FALSE
            Netscape Comment:
                OpenSSL Generated Certificate
            X509v3 Subject Key Identifier:
                5B:C2:6F:92:DA:F3:F4:B4:4E:23:1C:50:25:88:4E:37:81:51:69:7E
            X509v3 Authority Key Identifier:
                keyid:53:BA:DC:05:5E:C9:FF:79:D1:F1:A5:E2:F3:58:45:35:BA:EF:FB:E8
                DirName:/C=BE/ST=Hainaut/L=Gosselies/O=Technofutur3/OU=formation s\xC3\xA9curit\xC3\xA9/CN=Carl Devos/emailAddress=carl;@zongo.be
                serial:99:0D:48:56:F7:89:C8:22

Certificate is to be certified until Apr 21 12:37:54 2006 GMT (365 days)
Sign the certificate? [y/n]:y


1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
Data Base Updated

Configuration de SSL dans Apache

Modifier httpd.conf.

Ajouter sous

Listen 80

la ligne

Listen 443

Vérifier qu'à la fin de la section 2, il y a bien ceci:

<IfModule mod_ssl.c>
    Include conf/ssl.conf
</IfModule>

Et ajouter les lignes pour avoir:

<IfModule mod_ssl.c>
    Include conf/ssl.conf
    SSLPassPhraseDialog builtin
    SSLSessionCAche dbm:/tmp/session.cache
    SSLSessionCacheTimeout 300
</IfModule>

Ajouter l'hôte virtuel:

<VirtualHost *:443>
    ServerAdmin carl@zongo.be
    DocumentRoot /usr/local/apache2/htdocs/site1/
    ServerName carl.salle3.be
    ErrorLog logs/carl.salle3.be-error_log
    CustomLog logs/carl.salle3.be-access_log common
    <IfModule mod_ssl.c>
        SSLEngine on
        SSLCertificateFile /home/carl/ssl/carl.salle3.be.crt
        SSLCertificateKeyFile /home/carl/ssl/carl.salle3.be.key
    </IfModule>
</VirtualHost>

Principe de fonctionnement

  • le client se connecte au serveur
  • le site web renvoie son certificat
  • le client accepte le certificat
  • le serveur renvoie la page web
  • le client affiche la page web

22/04/05

PHP

Sous Ubuntu, il faut installer les packages suivants:

sudo aptitude install flex libxml2-dev mysql-server libmysqlclient12-dev

cf. PHP5 from source

  • télécharger PHP 5.0.4
wget ftp://ftp.belnet.be/packages/php/distributions/php-5.0.4.tar.bz2
  • décompresser
tar xjf php-5.0.4.tar.bz2
  • arrêter le serveur web
/usr/local/apache2/bin/apachectl stop
  • installer
cd php-5.0.4/
./configure --with-apxs2=/usr/local/apache2/bin/apxs --with-mysql
make
make install

Dans le fichier de configuration apache /usr/local/apache2/conf/httpd.conf que la ligne suivante a été ajoutée:

LoadModule php5_module        modules/libphp5.so

Ajouter la ligne:

AddType application/x-httpd-php .php .phtml

Apache va maintenant parser la page avec le parser PHP.

Changer la ligne:

DirectoryIndex index.cgi index.html index.html.var

en:

DirectoryIndex index.php index.cgi index.html index.html.var

Démarrer apache:

/usr/local/apache2/bin/apachectl start

Créer un fichier test.php

<?php
phpinfo()
?>

Le sauver dans la racine RootDocument: /usr/local/apache2/htdocs/

Surfer sur http://localhost/test.php

Installer un forum

Télécharger phpBB http://www.phpbb.com/downloads.php

wget http://belnet.dl.sourceforge.net/sourceforge/phpbb/phpBB-2.0.14.tar.bz2

Décompresser:

tar xjf phpBB-2.0.14.tar.bz2

copier dans l'arborescence DocumentRoot

Créer la base de données:

mysql
mysql> create database phpbb;

Se rendre sur le site: http://carl.salle3.be/phpBB2/

Remplir les champs (database login: root, password à blanc).

Télécharger le fichier config.php (en cliquant sur le bouton).

Copier le fichier dans le répertoire phpBB:

cp config.php /usr/local/apache2/htdocs/phpBB/

Déplacer les répertoire install et contrib:

mv /usr/local/apache2/htdocs/phpBB/install /tmp/
mv /usr/local/apache2/htdocs/phpBB/contrib /tmp/

Surfer sur le site: http://carl.salle3.be/phpBB2/

  • S'identifier comme administrateur.
  • Cliquer sur le lien “Go to Administration Panel” en bas au milieu.
  • Configurer
  • Utiliser

Documentation

formationsecurite/apache.txt · Last modified: 2013/01/30 17:52 (external edit)