Installation et configuration d'Apache 2

From Deimos.fr / Bloc Notes Informatique
Jump to: navigation, search

1 Introduction

Apache est l'un des serveurs web les plus utilisés au monde pour ne pas dire LE plus utilisé au monde.

2 Installation

Pour l'installer :

apt-get install apache2

3 Configuration

3.1 Choisir un Charset par défaut

Dans la configuration /etc/apache2/apache2.conf ou /etc/apache2/conf.d/charset, insérez ceci :

AddDefaultCharset          .latin9

Puis reloadez apache :

/etc/init.d/apache2 reload

3.2 Authentifications

3.2.1 LDAP

Pour avoir une authentification de type LDAP, il va falloir installer ceci :

Command apt-get
apt-get install libapache-authznetldap-perl

Puis activer le module et enfin redémarrer le serveur :

Command a2enmod
a2enmod authnz_ldap
/etc/init.d/apache2 restart

Maintenant, pour la partie config, je vais prendre l'exemple de Nagios3 dans lequel il va falloir toucher à la partie "DirectoryMatch" comme ceci :

Configuration File /etc/apache2/conf.d/nagios3
<DirectoryMatch (/usr/share/nagios3/htdocs|/usr/lib/cgi-bin/nagios3)>
    Options FollowSymLinks
 
    DirectoryIndex index.html
 
    AllowOverride AuthConfig
    Order Allow,Deny
    Allow From All
 
    AuthName "Nagios Access"
    AuthType Basic
    #AuthUserFile /etc/nagios3/htpasswd.users
    # nagios 1.x:
    #AuthUserFile /etc/nagios/htpasswd.users
    #require valid-user
 
    # auth from ldap
    AuthzLDAPAuthoritative on
    AuthBasicProvider ldap
    AuthLDAPURL ldap://ldap/dc=openldap,dc=mycompany,dc=lan?uid?sub?(objectClass=posixAccount)
    AuthLDAPRemoteUserIsDN off 
    AuthLDAPGroupAttribute memberUid
    AuthLDAPGroupAttributeIsDN off 
    Require ldap-group cn=prod,ou=Groupes,dc=openldap,dc=mycompany,dc=local
    Require ldap-group cn=sysnet,ou=Groupes,dc=openldap,dc=mycompany,dc=local
    Require ldap-user nagiosadmin
</DirectoryMatch>

Ici, j'ai 2 groupes (sysnet et prod) qui sont autoriser à se connecter.

3.3 Ne pas authentifier les machines venant d'une certaine IP

J'ai besoin pour des écrans de monitoring de ne pas avoir besoin d'authentification pour Nagios et en même temps garder l'authentififaction LDAP pour les autres personnes. En reprenant l'exemple ci dessus, voici les lignes à modifier :

Configuration File /etc/apache2/conf.d/nagios3
    AllowOverride AuthConfig
    Require valid-user
    Order Deny,Allow
    Allow From 10.100.10.0/24
    Satisfy Any

De la sorte, les IP venant du subnet 10.100.10.0/24 n'ont pas besoin de s'authentifier tandis que les autres si. Pour ensuite décider de valider une solution ou l'autre, j'utilise la directive Satisfy Any. On peut mettre 'Satisfy All' si l'on souhaite que toutes les conditions soient validées.

3.4 Faire des redirections

Si par exemple vous voulez protéger un dossier bien particulier, vous avez 2 méthodes :

  • L'interdiction complète
  • La redirection

PS : Je ne parlerais pas ici des cas particuliers tel que les htaccess, voir cette documentation.

Pour interdire un accès,

<Directory /mon/dossier/a/interdire>
        Order allow,deny
        Deny from all
</Directory>

Ensuite si vous souhaitez faire une redirection, insérez ceci dans votre "Directory" :

RedirectMatch ^/$ http://mysecureshell.sourceforge.net

Ceci redirigera sur le site de MySecureShell :-). Sinon si vous souhaitez rediriger dans un dossier local :

RedirectMatch ^/$ /mon_dossier/

Il existe également le fin du fin (ceux qui ont dit plantafin prennent la porte !) :

Redirect /mondossier http://mysecureshell.sourceforge.net

ou encore :

RedirectMatch ^(.*)$ https://www.deimos.fr$1

Ce qui me donne :

<VirtualHost *:80>
        ServerName www.deimos.fr
        ServerAlias deimos.fr www.deimos.fr
        RedirectMatch ^(.*)$ https://www.deimos.fr$1
</VirtualHost>

3.4.1 Redirecteur HTML

Voici une solution très simple pour faire un redirecteur. Il sagit de placer un fichier index.html dans le dossier voulu avec ce contenu :

<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="content-type" content="text/html; charset=ISO-8859-1" />
<meta http-equiv="refresh" content="0; url=http://www.google.com" />
<title>www.deimos.fr</title>
<meta name="robots" content="noindex,follow" />
</head>
 
<body>
<p><a href="http://www.google.com">Please wait while redirecting...</a></p>
</body>
</html>

3.4.2 VirtualHost

Dans le cas où nous avons un apache en frontale et que nous souhaitons rediriger des flux sur d'autres apache en dorsale, il faut activer le mod_proxy. Voici un exemple :

ProxyRequests Off
NameVirtualHost 1.2.3.4 # IP de ta box
 
<VirtualHost 1.2.3.4> # Website géré par l'Apache
   ServerName www.domain.tld
   DocumentRoot /var/www/htdocs/ # etc...
</VirtualHost>
 
<VirtualHost 1.2.3.4>
   ServerName www.domain2.tld
   ErrorLog blabla
   CustomLog blabla
   ProxyPassReverse /
   http://127.0.0.1:8002/
</VirtualHost>
 
<VirtualHost 1.2.3.4>
   ServerName www.domain3.tld
   ErrorLog blabla
   CustomLog blabla
   ProxyPassReverse /
   http://127.0.0.1:8003/
</VirtualHost>

Ici, en fonction de l'url que le client aura tapée, il y aura des redirections automatiques sur d'autres serveurs.

3.5 Redirection avec réécriture de l'URL

Voici un exemple de réécriture d'URL. Ici, cela permet de rediriger cvsweb.mydomain.com automatiquement vers la bonne URL et réécrire en plus l'url au propre. C'est à dire que je suis passé de :

à

Voici donc la solution, dans un premier temps, nous allons charger le module :

a2enmod rewrite

Ensuite on va écrire ceci dans notre fichier de configuration (/etc/apache2/sites-enabled/000-default) :

<VirtualHost cvsweb.mydomain.com:80>
        ServerName http://cvsweb.mydomain.com
        ServerAlias cvsweb
        ServerAdmin it-system@mydomain.com
        DocumentRoot /var/www/
        ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
        LogLevel warn
        ServerSignature On
        RedirectMatch ^/$ /cgi-bin/cvsweb/
 
        ### Rewrite http://cvsweb as http://cvsweb.mydomain.com
        RewriteEngine On
        RewriteCond %{HTTP_HOST} ^cvsweb$
        RewriteRule ^(.*)$ http://cvsweb.mydomain.com/$1 [R=301,L]
</VirtualHost>

Puis on force apache à recharger tout ça :

/etc/init.d/apache2 force-reload

3.5.1 Interdire l'accès à son site via Internet Explorer

Il est possible d'interdire l'accès à tout un tas de navigateur. Si comme moi, vous n'êtes pas copain copain avec IE qui vous flingue vos PNG en version 6, qui ne respecte pas les normes, qui flingue les CSS, etc... il peut être pratique de le bloquer et d'indiquer gentillement à l'internaute en question d'aller télécharger au plus vite Firefox.

Pour cela, nous allons utiliser le mode rewrite. Il faut donc l'activer comme décrit plus haut. Puis on ajoute dans le dossier voulu (Directory donc tout le site par exemple) ces lignes dans sites-enabled/000-default :

<Directory />
   ...
   AllowOverride FileInfo
   <IfModule mod_rewrite.c>
      RewriteEngine on
      RewriteCond %{HTTP_USER_AGENT} .*MSIE.*
      # opera se fait passer pour IE des fois
      RewriteCond %{HTTP_USER_AGENT} !.*Opera.*
      # on evite une boucle infinie dans les conditions
      RewriteCond %{REQUEST_FILENAME} !.*ie.html
      # on redirige vers une page expliquant les raisons du rejet
      RewriteRule .* /ie.html  [L]
   </IfModule>
</Directory>

Il ne reste plus qu'a créer le fichier ie.html et mettre son jolie texte dedans (vous pouvez également faire un simple fichier texte). Voici ce que j'utilise (/var/www/ie.html) :

Configuration File ie.html
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
        <title>Accès Interdit avec Internet Explorer</title>
</head>
<body>
 
Cher Internaute,<br>
<br>
Ce site n'est pas autorisé en accès par Internet Explorer que tu utilises.<br>
Tu dois maintenant être en mesure de comprendre que les temps changent.<br>
<br>
Tu es actuellement en train d'utiliser un navigateur (Internet Explorer) qui ne respecte<br>
pas les <a href="http://www.w3.org">normes</a> et qui détient le monopole, de part son omni présence obligatoire dans ton<br>
cher OS (Windows). Cela dit, tu es peut être au travail et n'a pas le choix de ton OS.<br>
<br>
Cependant, Internet Explorer ne doit plus être utilisé alors qu'il existe tout un tas<br>
d'autres navigateurs Internet libres, gratuit et respectant les normes !<br>
Mais puisque tu n'as pas l'air d'être au courant, ce n'est pas grave, laisse moi t'aider.<br>
<br>
Pour commencer, tu peux télécharger un navigateur propre tel que <a href="http://www.mozilla.org">Firefox</a>.<br>
Ceci t'aiderais déjà à rentrer dans le droit chemin et te permettra en plus d'accéder à<br>
mon site.<br>
<br>
Toujours dans ta nouvelle quête du côté clair de la force, il faudrait que tu passes sur<br>
un OS libre et gratuit (<a href="http://www.ubuntu.com">Ubuntu</a> par exemple) qui t'épanouira j'en suis sûr.<br>
<br>
Je t'invites donc à te prendre en main le plus rapidement possible.<br>
<br>
Cordialement,<br>
Pierre (alias Deimos)
</body>
</html>

3.6 Dossiers Publics

Les dossiers publics servent à avoir plusieurs clients sur un serveur dont chacun a son propre espace personnel. La pratique est assez simple, nous avons par exemple l'utilisateur toto qui un un dossier "public_html" dans son home, et son serveur web est accessible via "http://serveur/~toto". J'ai effectué ceci sous OpenBSD avec apache 1.3, normalement pour la version 2, c'est la même syntaxe. Voici donc la configuration a rajouter :

UserDir public_html

<Directory /home/clients/*/public_html>
   AllowOverride FileInfo AuthConfig Limit
   Options MultiViews Indexes SymLinksIfOwnerMatch IncludesNoExec

   # Look
   HeaderName /header.htm

   <Limit GET POST OPTIONS PROPFIND>
       Order allow,deny
       Allow from all
   </Limit>
   <Limit PUT DELETE PATCH PROPPATCH MKCOL COPY MOVE LOCK UNLOCK>
       Order deny,allow
       Deny from all
   </Limit>
</Directory>

Vous pouvez également voir que j'ai changer le header (en tête) de mes pages principales avec l'option "HeaderName". Ce fichier header.htm doit être situé dans le dossier "DocumentRoot" quand il est appellé par "/".

Voici un exemple avec un mix d'authentification BSD + restriction par IP :

UserDir download
 
AuthBSDGroup auth 
 
<Directory "/home/clients/*/download">
    AllowOverride FileInfo AuthConfig Limit
    Options MultiViews Indexes SymLinksIfOwnerMatch IncludesNoExec
 
    ### IP security for client connections ###
    Order deny,allow
    Deny from all
    Allow from 192.168.0.0/24
    #################
 
    # Look
    HeaderName /header.htm
 
    # Mod Auth BSD
    SSLRequireSSL
    AuthType Basic
    AuthName "Client Authentication"
    AuthBSD On
    AuthBSDKeepPass Off
    AuthBSDStrictRequire On
    <Limit GET POST OPTIONS PROPFIND PUT DELETE PATCH PROPPATCH MKCOL COPY MOVE LOCK UNLOCK>
        Require valid-user
    </Limit>
</Directory>

3.7 Modifier le header et footer

3.7.1 Standard

Si vous souhaitez changer le haut et le bas de vos pages de navigation (celles qui permettent de parcourir des fichiers et dossiers), il est possible d'utiliser ceci :

   HeaderName /.header.htm
   ReadmeName /.footer.htm

Il suffit de créer les fichiers .header.htm et .footer.htm et de mettre ce que vous voulez dedans :-)

3.7.2 Evolué

Il peut arriver que vous vouliez rendre la chose un petit peu plus interractive que du simple html. Mais vous allez vous heurter à un problème de taille puisqu'il n'arrivera tout simplement pas à interpréter votre code. Pour mon cas, j'ai voulu le faire en php et je vous livre donc la solution. Il faut que dans votre Directory, là ou vous avez déjà vos lignes contenant le HeaderName et le ReadmeName, vous insériez ces lignes :

   # In order for the PHP file to execute in a header, need to have a major type of text
   AddType text/html .php
   AddHandler application/x-httpd-php .php
   Options -Indexes
 
   HeaderName /.header.htm
   ReadmeName /.footer.php

Et là par exemple, j'ai bien mon footer en php :-). Je vous laisse suivre les explications sur le site d'Apache. Vous pouvez également faire du cgi etc...

3.8 Activer la compression PHP

La compression PHP5 va nous faire gagner de précieuses secondes sur l'affichage d'une page. Pour l'activer, éditez le fichier suivant et passez le paramètre en "on" :

Configuration File /etc/php5/cli/php.ini
; Transparent output compression using the zlib library
; Valid values for this option are 'off', 'on', or a specific buffer size
; to be used for compression (default is 4KB)
; Note: Resulting chunk size may vary due to nature of compression. PHP
;   outputs chunks that are few hundreds bytes each as a result of
;   compression. If you prefer a larger chunk size for better
;   performance, enable output_buffering in addition.
; Note: You need to use zlib.output_handler instead of the standard
;   output_handler, or otherwise the output will be corrupted.
; http://php.net/zlib.output-compression
zlib.output_compression = on

Redémarrez ensuite votre serveur web pour que la configuration soit appliquée.

4 Ressources

Documentation Apache sur OpenBSD
Documentation on reducing Apache's load with lighttpd
http://wiki.gcu.info/doku.php?id=unix:apache_mod_rewrite&s=internet%20explorer
The Useful Uses Of Mod Rewrite
How To Specify A Custom php ini For A Web Site (Apache2 With mod php)