Mettez un manchot dans votre PC
Dernière modification 31 juillet 2022
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 MariaDB à l'URL https://mariadb.org/
Pour l'analyser des logs d'Apache, reportez vous à la page "Analyser les logs d'Apache avec Webalizer et Awstats".
Pour mettre en place un moteur de recherche, reportez vous à la page " Hl://Dig"
Pour mettre en place un serveur web sécurisé dans un environnement "chrooté" consulter cette page (non maintenue).
Pour installer un webmail basé sur Roundcube mail avec une configuration LAMP on ira voir cette page.
tar xvfz mariadb-10.8.3.tar.gz
Cela crée le répertoire mariadb-10.8.3, sur ma Mageia j'ai dû installer les packages lib64lz4-devel, lib64gnutls-devel, lib64curl-devel et lib64ncurses-devel. Dans le répertoire de MariaDB, on tape alors:
mkdir build
cd build
cmake ..
voilà le résultat
-- The following OPTIONAL packages have been found:
* LibXml2
* CURL
* GSSAPI
* LZ4 (required version >= 1.6)
* LibLZMA
* BISON (required version >= 2.4)
-- The following RECOMMENDED packages have been found:
* OpenSSL
-- The following REQUIRED packages have been found:
* Curses
* Threads
-- The following features have been disabled:
* LIBWRAP, Support for tcp wrappers
* SYSTEMD, Systemd scripts and notification support
* CONNECT_ODBC, Support for ODBC in the CONNECT storage engine
* CONNECT_JDBC, Support for JDBC in the CONNECT storage engine
* CONNECT_MONGODB, Support for MongoDB in the CONNECT storage
engine
* NUMA, NUMA memory allocation policy
* INNODB_EXTRA_DEBUG, Extra InnoDB debug checks
* AWS_KEY_MANAGEMENT, AWS Encryption Key Management Plugin
* EMBEDDED_SERVER, Embedded MariaDB Server Library
-- The following OPTIONAL packages have not been found:
* Git
* Java (required version >= 1.6)
* JNI
* PMEM
* Boost (required version >= 1.40.0)
Required for the OQGraph storage engine
* BZip2
* LZO
* Snappy
-- Configuring done
-- Generating done
-- Build files have been written to:
/usr/local/linux/web/mariadb-10.8.3/build
on tape ensuite
make
et en tant que root make install
On rajoutera la ligne /usr/local/lib/mariadb dans le fichier /etc/ld.so.conf et on tapera ldconfig.
Les exécutables sont installés par défaut
sous /usr/local/mysql/bin,
les bibliothèques vont se trouver sous /usr/local/mysql/lib,
maintenant pour que les headers de mysql
soient accessibles pour d'autres softs qui en auraient l'usage, il faudra
créer le lien suivant
ln -s /usr/local/mysql/include/mysql
/usr/include
vous mettrez bien sûr votre chemin absolu de
mysql. Si vous upgradez MySQL
vous pouvez passer à l'étape
suivante. Sinon vous devez taper les commandes suivantes :
groupadd mysql
Puis l'utilisateur mysql du groupe mysql
useradd mysql -c "MySQL Server" -d /dev/null -g mysql -s /sbin/nologin
On va créer préalablement le répertoire /var/log/mysqld, et mysql
doit en être propriétaire
mkdir /var/log/mysqld
chown mysql:mysql /var/log/mysqld
On installera maintenant le fichier de configuration /etc/my.cnf, voilà à quoi il va ressembler
[client]
#emplacement de la socket
socket = /var/run/mysqld/mysqld.sock
[mysqld]
# chemin par défaut d'installation de mariaDB
basedir = /usr/local/mysql
# chemin de la base de donnée
datadir = /usr/local/mysql/data/
#répertoire temporaire
tmpdir = /tmp
# configuration diverse
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
on donne les droits qui vont bien
chown root:sys /etc/my.cnf
chmod 644 /etc/my.cnf
On va d'abord initialiser les bases de données avec le script mysql_install_db.sh qui se trouve dans le répertoire mariadb-10.8.3, il faudra le modifier pour éviter les erreurs comme cela
FATAL ERROR: Could not find mariadbd
The following directories were searched:
@mysqld_locations@
ou bien encore
./mysql_install_db.sh: ligne 444: @HOSTNAME@ : commande introuvable
on l'édite et on modifie ainsi les lignes suivantes
resolveip=`find_in_dirs resolveip $bindir`
au lieu de resolveip=`find_in_dirs resolveip @resolveip_locations@` et
mysqld=`find_in_dirs mariadbd $bindir`
langdir="/usr/local/mysql/share/french"
srcpkgdatadir="/usr/local/mysql/share"
ainsi qu'on remplace hostname=`@HOSTNAME@` par hostname=`hostname`
Une fois corrigé, on le lance
bash ./mysql_install_db.sh --user=mysql --basedir=/usr/local/mysql/ --datadir=/usr/local/mysql/data --builddir=/chemin/mariadb-10.8.3/
et voilà le résultat
Installing MariaDB/MySQL system tables in '/usr/local/mysql/data' ...
OK
To start mysqld at boot time you have to copy
support-files/mysql.server to the right place for your system
Two all-privilege accounts were created.
One is root@localhost, it has no password, but you need to
be system 'root' user to connect. Use, for example, sudo mysql
The second is mysql@localhost, it has no password either, but
you need to be the system 'mysql' user to connect.
After connecting you can set the password, if you would need to be
able to connect as any of these users with a password and without sudo
See the MariaDB Knowledgebase at https://mariadb.com/kb
You can start the MariaDB daemon with:
cd '/usr/local/mysql/' ; /usr/local/mysql//bin/mysqld_safe
--datadir='/usr/local/mysql/data'
You can test the MariaDB daemon with mysql-test-run.pl
cd '/usr/local/mysql//mysql-test' ; perl mysql-test-run.pl
Please report any problems at https://mariadb.org/jira
The latest information about MariaDB is available at
https://mariadb.org/.
Consider joining MariaDB's strong and vibrant community:
https://mariadb.org/get-involved/
Dans la configuration présentée dans cette page les bases de données se trouvent sous /usr/local/mysql/data, mysql doit en être propriétaire
chown -R mysql:mysql /usr/local/mysql/data
on va également mettre les droits à 755 sinon seul root aura accès à la base mysql
chmod 755 /usr/local/mysql/dataOn lance maintenant le serveur en tapant
/usr/local/mysql/bin/mysqld_safe --datadir='/usr/local/mysql/data'
voilà le résultat
220730 17:28:58 mysqld_safe Logging to
'/usr/local/mysql/data/ultra.kervao.fr.err'.
220730 17:28:58 mysqld_safe Starting mariadbd daemon with databases from
/usr/local/mysql/data
On sécurise maintenant l'accès à la base de données en tapant mysql_secure_installation en tant que root, voilà le résultat
NOTE: RUNNING ALL PARTS OF THIS SCRIPT IS RECOMMENDED FOR ALL MariaDBmaintenant on peut se connecter à la base en tapant
mysql -u root -p
Enter password: on rentre le mot de passe défini plus haut, et voilà le résultat
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MariaDB connection id is 82
Server version: 10.8.3-MariaDB Source distribution
Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.
Type 'help;' or '\h' for help. Type '\c' to clear the current input
statement.
MariaDB [(none)]>
A présent reportez vous à la page MariaDB à partir de la création des autres utilisateurs qui accèderont à vos base pour éviter de travailler sous root.
● mariadb.service - MariaDB Server
Loaded: loaded
(/usr/lib/systemd/system/mariadb.service; enabled; vendor preset:
disabled)
Active: active (running) since Sat 2021-09-11
14:47:29 CEST; 8s ago
Process: 45212 ExecStartPre=/bin/mkdir -p
/var/run/mysqld (code=exited, status=0/SUCCESS)
Process: 45214 ExecStartPre=/bin/chown mysql:mysql -R
/var/run/mysqld (code=exited, status=0/SUCCESS)
Main PID: 45215 (mysqld)
Tasks: 8 (limit: 4677)
Memory: 85.2M
CPU: 204ms
CGroup: /system.slice/mariadb.service
└─45215 /usr/local/mysql/bin/mysqld --basedir=/usr/local/mysql
--datadir=/usr/local/mysql/data --log-error=/var/log/mysqld/error.log
--pid-file=/var/run/mysqld/mysqld.pid
--socket=/var/run/mysqld/mysqld.sock
sept. 11 14:47:29 mana.kervao.fr systemd[1]: Starting MariaDB Server...
sept. 11 14:47:29 mana.kervao.fr systemd[1]: Started MariaDB Server.
sept. 11 14:47:29 mana.kervao.fr mysqld[45215]: 2021-09-11 14:47:29 0
[Note] /usr/local/mysql/bin/mysqld (server 10.6.4-MariaDB) starting as
process 45215 ...
systemctl enable mariadb.service
Juste après avoir installé la nouvelle version de MariaDB la première chose à faire est de relancer le daemon
systemctl restart mariadb
il faudra faire ensuite un upgrade de la base de données en tapantmysql_upgrade -u root -p
cela va donner
Enter password: Checking if update is needed.
Checking server version.
Running queries to upgrade MySQL server.
Checking system database.
mysql.columns_priv OK
mysql.db OK
mysql.engine_cost OK
mysql.event OK
mysql.func OK
mysql.general_log OK
mysql.gtid_executed OK
mysql.help_category OK
mysql.help_keyword OK
mysql.help_relation OK
mysql.help_topic OK
mysql.innodb_index_stats OK
mysql.innodb_table_stats OK
mysql.ndb_binlog_index OK
mysql.plugin OK
...
sys
sys.sys_config
OK
Phase 7/7: Running 'FLUSH PRIVILEGES'
OK
La mise à jour de la base est terminée, en revanche si vous avez l'erreur suivante
Error : Cannot load from mysql.proc. The table is
probably corrupted
error : Corrupt
sys.io_by_thread_by_latency
Error : Cannot load from mysql.proc. The table is
probably corrupted
error : Corrupt
sys.io_global_by_file_by_bytes
Error : Cannot load from mysql.proc. The table is
probably corrupted
error : Corrupt
sys.io_global_by_file_by_latency
Error : Cannot load from mysql.proc. The table is
probably corrupted
error : Corrupt
sys.io_global_by_wait_by_bytes
Error : Cannot load from mysql.proc. The table is
probably corrupted
error : Corrupt
il faudra retaper la commande en rajoutant
mysql_upgrade -uroot -p --force
Il faudra ensuite relancer le serveur
systemctl restart mariadb
Maintenant pour créer une connexion sécurisée on va créer le répertoire /etc/mysql et /etc/mysql/ssl. On va sous /etc/mysql/ssl et on génère une clé RSA privée pour l'autorité de certification maison (CA pour Certificate Autority). Il est bien évident que les certificats et clé de votre CA ne seront valables que sur votre seul réseau interne, à moins que vous soyiez une CA reconnue et enregistrée sur internet ! Si votre site est accessible par internet je vous conseille de créer un certificat qui sera valable sur internet avec let's encrypt.
openssl genrsa 2048 > ca-key.pem
voilà le résultat
Generating RSA private key, 2048 bit long modulus
............................................................................+++++
.............+++++
e is 65537 (0x010001)
on crée maintenant le certificat du CA basé sur la clé précédemment créée en tapant
openssl req -new -x509 -nodes -days 365000 -key ca-key.pem -out ca-cert.pem
voilà le résultat
You are about to be asked to enter information that will be incorporated[client]
ssl-ca=/etc/mysql/ssl/ca-cert.pemOn relance le serveur
systemctl restart mariadb
et on tape
mysql -u root -p
Enter password:
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MariaDB connection id is 4
Server version: 10.8.3-MariaDB Source distribution
Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.
Type 'help;' or '\h' for help. Type '\c' to clear the current input
statement.
MariaDB [(none)]>status
--------------
mysql Ver 15.1 Distrib 10.8.3-MariaDB, for Linux (x86_64) using
readline 5.1
Connection id: 4
Current database:
Current user: root@localhost
SSL: Cipher in
use is Cipher in use is TLS_AES_256_GCM_SHA384
Current pager: stdout
Using outfile: ''
Using delimiter: ;
Server: MariaDB
Server version: 10.8.3-MariaDB
Source distribution
Protocol version: 10
Connection: Localhost via UNIX
socket
Server characterset: latin1
Db characterset: latin1
Client characterset: utf8mb3
Conn. characterset: utf8mb3
UNIX socket:
/var/run/mysqld/mysqld.sock
Uptime: 3 min 31
sec
Threads: 4 Questions: 53 Slow queries: 0 Opens:
44 Open tables: 38 Queries per second avg: 0.251
--------------
et
MariaDB [(none)]> SHOW VARIABLES LIKE '%ssl%';
+---------------------+--------------------------------+
| Variable_name |
Value
|
+---------------------+--------------------------------+
| have_openssl |
YES
|
|
have_ssl
|
YES
|
|
ssl_ca
| /etc/mysql/ssl/ca-cert.pem |
| ssl_capath
|
|
|
ssl_cert
| /etc/mysql/ssl/server-cert.pem |
| ssl_cipher
|
|
|
ssl_crl
|
|
| ssl_crlpath
|
|
|
ssl_key
| /etc/mysql/ssl/server-key.pem |
| version_ssl_library | OpenSSL 1.1.1q 5 Jul 2022 |
+---------------------+--------------------------------+
10 rows in set (0.001 sec)
C'est bon vous êtes en connexion sécurisée. Pour aller plus loin vous pouvez consulter cette page qui va vous indiquer (par exemple) comment forcer les connexions chiffrées par utilisateur, machine, ou autre.
Si vous avez perdu le mot de passe root pour le réinitialiser il faut
stopper le serveur
systemctl stop mariadb
On redémarre le daemon en désactivant l'identification et l'écoute du réseau (afin d'éviter d'être piraté à ce moment où MariaDB est vulnérable) :
/usr/local/mysql/bin/mysqld --user=mysql --skip-grant-tables --skip-networking &
Maintenant on modifie le mot de passe en se connectant à la base mysql
/usr/local/mysql/bin/mysql mysql -u
root
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MariaDB connection id is 25
Server version: 10.8.3-MariaDB Source distribution
Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.
Query OK, 4 rows affected (0,06 sec)
Rows matched: 4 Changed: 4
Warnings: 0
On prend en compte les changements en tapant la commande suivante :
MariaDB [(mysql)]>
FLUSH PRIVILEGES;
Query OK, 0 rows affected (0,04 sec)
on relance ensuite le daemon mariadb
systemctl restart mariadb
tar xvfz httpd-2.4.54.tar.gz
Cela va créer le répertoire httpd-2.4.54.
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.7.0.tar.gz
cela donne le répertoire apr-1.7.0 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.6.1.tar.gz
cela donne le répertoire apr-util-1.6.1 on y tape successivement
./configure --with-apr=/chemin-absolu/apr-1.7.0
--with-crypto --with-openssl=/usr/local/ssl/lib
make
puis en tant que root
make install
ldconfig
Dans le répertoire d'Apache httpd-2.4.54, on tape alors:
./configure --prefix=/usr/local/apache2 --enable-modules=most
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
Rajoutez la ligne /usr/local/apache2/lib dans le fichier /etc/ld.so.conf puis tapez
ldconfig
Pour lancer maintenant Apache, il faut taper:
/usr/local/apache2/bin/apachectl start
Maintenant votre navigateur préféré dans le champ URL taper http://localhost ou http://nomdelamachine et là la page d'accueil d'Apache apparaît (ou du moins un It Works !!), pour info celle-ci se trouve sous /usr/local/apache2/htdocs.
NOTE Si vous upgradez d'une ancienne version, vos fichiers de conf ne seront pas écrasés.
- répertoire auth qui contient les mots de passe chiffrée pour
les pages web avec accès par mot de passe
- répertoire bin contient les exécutables d'Apache
- répertoire cgi-bin contient les scripts CGI
- répertoire error contient les messages d'erreur dans de
multiples langues, la langue est choisie en fonction de la configuration
du navigateur. Les messages sont entièrement configurables.
- répertoire lib contient des bibliothèques
- répertoire build contient des paramètres divers de
configuration de compilation
- répertoire conf contient les fichiers de configuration d'Apache
- répertoire htdocs contient la page
d'accueil d'Apache
- répertoire icons contient des icônes qui servent
notamment pour identifier les types de fichier.
- répertoire include contient les includes d'Apache
- répertoire modules contient les modules d'Apache
- répertoire logs contient les fichiers de log d'Apache
- répertoire man contient les manuels d'Apache
Le répertoire de log contient essentiellement deux fichiers:
- access_log listant les accès au serveur
- error_log listant les erreurs en tout genre
Le répertoire de modules modules contient les modules utilisables par Apache, pour info un module est une extension logicielle à Apache, lui permettant par exemple d'interpréter le PHP (module libphp.so). Ce ne sont que les modules chargés dynamiquement qui sont dans ce répertoire.
Le répertoire /usr/local/apache2/conf
contient:
- le fichier de configuration d'Apache http.conf
- mime.types fixe le type de fichier suivant l'extension du dit
fichier (.doc=msword, .ps=postscript, ...), ça permet au
client qui se connecte sur le serveur, de savoir comment interpréter le
fichier suivant son extension.
- magic sert pour le module mod_mime_magic
Vous trouverez également un tas d'autres fichiers de config fournis comme exemple dans les répertoire extra et original.
(...)
# Répertoire racine d'Apache
ServerRoot "/usr/local/apache"
(...)
# définition de l'adresse IP du port du serveur
# Listen: Allows you to bind Apache to specific IP addresses and/or
# ports, in addition to the default. See also the <VirtualHost>
# directive.
#
# Change this to Listen on specific IP addresses as shown below to
# prevent Apache from glomming onto all bound IP addresses (0.0.0.0)
#
#Listen 12.34.56.78:80
# avec un deuxième serveur apache, vous pouvez indiquer un port 8080
# dans l'url du navigateur il faudra mettre http://url:8080
Listen 80
(...)
# chargement des modules complémentaires
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 socache_shmcb_module modules/mod_socache_shmcb.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 env_module modules/mod_env.so
LoadModule headers_module modules/mod_headers.so
LoadModule setenvif_module modules/mod_setenvif.so
LoadModule version_module modules/mod_version.so
LoadModule ssl_module modules/mod_ssl.so
LoadModule unixd_module modules/mod_unixd.so
LoadModule status_module modules/mod_status.so
LoadModule autoindex_module modules/mod_autoindex.so
LoadModule cgid_module modules/mod_cgid.so
LoadModule dir_module modules/mod_dir.so
LoadModule alias_module modules/mod_alias.so
LoadModule rewrite_module modules/mod_rewrite.so
LoadModule wsgi_module modules/mod_wsgi.so
LoadModule php7_module
modules/libphp7.so
# On lance initialement httpd en tant que root, puis
immédiatement
# c'est l'utilisateur nobody (groupe nobody) qui en devient le
proprio
# ainsi s'il y a une faille dans Apache, le hacker au lieu de devenir
root
# devient daemon avec les droits qui vont avec
# pour vérifier que daemon est bien le proprio
# ps aux | grep httpd
User daemon
Group dameon
# ServerAdmin: Your address, where problems with the server
should be
# e-mailed. This address appears on some server-generated
pages, such
# as error documents.
# En cas de problème un email sera envoyé au webmaster, mettez donc
# ici l'adresse email du webmaster
ServerAdmin olivier@asterix.kervao.fr
(...)
# DocumentRoot: The directory out of which you will serve your
# documents. By default, all requests are taken from this directory,
but
# symbolic links and aliases may be used to point to other locations.
# C'est dans ce répertoire qu'on va trouver la page d'accueil
d'Apache
DocumentRoot "/usr/local/apache/htdocs"
(...)
# Définition des fichiers d'entrée
DirectoryIndex index.html index.html.var index.htm index.php
index.php index.php7
(...)
# nom du fichier d'erreur
ErrorLog logs/error_log
# niveau de log
# LogLevel: Control the number of messages logged to the error_log.
# Possible values include: debug, info, notice, warn, error, crit,
# alert, emerg.
#
LogLevel warn
(...)
# ordre de préférence des langues
# LanguagePriority allows you to give precedence to some languages
# in case of a tie during content negotiation.
#
# Just list the languages in decreasing order of preference. We have
# more or less alphabetized them here. You probably want to change
this.
#
LanguagePriority fr en da nl et de el it ja kr no pl
pt pt-br ltz ca es sv tw
En l'état s'est largement suffisant comme configuration pour faire tourner
un serveur Apache, on verra plus loin comment le personnaliser et
aller plus loin.
pour qu'apache soit lancé automatique à chaque démarrage on tapera systemctl enable httpd.service
Pour php, on aura besoin préalablement de d'oniguruma qu'on récupérera ici https://github.com/kkos/oniguruma/releases on décompresse l'archive en tapant :
tar xvfz onig-6.9.8.tar.gz
cela donne le répertoire onig-6.9.8 dans lequel on tape
./configure
make
puis en tant que root
make install
on installera également les packages argon2, argon2-devel, lib64gd-devel, lib64zip-devel et lib64sqlite3-devel on renvient à php qu'on décompresse en tapant
tar xvfj php-8.1.8.tar.bz2
Cela va créer un répertoire php-8.1.8. 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 --enable-bcmath=yes --enable-debug=no --with-zlib --with-kerberos --enable-mbstring --enable-ftp --with-mysqli --with-openssl --with-curl --enable-intl --with-ldap --enable-gd --with-zip --with-pdo-mysql --with-password-argon2 --with-freetype --with-external-gd --with-pear
Bizarrement il ne m'a pas trouvé ldap j'ai dû créer le lien suivant
ln -s /usr/lib64/libldap-2.4.so.2.11.5 /usr/lib/libldap.so
Tapez maintenant
make
si vous rencontrez l'erreur suivante
ldap.o: undefined reference to symbol 'ber_memfree'
il faudra éditer le fichier Makefile et au niveau de la ligne
définissant EXTRA_LIBS on rajoutera -llber on
retape make
Puis en tant que root
make install
Cette dernière commande va installer le module PHP sous /usr/local/apache2/modules
et modifier le fichier httpd.conf
en rajoutant
LoadModule php_module modules/libphp.so
On modifiera maintenant manuellement le fichier httpd.conf pour
qu'Apache prenne en compte PHP, à la suite des lignes
AddType application/x-compress .Z
AddType application/x-gzip .gz .tgz
On rajoute
AddType application/x-httpd-php .php .phtml
AddType application/x-httpd-php-source .phps
Par ailleurs à la ligne
DirectoryIndex index.html
On rajoutera
DirectoryIndex index.html index.htm index.php
A présent on va copier le fichier php.ini-production se trouvant dans le répertoire de PHP pour le mettre sous /usr/local/apache2/conf et en le renommant php.ini
cp php.ini-production /usr/local/apache2/conf/php.ini
Dans le cas d'une ancienne installation de php,
vous avez tout intérêt à repartir du nouveau fichier
php-dist.ini fourni et de le remodifier.
Dans le répertoire /usr/local/apache/htdocs on trouve les
fichiers qui seront accessibles à partir de la page d'accueil de votre
serveur Apache.
On relance Apache
systemctl restart httpd
Créer maintenant le fichier infophp.php contenant
<?php
phpinfo();
?>
Que vous placerez sous /usr/local/apache2/htdocs, 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 rajouter préciser la position du fichier socket de mysql dans le fichier php.ini
pdo_mysql.default_socket=/var/run/mysqld/mysqld.sock
sinon avec phpMyAdmin vous pourriez avoir une erreur du styleUserDir /home/httpd
Ainsi pour l'utilisateur toto quand vous taperez comme URL http://serveur-apache/~toto, apache ira chercher le fichier index.htm sous /home/httpd/toto. On peut aller plus loin en spécifiant un répertoire particulier, /home/httpd/toto/html par exemple, en écrivant:
UserDir /home/httpd/*/html
Alias /icons/
"/usr/local/apache/icons/"
Alias /doc "/usr/doc/html/"
on rajoute ensuite pour chacun des répertoires
<Directory
"/usr/doc/html">
Options Indexes FollowSymLinks Includes ExecCGI
AllowOverride All
Require all granted
</Directory>
NOTE Si vous mettre /doc/ à la place de /doc dans l'URL il faudra taper http://obelix/doc/, si vous omettez le dernier /, vous aurez une erreur.
# définition des fichiers de protection
des pages
AccessFileName .htaccess
il faut bien évidemment relancer apache.
Tous les fichiers à accès limité doivent être concentrés dans un même répertoire /home/olivier/public_html/reserve par exemple, il suffit de créer dans celui-ci un fichier qu'on devra nommer .htaccess contenant:
AuthUserFile auth/olivier.users
AuthGroupFile auth/olivier.group
AuthName "Acces Restreint"
AuthType Basic
require group autorise
Le fichier olivier.users va
contenir une liste d'utilisateurs, il va se trouver sous le répertoire /usr/local/apache2/auth
(éventuellement à créer), pour info vous pouvez changer le chemin /usr/local/apache2
en modifiant la valeur de la variable ServerRoot qu'on trouve
dans le fichier httpd.conf. Le fichier olivier.group
correspond à une liste des groupes de personnes, ces mêmes personnes ayant
été défini dans le fichier olivier.users. Le principe consiste à
créer un groupe de personnes autorisées et à leur attribuer un mot de
passe à chacune, seul ce groupe pourra accéder à la section réservée.
Pour créer ces fichiers il suffit, en tant que root, d'une part de créer
le répertoire /usr/local/apache2/auth, puis de taper:
htpasswd -c /usr/local/apache2/auth/olivier.users olivier
Pour info cet exécutable se trouve dans le répertoire d'installation d'apache précisement sous httpd-2.4.54/support. L'option -c correspond à la création du fichier olivier.users. On va alors avoir à rentrer un mot de passe pour l'utilisateur olivier.
New password:
On confirme
Re-type new password:
Adding password for user olivier
Pour créer un autre utilisateur veronique vous taperez la même commande sans l'option de création :
htpasswd /etc/httpd/auth/olivier.users veronique
Toujours en tant que root, créer le fichier /usr/local/apache2/auth/olivier.group qui contiendra la liste des personnes autorisées à accéder aux pages réservées :
autorise: olivier veronique
Maintenant quand à partir de votre navigateur préféré quand vous allez rentrer comme URL http://obelix/~olivier/reserve, vous aurez une fenêtre popup qui va s'ouvrir vous demandant de rentrer votre nom d'utilisateur et le mot de passe préalablement rentré.
Notez que pour que quelqu'un ne puisse jeter un coup d'oeil dans les fichiers .htaccess de vos utilisateurs, le fichier httpd.conf doit contenir la directive suivante:
<Files ~ "^\.ht">
Order allow,deny
Deny from all
Satisfy All
</Files>
On va rajouter tout à la fin du fichier:
<VirtualHost 192.168.13.11>
ServerName obelix.breizland.bz
DocumentRoot /usr/local/apache2/htdocs
ErrorLog logs/obelix-error_log
TransferLog logs/obelix-access_log
</VirtualHost>
<VirtualHost 192.168.13.11>
ServerName www.asterix.breizland.bz
DocumentRoot /usr/local/asterix
ErrorLog logs/asterix-error_log
TransferLog logs/asterix-access_log
</VirtualHost>
<VirtualHost 192.168.13.11>
ServerName www.idefix.breizland.bz
DocumentRoot /usr/local/idefix
ErrorLog logs/idefix-error_log
TransferLog logs/idefix-access_log
</VirtualHost>
pour chacun des répertoires je dois créer ensuite les instructions suivantes
<Directory "/usr/local/asterix">
Options Indexes FollowSymLinks Includes ExecCGI
AllowOverride All
Require all granted
</Directory>
Relancez Apache en tapant:
systemctl restart httpd
Maintenant nous allons créer nos hôtes asterix et idefix,
pour cela vous avez deux méthodes:
- rajouter www.asterix.breizland.bz et www.idefix.breizland.bz
dans /etc/hosts sur la même ligne que votre serveur Apache
(obelix dans notre exemple).
192.168.13.11 obelix obelix.breizland.bz www.asterix.breizland.bz www.idefix.breizland.bz
Normalement si vous faites un ping sur www.idefix.breizland.bz ça devrait marcher, pour les postes clients il faudra rajouter la même ligne dans le fichier hosts (non nécessaire).
- si vous disposez d'un serveur DNS sur votre machine, au niveau de votre config DNS dans votre fichier breizland.bz qui se trouve sous /var/named vous devez rajouter tout à la fin:
www.asterix A 192.168.13.11
www.idefix A 192.168.13.11
Relancez le DNS en tapant:
systemctl restart dns
Pour tester tapez dans un shell:
ping www.asterix.breizland.bz
Maintenant dans le champ URL de votre navigateur préféré:
http://www.asterix.breizland.bz
Et là, normalement vous devriez voir s'afficher la page que vous avez placé sous /usr/local/asterix
Dans l'hypothèse où vous utilisez deux serveurs Apache
(versions 1.3 et 2 par exemple), vous pouvez spécifier le port 80 pour Apache 1.3 et le port 8080 pour Apache 2 en fixant dans le fichier de
configuration Listen à 8080. Au
niveau de la déclaration des hôtes virtuels il faudra mettre quelque chose
comme ça
<VirtualHost 192.168.13.11:8080>
ServerName tosh.kervao.fr
DocumentRoot /usr/local/apache2/htdocs
ErrorLog logs/tosh-error_log
TransferLog logs/tosh-access_log
</VirtualHost>
Si votre site est accessible par internet je
vous conseille de créer un certificat qui sera valable sur internet avec let's encrypt. Dans le cas présent
on va créer un certificat perso auto signé qui ne marchera que pour mon
réseau privé comme j'ai pu le faire pour sendmail
et dovecot. On veillera à
ce que les répertoires /etc/ssl/apache et /etc/ssl/public
soient préalablement créés.
openssl req -new -x509 -nodes
-out /etc/ssl/public/apache.crt -keyout /etc/ssl/apache/apache.key
voilà
le résultat
Generating a 2048
bit RSA private key
...+++
...................+++
writing new private key to '/etc/ssl/apache/apache.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]:FR
State or Province Name (full name) [Some-State]:Bretagne
Locality Name (eg, city) []:Brest
Organization Name (eg, company) [Internet Widgits Pty Ltd]:None
Organizational Unit Name (eg, section) []:None
Common Name (e.g. server FQDN or YOUR name) []:www.asterix.breizland.bz
Email Address []:olivier.hoarau@funix.org
On va modifier maintenant le fichier de configuration d'apache /usr/local/apache2/conf/httpd.conf en activant les modules suivants
LoadModule ssl_modulemodules/mod_ssl.so
LoadModule log_config_module modules/mod_log_config.so
LoadModule setenvif_module modules/mod_setenvif.so
LoadModule socache_shmcb_module modules/mod_socache_shmcb.so
tout en pensant à ce que la redirection vers le port 443 soit bien en place
<VirtualHost 192.168.0.13:443>
ServerName funix.kervao.fr
DocumentRoot /data/homepage/www.funix.org
ErrorLog logs/funix-error_log
TransferLog logs/funix-access_log
SSLEngine on
# on pointe vers le certificat et la clé privée
SSLCertificateFile /etc/ssl/public/apache.crt
SSLCertificateKeyFile /etc/ssl/apache/apache.key
</VirtualHost>
Dans le fichier /usr/local/apache2/conf/extra/httpd-ssl.conf on y trouve
#on pense à ouvrir le port 443 sur le
firewall et on se connecte normalement sur le site. La première fois avec
un certificat perso auto signé non reconnu par une autorité de
certification il faudra accepter l'exception de sécurité, en cliquant sur
Accepter le risque et poursuivre
On surfe maintenant de manière sécurisée sur le site.
Pour aller plus loin sur le sujet, voir la doc très complète d'Apache à ce sujet.
ScriptAlias /cgi-bin/ /usr/local/apache2/cgi-bin/
Pour que les scripts CGI soient exécutés dans les répertoires accessibles via HTTP, il faudra rajouter l'option ExecCGI comme ceci
<Directory "/monrepertoire">
Options Indexes FollowSymLinks Includes ExecCGI
AllowOverride All
Require all granted
</Directory>
on relance bien sûr apache en cas de modification du fichier
httpd.conf
Le but de l'exercice est de créer un script perl CGI qui va traiter un formulaire quelconque d'une page HTML. Vous allez créer votre script perl sous /usr/local/apache2/cgi-bin, et le nommer form.pl, voici son contenu:
#!/usr/bin/perl
use CGI;
$html=new CGI;
print $html->header;
print "<HTML>\n";
print "<HEAD>\n";
print "<TITLE>Premier script CGI perl</TITLE>\n";
print "</HEAD>\n";
print "<BODY>\n";
print "<H1>Traitement du formulaire</H1>\n";
print "Nom :";
print $html->param('nom');
print "<p>\n";
print "Email :";
print $html->param('email');
print "<p>\n";
print "Commentaire:";
print $html->param('comment');
print "</BODY>\n";
print "</HTML>\n";
Donner les droits qui vont bien avec ce fichier:
chmod 755 form.pl
En tant qu'utilisateur standard (olivier dans notre exemple), créer maintenant le fichier HTML suivant que vous appellerez formulaire.htm
<html>
<body>
<h2>Formulaire</h2>
<form action="http://obelix/cgi-bin/form.pl" METHOD=GET>
Nom: <input type="text" name=nom size=20><br>
Email: <input type="text" name=email size=30><br>
Commentaire: <input type="text" name=comment size=100><br>
<input type=submit value="Envoyer"> <input type=reset
value="remettre à zéro">
</form>
</body>
</html>
Voilà maintenant quand vous allez accéder à http://obelix/~olivier/formulaire.htm
, vous allez avoir une page du style:
En appuyant sur Envoyer ça va déclencher l'exécution du script CGI perl, qui va provoquer l'affichage des valeurs précédemment saisies.
--with-ldap=/var/lib/ldap
/var/lib/ldap devant être remplacé par le chemin où se trouve votre base LDAP. Recompilez puis réinstallez le module qui va bien :
make
Et en tant que root
make install
Relancez Apache
systemctl restart httpd
Voilà un petit programme qui va nous permettre de rajouter une entrée dans la base, libre à vous maintenant de créer des formulaires de saisie, de destruction, et de recherche:
Appelez ce fichier ldap.php, vous pouvez le tester et vérifier que l'entrée a bien été saisie dans la base.
<?php
$serveur="localhost";
$login="olivier";
$pass="mot-de-passe";
$base="essai";
$table="coord";
$id=MYSQL_CONNECT($serveur,$login,$pass);
mysql_select_db($base);
$nom="hoarau";
$prenom="olivier";
$email="olivier.hoarau@fnac.net";
$query="INSERT INTO $table VALUES('$nom','$prenom','$email')";
$result=mysql_query($query,$id);
echo "Saisie terminée";
?>
Placer ce script dans ~/public_html et appeler le bd1.php
Dans votre navigateur préféré, dans le champ URL saisissez :
http://obelix/~olivier/bd1.php
A priori y a pas grand chose qui s'est passé, maintenant connecter vous à votre base essai dans un shell
[olivier@obelix olivier]$ mysql -u olivier -p essai
Enter password:
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MariaDB connection id is 91
Server version: 10.8.3-MariaDB Source distribution
Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.
Type 'help;' or '\h' for help. Type '\c' to clear the current input
statement.
MariaDB [(essai)]> SELECT * FROM coord;
+-----+-------+--------------------+
| nom | prenom |
email
|
+-----+-------+--------------------+
| hoarau | olivier | olivier.hoarau@fnac.net |
+-----+-------+--------------------+
1 row in set (0.00 sec)
C'est bon ça fonctionne. Passons à un exemple plus pointu, on va entrer les informations concernant vos visiteurs dans une base MySQL , créer la table telle que décrite dans l'exemple 2 de la page MariaDB, créer maintenant le script PHP.
<?php
$page=getenv("HTTP_REFERER");
$ip=getenv( "REMOTE_ADDR");
$host=gethostbyaddr($ip);
$d = date("d/m/Y H:i:s");
$expl=getenv("HTTP_USER_AGENT");
$serveur="localhost";
$login="olivier";
$pass="mot-de-passe";
$base="essai";
$table="ref";
$id=MYSQL_CONNECT($serveur,$login,$pass);
mysql_select_db($base);
$query="INSERT INTO $table
VALUES('$d','$host','$ip','$expl','$page')";
$result=mysql_query($query,$id);
echo "$d $host($ip) $expl $page";
?>
Nommez ce script bd2.php et placez le dans ~/public_html . Dans votre navigateur préféré tapez dans le champ URL
http://obelix/~olivier/bd2.php
Vous devriez voir la date, le nom de votre machine avec son adresse IP et des infos sur votre OS et votre navigateur. A présent connectons nous à la base:
[olivier@obelix olivier]$ mysql -u olivier -p essai
Enter password:
Welcome to the MariaDB monitor.
Commands end with ; or \g.
Your MariaDB connection id is 91
Server version: 10.8.3-MariaDB Source distribution
Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
MariaDB [(essai)]> SELECT * FROM ref;
+---------------+---------------+----------+-----------------+-----+
|
date
|
host
|
ip
|
os
|
page |
+---------------+---------------+----------+-----------------+-----+
| 24/04/2000 08:34:05 | asterix.armoric.bz | 192.168.13.11 |
Mozilla/4.61 [en] (X
| |
+---------------+---------------+----------+-----------------+-----+
1 row in set (0.00 sec)
C'est bon le visiteur a bien été pris en compte.
Maintenant que vous savez comment Apache fonctionne avec MariaDB et PHP, laissez libre cours à votre imagination.
L'archive se présente sous la forme d'un zip qu'on décompresse en
tapant :
unzip phpMyAdmin-5.2-all-languages.zip
Cela va créer dans le répertoire de travail un répertoire phpMyAdmin-5.2-all-languages. Dans ce répertoire vous avez un fichier config.inc.sample.php, il faut le copier en config.inc.php, dans ce fichier il faut modifier les champs suivants :
Pour cette variable on peut mettre un peu n'importe quoi pourvu que ça fasse 32 octets ! En mettant une ligne de 32 caractères ça semble passer, ça sert ensuite pour chiffrer de manière aléatoire.
$cfg['blowfish_secret'] = 'je suis toto et il faut que la phrase soit suffisamment longue'; /* YOU MUST FILL IN THIS FOR COOKIE AUTH! */
j'ai défini également cette variable
$cfg['DefaultLang'] = 'fr';
pour le reste j'ai laissé les valeurs par défaut à savoir
Maintenant on doit rendre accessible le répertoire phpMyAdmin
d'une page web, pour cela deux solutions:
- (solution simple) placer phpMyAdmin dans /usr/local/apache/htdocs
et au niveau de la page d'accueil d'apache faire un lien vers /usr/local/apache/htdocs/phpMyAdmin-5.2-all-languages/index.php
- (solution préconisée), créer un hôte virtuel pointant vers ./phpMyAdmin-5.2-all-languages
qu'on appelera www.sql.breizland.bz .
Si vous avez l'erreur
mysqli_real_connect(): (HY000/2002): No such file or directory
dans le fichier de configuration il faudra remplacer localhost par 127.0.01 comme ceci
$cfg['Servers'][$i]['host'] = '127.0.0.1';
si vous avez maintenant l'erreur
$cfg['TempDir'] (./tmp/) n'est pas accessible. phpMyAdmin est incapable de mettre en cache les modèles et de ce fait sera lent.
dans le fichier config.inc.php il faudra définir la variable
$cfg['TempDir'] = '/tmp';
Pour cette erreur
Créer une base de données nommée « phpmyadmin » et la configuration du stockage de phpMyAdmin dans cette base.
dans le fichier de configuration config.inc.php on décommentera les lignes suivantes
/* Storage database and tables */
$cfg['Servers'][$i]['pmadb'] = 'phpmyadmin';
$cfg['Servers'][$i]['bookmarktable'] = 'pma__bookmark';
$cfg['Servers'][$i]['relation'] = 'pma__relation';
$cfg['Servers'][$i]['table_info'] = 'pma__table_info';
$cfg['Servers'][$i]['table_coords'] = 'pma__table_coords';
$cfg['Servers'][$i]['pdf_pages'] = 'pma__pdf_pages';
$cfg['Servers'][$i]['column_info'] = 'pma__column_info';
$cfg['Servers'][$i]['history'] = 'pma__history';
$cfg['Servers'][$i]['table_uiprefs'] = 'pma__table_uiprefs';
$cfg['Servers'][$i]['tracking'] = 'pma__tracking';
$cfg['Servers'][$i]['userconfig'] = 'pma__userconfig';
$cfg['Servers'][$i]['recent'] = 'pma__recent';
$cfg['Servers'][$i]['favorite'] = 'pma__favorite';
$cfg['Servers'][$i]['users'] = 'pma__users';
$cfg['Servers'][$i]['usergroups'] = 'pma__usergroups';
$cfg['Servers'][$i]['navigationhiding'] = 'pma__navigationhiding';
$cfg['Servers'][$i]['savedsearches'] = 'pma__savedsearches';
$cfg['Servers'][$i]['central_columns'] = 'pma__central_columns';
$cfg['Servers'][$i]['designer_settings'] = 'pma__designer_settings';
$cfg['Servers'][$i]['export_templates'] = 'pma__export_templates';
Dans la console SQL en bas de l'écran on créera la base phpmyadmin
CREATE DATABASE IF NOT EXISTS `phpmyadmin`
DEFAULT CHARACTER SET utf8 COLLATE utf8_bin;
USE phpmyadmin;
CTRL+enter pour exécuter
On sélectionne la base phpmyadmin à gauche et toujours dans la console on créera les tables qu'on trouvera dans le fichier phpMyAdmin-5.2-all-languages/sql/create_tables.sql
CREATE TABLE IF NOT EXISTS `pma__bookmark` (
`id` int(10) unsigned NOT NULL auto_increment,
`dbase` varchar(255) NOT NULL default '',
`user` varchar(255) NOT NULL default '',
`label` varchar(255) COLLATE utf8_general_ci NOT NULL default '',
`query` text NOT NULL,
PRIMARY KEY (`id`)
)
COMMENT='Bookmarks'
DEFAULT CHARACTER SET utf8 COLLATE utf8_bin;
CTRL+enter pour exécuter, etc.
NOTE Si ça vous gène que n'importe qui d'un navigateur puisse aller dans le répertoire phpMyAdmin, mettez y des restrictions d'accès avec un fichier .htaccess.
Avec la solution hôte virtuel, à partir d'un navigateur quand on sélectionne www.sql.breizland.bz on tombe d'abord sur une bannière de login, ensuite sur une fenêtre avec frame avec à gauche la liste des bases de données disponibles et à droite, le menu suivant:
Pour travailler sur une base de données particulières il suffit de la sélectionner dans le choix déroulant à gauche, on retrouve d'ailleurs notre base essai, pour en créer une autre il suffit de choisir Bases de données puis Créer une base de données.
Si on sélectionne essai par exemple on obtient
Vous pouvez donc créer des nouvelles tables, faire des requêtes SQL, etc.
A noter que si vous avez une erreur de chargement de phpMyAdmin du style
Error during session start; please check your PHP and/or webserver log
file and configure your PHP installation properly. Also ensure that
cookies are enabled in your browser.
session_start(): open(SESSION_FILE, O_RDWR) failed: No such file or
directory (2)
session_start(): Failed to read session data: files (path: )
il faudra éditer le fichier /usr/local/apache2/conf/php.ini et modifier la ligne suivante
session.save_path = "/tmp"vous mettez le répertoire temporaire que vous voulez.
Maintenant pour une connexion sécurisée on rajoutera dans le fichier config.inc.php
$cfg['Servers'][$i]['ssl'] = true;
$cfg['Servers'][$i]['ssl_key'] ='/etc/mysql/ssl/client-key.pem';
$cfg['Servers'][$i]['ssl_cert'] = '/etc/mysql/ssl/client-cert.pem';
$cfg['Servers'][$i]['ssl_ca'] = '/etc/mysql/ssl/ca-cert.pem';
$cfg['Servers'][$i]['ssl_ca_path'] = '/etc/mysql/ssl/';
$cfg['Servers'][$i]['ssl_verify'] = 'true';
$cfg['Servers'][$i]['ssl_ciphers'] = 'ECDHE-RSA-AES256-GCM-SHA384';
il faudra sans doute rajouter également le nom du serveur tel que défini plus haut
$cfg['Servers'][$i]['host'] = '127.0.0.1';$cfg['Servers'][$i]['host'] = 'mariadb-serveur';
ça évitera ce genre d'erreur
mysqli::real_connect(): Peer certificate CN=`mariadb-serveur' did not match expected CN=`127.0.0.1'
et voilà quand on va se connecter, voilà ce que ça va donner dans les propriétés de MariaDB
Il faudra éviter également un autre piège avec les connexions sécurisées si votre utilisateur est déclaré comme étant user@localhost dans la base mysql, vous n'arriverez pas à vous connecter avec user@mariadb-serveur, il faudra créer un nouvel utilisateur user@mariadb-serveur.
[Retour page d'accueil FUNIX] | [retour haut de la page ] |