[Présentation | Installation de MySQL ( Installation, chrooter MySQL, configuration ) | Installation d'Apache ( Installation , chrooter Apache , configuration )  |  Installation de PHP ( installation avec les sources , chrooter PHP , configuration ) |  Lancement automatique ( lancement de MySQL , lancement d'Apache ) | Installation d'un blog wordpress en local | Installation d'une photothèque basée sur piwigo ||  Rendre votre site accessible d'internet ]

Dernière modification 1er mars 2013

Apache 2.4.3 + PHP5.4.11 + MySQL 5.5.29 dans un environnement sécurisé chroot

(Ce guide peut être téléchargé dans la section téléchargement)

Configuration réseau


Présentation

Cette page présente l'installation et la configuration d'Apache 2.4.3 avec PHP5.4.11 et MySQL 5.5.29 dans un environnement sécurisé à base de chroot.
Chroot permet d'isoler l'exécution d'un programme dans un espace circonscrit et limité (souvent appelé jail ou prison). C'est à dire que si un hacker arrive à profiter d'un faille dans le programme, il restera limité à une arborescence restreinte avec un nombre très limité de commandes.

Vous devez récupérer préalablement les sources d' Apache à l'URL httpd.apache.org on récupère ensuite PHP à l'URL www.php.net  et enfin MySQL à l'URL www.mysql.com.

 
[retour haut de la page]

Installation de MySQL

Installation de MySQL avec les sources

Dans le répertoire de travail, on décompresse l'archive:

tar xvfz mysql-5.5.29.tar.gz

Cela crée le répertoire mysql-5.5.29, sur ma Mandriva j'ai du installer le package libncurses-devel. Dans le répertoire de MySQL, on tape alors:

cmake .  -DMYSQL_UNIX_ADDR=/chroot/mysql/tmp/mysql.sock   -DCMAKE_INSTALL_PREFIX=/usr/local/mysql                                 

Puis

make

La compilation est relativement longue même sur une machine puissante. On tape maintenant en temps que root:

make install

Les exécutables sont installés par défaut sous /usr/local/bin et le serveur mysqld sous /usr/local/libexec. Installez maintenant la base de donnée en tapant :

./mysql-5.5.29/scripts/mysql_install_db

Voilà le résultat obtenu

Installing MySQL system tables...                                                                  
OK                                                                                                 
Filling help tables...                                                                             
OK                                                                                                 

To start mysqld at boot time you have to copy
support-files/mysql.server to the right place for your system

PLEASE REMEMBER TO SET A PASSWORD FOR THE MySQL root USER !
To do so, start the server, then issue the following commands:

/usr/local/mysql/bin/mysqladmin -u root password 'new-password'
/usr/local/mysql/bin/mysqladmin -u root -h power.kervao.fr password 'new-password'

Alternatively you can run:
/usr/local/mysql/bin/mysql_secure_installation
mkdir -p /chroot/mysql/usr/local/mysql/data

which will also give you the option of removing the test
databases and anonymous user created by default.  This is
strongly recommended for production servers.

See the manual for more instructions.

You can start the MySQL daemon with:
cd /usr/local/mysql ; /usr/local/mysql/bin/mysqld_safe &

You can test the MySQL daemon with mysql-test-run.pl
cd /usr/local/mysql/mysql-test ; perl mysql-test-run.pl

Please report any problems with the /usr/local/mysql/bin/mysqlbug script!

Si ce n'est pas déjà fait créer le groupe mysql

groupadd mysql

Puis l'utilisateur mysql du groupe mysql

useradd mysql -c "MySQL Server" -d /dev/null -g mysql -s /sbin/nologin

Les bases se trouvent par défaut sous /usr/local/mysql/data, mysql doit en être propriétaire

chown -R mysql:mysql /usr/local/mysql/data

On installe maintenant le fichier de configuration

cp support-files/my-medium.cnf /etc/my.cnf

on donne les droits qui vont bien

chown root:sys /etc/my.cnf
chmod 644 /etc/my.cnf

[retour haut de la page]

Chrooter MySQL

On doit créer préalablement les répertoires suivants :

mkdir -p /chroot/mysql/dev
mkdir -p /chroot/mysql/etc
mkdir -p /chroot/mysql/tmp
mkdir -p /chroot/mysql/usr
mkdir -p /chroot/mysql/usr/lib64
mkdir -p /chroot/mysql/lib64
mkdir -p /chroot/mysql/var/tmp
mkdir -p /chroot/mysql/usr/local/mysql/bin
mkdir -p /chroot/mysql/usr/local/mysql/data
mkdir -p /chroot/mysql/usr/local/mysql/var
mkdir -p /chroot/mysql/usr/local/mysql/share/english
mkdir -p /chroot/mysql/usr/local/mysql/share/french

on copie ensuite les fichiers nécessaires au fonctionnement du serveur mysqld

cp /usr/local/mysql/bin/mysqld /chroot/mysql/usr/local/mysql/bin
cp /usr/local/mysql/share/english/errmsg.sys /chroot/mysql/usr/local/mysql/share/english/
cp /usr/local/mysql/share/french/errmsg.sys /chroot/mysql/usr/local/mysql/share/french/
cp -Rf /usr/local/mysql/share/charsets /chroot/mysql/usr/local/mysql/share
cp /etc/hosts /chroot/mysql/etc/
cp /etc/host.conf /chroot/mysql/etc/
cp /etc/resolv.conf /chroot/mysql/etc/
cp /etc/group /chroot/mysql/etc/
cp /etc/passwd /chroot/mysql/etc/
cp /etc/my.cnf /chroot/mysql/etc/

dans les fichiers /chroot/mysql/etc/passwd et /chroot/mysql/etc/group on veillera à laisser seulement l'utilisateur et le group mysql

maintenant on vérifie la dépendance du daemon mysqld en tapant

ldd /usr/local/mysql/bin/mysqld

voilà le résultat

        linux-vdso.so.1 =>  (0x00007fff2afc0000)
        libpthread.so.0 => /lib64/libpthread.so.0 (0x00007fede825e000)
        libz.so.1 => /usr/lib64/libz.so.1 (0x00007fede8049000)
        librt.so.1 => /lib64/librt.so.1 (0x00007fede7e41000)
        libcrypt.so.1 => /lib64/libcrypt.so.1 (0x00007fede7bf3000)
        libdl.so.2 => /lib64/libdl.so.2 (0x00007fede79ef000)
        libstdc++.so.6 => /usr/lib64/libstdc++.so.6 (0x00007fede76e2000)
        libm.so.6 => /lib64/libm.so.6 (0x00007fede7460000)
        libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x00007fede724a000)
        libc.so.6 => /lib64/libc.so.6 (0x00007fede6ede000)
        /lib64/ld-linux-x86-64.so.2 (0x00007fede847a000)

on copie les bibliothèques nécessaires dans l'environnement chrooté

cp /lib64/libpthread.so.0 /chroot/mysql/lib64
cp /lib64/libcrypt.so.1 /chroot/mysql/lib64
cp /lib64/libnsl.so.1 /chroot/mysql/lib64
cp /lib64/libm.so.6 /chroot/mysql/lib64
cp /lib64/libgcc_s.so.1 /chroot/mysql/lib64
cp /lib64/libc.so.6 /chroot/mysql/lib64
cp /lib64/ld-linux-x86-64.so.2 /chroot/mysql/lib64
cp /usr/lib64/libz.so.1 /chroot/mysql/usr/lib64
cp /usr/lib64/libstdc++.so.6 /chroot/mysql/usr/lib64
cp /lib64/librt.so.1 /chroot/mysql/lib64
cp
/lib64/libdl.so.2 /chroot/mysql/lib64

il faudra également copier les deux bibliothèques suivantes

cp /lib64/libnss_files.so.2 /chroot/httpd/lib64
cp /lib64/libnss_mdns4_minimal.so.2 /chroot/httpd/lib64

maintenant on modifie les droits du répertoire /chroot/mysql et celui du répertoire temporaire

chown -R root:sys /chroot/mysql
chmod -R 755 /chroot/mysql
chmod 1777 /chroot/mysql/tmp

on crée un fichier poubelle /dev/null dans l'environnement chroot

mknod /chroot/mysql/dev/null c 2 2
chown root:sys /chroot/mysql/dev/null
chmod 666 /chroot/mysql/dev/null

on copie ensuite la base et on met mysql propriétaire

cp -R /usr/local/mysql/data/ /chroot/mysql/usr/local/mysql/data
chown -R mysql:mysql /chroot/mysql/usr/local/mysql/data

Pour terminer on installe le package suivant

urpmi chrootuid

[retour haut de la page]

Configuration de MySQL

On édite le fichier /etc/my.cnf vous devez au moins avoir les lignes suivantes

[client]
port            = 3306
socket = /chroot/mysql/tmp/mysql.sock

[mysqld]
port            = 3306
socket          = /tmp/mysql.sock
skip-external-locking
pid-file=/tmp/mysqld.pid

skip-networking

on laisse le reste par défaut. Copiez maintenant /etc/my.cnf sous /chroot/mysql/etc

cp /etc/my.cnf /chroot/mysql/etc

on lance maintenant le daemon chrooté en tapant

chrootuid /chroot/mysql mysql /usr/local/mysql/bin/mysqld &

voilà le résultat

130301  9:22:21 InnoDB: The InnoDB memory heap is disabled
130301  9:22:21 InnoDB: Mutexes and rw_locks use GCC atomic builtins
130301  9:22:21 InnoDB: Compressed tables use zlib 1.2.3
130301  9:22:21 InnoDB: Initializing buffer pool, size = 128.0M
130301  9:22:21 InnoDB: Completed initialization of buffer pool
130301  9:22:21 InnoDB: highest supported file format is Barracuda.
130301  9:22:21  InnoDB: Waiting for the background threads to start
130301  9:22:22 InnoDB: 1.1.8 started; log sequence number 1595675
130301  9:22:22 [Note] Server hostname (bind-address): '0.0.0.0'; port: 3306
130301  9:22:22 [Note]   - '0.0.0.0' resolves to '0.0.0.0';
130301  9:22:22 [Note] Server socket created on IP: '0.0.0.0'.
130301  9:22:22 [Note] Event Scheduler: Loaded 0 events
130301  9:22:22 [Note] /usr/local/mysql/bin/mysqld: ready for connections.
Version: '5.5.29-log'  socket: '/tmp/mysql.sock'  port: 3306  Source distribution

Pour vérifier qu'on est bien dans un environnement chrooté, on récupére le PID du process mysqld en tapant

ps aux|grep mysql

voilà le résultat

mysql    21495  0.0  3.7 388292 38620 pts/2    Sl+  10:22   0:00 /usr/local/mysql/bin/mysqld

en tapant

ll /proc/21495/root

on voit bien un lien vers /chroot/mysql

Si vous disposez déjà d'une base sql à upgrader il faudra taper

./mysql_upgrade -p

Sinon, on part de zéro, il faut modifier le mot de passe d'administrateur de la base en tapant

/usr/local/mysql/bin/mysql -u root

voilà le résultat

Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 1
Server version: 5.5.29-log Source distribution

Copyright (c) 2000, 2012, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.


Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql>SET PASSWORD FOR root@localhost=PASSWORD('newpassword');
Query OK, 0 rows affected (0,00 sec)

on supprime la base de test

mysql> drop database test;
Query OK, 0 rows affected (0,00 sec)

on fait le ménage dans la base mysql en supprimant les utilisateurs inutiles

mysql> use mysql;
Database changed
mysql> delete from db;
Query OK, 2 rows affected (0,00 sec)

mysql> delete from user where not(host="localhost" and user="root");
Query OK, 4 rows affected (0,00 sec)

mysql> flush privileges;
Query OK, 0 rows affected (0,00 sec)

on change le nom de l'administrateurmysqld.pid

mysql> update user set user="adminmysql" where user="root";
Query OK, 1 row affected (0,00 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> flush privileges;
Query OK, 0 rows affected (0,00 sec)

on peut quitter la base

mysql>quit

pour terminer on supprime toutes traces de nos manips

cat /dev/null > ~/.mysql_history

[retour haut de la page]

Installation d'Apache

Installation d'Apache

On commence en créant un utilisateur et un groupe apache en tapant

groupadd apache
useradd apache -c "Apache Server" -d /dev/null -g apache -s /sbin/nologin

Pour Apache, on désarchive en tapant:

tar xvfz httpd-2.4.3.tar.gz

Cela va créer le répertoire httpd-2.4.3. Il faudra préalablement installer les outils apr et apr-util qu'on téléchargera sur le site apr.apache.org. On décompresse la première archive en tapant

tar xvfz apr-1.4.6.tar.gz

cela donne le répertoire apr-1.4.6 dans lequel on tape successivement

./configure
make

puis en tant que root

make install

on édite maintenant le fichier /etc/ld.so.conf et on rajoute la ligne suivante

/usr/local/apr/lib

on décompresse la deuxième archive en tapant

tar xvfz apr-util-1.5.1.tar.gz

cela donne le répertoire apr-util-1.5.1 on y tape successivement

./configure --with-apr=/chemin-absolu/apr-1.4.6
make

puis en tant que root

make install
ldconfig

Dans ce répertoire on tape alors:

./configure  --prefix=/usr/local/apache2  --with-mpm=prefork  --disable-charset-lite  --disable-include  --disable-env  --disable-setenvif  --disable-status  --disable-autoindex  --disable-asis  --disable-cgi  --disable-negotiation  --disable-imap  --disable-actions  --disable-userdir  --disable-alias  --enable-so --enable-unixd

Par prefix on indique que les répertoires d'Apache contenant entre autre le fichier de conf se trouveront sous /usr/local/apache2 c'est utile dans le cas où vous voulez faire coexister deux versions d'Apache sur votre système.

On tape maintenant:

make

Et enfin en tant que root:

make install

Pour avoir la liste des modules préinstallés taper la commande

/usr/local/apache2/bin/httpd -l          

voilà la réponse

Compiled in modules:
  core.c
  mod_so.c
  http_core.c
  prefork.c

Chacun de ces modules est directement intégré dans l'exécutable d'apache, à l'exception du module php qui sera chargé dynamiquement grâce au module DSO (dynamic shared object).

[retour haut de la page]

Chrooter Apache

On doit créer préalablement les répertoires suivants

mkdir -p /chroot/httpd/dev
mkdir -p /chroot/httpd/etc
mkdir -p /chroot/httpd/var/run
mkdir -p /chroot/httpd/usr/lib

mkdir -p /chroot/httpd/usr/lib64
mkdir -p
/chroot/httpd/lib64
mkdir -p /chroot/httpd/usr/libexec
mkdir -p /chroot/httpd/usr/local/apache2/bin
mkdir -p /chroot/httpd/usr/local/apache2/lib
mkdir -p /chroot/httpd/usr/local/apache2/logs/lena.hoarau.org
mkdir -p /chroot/httpd/usr/local/apache2/conf
mkdir -p /chroot/httpd/usr/local/lib

mkdir -p /chroot/httpd/usr/local/apr/lib/
mkdir -p /chroot/httpd/www

on copie maintenant les fichiers nécessaires au fonctionnement du daemon httpd

cp /usr/local/apache2/bin/httpd /chroot/httpd/usr/local/apache2/bin/
cp /usr/local/apache2/conf/mime.types /chroot/httpd/usr/local/apache2/conf/
cp /usr/local/apache2/conf/httpd.conf /chroot/httpd/usr/local/apache2/conf/
cp /etc/hosts /chroot/httpd/etc/
cp /etc/nsswitch.conf /chroot/httpd/etc/
cp /etc/resolv.conf /chroot/httpd/etc/
cp /etc/group /chroot/httpd/etc/
cp /etc/passwd /chroot/httpd/etc

on copie les modules à l'endroit qui va bien

cp /usr/local/apache2/modules/*
/chroot/httpd/usr/local/apache2/modules

dans les fichiers /chroot/mysql/etc/passwd et /chroot/mysql/etc/group on veillera à laisser seulement l'utilisateur et le group apache

On vérifie les dépendances du daemon en tapant

ldd /usr/local/apache2/bin/httpd

voilà le résultat

        linux-vdso.so.1 =>  (0x00007fffe9f8b000)
        libpcre.so.0 => /usr/lib64/libpcre.so.0 (0x00007fb902f49000)
        libaprutil-1.so.0 => /usr/local/apr/lib/libaprutil-1.so.0 (0x00007fb902d25000)
        libexpat.so.1 => /usr/lib64/libexpat.so.1 (0x00007fb902afc000)
        libapr-1.so.0 => /usr/local/apr/lib/libapr-1.so.0 (0x00007fb9028ce000)
        libuuid.so.1 => /lib64/libuuid.so.1 (0x00007fb9026c9000)
        librt.so.1 => /lib64/librt.so.1 (0x00007fb9024c1000)
        libcrypt.so.1 => /lib64/libcrypt.so.1 (0x00007fb902273000)
        libpthread.so.0 => /lib64/libpthread.so.0 (0x00007fb902057000)
        libdl.so.2 => /lib64/libdl.so.2 (0x00007fb901e53000)
        libc.so.6 => /lib64/libc.so.6 (0x00007fb901ae7000)
        /lib64/ld-linux-x86-64.so.2 (0x00007fb90317a000)

on copiera donc les bibliothèques nécesaires en tapant

cp /lib64/libm.so.6 /chroot/httpd/lib64
cp
/lib64/librt.so.1 /chroot/httpd/lib64
cp
/lib64/libcrypt.so.1 /chroot/httpd/lib64
cp
/lib64/libpthread.so.0 /chroot/httpd/lib64
cp
/lib64/libdl.so.2 /chroot/httpd/lib64
cp
/lib64/libc.so.6 /chroot/httpd/lib64
cp
/lib64/libuuid.so.1 /chroot/httpd/lib64
cp
/lib64/ld-linux-x86-64.so.2 /chroot/httpd/lib64
cp
/usr/local/apr/lib/libaprutil-1.so.0 /chroot/httpd/usr/local/apr/lib
cp
/usr/local/apr/lib/libapr-1.so.0 /chroot/httpd/usr/local/apr/lib
cp
/usr/local/apache2/lib/libexpat.so.0 /chroot/httpd/usr/lib64
cp
/usr/lib64/libexpat.so.1 /chroot/httpd/usr/lib64
cp
/usr/lib64/libpcre.so.0 /chroot/httpd/usr/lib64

On lance le daemon httpd en traçant les appels à d'autres fichiers ou bibliothèques en tapant

strace -o /tmp/trace /usr/local/apache2/bin/httpd

voilà ce que ça donne dans le fichier

cat /tmp/trace | grep open 

open("/dev/urandom", O_RDONLY)          = 3
open("/etc/gai.conf", O_RDONLY)         = -1 ENOENT (No such file or directory)
open("/usr/local/apache2/conf/httpd.conf", O_RDONLY|O_CLOEXEC) = 3
open("/usr/local/apache2/modules/libphp5.so", O_RDONLY) = 4
open("/usr/lib64/tls/x86_64/libc-client.so.0", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/usr/lib64/tls/libc-client.so.0", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/usr/lib64/x86_64/libc-client.so.0", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/usr/lib64/libc-client.so.0", O_RDONLY) = 4
open("/usr/lib64/libresolv.so.2", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/usr/local/apr/lib/libresolv.so.2", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/etc/ld.so.cache", O_RDONLY)      = 4
open("/lib64/libresolv.so.2", O_RDONLY) = 4
open("/usr/lib64/libmcrypt.so.4", O_RDONLY) = 4
open("/usr/lib64/libltdl.so.7", O_RDONLY) = 4
open("/usr/lib64/libpam.so.0", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/usr/local/apr/lib/libpam.so.0", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/lib64/libpam.so.0", O_RDONLY)    = 4
open("/usr/lib64/libintl.so.8", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/usr/local/apr/lib/libintl.so.8", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/lib64/libintl.so.8", O_RDONLY)   = 4
open("/usr/lib64/libm.so.6", O_RDONLY)  = -1 ENOENT (No such file or directory)
open("/usr/local/apr/lib/libm.so.6", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/lib64/libm.so.6", O_RDONLY)      = 4
open("/usr/lib64/libnsl.so.1", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/usr/local/apr/lib/libnsl.so.1", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/lib64/libnsl.so.1", O_RDONLY)    = 4
open("/usr/lib64/libz.so.1", O_RDONLY)  = 4
open("/usr/lib64/libssl.so.1.0.0", O_RDONLY) = 4
open("/usr/lib64/libcrypto.so.1.0.0", O_RDONLY) = 4
open("/usr/lib64/libxml2.so.2", O_RDONLY) = 4
open("/usr/lib64/libaudit.so.1", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/usr/local/apr/lib/libaudit.so.1", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/lib64/libaudit.so.1", O_RDONLY)  = 4
open("/etc/nsswitch.conf", O_RDONLY)    = 4
open("/etc/host.conf", O_RDONLY)        = 4
open("/etc/resolv.conf", O_RDONLY)      = 4
open("/usr/local/apr/lib/libnss_mdns4_minimal.so.2", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/etc/ld.so.cache", O_RDONLY)      = 4
open("/lib64/libnss_mdns4_minimal.so.2", O_RDONLY) = 4
open("/usr/local/apr/lib/libnss_files.so.2", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/etc/ld.so.cache", O_RDONLY)      = 4
open("/lib64/libnss_files.so.2", O_RDONLY) = 4
open("/etc/hosts", O_RDONLY|O_CLOEXEC)  = 4
open("/etc/hosts", O_RDONLY|O_CLOEXEC)  = 4
open("/usr/local/apache2/logs/httpd.pid", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
open("/usr/local/apache2/logs/error_log", O_WRONLY|O_CREAT|O_APPEND|O_CLOEXEC, 0666) = 6
open("/usr/local/apache2/logs/lena.hoarau.org/error_log", O_WRONLY|O_CREAT|O_APPEND|O_CLOEXEC, 0666) = 6
open("/etc/localtime", O_RDONLY)        = 7

on voit que httpd requiert des bibliothèques que ldd ne signale pas. On les copiera en tapant

cp /usr/lib64/libxml2.so.2 /chroot/httpd/usr/lib64
cp /usr/lib64/libz.so.1 /chroot/httpd/usr/lib64
cp /lib64/libresolv.so.2 /chroot/httpd/lib64
cp /lib64/libnsl.so.1 /chroot/httpd/lib64
cp /lib64/libnss_files.so.2 /chroot/httpd/lib64
cp /lib64/libnss_mdns4_minimal.so.2 /chroot/httpd/lib64

on modifie maintenant les droits et propriétaire du répertoire chrooté d'Apache

chown -R root:sys /chroot/httpd
chmod -R 0755 /chroot/httpd

on crée maintenant un fichier poubelle /dev/null en tapant

mknod /chroot/httpd/dev/null c 1 3
chown root:sys /chroot/httpd/dev/null
chmod 666 /chroot/httpd/dev/null

mknod -m 644 /chroot/httpd//dev/random c 1 8
mknod -m 644 /chroot/httpd//dev/urandom c 1 9
chown root:root /chroot/httpd/dev/random /chroot/httpd/dev/urandom

cp /dev/urandom /chroot/httpd/dev/urandom

placer maintenant vos fichiers html sous /chroot/httpd/www on va considérer le site principal placé sous /chroot/httpd/www/www.kervao.org et un secondaire sous /chroot/httpd/www/funix.kervao.org

[retour haut de la page]

Configuration d'Apache

Voilà le fichier /chroot/httpd/usr/local/apache2/conf/httpd.conf

# =================================================
# Basic settings                                  
# =================================================
Listen 0.0.0.0:80                                 
User apache                                       
Group apache                                      
ServerAdmin webmaster@funix.org                   
UseCanonicalName Off                              
ServerSignature Off                               
HostnameLookups Off                               
ServerTokens Prod                                 
ServerRoot "/usr/local/apache2"                   
DocumentRoot "/chroot/httpd/www"                  
PidFile /usr/local/apache2/logs/httpd.pid         
ScoreBoardFile /usr/local/apache2/logs/httpd.scoreboard

LoadModule php5_module    modules/libphp5.so
LoadModule authn_file_module modules/mod_authn_file.so
LoadModule authn_core_module modules/mod_authn_core.so
LoadModule authz_host_module modules/mod_authz_host.so
LoadModule authz_groupfile_module modules/mod_authz_groupfile.so
LoadModule authz_user_module modules/mod_authz_user.so
LoadModule authz_core_module modules/mod_authz_core.so
LoadModule access_compat_module modules/mod_access_compat.so
LoadModule auth_basic_module modules/mod_auth_basic.so
LoadModule reqtimeout_module modules/mod_reqtimeout.so
LoadModule filter_module modules/mod_filter.so
LoadModule mime_module modules/mod_mime.so
LoadModule log_config_module modules/mod_log_config.so
LoadModule headers_module modules/mod_headers.so
LoadModule version_module modules/mod_version.so
LoadModule unixd_module modules/mod_unixd.so
LoadModule vhost_alias_module modules/mod_vhost_alias.so
LoadModule dir_module modules/mod_dir.so

<IfModule mod_dir.c>  
   DirectoryIndex index.html
</IfModule>
# =================================================            
# HTTP and performance settings                                
# =================================================            
Timeout 300                                                    
KeepAlive On                                                   
MaxKeepAliveRequests 100                                       
KeepAliveTimeout 15                                            
<IfModule prefork.c>                                           
   MinSpareServers 5                                           
   MaxSpareServers 10                                          
   StartServers 5                                              
   MaxClients 150                                              
   MaxRequestsPerChild 0                                       
</IfModule>                                                    
# =================================================            
# Access control                                               
# =================================================            
<Directory />                                                  
  Options None                                                 
  AllowOverride None                                           
  Order deny,allow                                             
  Deny from all                                                
</Directory>                                                   
<Directory "/www/www.kervao.org">                
  Order allow,deny                                             
  Allow from all                                               
</Directory>                                                   
<Directory "/www/funix.kervao.org">                               
  Order allow,deny                                            
  Allow from all                                              
</Directory>                                                  
# =================================================            
# MIME encoding                                                
# =================================================            
<IfModule mod_mime.c>                                          
  TypesConfig /usr/local/apache2/conf/mime.types               
</IfModule>                                                    
DefaultType text/plain                                         
<IfModule mod_mime.c>                                          
  AddEncoding x-compress .Z                                    
  AddEncoding x-gzip .gz .tgz                                  
  AddType application/x-compress .Z                            
  AddType application/x-gzip .gz .tgz                          
  AddType application/x-tar .tgz                               
</IfModule>                                                    
# =================================================            
# Logs                                                         
# ================================================= i          
LogLevel warn                                                  
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%h %l %u %t \"%r\" %>s %b" common                                     
LogFormat "%{Referer}i -> %U" referer                                            
LogFormat "%{User-agent}i" agent                                                 
ErrorLog /usr/local/apache2/logs/error_log                                       
CustomLog /usr/local/apache2/logs/access_log combined                            
# =================================================                              
# Virtual hosts                                                                  
# =================================================                              

<VirtualHost *>
   DocumentRoot "/www/www.kervao.org"
   ServerName "www.kervao.org"
   ServerAlias "www.kervao.org"
   ErrorLog logs/www.kervao.org/error_log
   CustomLog logs/www.kervao.org/access_log combined
</VirtualHost>
<VirtualHost *>
   DocumentRoot "/www/funix.kervao.org"
   ServerName "funix.kervao.org"
   ServerAlias "funix.kervao.org"
   ErrorLog logs/funix.kervao.org/error_log
   CustomLog logs/funix.kervao.org/access_log combined
</VirtualHost>

vous devez créer préalablement les répertoires pour stocker les logs de vos sites

mkdir /chroot/httpd/usr/local/apache2/logs/funix.kervao.org
mkdir /chroot/httpd/usr/local/apache2/logs/www.kervao.org

créer également les alias qui vont bien au niveau de /etc/hosts pour vos hôtes virtuels, c'est à dire que si votre serveur a l'adresse IP locale 192.168.1.10 et a pour nom local mana.kervao.fr vous devez avoir

192.168.1.10 mana.kervao.fr www.kervao.org funix.kervao.org

vous devez faire de même pour tous vos clients. Pour lancer maintenant Apache, il faut taper:

chroot /chroot/httpd /usr/local/apache2/bin/httpd

Maintenant votre navigateur préféré dans le champ URL taper http://www.kervao.org et vous devriez retrouver vos pages.

[retour haut de la page]

Installation de PHP

Installation avec les sources de PHP

Pour php5, on tapera d'abord

tar xvfj php-5.4.11.tar.bz2

Cela va créer un répertoire php-5.4.11. A présent dans le répertoire de php, vous taperez

./configure --with-apxs2=/usr/local/apache2/bin/apxs --with-config-file-path=/usr/local/apache2/conf  --with-mysql --enable-debug=no --with-gettext --with-mcrypt --with-imap --with-imap-ssl --with-libdir=lib64 --with-openssl  --enable-exif

A noter que l'option safe_mode n'est plus prise en compte depuis la version 5.3.0. On installera préalablement les packages suivants lib64mcrypt-devel  et lib64c-client-devel on tape ensuite

make

Puis en tant que root

make install

cd /etc/ssl

on génère une clé non chiffrée sur disque (pour éviter d'avoir à saisir un mot de passe à chaque redémarrage d'Apache) :

openssl genrsa -out server.key 1024
Generating RSA private key, 1024 bit long modulus
.........++++++
...........................................++++++
e is 65537 (0x10001)

Ensuite on crée un certificat signé avec cette clé :

openssl req -new -key server.key -out server.csr
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) [XX]:FR

State or Province Name (full name) [Default Province]:Bretagne
Locality Name (eg, city) [Default City]:Brest
Organization Name (eg, company) [Default Company Ltd]:funix
Organizational Unit Name (eg, section) []:
Common Name (eg, your name or your server's hostname) []:horde.kervao.org
Email Address []:olivier.hoarau@funix.org

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:mot-de-passe
An optional company name []:funix

[retour haut de la page]

Chrooter PHP

A présent on va copier le fichier php.ini-production se trouvant dans le répertoire de PHP php-5.3.3 pour le mettre sous /chroot/httpd/usr/local/apache2/conf et en le renommant php.ini

cp ./php-5.4.11/php.ini-production /usr/local/apache2/conf/php.ini

On copie également le module php en tapant

cp /usr/local/apache2/modules/libphp5.so /chroot/httpd/usr/local/apache2/modules
cp /usr/local/bin/phar /chroot/httpd/usr/local/bin
cp -Rf /usr/local/include/php /chroot/httpd/usr/local/include
cp -Rf /usr/local/lib/php/ /chroot/httpd/usr/local/lib
cp /usr/local/bin/pecl /chroot/httpd/usr/local/bin
cp /usr/local/bin/php* /chroot/httpd/usr/local/bin
cp -Rf /usr/lib64/libmcrypt /chroot/httpd/usr/lib64/

maintenant on vérifie les dépendances de bibliothèques du module en tapant

ldd /usr/local/apache2/modules/libphp5.so

voilà le résultat

        linux-vdso.so.1 =>  (0x00007fff519ff000)
        libcrypt.so.1 => /lib64/libcrypt.so.1 (0x00007fd47671e000)
        libc-client.so.0 => /usr/lib64/libc-client.so.0 (0x00007fd476405000)
        libresolv.so.2 => /lib64/libresolv.so.2 (0x00007fd4761ee000)
        librt.so.1 => /lib64/librt.so.1 (0x00007fd475fe6000)
        libmcrypt.so.4 => /usr/lib64/libmcrypt.so.4 (0x00007fd475dde000)
        libltdl.so.7 => /usr/lib64/libltdl.so.7 (0x00007fd475bd3000)
        libpam.so.0 => /lib64/libpam.so.0 (0x00007fd4759c6000)
        libintl.so.8 => /lib64/libintl.so.8 (0x00007fd4757bc000)
        libm.so.6 => /lib64/libm.so.6 (0x00007fd475539000)
        libdl.so.2 => /lib64/libdl.so.2 (0x00007fd475335000)
        libnsl.so.1 => /lib64/libnsl.so.1 (0x00007fd47511d000)
        libz.so.1 => /usr/lib64/libz.so.1 (0x00007fd474f07000)
        libssl.so.1.0.0 => /usr/lib64/libssl.so.1.0.0 (0x00007fd474ca8000)
        libcrypto.so.1.0.0 => /usr/lib64/libcrypto.so.1.0.0 (0x00007fd4748c9000)
        libxml2.so.2 => /usr/lib64/libxml2.so.2 (0x00007fd47457a000)
        libc.so.6 => /lib64/libc.so.6 (0x00007fd47420e000)
        libpthread.so.0 => /lib64/libpthread.so.0 (0x00007fd473ff2000)
        /lib64/ld-linux-x86-64.so.2 (0x00007fd4773e4000)
        libaudit.so.1 => /lib64/libaudit.so.1 (0x00007fd473dd9000)

la plupart des bibliothèques ont déjà été copiés dans l'environnement chrooté suite à l'installation d'apache, il faut juste taper

cp /usr/local/mysql/lib/libmysqlclient.so.18 /chroot/httpd/usr/local/mysql/lib
cp
/usr/lib64/libmcrypt.so.4 /chroot/httpd/usr/lib64
cp
/lib64/libaudit.so.1 /chroot/httpd/lib64
cp
/lib64/libpam.so.0 /chroot/httpd/lib64
cp
/usr/lib64/libc-client.so.0 /chroot/httpd/usr/lib64
cp
/usr/lib64/libssl.so.1.0.0 /chroot/httpd/usr/lib64
cp
/usr/lib64/libcrypto.so.1.0.0 /chroot/httpd/usr/lib64

[retour haut de la page]

Configuration de PHP

On va modifier maintenant le fichier /chroot/httpd/usr/local/apache2/conf/httpd.conf en veillant à rajouter

LoadModule php5_module        modules/libphp5.so

à la suite des lignes

AddType application/x-compress .Z
AddType application/x-gzip .gz .tgz

On rajoute

AddType application/x-httpd-php .php .php3 .php4 .php5 .phtml
AddType application/x-httpd-php-source .phps

Par ailleurs à la ligne

DirectoryIndex index.html

On rajoutera

DirectoryIndex index.html index.php

On relance Apache créer maintenant le fichier infophp.php contenant

<?php
phpinfo();
?>

Que vous placerez sous /chroot/httpd/www, dans l'URL de votre navigateur préféré, taper http://localhost/infophp.php ou http://nommachine/infophp.php et là magique devrait s'afficher des info sur la configuration de PHP sur votre système.


ATTENTION pour un fonctionnement optimal de mysql avec php, il faudra préciser la position du fichier socket de mysql dans le fichier php.ini

mysql.default_socket = /tmp/mysql.sock

On va également modifier les paramètres suivants:

expose_php=Off
PHP ne délivrera pas d'information en réponse aux requêtes faites par des clients.
display_errors = Off PHP ne délivrera à l'affichage (dans le navigateur) aucune erreur et warning.
log_errors = On Les erreurs et warnings seront inscrits dans un fichier de log
error_log = /usr/local/apache/logs/php.log Définition du fichier de log
file_uploads = Off Désactivation de l'upload
register_globals=Off En mettant à On les variables d'environnement, GET, POST, etc. deviennent automatiquement des variables globales, ce qui est potentiellement dangereux, en conséquence il est fortement conseillé de désactiver ce paramètre

[retour haut de la page

Lancement automatique

Lancement automatique de Mysql

Nous pouvons passer à la création d'un fichier de lancement mysqld qu'on placera sous /etc/init.d

#!/bin/sh

# Comments to support chkconfig on RedHat Linux
# chkconfig: 2345 64 36
# description: A very fast and reliable SQL database engine.

CHROOT_MYSQL=/chroot/mysql
CHROOT_PHP=/chroot/httpd
SOCKET=/tmp/mysql.sock
MYSQLD=/usr/local/mysql/bin/mysqld
PIDFILE=/tmp/mysqld.pid
CHROOTUID=/usr/sbin/chrootuid
echo -n " mysql"
case "$1" in
  start)        rm -f  ${CHROOT_PHP}/${SOCKET}
                nohup ${CHROOTUID} ${CHROOT_MYSQL} mysql ${MYSQLD} >
/dev/null 2>&1 &
                sleep 5 && ln ${CHROOT_MYSQL}/${SOCKET} ${CHROOT_PHP
}/${SOCKET}
                ;;
  stop)         kill `cat ${CHROOT_MYSQL}/${PIDFILE}`
                rm -rf ${CHROOT_MYSQL}/${SOCKET}         ;;
  *)         echo ""
             echo "Usage: `basename $0` {start|stop}" >&2         ex
it 64         ;;
esac
exit 0

Pour un lancement automatique de MySQL à l'état de marche 3, 4 et 5, on tapera ensuite

chkconfig --level 345 mysql on

Et un arrêt à l'état de marche 0, 1, 2 et 6

chkconfig --level 0126 mysql off


[retour haut de la page]

Lancement automatique d'Apache

nous pouvons passer à la création d'un fichier de lancement apache qu'on placera sous /etc/init.d

#!/bin/sh

# Startup script for the Apache Web Server
#
# chkconfig: 345 85 15
# description: Apache is a World Wide Web server.  It is used to serve \
#              HTML files and CGI.
# processname: httpd

CHROOT=/chroot/httpd
HTTPD=/usr/local/apache2/bin/httpd
PIDFILE=/usr/local/apache2/logs/httpd.pid
echo -n " apache"
case "$1" in
  start)        /usr/sbin/chroot $CHROOT $HTTPD        ;;
  stop)        kill `cat ${CHROOT}/${PIDFILE}`        ;;
  *)        echo ""        echo "Usage: `basename $0` {start|stop}" >&2        exit 64        ;;
esac
exit 0

Pour un lancement automatique à l'état de marche 3,4 et 5 on doit normalement taper:

chkconfig --level 345 apache on

Et pour un arrêt à l'état de marche 0, 1, 2 et 6

chkconfig --level 0126 apache off

[retour haut de la page]

Installation d'un blog wordpress en local

Wordpress vous permet de créer un blog. La page de téléchargement de la version française se trouve sur ce site http://www.wordpress-fr.net/telechargements

On y récupère l'archive qu'on décompresse directement sous le répertoire /chroot/httpd/www/  

unzip wordpress-3.5.1-fr_FR.zip

on renomme le répertoire wordpress dans un nom de répertoire approprié

mv wordpress blog.kervao.org

maintenant on va créer une base wordpress et un utilisateur adminwp qui va pouvoir accéder à la base

/usr/local/mysql/bin/mysql -u admysql -p
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.

Your MySQL connection id is 3     
Server version: 5.5.29-log Source distribution

Copyright (c) 2000, 2012, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
                    

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> CREATE DATABASE wordpress;
Query OK, 1 row affected (0,01 sec)

mysql> GRANT ALL PRIVILEGES ON wordpress.* TO "adminwp"@"localhost"
    -> IDENTIFIED BY "motpasse";
Query OK, 0 rows affected (0,00 sec)

mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0,00 sec)

mysql> quit
Bye

Maintenant dans le fichier /chroot/httpd/usr/local/apache2/conf/httpd.conf on veillera à rajouter

<Directory "/www/blog.kervao.org">
  Order allow,deny
  Allow from all
</Directory>

et

<VirtualHost *>
   DocumentRoot "/www/blog.kervao.org"
   ServerName "blog.kervao.org"
   ErrorLog logs/blog.kervao.org/error_log
   CustomLog logs/blog.kervao.org/access_log combined
</VirtualHost>

on relance apache.

/etc/init.d/apache stop
/etc/init.d/apache start

On rajoute l'URL blog.kervao.org dans le fichier /etc/hosts. Maintenant on lance l'interface d'administration de wordpress en mettant dans votre navigateur l'URL suivant http://blog.kervao.org/wp-admin/install.php

Lors de la configuration de la base, les paramètres à saisir sont

- Nom de la base de données wordpress

- Identifiant adminwp

- Mot de passe "le mot de passe préalablement fixé"

- Hôte de la base de données localhost

- Préfixe de table wpblog1_

Il suffit ensuite de suivre les indications. Pour le reste vous pouvez consulter les nombreux sites sur wordpress qu'on peut trouver sur le net.

Pour l'upload des photos il faudra modifier également le fichier /chroot/httpd/usr/local/apache2/conf/php.ini en mettant

file_uploads = On
upload_tmp_dir = /www/blog.kervao.org/wp-content/uploads

relancez apache

[retour haut de la page]

Installation d'une photothèque avec piwigo 

Piwigo est un CMS orienté photothèque, il est issu de phpwebgallery. le site officiel est http://fr.piwigo.org. On récupère l'archive qu'on décompresse directement sous /chroot/httpd/www

unzip piwigo-2.4.7.zip

on renomme le répertoire piwigo ainsi obtenu

mv piwigo phototheque.kervao.org

Maintenant on modifie le fichier /chroot/httpd/usr/local/apache2/conf/httpd.conf en rajoutant

<Directory "/www/phototheque.kervao.org">
  Order allow,deny
  Allow from all
</Directory>

et

<VirtualHost *>
   DocumentRoot "/www/phototheque.kervao.org"
   ServerName "phototheque.kervao.org"
   ErrorLog logs/phototheque.kervao.org/error_log
   CustomLog logs/phototheque.kervao.org/access_log combined
</VirtualHost>

Maintenant sous /chroot/httpd/usr/local/apache2/logs, il faudra créer le répertoire phototheque.kervao.org

mkdir phototheque.kervao.org


On modifie maintenant le fichier /etc/hosts pour rajouter phototheque.kervao.org

Il faudra recompiler php en rajoutant l'option

--enable-exif

recopier le module php au bon endroit et relancer apache

cp /usr/local/apache2/modules/libphp5.so /chroot/httpd/usr/local/apache2/modules
/etc/init.d/apache stop
/etc/init.d/apache start

A présent on crée la base de donnée piwigo et l'utilisateur admingallery qui y accédera

/usr/local/mysql/bin/mysql -u admysql -p                                             
Enter password:                                                                      
Welcome to the MySQL monitor.  Commands end with ; or \g.                            
Your MySQL connection id is 231                                                      
Server version: 5.5.29-log Source distribution

Copyright (c) 2000, 2012, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.


Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> CREATE DATABASE piwigo;
Query OK, 1 row affected (0,01 sec)

mysql> GRANT ALL PRIVILEGES ON piwigo.* TO "admingallery"@"localhost"
    -> IDENTIFIED BY "motdepasse";
Query OK, 0 rows affected (0,02 sec)

mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0,00 sec)

mysql> quit
Bye

Pour le reste il suffit dans le navigateur de taper l'URL phototheque.kervao.org est de suivre les indications. Au moment de la création de la base il faudra donner les éléments suivants

base de données : piwigo

utilisateur: admingallery

Pour mémoire les droits de _data, local et upload sont à 777. Voilà ce que ça donne

Je suis parti du thème blancmontxl que j'ai légèrement modifié à ma sauce.

Pour terminer l'installation vous pouvez installer pLoader qui est un utilitaire indépendant permettant de pouvoir télécharger des photos. On récupèrera les sources par ici http://piwigo.org/ext/extension_view.php?eid=269

Préalablement il faudra installer les packages lib64gtk+2.0_0-devel et lib64magick-devel

Grâce à l'utilitaire cpan, au prompt il faudra installer les utilitaires suivants

install Class::Accessor
install File::HomeDir
install Digest::MD5
install Digest::MD5::File
install Image::ExifTool
install Image::Magick
install Wx

Maintenant on revient à l'archive de pLoader qu'on décompresse en tapant

tar xvfz pLoader-1.6.tar.gz

cela donne le répertoire pLoader, on lancera l'utilitaire en tapant dans le répertoire src et en tapant

perl ploader.pl

Maintenant sous /usr/bin vous pouvez créer un script pLoader contenant

#!/bin/bash
cd /usr/local/linux/web/pLoader-1.6/src
perl ploader.pl

donnez lui les droits d'exécution

chmod 755 /usr/bin/pLoader

La prochaine fois il suffira de taper pLoader



L'intérêt de l'outil est qu'il n'est pas nécessaire de le lancer dans un environnement chrooté, vous pouvez l'utiliser normalement pour remplir la base d'image qui elle se trouve dans l'environnement chrooté.
Inconvénient de l'outil, ce n'est pas avec lui que vous pourrez modifier les images avant téléchargement, il faudra le faire préalablement.

[retour haut de la page]

Rendre votre site accessible d'internet

Maintenant il faudra créer un compte sous dyndns. Maintenant avec routeur vous devriez retrouver une fonctionnalité permettant de faire le lien entre votre adresse IP et le nom d'URL attribué par dyndns. Exemple avec le routeur fourni avec numericable.

L'inconvénient de ce routeur est qu'il ne permet de pointer que vers un seul site local. Si vous avez la possibilité de pointer vers deux sites locaux, vous pouvez disposer chacun de vos sites à des numéros de port différents (à préciser dans le fichier httpd.conf). Autre solution (plus simple), redirigez vers une page d'accueil locale qui pointera vers vos sites locaux par lien.
Si votre routeur ne dispose pas de cette possibilité, vous pouvez toujours aller voir par ici. C'est un peu ancien, mais toujours fonctionnel. Le site dyndns renvoie également vers l'utilitaire inadyn qui permet de réactualisation de l'adresse IP si votre routeur ne le fait pas.
 
[Retour page d'accueil FUNIX] [retour haut de la page ]