Apache

De OpenWikiBSD
Aller à : navigation, rechercher

Debian

En fait c'est apache2 en l'occurence.

  • Activation de SSL :
a2enmod ssl && /etc/init.d/apache2 restart
cp /nagios.pem /etc/ssl/certs
chmod 444 /etc/ssl/certs/nagios.pem 

vi /etc/apache2/sites-avalaible/default-ssl





  • a2enmod Nom_du_Module_à_activer

COntenu dans /etc/apache2/

  • a2ensite Nom_du_site_à_activer

Contenu dans /etc/apache2/sites-avalaible

Installation de base/OpenBSD

Installé, mais pas activé par défaut dans l'installation de base.

User www group www Identité sous laquelle tourne Apache dès que le serveur s'est "accroché" (bind to) aux ports privilégiés (< 1024) standards 80 (http) et 443 (https) pour lesquels un privilège superutilisateur est nécessaire.

Depuis la 3.2 httpd, le démon Apache est chrooté (mis en prison) dans /var/www. Ceci augmente drastiquement la sécurité de la mchine en cas de compromission du service web, l'attaquant se retrouve avec l'identité www.www dans une prison dont la racine virtuelle est /var/www.

Cela implique quelques menues acrobaties pour faire communiquer apache avec, au hasard, MySQL...

httpd.conf

Section 1:Global Environment

  • ServerAdmin Mon_email

Section 2 : Main server configuration

  • DirectoryIndex index.html index.php Si vous voulez éviter qu'en l'absence d'index.html dans un répertoire de script php, vous vous retrouviez avec la liste des fichiers présents..
  • ServerSignature On Off Email

Qu'est ce qui apparait en cas d'erreur 404 ? le nom et la version d'apache / Rien / L'email de l'administrateur

Gestion des hôtes virtuels basés sur le nom

Apache répond, évidemment , aux normes http 1.1; il est capable d'héberger et de répondre à plusieurs noms de machines, de domaines avec un nombre réduit d'adresses IP :

Vous n'avez qu'une seule adresse IP fixe publique (Ce n'est deja pas mal!) et vous voulez heberger deux (ou plus) serveurs répondant à des noms radicalement différents. Pour cela vous devez utiliser la notion d'hôte virtuel. Attention les vieux clients http 1.0 ne sauront pas résoudre ce nom.

Dans la section 3: Virtual Hosts, ajoutez les lignes suivantes :

  1. Évidemment vous rangerez cela comme vous voulez chez vous..

#<VirtualHost _default_:*>

</VirtualHost>
######Config de mon premier serveur virtuel

<VirtualHost Mon_IP_Publique > Définition du bloc d'instructions relatives au premier hote virtuel

 ServerAdmin email-1 Adresse admin de cet hôte virtuel

 ServerName [http://www.openbsd-edu.net  www.mon_domaine-1 ] Son nom DNS

 ServerAlias *[http://www.openbsd-edu.net .mon_domaine-1] Intercepte toute connexion vers n"importe_quoi.openbsd-edu.net

 DocumentRoot /var/www/[http://www.openbsd-edu.net mon_domaine-1]/ Les documents publiés par cet hôte

 ScriptAlias /cgi-bin/ /var/www/[http://www.openbsd-edu.net mon_domaine-1]/cgi-bin/ Les scripts CGI qui li sont particuliers.

 TransferLog /var/www/[http://www.openbsd-edu.net mon_domaine-1]/logs/access_log Ses logs d'accès

 ErrorLog /var/www/[http://www.openbsd-edu.net mon_domaine-1]/logs/error_log Ses logs d'erreur

</VirtualHost>

######Config de mon second serveur virtuel



<VirtualHost Mon_IP_Publique > 

 ServerAdmin email-2 

 ServerName [http://www.openbsd-edu.net www.mon_domaine-2 ]

 ServerAlias *[http://www.openbsd-edu.net .mon_domaine-2]

 DocumentRoot /var/www/[http://www.openbsd-edu.net mon_domaine-2]/ 

 ScriptAlias /cgi-bin/ /var/www/[http://www.openbsd-edu.net mon_domaine-2]/cgi-bin/ 

 TransferLog /var/www/[http://www.openbsd-edu.net mon_domaine-2]/logs/access_log 

 ErrorLog /var/www/[http://www.openbsd-edu.net mon_domaine-2]/logs/error_log 

</VirtualHost> 

######Config de mon troisième serveur virtuel '''''en HTTPS'''''



<VirtualHost Mon_IP_Publique:443 > 

 ServerAdmin email-3 

 ServerName [http://www.openbsd-edu.net www.mon_domaine-3]

 ServerAlias *[http://www.openbsd-edu.net .mon_domaine-3]

 DocumentRoot /var/www/[http://www.openbsd-edu.net mon_domaine-3]/ 

 ScriptAlias /cgi-bin/ /var/www/[http://www.openbsd-edu.net mon_domaine-3]/cgi-bin/ 

 TransferLog /var/www/[http://www.openbsd-edu.net mon_domaine-3]/logs/access_log 

 ErrorLog /var/www/[http://www.openbsd-edu.net mon_domaine-3]/logs/error_log 

 SSLCertificateFile /etc/ssl/MonSRV-cert.pem

 SSLCertificateKeyFile /etc/ssl/private/MonSRV-key.pem


 </VirtualHost>
    1. Les hotes virtuels en ssl doivent inclure dans leur définition la partie de fichier (plus loin) gérant ces définitions.


Vérification de la configuration :

apachectl configtest

Pour relancer apache :

apachectl restart

Pour relancer apache le plus doucement possible :

apachectl graceful


Gestion des fichiers .htaccess

Par défaut, ils ne sont pas pris en compte.

Pour cela, il faut le dire à Apache :

Changer

    AllowOverride None

en

    AllowOverride Authconfig

dans la partie qui vous intéresse. Exemple :


Et relancer le biniou :

 apachectl stop
apachectl startssl


Mettons que vous mettiez cela dans votre .htaccess

AuthType Basic require valid-user 

Dans, httpd.conf, il faudra donner le chemin complet en partant de la racine du chroot !

/htpasswd.users

Pour un fichier /var/www/htpasswd.users

Mais, bon, depuis qques temps, j'utilise une autre méthode plus souple dès qu'on dépasse une dizaine d'utilisateurs :

Authentification LDAP sur Apache

On installe mod_auth_ldap

pkg_add ftp://ftp.irisa.fr/pub/OpenBSD/$(uname -r)/packages/$(uname -m)/mod_auth_ldap

Puis on ajoute dans httpd.conf les authentifications

Include /var/www/conf/Auth_ssl_Documents

Et on lit la bible aussi : [1] bien que ce soit apache 2.0, pas mal de docs marchent en 1.3

Avec OpenLDAP

Avec Auth_ssl_Documents qui contient :

<Directory "/var/www/htdocs/ssl/Documents">
AuthType Basic
AuthName "Authentification Ldap"
#AuthLDAPGroupAttribute memberUid
#AuthLDAPGroupAttributeIsDN off
#Require group ou=People,....mon basedn du se3
Require valid-user
AuthLDAPURL ldap://@IPduse3:389/ou=People,....mon basedn du se3

qui autorisera tout utilisateur appartenant à l'ou=People.


Si vous voulez limiter à un groupe précis, le fichier devient:

<Directory "/var/www/htdocs/ssl/Profs">
AllowOverride AuthConfig

AuthType Basic
AuthName "Authentification Ldap"
AuthLDAPGroupAttribute memberUid
AuthLDAPGroupAttributeIsDN off
Require group cn=profs,ou=Groups,....mon basedn du se3
Require group cn=cpe,ou=Groups,....mon basedn du se3
Require group cn=persdir,ou=Groups,....mon basedn du se3
AuthLDAPURL ldap://@IPduse3:389/ou=People,....mon basedn du se3
</Directory>

qui autorisera les cpe, persdir et profs à accéder à la ressource.

Avec Active Directory

Attention, si vous utilisez userPrincipalName comme identifaint, vous devrez avoir un login en USER@DOMAINE, sinon, utilisez sAMAccountName:

Si vous voulez parcourir une OU et autoriser tout utilisateur authentifié:

<Directory "/var/www/htdocs/ssl/URL">
AllowOverride AuthConfig
AuthType Basic
AuthName "Authentification Ldap"
AuthLDAPURL ldap://IP:389/BASEDN?userPrincipalName
AuthLDAPBindDN "USER"
AuthLDAPBindPassword "PASS"
require valid-user
require dn DNPROF
</Directory>

Si vous voulez parcourir toutes les sous-OU et autoriser tout utilisateur authentifié:

<Directory "/var/www/htdocs/URL1">
AllowOverride AuthConfig
AuthType Basic
AuthName "Authentification sur l' annuaire"
AuthLDAPURL ldap://@IP:389/OU=UTILISATEURS,BASEDN?userPrincipalName?sub?(objectClass=*)
AuthLDAPBindDN "USER"
AuthLDAPBindPassword "PASS"
require valid-user  
</Directory>

Si vous voulez parcourir toutes les sous-OU et autoriser seulement certains utilisateurs authentifiés:

<Directory "/var/www/htdocs/URL2">
AllowOverride AuthConfig
AuthType Basic
AuthName "Authentification sur l' annuaire"
AuthLDAPURL ldap://@IP:389/OU=UTILISATEURS,BASEDN?userPrincipalName?sub?(objectClass=*)
AuthLDAPBindDN "USER"
AuthLDAPBindPassword "PASS"
require user USER1 USER2
</Directory>

httpS

Un serveur https en 3 lignes et 10 minutes !

Apache sait délivrer des flux cryptésTLS simultanément à des flux non cryptés. Les uns sur le port 443, les autres sur le classique port 80.

NB : TLS (Transport Layer Security, Sécurité de la couche transport) est la version de l'IETF du protocole SSL (Secure Socket Layer) inventé par Netscape.

Tout se fait dans /etc/ssl/private.

  • On crée la clé RSA 1024 bits du serveur :
openssl genrsa -out /etc/ssl/private/server.key 1024

Si on préfère un clé chiffrée par une passphrase(mais alors il faut être devant le serveur au démarrage..), :

openssl genrsa -des3 -out /etc/ssl/private/server.key 1024

Il faut maintenant créer la requête signée de certification utilisée pour la demande de certification auprès d'une autorité de certification. Préparez votre portefeuille ou votre pki privée...

openssl req -new -key /etc/ssl/private/server.key -out /etc/ssl/private/server.csr

Il vous sera demandé successivement :

Country Name (2 letter code) []:
State or Province Name (full name) []:
Locality Name (eg, city) []:
Organization Name (eg, company) []:
Organizational Unit Name (eg, section) []:
Common Name (eg, fully qualified host name) []:''Le nom DNS du serveur '''Indispensable'''''
Email Address []:''L'adresse du hostmaster de votre serveur'' '''''Indispensable'''''
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:''Entrée''
An optional company name []:''Entrée''


  • Puis vous envoyez le fichier server.csr à Thawte ou autre autorité de certification.Si vous n'avez pas les moyens de sortir la centaine de dollars annuels, vous pouvez utiliser des certificats auto-signés ou alors utilisez une bonne PKI. Le seul inconvénient est que vous n'êtes pas une autorité de certification, les navigateurs émettront un message d'alerte (désactivable pour partie) lors de la consultation de votre site.
Pour auto-signer :
openssl x509 -req -days 365 -in /etc/ssl/private/server.csr -signkey /etc/ssl/private/server.key -out /etc/ssl/server.crt


  • Puis modifiez /etc/rc.conf en httpd="-DSSL"
Si vous voulez profitez du https sans avoir à redémarrer, : /usr/sbin/apachectl startssl. (un simple apachectl restart n'est pas suffisant!!).
Votre machine est maintenant accessible par https://votre_machine sur le port 443.


Apache SSL sous un autre OS

Debian

apt-get install apache2 openssl
a2enmod ssl
vi /etc/apache2/ports.conf

Commenter les deux lignes pour virer l'accès http en clair.

#NameVirtualHost *:80
#Listen 80


Copier le certificat .pem créé par TinyCA dans /etc/ssl/certs/Fichier.pem

Gérer les droits chmod 744 /etc/ssl/certs/nagios.pem

Puis ajouter dans /etc/apache2/sites-enabled/000-default

<VirtualHost *:443>
       ServerName nagios.lyceenobel.org
       DocumentRoot /var/www/
       ErrorLog /var/log/apache2/error.log
       CustomLog /var/log/apache2/access.log combined
       SSLEngine on
       SSLCertificateFile /etc/ssl/certs/nagios.pem
</VirtualHost>

Ou bien suivre ca :

apt-get install openssl
mkdir /etc/apache2/ssl
/usr/sbin/make-ssl-cert  /usr/share/ssl-cert/ssleay.cnf  /etc/apache2/ssl/apache.pem
vi /etc/apache2/sites-available/default-ssl 

Pour Nagios, par ex.

a2ensite default-ssl
service apache2 reload

Versions de algo de chiffrement

Il est largement temps d'interdire autre chose que TLS ! Ajouter

SSLProtocol All -SSLv3 -SSLv2

dans

/etc/apache2/sites-available/default-ssl

ou

/var/www/conf/httpd.conf

et reloader la config d'Apache

Authentification du client

Il est facile de n'autoriser l'accès à un serveur https qu'à un nombre restreint de clients; ceux disposant d'un certificat client émis par une AC autorisée.

SSLVerifyClient require
SSLVerifyDepth  5

Signifiant qu'il faut un certificat émis par la même AC que citée précédemment (ligne SSLCACertificateFile) et dont le nombre d'AC intermédiaires est de 3 (5-1-1) maximum.


Un client sans certificat donnera dans les logs d'Apache:

[error] SSL handshake failed (server www.openbsd-edu.net:443, client @IP) (OpenSSL library error follows)
[error] OpenSSL: error:140890C7:SSL routines:SSL3_GET_CLIENT_CERTIFICATE:peer did not return a certificate [Hint: No CAs known 
to server for verification? ]

IPv6

Contrairement aux versions des autres OS, la version 1.3 sous OpenBSD est fonctionnelle en IPv6 ! Inutile de passer en apache 2; en tout cas, pas pour cette raison.

httpd -6

Remarques sur la sécurité :

1. Attention aux dénis de service (DoS) !

Le dialogue entre le serveur et le client étant chiffré, Toutes les données (pas les en-têtes) doivent être chiffrées/déchiffrées par chacune des parties. Ceci induit une forte surcharge CPU (D'un facteur 10, voire plus entre un apache https et un apache http). Or, si, normalement, un client ne gère qu'un seul flux https simultané, il n'en est pas de même du serveur. Il peut s'effondrer avec seulement une vingtaine de requêtes simultanées. (Attention, il peut s'agir de simples paquets identiques envoyés de manière répétitive; le serveur essaiera systématiquement de la déchiffrer.)

Une solution pourrait être d'investir dans un de ces coûteux accélérateurs cryptographiques qu'OpenBSD sait gérer nativement, mais ce n'est qu'une protection d'échelle, il faudrait peut-être aller jusqu'à 200 connexions SSL simultanées pour écrouler votre serveur.| Le document d'origine.


  • Attention au passage que vous faites dans votre beau coupe-feu !

Le flux étant chiffré, il peut contenir n'importe quoi, en particulier des troyens, des tentatives de hack, des scans de port......bref que des cochonneries que votre beau FireWall, ou votre bel IDS ne verront pas passer. Ceci, à moins de déchiffrer le flux avant de le faire arriver à la zone protégée.


En conclusion, n'utilisez pas https parce que c'est à la mode, mais parce qu'il répond à un réel besoin.

Webalizer

Webalizer est un analyseur de logs, très orienté logs de serveur Web, Apache au hasard...

Ca s'installe tout seul
  • cd /usr/ports/www/webalizer && make && make install &&& make clean

et ça se configure aussi facilement.

  • cp /usr/local/share/examples/webalizer/sample.conf /etc/webalizer.conf


Pour lancer l'activation des requêtes inverses, afin de connaitre vos clients : webazolver -D DNSCache. Ca peut être relativement long à 1 requete inverse par secone en moyenne.
Il est déconseillé de faire tourner webalizer sur des fichiers de logs en cours. Usez de la crontab pour faire tourner les logs et appliquer webalizer dessus.
10 */2 * * *' /usr/local/bin/'''''webalizer -D DNSCache -M 0 -g 1 -R 1  Lance l'analyse toutes les 2 heures[Fichiers/StatistiquesWeb-Last12Months.htm 

]10 2 */7 * *' /usr/local/bin/webazolver -D DNSCache Recrée le fichier DNS inverse une fois par semaine[Fichiers/StatistiquesWeb-Last12Months.htm | Le résultat]


Debug Apache

Votre apache se ramasse un segfault dès qu'il démarre ou à la moindre requête ? Il faut débugger : [2]

Dans /etc/apache2/apache2.conf ajouter :

CoreDumpDirectory /tmp/mycoredump

Puis

mkdir -p /tmp/mycoredump
chown -R www-data:www-data /tmp/mycoredump
chmod 777 /tmp/mycoredump
service apache2 restart

Attendre le segfault, puis

gdb apache2  -core /tmp/mycoredump/core
..

..

Program terminated with signal 11, Segmentation fault.
#0  0xb5c639b0 in ?? () from /usr/lib/apache2/modules/libphp5.so

C'est la libphp5 qui est fautive !