Table of Contents
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
- pointer le browser sur http://10.10.3.201 ou http://carl.site.com/
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