Auteur Sujet: Sécuriser l'accès à un site web - Méthodes / pièges / bon à savoir ?  (Lu 11468 fois)

0 Membres et 1 Invité sur ce sujet

Darkjeje

  • Abonné Free adsl
  • *
  • Messages: 592
  • Free VDSL2 Issy-les-Moulineaux (92)
Bonjour à tous,

Je suis en train de créer un site web sur mon synology que je souhaiterai rendre accessible sur le net et en local pour ma seule famille.
Cela me permet de redécouvrir html/css, de découvrir php, et maintenant je découvre la sécurité sur le net (vaste sujet).
Je souhaiterai  sécuriser mon site, tout en le rendant simple d'accès pour les utilisateurs mais aussi transparent dans son accès (local ou Internet).

Pour le moment j'ai mis un fichier .htaccess qui :
- force la redirection en https vers mon nom de domaine crypté via Let’s Encrypt (lui même généré par mon NAS),
- Demande un login et un mot de passe pour accéder au dossier contenant le site web.

Ce fichier est stocké à la racine du site web.
Résultat toutes les connexions que ce soit sur l'adresse IP privée, IP public, nom de domaine en http ou https, renvoi sur mon nom de domaine en https.
Sur chaque page web, j'ai un script php qui si la connexion à la page se fait en http, actualise cette dernière en https.

Je voulais voir avec vous déjà si cette sécurité vous paraissait nul, moyenne, bonne,...

Mes soucis d'après moi sont :
- Lors de la connexion il me demande le login et le mot de passe 2 fois, je pense qu'il le demande une fois lors de l'accès en http sur adresse IP privée ou public , puis me redirige puis me le redemande en https sur le nom de domaine. Ce qui voudrait dire que je transmet une première fois en claire (pas bon) puis en crypté.
- N'ayant pas de compteur de tentative d'accès avec refus au-delà d'un certain nombre d'essai, je pense qu'il doit être possible d'accéder à mon site via une attaque force brut, non ?
- Cette protection a pour effet de toujours redemander le login et le mot de passe.

Ma question est, existe t'il une technique plus sécurisée et permettant de stocker le login et mot de passe de connexion dans le terminal de chacun des membres de ma famille ?
Et que ce login et mot de passe soit sécurisé en cas de piratage du terminal et soit transmis de manière sécurisé lors de chaque connexion à mon site ?

Si jamais vous avez des questions ou remarques, n'hésitez pas, je suis là pour apprendre et échanger ;)

Merci

Jérem

Gabi

  • Abonné SFR THD (câble)
  • *
  • Messages: 96
Sécuriser l'accès à un site web - Méthodes / pièges / bon à savoir ?
« Réponse #1 le: 24 février 2017 à 14:32:04 »
- Lors de la connexion il me demande le login et le mot de passe 2 fois, je pense qu'il le demande une fois lors de l'accès en http sur adresse IP privée ou public , puis me redirige puis me le redemande en https sur le nom de domaine. Ce qui voudrait dire que je transmet une première fois en claire (pas bon) puis en crypté.

Exactement. Tu perds l'intérêt du HTTPS en faisant ça. La redirection HTTP --> HTTPS doit se faire le plus "haut" possible. Tu dois pouvoir modifier ton .htaccess afin que la redirection HTTP -> HTTPS soit renvoyée directement (c'est lointain pour moi, mais y'a des flags genre [L] que tu peux rajouter sur les règles de redirection), sans même que ça atteigne ton code PHP

Du point de vue du navigateur, tu dois voir la chose suivante (j'imagine que tu utilises de l'authentification dite "basique", il n'y a rien de mal à cela tant que c'est sur du HTTPS) : appel HTTP -> réponse avec 301 (redirection vers le HTTPS) -> appel HTTPS -> réponse 401 (challenge Basic auth) -> entrée login + mot de passe -> re-appel HTTPS (mais avec le header Authorization) -> 200 OK.

vivien

  • Administrateur
  • *
  • Messages: 48 042
    • Twitter LaFibre.info
Sécuriser l'accès à un site web - Méthodes / pièges / bon à savoir ?
« Réponse #2 le: 25 février 2017 à 11:23:32 »
Je ne sais pas si tu as les options de configuration du serveur web comme sur un Linux mais il est préférable de mettre un mot de passe dans la configuration du serveur web et non pas dans un .htaccess

Il faut séparer le site https du site sans https.

Le site sans https fait juste une redirection :
<VirtualHost *:80>
        ServerName "testdebit.info"
        Redirect permanent / https://testdebit.info/
        CustomLog ${APACHE_LOG_DIR}/redirect80.log combined
</VirtualHost>

Si tu as deux noms de domaine (un avec www et un sans www) il faut rediriger celui qui n'est pas ton préféré vers le bon.

Darkjeje

  • Abonné Free adsl
  • *
  • Messages: 592
  • Free VDSL2 Issy-les-Moulineaux (92)
Sécuriser l'accès à un site web - Méthodes / pièges / bon à savoir ?
« Réponse #3 le: 25 février 2017 à 12:30:22 »
Merci à tous les deux pour vos réponses.

Je ne sais pas si tu as les options de configuration du serveur web comme sur un Linux mais il est préférable de mettre un mot de passe non pas dans la configuration du serveur web et non pas dans un .htaccess

Qu'entends tu par là ? Où devrais-je mettre un mot de passe/login dans ce cas ?

Il faut séparer le site https du site sans https.

Le site sans https fait juste une redirection :
<VirtualHost *:80>
        ServerName "testdebit.info"
        Redirect permanent / https://testdebit.info/
        CustomLog ${APACHE_LOG_DIR}/redirect80.log combined
</VirtualHost>

J'ai déjà vue ce bout de code, mais je n'ai pas encore trouvé dans quel fichier le mettre et où se trouve ce fichier sur mon NAS, ni s'il sera supprimé à chaque MAJ du paquet contenant apache ou autre.

Si tu as deux nom de domaine (un avec www et un sans www) il faut rediriger celui qui n'est pas ton préféré vers le bon.

De ce côté là, pas de soucis, je n'utilise pas le www, je n'ai une redirection ovh que vers le site sans www.

Mon but est de taper le nom de domaine ovh ou l'adresse ip local et que je sois automatiquement redirigé vers mon site en https sans jamais avoir un lien en http.
Puis seulement, qu'on me demande de m'identifier de manière sûr, sans donc passer par http comme c'est le cas actuellement comme me l'a fait remarquer Gabi.
Et j'aimerai que les tentatives multiples erronées soient bloquées et que l'adresse ip soit blacklistée.
Et enfin si c'est possible j'aimerai que le login / mot de passe ne soit pas redemandé lors des prochaines connexions pour les appareils s'étant correctement authentifiés précédemment et ayant acccepté de l'enregistré.
Cela bien sûr si le stockage du login / mot de passe est sûr (qu'en cas de piratage du terminal, le couple login / mot de passe ne soit pas utilisable).
Stocker le mot de passe dans un cookie ne m'a pas l'air sûr du tout.

vivien

  • Administrateur
  • *
  • Messages: 48 042
    • Twitter LaFibre.info
Sécuriser l'accès à un site web - Méthodes / pièges / bon à savoir ?
« Réponse #4 le: 25 février 2017 à 12:53:54 »
il est recommandé de faire cette conf pour un site web avec mot de passe :

        DocumentRoot "/home/mon_site_web"
        <Directory "/home/mon_site_web">
                Options None
                AllowOverride None
                AuthType Basic
                AuthName "Mot de passe necessaire ici !! Vivien"
                AuthUserFile "/home/password.pwd"
                Require valid-user
        </Directory>

Là les fichiers .htaccess sont ignorés. Cela évite qu'un hacker puisse utiliser pour rajouter des droits.

kgersen

  • Modérateur
  • Abonné Orange Fibre
  • *
  • Messages: 9 230
  • Paris (75)
Sécuriser l'accès à un site web - Méthodes / pièges / bon à savoir ?
« Réponse #5 le: 25 février 2017 à 14:25:21 »
De maniéré plus général, je te conseil de réfléchir plus a l'authentification avant de te lancer:

Le souci 1er quand on met de l'authentification c'est comment gerer les comptes et les droits: Reset de mots de passe, ajout/suppression des comptes,etc et qui les gere.

Avec le web moderne, tout le monde a déjà un compte ou même plusieurs. Le 1er étant son email qui peut servir de non seulement  'login' (avec un mot de passe spécifique au site) mais aussi de moyen de valider des informations dont le changement du mot de passe par exemple. Ca permet aussi a l'administrateur du site d'envoyer des mots de passe 'one time' ou des invitations sans utiliser du 'papier' ou une transmission vocale. Ca permet a n'importe qui de s’inscrire aussi si le site autorise ce genre de chose.

Les gens ont aussi des comptes Google, Facebook, Twitter, etc. et via oauth (openid connect) ou des intégrations directes de ces fournisseurs tu peux déléguer l’authentification a des tiers (qui eux ont plus de moyen que toi d'assurer la sécurité et la gestion des comptes).

Apres je ne sais pas ton but mais "apache+php" en direct comme ca c'est un peu antique de nos jours ... depuis 20 ans y'a eu plein de progrès et de frameworks qui ont été faits.
Si tu veux un site web pas trop compliqué, tu peux partir d'un CMS comme Worpress ou Drupal ou Joomla (ou plus récent encore que ces 3 mammouths qui 10 ans +) ou alors "un cran" en dessous en partant de frameworks plus haut-niveau que Apache+php. La plupart de ces produits et frameworks intègrent souvent directement l'authentification et surtout sa gestion.

Apres si tu veux vraiment partir 'bas niveau' je commanderais plutot Nginx (en frontend) qu'Apache et une techno plus moderne que PHP (stack LAMP).
En 2017 il me semble plus adaptée d'apprendre Javascript (surtout ES6 et TypeScript), Node et des technos modernes comme Polymer ou les composants web en général que de perdre son temps avec du "vieux" php. Enfin c'est que mon avis bien sur.


Darkjeje

  • Abonné Free adsl
  • *
  • Messages: 592
  • Free VDSL2 Issy-les-Moulineaux (92)
Sécuriser l'accès à un site web - Méthodes / pièges / bon à savoir ?
« Réponse #6 le: 26 février 2017 à 10:39:22 »
De maniéré plus général, je te conseil de réfléchir plus a l'authentification avant de te lancer:

Le souci 1er quand on met de l'authentification c'est comment gerer les comptes et les droits: Reset de mots de passe, ajout/suppression des comptes,etc et qui les gere.

Tout sera gérer par moi.
Mais la seule raison de modifier le mot de passe, sera le vol d'un terminal.

Avec le web moderne, tout le monde a déjà un compte ou même plusieurs. Le 1er étant son email qui peut servir de non seulement  'login' (avec un mot de passe spécifique au site) mais aussi de moyen de valider des informations dont le changement du mot de passe par exemple. Ca permet aussi a l'administrateur du site d'envoyer des mots de passe 'one time' ou des invitations sans utiliser du 'papier' ou une transmission vocale. Ca permet a n'importe qui de s’inscrire aussi si le site autorise ce genre de chose.

Les gens ont aussi des comptes Google, Facebook, Twitter, etc. et via oauth (openid connect) ou des intégrations directes de ces fournisseurs tu peux déléguer l’authentification a des tiers (qui eux ont plus de moyen que toi d'assurer la sécurité et la gestion des comptes).

Je ne suis pas contre déléguer la sécurité surtout si cela permet d'améliorer cette dernière. Mais j'ai aussi bien peur que cela soit compliqué à intégrer dans mon site qui n'est constitué que de 3 à 5 pages,...
D'autant qu'il n'y aura que 2 à 3 comptes à créer et que le site ne proposera pas de les créer.
Le site permet de se connecter, puis d'aller sur les quelques pages du site.


Apres je ne sais pas ton but mais "apache+php" en direct comme ca c'est un peu antique de nos jours ... depuis 20 ans y'a eu plein de progrès et de frameworks qui ont été faits.
Si tu veux un site web pas trop compliqué, tu peux partir d'un CMS comme Worpress ou Drupal ou Joomla (ou plus récent encore que ces 3 mammouths qui 10 ans +) ou alors "un cran" en dessous en partant de frameworks plus haut-niveau que Apache+php. La plupart de ces produits et frameworks intègrent souvent directement l'authentification et surtout sa gestion.

Apres si tu veux vraiment partir 'bas niveau' je commanderais plutot Nginx (en frontend) qu'Apache et une techno plus moderne que PHP (stack LAMP).
En 2017 il me semble plus adaptée d'apprendre Javascript (surtout ES6 et TypeScript), Node et des technos modernes comme Polymer ou les composants web en général que de perdre son temps avec du "vieux" php. Enfin c'est que mon avis bien sur.

Je n'ai rien contre le fait de lâcher apache/php, mais je n'ai malheureusement pas beaucoup de temps à moi pour repartir de zéro, bien que cela puisse me plaire si c'est accessible.
Je ne travaille pas du tout dans le monde de la programmation et mes connaissances en xhtml/css remonte à mes années d'études quand j'avais du temps de libre pour apprendre à coder.

Mon site web a été construit dans le but de piloter ma domotique legrand via des commandes openwebnet que l'on peut envoyer via php.
Ainsi j'ai une page pour les volets, une pour la lumière et enfin une pour le chauffage.
En Intranet pas de soucis pour la sécurité, le mot de passe wi-fi est long et complexe, mais voulant pouvoir y accéder depuis Internet pour par exemple couper le chauffage à distance lors d'un oubli avant un départ en vacances,... je suis donc obliger de sécuriser le tout.
Mais je ne veux pas non plus rendre la chose trop complexe juste pour ça.

D'où mes questions : comment sécuriser l'accès à ce site restreint à 2 / 3 membres ?
Comment faire en sorte que le mot de passe soit enregistré sur le terminal (l'iphone redemande à chaque fois le mot de passe, alors qu'il est enregistré dans le trousseau de clef),
Comment faire la redirection http vers https ?
Et autre conseils que vous auriez ;)

Merci en tout cas pour votre aide.

vivien

  • Administrateur
  • *
  • Messages: 48 042
    • Twitter LaFibre.info
Sécuriser l'accès à un site web - Méthodes / pièges / bon à savoir ?
« Réponse #7 le: 26 février 2017 à 11:07:23 »
Firefox (disponible sur iPhone) sait enregistrer les mots de passe.

Pour le choix de nginx vs apache2, choix celui sur lequel tu as le plus de compétences.

Il y a plus d'exemples pour Apache2, donc c'est ce que je conseillerais.

Pour la partie performance, il me semble que Apache 2.4 a bien comblé son retard face à Nginx et Apache a toujours bien plus de fonctionnalités évoluées que Nginx. (il faut bien sur comparer à périmètre fonctionnel équivalent pour ne pas biaiser les résultats)

Hugues

  • AS2027 MilkyWan
  • Modérateur
  • *
  • Messages: 12 677
  • Lyon 3 (69) / St-Bernard (01)
    • Twitter
Sécuriser l'accès à un site web - Méthodes / pièges / bon à savoir ?
« Réponse #8 le: 26 février 2017 à 11:22:28 »
Firefox (disponible sur iPhone) sait enregistrer les mots de passe.

Safari aussi, faut juste activer l'option

Pour la partie performance, il me semble que Apache 2.4 a bien comblé son retard face à Nginx et Apache a toujours bien plus de fonctionnalités évoluées que Nginx. (il faut bien sur comparer à périmètre fonctionnel équivalent pour ne pas biaiser les résultats)

+1, apache est très bon :)

buddy

  • Expert
  • Abonné Free fibre
  • *
  • Messages: 15 554
  • Alpes Maritimes (06)
Sécuriser l'accès à un site web - Méthodes / pièges / bon à savoir ?
« Réponse #9 le: 26 février 2017 à 11:43:42 »
Bonjour,

voici une solution pour ne pas demander plusieurs fois le login avec le .htpasswd

AuthUserFile /home/xxxxxxxx/www/.htpasswd
AuthName "Secure"
AuthType Basic

Order Deny,Allow
Deny from all
Satisfy Any
Allow from env=!HTTPS
Require valid-user

#force la redirection en HTTPS
RewriteEngine on
RewriteCond %{SERVER_PORT} 80 [OR]
RewriteCond %{HTTP_HOST} ^monsite\.com$ [NC]
RewriteRule ^(.*) https://www.monsite.com/$1 [QSA,L,R=301]

#permet aux navigateurs de se souvenir qu'il doit passer en https pour votre site (HSTS)
Header set Strict-Transport-Security "max-age=15811200; includeSubDomains; preload"


ce n'est pas la meilleure méthode, mais c'est une méthode qui ne demande que le .htaccess

kgersen

  • Modérateur
  • Abonné Orange Fibre
  • *
  • Messages: 9 230
  • Paris (75)
Sécuriser l'accès à un site web - Méthodes / pièges / bon à savoir ?
« Réponse #10 le: 26 février 2017 à 15:13:46 »
si tu reste avec Apache et une sécurité basique les réponses ont déjà été données je pense.
Perso je ferais juste des acces VPN sans toucher a la partie qui marche déja ('le mieux est l'ennemi du bien'): active le VPN dans le syno et un client vpn dans le(s) mobile(s).
Je préféré toujours séparer la sécurité de l'application quand c'est possible et la c'est le cas. Si tu veux vraiment faire via un web ouvert sur l'exterieur tu peux mettre un "reverse proxy sécurisé" frontal (Apache ou NGinx) devant ton serveur existant plutôt que modifier celui ci.

Apres pour le fun et vu que t'as un IPhone tu peux utiliser Apple HomeKit + homebridge + un plugin pour ton système (au pire a coder s'il n'existe pas mais cherche bien avant).

Comme cela tu pourra piloter tout avec la voix ou le tactile via le wifi de la maison.
Et de l’extérieur il suffit d'avoir une Apple TV ou laisser un IPad dans la maison, ils peuvent servir de relais sécurisés (la sécu utilise iCloud keychain).

Chez Google/Android y'a l’équivalent qui arrive aussi.

Darkjeje

  • Abonné Free adsl
  • *
  • Messages: 592
  • Free VDSL2 Issy-les-Moulineaux (92)
Sécuriser l'accès à un site web - Méthodes / pièges / bon à savoir ?
« Réponse #11 le: 26 février 2017 à 15:21:27 »
Firefox (disponible sur iPhone) sait enregistrer les mots de passe.

Pour le choix de nginx vs apache2, choix celui sur lequel tu as le plus de compétences.

Il y a plus d'exemples pour Apache2, donc c'est ce que je conseillerais.

Pour la partie performance, il me semble que Apache 2.4 a bien comblé son retard face à Nginx et Apache a toujours bien plus de fonctionnalités évoluées que Nginx. (il faut bien sur comparer à périmètre fonctionnel équivalent pour ne pas biaiser les résultats)

Pour le moment je suis sous Apache 2.2 car mon site ne fonctionne pas sous Apache 2.4.