Le Blog de C-quad

Archive pour la catégorie ‘Sécurité’

Forcer l’utilisation de https pour certaines pages

Nous avons vu précédemment comment sécuriser l’accès à un site web en activant le support de https, nous allons voir maintenant comment forcer l’utilisation d’une page en https.

L’intérêt d’utiliser le protocole https est d’éviter que vos identifiants et mot de passe circulent en clair sur le réseau. C’est bien joli de pouvoir accéder aux pages sécuriser, mais si l’accès aux pages non sécurisées est toujours disponible, le travail n’est qu’a moitié accompli.

La configuration a éffectuer

Le principe utilisé sera de réaliser une redirection à partir du répertoire que l’on désire sécuriser. Pour cela, il existe plusieurs solutions:

  • Via .htaccess
  • Via la configuration d’apache

La solution que j’ai choisie est de modifier directement la configuration d’apache.

Beaucoup de sites proposent de modifier le fichier httpd.conf, je le déconseille fortement ! il existe un répertoire dédié aux personnalisations d’apache : conf.d, c’est dans le répertoire conf.d qu’il faut créer un fichier avec ce que l’on souhaite modifier.

Cette façon de procéder permettra de s’affranchir de tout risque lors d’une mise à jour d’apache. Le paquet apache écrasera le fichier httpd.conf lors d’une mise à jour, alors que le répertoire conf.d sera lui conservé et de ce fait vous n’auriez rien perdu.

Voici un exemple pour sécuriser l’accès à la page d’administration d’un blog wordpress :

<Directory "/var/www/html/wordpress/wp-admin">
 RewriteEngine on
 RewriteBase /var/www/html/wordpress/wp-admin
 RewriteCond %{SERVER_PORTS} !^443$
 RewriteRule ^(.*)?$ https://%{SERVER_NAME}/wordpress/wp-admin/ [L,R]
 </Directory>

Il vous suffit de recopier cette section dans un fichier et de le déposer dans le répertoire /etc/httpd/conf.d/

On vérifiera ensuite que la configuration est correcte,

  • soit directement avec apachectl :
$ apachectl configtest
Syntax OK
  • soit avec la commande service
# service httpd configtest
Syntax OK

Il faut bien sur que la syntaxe soit OK avant de procéder à un rechargement de la configuration d’apache.

# service httpd reload

Sécuriser l’accès au site via https – configuration d’apache

Nous allons ici voir comment sécuriser un site web fonctionnant sous apache en y ajoutant la possibilité de se connecter avec le protocole https.

Pour cela nous installerons le module « mod_ssh »

# yum install mod_ssl

Le protocole https utilise SSL et de ce fait il est nécessaire de générer les certificats qui seront installés. Si vous avez déjà une autorité de certification active vous pouvez passer à la suite directement.

Mise en place d’une autorité de certification (CA)

Création de l’autorité de certification (CA)

Nous allons créer la clé privée de l’autorité de certification qui nous permettra de produire des certificats auto-signé.

Le autorité de certification (CA) sera stocké dans /etc/pki/CA/cacert.pem, tandis que la clé privée du CA sera stockée dans /etc/pki/CA/private/cakey.pem:

# openssl req -new -x509 -days 365 -newkey rsa:1024 \
  -keyout /etc/pki/CA/private/cakey.pem \
  -out /etc/pki/CA/cacert.pem
# chmod 600 /etc/pki/CA/private/cakey.pem

Une copie de chaque certificat signé par l’autorité sera stockée dans /etc/pki/CA/newcerts, avec un nom correspondant au SN (Serial Number) de l’autorité avec l’extentsion .pem. Si ce dossier n’est pas présent, il est nécessaire de le créer :

# mkdir /etc/pki/CA/newcerts

Le fichier /etc/pki/CA/index.txt liste tous les certificats qui ont été signés, si ce fichier n’est pas présent, il est la aussi nécessaire de le créer :

# touch /etc/pki/CA/index.txt

Le fichier /etc/pki/CA/serial contient le prochain numéro de série disponible, étant donné que nous venons de mettre en place l’autorité le prochain numéro de série sera le 1 :

# echo 01 > /etc/pki/CA/serial

Voila l’autorité de certificat est prête à délivrer des certificats auto-signé, nous allons donc pouvoir créer notre certificat pour apache.

Création du certificat pour apache

Création du certificat

Il est nécessaire de créer un certificat SSL.Voici la démarche à suivre :

 # cd /etc/pki/tls/certs
 # openssl genrsa -des3 -out apachekey.pem 2048

Génération du CSR (Certificate Signing Request)

# openssl req -new -key apachekey.pem -out apachekey.csr
Enter pass phrase for apachekey.pem:
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) []:France
Locality Name (eg, city) [Default City]:Fretin
Organization Name (eg, company) [Default Company Ltd]:C-quad Company Ltd
Organizational Unit Name (eg, section) []:
Common Name (eg, your name or your server's hostname) []:cquad.dyndns.org
Email Address []:

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

Créer le certificat pour le serveur web

Il est nécessaire de signer le CSR pour créer le certificat du serveur web.

# openssl ca -in apachekey.csr -out apachecert.pem
Using configuration from /etc/pki/tls/openssl.cnf
Enter pass phrase for /etc/pki/CA/private/cakey.pem:
Check that the request matches the signature
Signature ok
Certificate Details:
 Serial Number: 1 (0x1)
 Validity
 Not Before: Feb  6 15:51:39 2011 GMT
 Not After : Feb  6 15:51:39 2012 GMT
 Subject:
 countryName               = FR
 stateOrProvinceName       = France
 organizationName          = C-quad Company Ltd
 commonName                = cquad.dyndns.org
 emailAddress              =
 X509v3 extensions:
 X509v3 Basic Constraints:
 CA:FALSE
 Netscape Comment:
 OpenSSL Generated Certificate
 X509v3 Subject Key Identifier:
 98:D8:CF:53:5D:0D:5C:BE:E8:87:ED:01:0C:CA:71:1B:32:94:80:60
 X509v3 Authority Key Identifier:
 keyid:E4:04:44:36:1A:A3:1C:F1:D5:6A:5A:C2:CA:E6:DC:7D:24:EF:FD:41

Certificate is to be certified until Feb  6 15:51:39 2012 GMT (365 days)
Sign the certificate? [y/n]:y

1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
Data Base Updated

Installer le certificat SSL

Copier la clé et le certificat dans /etc/pki/tls/http/ :
# cp apachecert.pem /etc/pki/tls/http/
# cp apachekey.pem /etc/pki/tls/http/

Update VirtualHost as follows:

<VirtualHost cquad.dydns.org:443>
    SSLEngine On
    SSLCertificateFile /etc/pki/tls/http/apachecert.pem
    SSLCertificateKeyFile /etc/pki/tls/http/apachekey.pem
    SSLProtocol All -SSLv2
    SSLCipherSuite HIGH:MEDIUM:!aNULL:+MD5
    DocumentRoot "/var/www/html/ssl"
    ServerName cquad.dyndns.org:443
</VirtualHost>

Attention avec cette configuration, au démarrage d’apache la passphrase qui a été renseignée sera demandée pour décrypter la clé. Si vous redemarrez souvent ce service ou l’ordinateur, il est préférable de supprimer la passphrase avec les actions suivantes :

# cp apachekey.pem apachekey.pem.org
# openssl rsa -in apachekey.pem.org -out apachekey.pem
Enter pass phrase for apachekey.pem.org:
writing RSA key

De ce fait apache ne demandera plus la passphrase. Pour le vérifier, il suffit d’afficher le contenu de la clé il ne doit plus apparaitre ce type de choses :

Proc-Type: 4,ENCRYPTED
DEK-Info: DES-EDE3-CBC,E895E09547914F04

Sécuriser apache avec fail2ban

Si vous hébergez un site web avec apache, il y a de fortes chance qu’en regardant les logs vous tombiez sur ce type de chose.

[Sun Jan 09 09:27:54 2011] [error] [client 85.17.201.75] File does not exist: /var/www/html/wordpress/phpMyAdmin-2.5.5-rc1
[Sun Jan 09 09:27:54 2011] [error] [client 85.17.201.75] File does not exist: /var/www/html/wordpress/phpMyAdmin-2.5.6-rc1
[Sun Jan 09 09:27:55 2011] [error] [client 85.17.201.75] File does not exist: /var/www/html/wordpress/phpMyAdmin-2.5.6-rc2
[Sun Jan 09 09:27:55 2011] [error] [client 85.17.201.75] File does not exist: /var/www/html/wordpress/phpMyAdmin-2.5.6
[Sun Jan 09 09:27:55 2011] [error] [client 85.17.201.75] File does not exist: /var/www/html/wordpress/phpMyAdmin-2.5.7
[Sun Jan 09 09:27:55 2011] [error] [client 85.17.201.75] File does not exist: /var/www/html/wordpress/phpMyAdmin-2.5.7-pl1
[Sun Jan 09 09:27:55 2011] [error] [client 85.17.201.75] File does not exist: /var/www/html/wordpress/phpMyAdmin-2.6.0-alpha
[Sun Jan 09 09:27:55 2011] [error] [client 85.17.201.75] File does not exist: /var/www/html/wordpress/phpMyAdmin-2.6.0-alpha2
[Sun Jan 09 09:27:55 2011] [error] [client 85.17.201.75] File does not exist: /var/www/html/wordpress/phpMyAdmin-2.6.0-beta1
[Sun Jan 09 09:27:55 2011] [error] [client 85.17.201.75] File does not exist: /var/www/html/wordpress/phpMyAdmin-2.6.0-beta2
[Sun Jan 09 09:27:55 2011] [error] [client 85.17.201.75] File does not exist: /var/www/html/wordpress/phpMyAdmin-2.6.0-rc1
[Sun Jan 09 09:27:55 2011] [error] [client 85.17.201.75] File does not exist: /var/www/html/wordpress/phpMyAdmin-2.6.0-rc2
[Sun Jan 09 09:27:55 2011] [error] [client 85.17.201.75] File does not exist: /var/www/html/wordpress/phpMyAdmin-2.6.0-rc3
[Sun Jan 09 09:27:55 2011] [error] [client 85.17.201.75] File does not exist: /var/www/html/wordpress/phpMyAdmin-2.6.0

Nous n’allons bien sur pas laisser ces tentatives d’intrusion impunies. Nous allons faire en sorte de bannir l’adresse ip de celui qui essaie d’accéder à des dossiers ou fichiers qui ne sont pas disponibles sur le serveur.

Pour cela nous utilisons fail2ban.

Configuration de fail2ban

Ajoutons dans le fichier /etc/fail2ban/jail.conf

# Apcahe 404
[apache-404]
enabled = true
filter  = apache-404
action   = iptables[name=HTTP, port=http, protocol=tcp]
           sendmail-whois[name=HTTP, dest=root, sender=fail2ban@mail.com]
logpath = /var/log/httpd*/error*.log
maxretry = 5

Les filtres

Il nouus reste à créer le filter apache-404. Nous l’ajoutons donc dans /etc/fail2ban/filter.d/

Voici le contenu du fichier apache-404.conf à créer :

# Fail2Ban configuration file
#
# Author: Cédric OLIVIER
#
#

[Definition]

# Option:  failregex
# Notes.:  regex to match the 404 failure messages in the logfile. The
#          host must be matched by a group named "host". The tag "<HOST>" can
#          be used for standard IP/hostname matching and is only an alias for
#          (?:::f{4,6}:)?(?P<host>[\w\-.^_]+)
# Values:  TEXT
#
failregex = [[]client <HOST>[]] (File does not exist|script not found or unable to stat): .*

# Option:  ignoreregex
# Notes.:  regex to ignore. If this regex matches, the line is ignored.
# Values:  TEXT
#
ignoreregex =

Les actions

Dans le fichier /etc/fail2ban/jail.conf une action est définie quand le filtre est respecté. Dans notre cas, c’est :

  • iptables[name=HTTP, port=http, protocol=tcp]
  • sendmail-whois[name=HTTP, dest=root, sender=fail2ban@mail.com]

iptables est une action qui est définie dans /etc/fail2ban/action.d/iptables.conf, cette action a pour effet de bannir l’adresse ip de la personne qui a tenté l’intrusion

sendmail-whois est une action qui recherche les informations whois de l’attaquant et envoie un mail lorsqu’une ip est bannie, cela permet d’avoir une idée de l’efficacité de la règle.


Générer la clé pkcs12 pour firefox (Contribution à Fedora Project)

Pour générer le certificat :

    • Se connecter à https://admin.fedoraproject.org/accounts/ et cliquer sur le lien « Download a client-side certificate ».
    • Sauvegarder dans le fichier ~/.fedora.cert
    • S’il y avait d’ancien certificats fedora les supprimer :
    rm ~/.fedora-server-ca.cert ~/.fedora-upload-ca.cert
    
    • Pour générer la clé pkcs12 :
    fedora-packager-setup
    
    • Ouvrir Firefox et aller dans Édition -> Préférences -> Avancé -> Chiffrement -> Afficher les Certificat -> Vos certificats
    • Supprimer l’ancien certificat et importer le nouveau depuis ~/fedora-browser-cert.p12

    Sécuriser un ordinateur avec fail2ban

    Dans le cas ou la machine est accessible à partir d’Internet, il est impératif de la sécuriser un minimum.

    Je vous conseille donc de bien configurer votre firewall. Néanmoins, il n’est pas toujours possible de tout fermer. Exemple, il serait dommage de fermer l’accès ssh si vous voulez accéder à votre ordinateur depuis l’extérieur. Mais si vous y avez accès, tous le monde peut tenter de s’y connecter.

    Afin de limiter les chances que ces accès soient fructueux, je vous conseille donc l’utilisation de fail2ban. Logiciel qui intervient sur la configuration du firewall de tel sorte qu’il effectue un ban des ip des ordinateurs insistants.

    Lire la suite de cette entrée »