Sécuriser Jeedom avec SSL et Cloudflare

0
(0)

La sécurisation de l’accès à votre instance Jeedom est cruciale, surtout si vous la rendez accessible depuis l’extérieur. Cloudflare est une solution populaire qui peut non seulement protéger votre Jeedom contre les attaques, mais également offrir un certificat SSL gratuit pour sécuriser les communications.

Prérequis

  1. Une instance Jeedom installée et fonctionnelle.
  2. Un nom de domaine ou un sous-domaine que vous possédez.
  3. Un fournisseur de nom de domaine qui permet de changer les serveurs de noms (nameservers).
  4. Un compte Cloudflare (gratuit ou payant).

Fournisseurs de nom de domaine recommandés

Si vous n’avez pas encore de nom de domaine ou que vous cherchez un fournisseur qui permet de modifier les serveurs de noms, voici trois options populaires, classées par coût :

  1. Namecheap : Un des registraires les moins chers, offrant une interface conviviale et une gestion DNS complète, y compris la possibilité de changer les serveurs de noms.
  2. OVHcloud : Une solution européenne abordable et fiable, idéale pour les utilisateurs en France.
  3. GoDaddy : Bien qu’un peu plus cher, il est réputé pour sa simplicité d’utilisation et son support technique étendu

Bien entendu, Cloud Flare vend également se type de service.

Étape 1 : Configurer Cloudflare

Ajouter votre domaine à Cloudflare

  1. Connectez vous à votre compte Cloudflare.
  2. Accédez à l’onglet Website et cliquez sur Add a Domain.
  3. Saisissez votre nom de domaine.
  4. Une fois ajouté, accédez au tableau de bord de votre domaine et explorez le menu DNS. Créez un enregistrement de type A qui pointe vers l’adresse IP WAN de votre box internet.
  5. Si votre connexion utilise IPv6, ajoutez également une entrée AAAA.
  6. Assurez-vous que l’option Proxy (nuage orange) est activée pour bénéficier des fonctionnalités de Cloudflare, y compris le chiffrement.
Tips

Réduisez votre surface d’exposition en choisissant un nom de sous domaine difficile a deviner.

Configurer les règles SSL/TLS

  1. Accédez à l’onglet SSL/TLS.
  2. Sélectionnez l’option Full (Strict) pour un chiffrement de bout en bout.

Étape 2 : Générer un certificat SSL Cloudflare pour Apache

Pour sécuriser les communications entre Cloudflare et votre serveur Jeedom, vous devez générer un certificat SSL. Voici les étapes :

Générer un certificat SSL Cloudflare

  1. Dans le tableau de bord Cloudflare, accédez à SSL/TLS > Origin Server.
  2. Cliquez sur Create Certificate.
  3. Choisissez l’option Generate private key and CSR with Cloudflare.
  4. Ajoutez votre le sous-domaine relatif à l’accès Jeedom.
  5. Configurez la durée de validité du certificat (par défaut 15 ans).
  6. Cliquez sur Create.
  7. Choisissez le format de la clé (Key Format): PEM (Base64-encoded ASCII).
  8. Copiez la clé privé et la clé publique dans des fichiers séparés. Pour des raisons de sécurité vous ne pourrez plus récupérer la clé privée après avoir fermé la fenêtre.
  9. Cliques sur OK.

Installer le certificat sur Apache

Étape 1 : Copier les certificats sur le serveur

Sur votre machine locale, placez le certificat et la clé privée dans un répertoire temporaire, par exemple

PowerShell
mkdir ~/certificats mv origin.pem origin.key ~/certificats/
mv origin.* $Home/certificats/

Transférez les fichiers vers le serveur Jeedom avec scp (remplacez <user> et <ip-server> par vos informations)

Bash
scp $Home/certificats/origin.pem <user>@<ip-server>:/tmp/ 
scp $home/certificats/origin.key <user>@<ip-server>:/tmp/

Connectez-vous à votre serveur Jeedom

Bash
ssh <user>@<ip-server>

Déplacez les fichiers dans le répertoire sécurisé d’Apache (par exemple /etc/ssl/certs pour le certificat et /etc/ssl/private pour la clé)

Bash
sudo mv /tmp/origin.pem /etc/ssl/certs/jeedom-cert.pem
sudo mv /tmp/origin.key /etc/ssl/private/jeedom-key.key

Ajustez les permissions pour sécuriser la clé privée

Bash
sudo chmod 600 /etc/ssl/private/jeedom-key.key
sudo chmod 644 /etc/ssl/certs/jeedom-cert.pem

Étape 2 : Configurer Apache pour utiliser les certificats

Ouvrez le fichier de configuration SSL d’Apache. Sur un serveur standard Debian, le fichier est généralement

Bash
sudo nano /etc/apache2/sites-available/default-ssl.conf

Modifiez les directives pour pointer vers votre certificat et votre clé privée

Bash
<VirtualHost *:443> 
  ServerAdmin webmaster@localhost 
  ServerName sousdomain.domain.org # Entrez l'adresse exterieur complete de votre jeedom
  DocumentRoot /var/www/html
  SSLEngine on
  SSLCertificateFile /etc/ssl/certs/jeedom-cert.pem # entrez le chemin vers votre certificat
  SSLCertificateKeyFile /etc/ssl/private/jeedom-key.key # entrez le chemin vers votre clé privée
# (Optionnel) Inclure le certificat CA si nécessaire 
# SSLCertificateChainFile /etc/ssl/certs/ca.pem
  ErrorLog ${APACHE_LOG_DIR}/error.log
  CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

Enregistrez et quittez l’éditeur (Ctrl+O, Enter, puis Ctrl+X).

Étape 3 : Activer le site SSL

Activez le module SSL d’Apache (si ce n’est pas encore fait)

Bash
sudo a2enmod ssl

Activez le site SSL

Bash
sudo a2ensite default-ssl

Redémarrez Apache pour appliquer les changements

Bash
sudo systemctl restart apache2
Tips

Changez le port de communication pour réduire encore un peu la surface d’exposition

Étapes pour configurer un NAT :

Accéder à l’interface de gestion de la box :

Connectez-vous à l’interface web de votre box en entrant son adresse IP dans un navigateur (souvent 192.168.1.1 ou similaire). Vérifiez dans le manuel ou sous la box si vous ne connaissez pas l’adresse.

Identifiez-vous avec vos identifiants administrateur (fournis par votre FAI).

Localiser les paramètres NAT/Port Forwarding :

Dans le menu de votre box, cherchez une section appelée NAT, Redirection de ports, ou Port Forwarding (souvent dans les paramètres avancés ou réseau).

Créer une nouvelle règle de redirection :

Port externe : Entrez le port utilisé pour l’accès depuis l’extérieur (par exemple, 8443 pour HTTPS).

Adresse IP interne : Indiquez l’adresse IP locale de votre serveur Jeedom (par exemple, 192.168.1.100).

Port interne : Spécifiez le port utilisé par le service sur votre serveur (généralement ici 443).

Protocole : Choisissez entre TCP, UDP, ou TCP/UDP (HTTPS utilise TCP).

Sauvegarder la règle et redémarrer la box si nécessaire :

Après avoir ajouté la règle, sauvegardez les modifications.

Étape 5 : Tester la configuration

Ouvrez votre navigateur et accédez à votre site

Bonus: Automatiser la mise à jour DNS

Si comme moi, votre IP publique est dynamique, je vous livre de quoi rafraichir l’adresse votre entrée DNS Cloud flare.

Prérequis

Tel qu’écrit ici, vous devez générer un Jeton API: Mon Profil > Jeton API  > Créer un Jeton. Utilisez le modèle Modifier le DNS zone

Ensuite, il est écrit ici comment obtenir le ZoneId. Oui, décidément tout est bien documenté chez CloudFlare.
L’Id se trouve en bas à droite de la page d’accueil, copiez le.

PowerShell
# Fonction pour récupérer l'ID de l'enregistrement DNS
function Get-DnsRecordID {
    [CmdletBinding()]
    param (
        [String]$apiUrl = "https://api.cloudflare.com/client/v4",
        [String]$apiToken,
        [String]$Email,
        [String]$zoneID,
        [String]$recordName,
        [String]$recordType = "A"
    )
    $dnsRecordUrl = "$apiUrl/zones/$zoneID/dns_records?type=$recordType&name=$recordName"
    $headers = @{
        "Authorization" = "Bearer $apiToken"
        'X-Auth-Email' = $Email
    }

    # Requête pour obtenir l'ID de l'enregistrement
    $response = Invoke-RestMethod -Uri $dnsRecordUrl -Method Get -Headers $headers -ContentType application/json
    If ($response.success) {
        return $response.result[0].id
    }
    eElse {
        Write-Host "Erreur : impossible de récupérer l'ID de l'enregistrement DNS."
        return $null
    }
}

# Fonction pour mettre à jour l'enregistrement DNS
function Update-DnsRecord {
    [CmdletBinding()]
    param(
        [String]$apiUrl = "https://api.cloudflare.com/client/v4",
        [String]$apiToken,
        [String]$Email,
        [String]$zoneID,
        [String]$dnsRecordID,
        [String]$PublicIP
    )

    # URL de l'API pour mettre à jour l'enregistrement DNS
    $updateUrl = "$apiUrl/zones/$zoneID/dns_records/$dnsRecordID"
    Write-Verbose $updateUrl

    $headers = @{
        "Authorization" = "Bearer $apiToken"
        'X-Auth-Email' = $Email
    }

    # Données de la requête pour la mise à jour
    $body = @{
        "content" = $PublicIP
    } | ConvertTo-Json -Depth 10

    Write-Verbose  $body

    # Exécution de la mise à jour
    $response = Invoke-RestMethod -Uri $updateUrl -Method Patch -Headers $headers -Body $body -ContentType application/json
    If ($response.success) {
        $response.result
    } Else {
        Write-Host "Erreur lors de la mise à jour de l'enregistrement DNS : $($response.errors)"
    }
}
PowerShell
$Parameters = @{
    zoneID = "$Zone_ID"                        # ID de la zone Cloudflare (nom de domaine)
    recordName = "$DNS_RECORD_NAME"           # Nom de l'enregistrement DNS
    recordType = "A"                          # type d'enregistrement A ou AAAA
    apiToken = "$Env:CLOUDFLARE_API_KEY"      # Token API Cloudflare
    Email = "$Env:CLOUDFLARE_EMAIL"           # Vore identifiant CloudFlare
}

$dnsRecordID = Get-DnsRecordID @Parameters

$Parameters.Add("PublicIP", $PublicIP)
$Parameters.Add("dnsRecordID", $dnsRecordID)
$Parameters.Remove("recordName")
$Parameters.Remove("recordType")

# Appel de la fonction pour mettre à jour l'enregistrement DNS
Update-DnsRecord @Parameters -Verbose

Vous noterez qu’il vous manque de quoi obtenir l’adresse IP automatiquement. J’ai un code pour interroger ma Livebox. Il existe également des api publique pour vous aider dans le démarche. Pour ma part, je m’arrête là ce soir.

Sources


Cette publication était-elle utile ?

Cliquez sur une étoile pour l'évaluer !

Note moyenne 0 / 5. Nombre de votes : 0

Aucun vote pour le moment ! Soyez le premier à évaluer cette publication.

Laisser un commentaire