Step-by-step Ubuntu server configuration: Apache server and SSLInstallation pas à pas d’un serveur Ubuntu 10.04 : Serveur Apache et SSL

Le quatrième post concerne l’installation et la configuration d’un serveur apache, notamment pour sécuriser les échanges avec celui-ci via SSL.

Coming (probably not so) soon…

Installation de apache

Apache s’installe simplement par la commande

apt-get install apache2
/etc/init.d/apache2 start

L’installation est réussie si, lorsque vous tapez dans un navigateur votre nom de domaine (ou votre adresse IP), vous avez le message : “It works!”.

Les fichiers que vous voulez rendre accessibles depuis le serveur apache sont à placer dans le répertoire /var/www/ de votre serveur.

Configuration de apache pour la prise en charge des fichiers .htaccess

Si vous souhaitez restreindre l’accès d’un répertoire du type http://nom-du-serveur.org/dir/ par login et mot de passe, une méthode consiste à placer dans /var/www/dir un fichier nommé .htaccess et définissant les autorisations d’accès à ce répertoire. On procède de la manière suivante :

  • On édite le fichier /etc/apache2/sites-enabled/default et on y ajoute les lignes suivantes
        AllowOverride all

    On relance ensuite le serveur apache :

    /etc/init.d/apache2 reload
  • Dans le répertoire /var/www/dir, on crée un fichier nommé .htaccess et contenant les informations suivantes :
    AuthUserFile /var/www/dir/password/.htpasswd
    AuthGroupFile /dev/null
    AuthName "Entrer login et mot de passe, svp"
    AuthType Basic
    Require valid-user

    En l’état, ce fichier permet l’accès au répertoire /dir pour les utilisateurs identifiés par login et mot de passe, les logins et mots de passe étant inclus dans un fichier .htpasswd du sous-répertoire dir/password.

  • Dans le répertoire /var/www/dir/password, on crée deux fichiers :
    • un fichier .htaccess contenant
      deny from all

      qui interdit l’accès au répertoire password à tout le monde ;

    • un fichier .htpasswd contenant
      login1:enc-mdp1
      login2:enc-mdp2

      loginn sont les logins et enc-mdpn contient les mots de passe correspondant, préalablement encryptés (voir par exemple site web pour encrypter un mot de passe).

Configuration pour la prise en charge de SSL

SSL est un protocole qui permet des échanges sécurisés entre le serveur apache et le navigateur web. Pour mettre en place la sécurisation des échanges par SSL, il faut disposer d’un certificat qui est signé par une autorité. Généralement, pour les serveurs privés (qui ne prétendent pas faire de commerce, par exemple), un certificat SSL auto-signé suffit (l’utilisateur aura alors un message de sécurité lui indiquant que le certificat n’est pas signé par une autorité reconnue mais une fois l’exception de sécurité acceptée, les échanges se feront bien de manière sécurisée).

Les étapes suivantes décrivent :

    • comment générer un certificat d’autorité pour signer le certificat du serveur apache ;
    • comment générer et signer un certificat pour le serveur apache ;
    • comment configurer le serveur apache pour qu’il utilise SSL.
      • Création d’un fichier de configuration initial, root-cacert.cnf: ce fichier texte contient les informations suivantes :
        # Configuration file example (root certificate)
        # Default configuration to use when one is not provided on the command line.
        [ ca ]
        default_ca      = local_ca
        # Default location of directories and files needed to generate certificates.
        [ local_ca ]
        dir             = /home/USERNAME/CertSSL
        certificate     = $dir/root-cacert.pem
        database        = $dir/index.txt
        new_certs_dir   = $dir/signedcerts
        private_key     = $dir/private/root-key.pem
        serial          = $dir/serial
        # Default expiration and encryption policies for certificates.
        default_crl_days        = 365
        default_days            = 1825
        default_md              = md5
        policy          = local_ca_policy
        x509_extensions = local_ca_extensions
        # Default policy to use when generating server certificates.  The following
        # fields must be defined in the server certificate.
        [ local_ca_policy ]
        commonName              = supplied
        stateOrProvinceName     = supplied
        countryName             = supplied
        emailAddress            = supplied
        organizationName        = supplied
        organizationalUnitName  = supplied
        # x509 extensions to use when generating server certificates.
        [ local_ca_extensions ]
        subjectAltName          = DNS:server-name.org
        subjectAltName          = DNS:*.server-name.org
        basicConstraints        = CA:false
        nsCertType              = server
        # The default root certificate generation policy.
        [ req ]
        default_bits    = 2048
        default_keyfile = /home//CertSSL/private/root-key.pem
        default_md      = md5
        prompt                  = no
        distinguished_name      = root_ca_distinguished_name
        x509_extensions         = root_ca_extensions
        # Root Certificate Authority distinguished name.  Change these fields to match
        # your local environment!
        [ root_ca_distinguished_name ]
        commonName              = Tuxette s Root Certificate Authority
        stateOrProvinceName     = NC
        countryName             = FR
        emailAddress            = my-email@server-name.org
        organizationName        = My Home
        organizationalUnitName  = My Office
        [ root_ca_extensions ]
        basicConstraints        = CA:true

        les parties [ local_ca ] et [ root_ca_distinguished_name ] sont à adapter à votre environnement de travail ; en particulier subjectAltName permettra de gérer des URL du type server-name.org et des sous-domaines du type subdomain.server-name.org. La partie default_days donne la durée de validité de votre certificat et elle est aussi à adapter à vos besoins éventuellement.

      • Génération du certificat:
        export OPENSSL_CONF=~/CertSSL/root-cacert.cnf
        openssl req -x509 -newkey rsa:2048 -out root-cacert.pem -outform PEM -days 1825

        un mot de passe à conserver précieusement vous est alors demandé.

      • Nettoyage du certificat:
        openssl x509 -in root-cacert.pem -out root-cacert.crt
      • un certificat SSL auto-signé pour le serveur, apache-cert.pem ;
      • une clé SSL pour le serveur, apache-enc-key.pem.
      • Création d’un fichier de configuration pour le certificat sur serveur, apache-cert.cnf:
        # Configuration file example (server)
        [ req ]
        prompt                  = no
        distinguished_name      = server_distinguished_name
        
        [ server_distinguished_name ]
        commonName              = server-name.org
        stateOrProvinceName     = NC
        countryName             = FR
        emailAddress            = my-email@server-name.org
        organizationName        = My Home
        organizationalUnitName  = My Office

        où la partie [ server_distinguished_name ] doit être personnalisée (particulièrement la partie commonName). Dans le cas où des sous-domaines sont utilisés sur le serveur, domain1.server-name.org et domain2.server-name.org, il faudra générer autant de certificats que de sous-domaines, chacun possédant une partie commonName personnalisée.

      • Génération du certificat et de la clé:
        export OPENSSL_CONF=~/CertSSL/apache-cert.cnf
        openssl req -newkey rsa:1024 -keyout apache-key.pem -keyform PEM -out
          apache-temp-cert.pem -outform PEM

        Un nouveau mot de passe vous est demandé, également à conserver précieusement.

      • Encrypter la clé privée:
        openssl rsa < apache-key.pem > apache-enc-key.pem

        Le mot de passe entré précédemment est demandé.

      • Signer le certificat du serveur avec le certificat d’autorité créé à la section précédente:
        export OPENSSL_CONF=~/CertSSL/root-cacert.cnf
        openssl ca -in apache-temp-cert.pem -out apache-cert.pem

        Le mode de passe du certificat d’autorité est demandé.

      • Supprimer les certificats temporaires inutiles
        rm apache-temp-cert.pem apache-key.pem
      • Installation du certificat d’autorité sur le serveur : Créer un répertoire self dans /usr/share/ca-certificates et y déposer le fichier root-cacert.crt. Reconfigurer ca-certificatespour qu’il utilise ce certificat d’autorité :
        dpkg-reconfigure ca-certificates

        (cocher root-cacert de self dans la liste des certificats).

      • Installation du certificat et de la clé du serveur : copier le fichier apache-cert.pem dans /etc/ssl/certs et le fichier apache-enc-key.pem dans /etc/ssl/private. Modifier les droits sur la clé privée :
        chmod 400 /etc/ssl/private/apache-enc-key.pem

        de manière à ce qu’elle ne soit pas lisible.

      • Édition des fichiers de configuration du serveur apache : dans le répertoire, /etc/apache2/sites-available
        • Éditer le fichier defaultde manière à ce qu’il commence par : < VirtualHost *:80>
                  ServerAdmin my-email@server-name.org
                  ServerName server-name.org
                  ServerAlias www.server-name.org

          où les valeurs de ServerName et ServerAlias doivent correspondre à votre serveur.

        • Éditer le fichier default-sslde manière à ce qu’il commence par : < VirtualHost *:443>
                  
                  ServerAdmin my-email@server-name.org
                  ServerName server-name.org
                  ServerAlias www.server-name.org
          
                  SSLEngine On
                  SSLCertificateFile /etc/ssl/certs/apache-cert.pem
                  SSLCertificateKeyFile /etc/ssl/private/apache-enc-key.pem

          où les valeurs de ServerName et ServerAlias doivent correspondre à votre serveur.

      • Configuration de apache pour SSL
        a2enmod ssl rewrite
        a2ensite default-ssl
        /etc/init.d/apache2 reload

Les deux premières étapes peuvent être effectuées en local et les clés déposées ensuite sur le serveur : c’est cette approche que nous décrivons ici. Les manipulations en local sont effectuées dans un répertoire choisi par l’utilisateur (par exemple ~/CertSSL), répertoire qui contient deux sous-répertoires, private et signedcert. Vous pouvez vous connecter à votre serveur par :

http://server-name.org (non sécurisé)

https://server-name.org (sécurisé)

Pour en savoir plus : Documentation Ubuntu (en anglais).