Gunicorn: PossibilitĂ© de masquer l'attribut serveur d'en-tĂȘte de rĂ©ponse http

CrĂ©Ă© le 24 juil. 2014  Â·  36Commentaires  Â·  Source: benoitc/gunicorn

À l'heure actuelle, toutes les rĂ©ponses ont l'en-tĂȘte http
serveur : gunicorn/19.0.0

Pour des raisons de sĂ©curitĂ©, j'aimerais pouvoir masquer cela afin que les gens ne sachent pas rechercher des failles de sĂ©curitĂ© dans gunicorn. Y a-t-il un moyen de le masquer ? via un rĂ©glage peut-ĂȘtre ?

Improvement FeaturCore To DO

Commentaire le plus utile

Malheureusement, @mathiasverhoeven a fermé ses relations publiques pour une raison quelconque et n'a pas eu d'activité ces derniers temps.

Serait-il impossible d'avoir une option plus gĂ©nĂ©rique ici, comme dans --set-headers oĂč vous pouvez spĂ©cifier n'importe quel nombre d'en-tĂȘtes en tant que paires clĂ©-valeur ? Une valeur vide omettrait complĂštement l'en-tĂȘte.

Pour le moment, j'aimerais ajuster Server , mais j'aimerais Ă©galement ajouter un autre en-tĂȘte de rĂ©ponse, par exemple X-Product: MyProduct .

Je peux organiser quelque chose sur la base des relations publiques de @benoitc et @tilgovi qu'en pensez-vous ?

Tous les 36 commentaires

Généralement, gunicorn est déployé derriÚre un serveur proxy inverse comme nginx dans un environnement de production, et nginx produirait sa propre balise Server .

Ă  l'Ă©tage plus un

avec @benoitc on peut proposer une option en ligne de commande, qu'en pensez vous ? sinon, nous fermerons ce ticket comme expliqué par @georgexsh , en mode production, vous pouvez utiliser un reverse proxy (nginx, apache, ...).

Ne pourrait-on pas simplement modifier l'environ dans un crochet post_request ?

@tilgovi cela fonctionnerait je suppose... je ne sais pas si nous devons créer une autre option...

Ne fonctionne pas. La demande est déjà envoyée à ce stade.

Le middleware Server est dans les en-tĂȘtes par dĂ©faut.

Et si nous supprimions simplement l'en-tĂȘte Server ?

+1

Si nous vous permettons de dĂ©finir la valeur de l'en-tĂȘte sur une chaĂźne alĂ©atoire, nous devrions Ă©galement vous permettre de supprimer complĂštement l'en-tĂȘte.

+1

pourquoi veux-tu supprimer l'en-tĂȘte ?

Dans le passĂ©, j'ai supprimĂ© l'en-tĂȘte des dĂ©ploiements pour masquer le logiciel et la version du serveur afin qu'il ne soit pas rĂ©cupĂ©rĂ© par une personne cherchant des serveurs avec un exploit connu.

Ouais. La sécurité est l'une des raisons. Bien sûr, vous pouvez changer la Server en quelque chose d'aléatoire, mais pourquoi envoyer des octets supplémentaires qui ne sont pas vraiment nécessaires ?

J'ai pris la liberté de faire un PR pour cette fonctionnalité : #1384 . Il est sur ma liste de personnes recherchées depuis un certain temps.

Pour ajouter Ă  la discussion : je dirais que si certains serveurs proxy inverses modifient l'en-tĂȘte Server , certains ajoutent un en-tĂȘte Via comme dĂ©crit dans https://www.w3.org/Protocols/ rfc2616/rfc2616-sec14.html#sec14.38

Malheureusement, @mathiasverhoeven a fermé ses relations publiques pour une raison quelconque et n'a pas eu d'activité ces derniers temps.

Serait-il impossible d'avoir une option plus gĂ©nĂ©rique ici, comme dans --set-headers oĂč vous pouvez spĂ©cifier n'importe quel nombre d'en-tĂȘtes en tant que paires clĂ©-valeur ? Une valeur vide omettrait complĂštement l'en-tĂȘte.

Pour le moment, j'aimerais ajuster Server , mais j'aimerais Ă©galement ajouter un autre en-tĂȘte de rĂ©ponse, par exemple X-Product: MyProduct .

Je peux organiser quelque chose sur la base des relations publiques de @benoitc et @tilgovi qu'en pensez-vous ?

Je vais juste laisser ça ici : https://www.fastly.com/blog/headers-we-dont-want. Comme vous pouvez le lire dans l'article, l'en-tĂȘte Server est Ă  la fois trĂšs courant ET totalement inutile.

J'aimerais Ă©galement pouvoir omettre l'en-tĂȘte Server. J'utilise un serveur Web axĂ© sur la sĂ©curitĂ© appelĂ© Hiawatha pour inverser le proxy, configurĂ© pour ne pas ajouter son propre en-tĂȘte de serveur, donc l'en-tĂȘte de serveur de gunicorn est actuellement transmis aux clients.

L'idée de @tuukkamustonen me semble bonne. :)

Edit : je viens de voir https://github.com/benoitc/gunicorn/pull/1617. server_tokens = true|false|string serait génial.

Quelqu'un utilise Flask ? https://stackoverflow.com/a/46858238/452210 suggĂšre d'envelopper et de remplacer process_response , en remplaçant ou en supprimant l'en-tĂȘte.

J'aimerais Ă©galement pouvoir omettre l'en-tĂȘte Server. J'utilise un serveur Web axĂ© sur la sĂ©curitĂ© appelĂ© Hiawatha pour inverser le proxy, configurĂ© pour ne pas ajouter son propre en-tĂȘte de serveur, donc l'en-tĂȘte de serveur de gunicorn est actuellement transmis aux clients.

J'ai remarquĂ© que mĂȘme cloudflare affiche un en-tĂȘte de serveur, donc je ne sais pas ces jours-ci en quoi il s'agit plus de sĂ©curitĂ© que de renommĂ©e.

Je pense que plutĂŽt que d'ajouter une autre option Ă  la ligne de commande ou Ă  la configuration, je supprimerais simplement la version de l'en-tĂȘte pour commencer. Ajoutez ensuite un paramĂštre de fichier de configuration uniquement pour supprimer le server_token. L'avantage est que le serveur effectuant une mise Ă  niveau progressive vers la nouvelle version pourra ajouter ce paramĂštre sans arrĂȘter le service. Les pensĂ©es?

J'ai remarquĂ© que mĂȘme cloudflare affiche un en-tĂȘte de serveur, donc je ne sais pas ces jours-ci en quoi il s'agit plus de sĂ©curitĂ© que de renommĂ©e.

Je pense que l'en-tĂȘte du service et du serveur de Cloudflare a un contexte diffĂ©rent de celui du serveur d'un site individuel. Lorsqu'un site fait l'objet d'un proxy inverse via Cloudflare, le fait que ce soit Cloudflare qui effectue le proxy n'est pas autrement inconnu ; cela se voit via les serveurs de noms et/ou l'adresse IP, etc. En revanche, le fait que j'hĂ©berge un site sur un VPS sans proxy inverse tiers me donne potentiellement un espoir d'Ă©viter au moins une identification directe via l'en-tĂȘte HTTP du logiciel serveur. (L'idĂ©e Ă©tant, bien sĂ»r, que s'il s'avĂšre Ă  l'avenir que gunicorn prĂ©sente une certaine vulnĂ©rabilitĂ©, il devrait ĂȘtre plus difficile de trouver des cibles que de simplement rechercher son en-tĂȘte de serveur.)

Je pense que plutĂŽt que d'ajouter une autre option Ă  la ligne de commande ou Ă  la configuration, je supprimerais simplement la version de l'en-tĂȘte pour commencer. Ajoutez ensuite un paramĂštre de fichier de configuration uniquement pour supprimer le server_token. L'avantage est que le serveur effectuant une mise Ă  niveau progressive vers la nouvelle version pourra ajouter ce paramĂštre sans arrĂȘter le service. Les pensĂ©es?

Ce serait génial. :+1: :slightly_smiliing_face:

Oui, veuillez au moins supprimer la version. La version n'ajoute rien à la renommée et fait gagner beaucoup de temps aux attaquants.

Je pense juste supprimer la version. @tilgovi des pensées à ce sujet?

Bien pour moi !

Des progrĂšs sur celui-ci ? Cela semble ĂȘtre une victoire rapide pour la sĂ©curitĂ©.

qui fera partie du prochain 20.1

Je pense juste supprimer la version.

Le paramĂštre de fichier de configuration uniquement pour supprimer complĂštement l'en-tĂȘte du serveur est-il toujours prĂ©vu ?

@DavidOliver pourquoi la question ?

@benoitc Votre commentaire que j'ai citĂ© pourrait ĂȘtre interprĂ©tĂ© comme signifiant que c'est "juste"/seulement le numĂ©ro de version qui sera supprimĂ©, alors que plus tĂŽt dans la conversation, le paramĂštre pour supprimer complĂštement l'en-tĂȘte du serveur (ce que j'aimerais faire) Ă©tait ĂȘtre considĂ©rĂ©.

Merci.

Si nous pouvons simplement supprimer complĂštement l'en-tĂȘte du serveur, nous devrions le faire.

Je dois encore ĂȘtre convaincu que le retirer a quelque chose Ă  voir avec le
Sécurité. Cela n'a pas été un problÚme au cours des 10 derniÚres années. Sécurité par
l'obscurité n'aide pas non plus, je préférerais savoir que nous avons un problÚme et
répare le. Connaßtre également le serveur peut aider les opérations

Je suis enclin Ă  supprimer la version pour le moment car cette version donne
trop d'informations sur la façon dont le serveur est maintenu. Nous devrions le faire pour
chaque branche que nous entretenions.

Les pensées?

BenoĂźt

Le dimanche 29 dĂ©cembre 2019 Ă  04:23 Randall Leeds [email protected] a Ă©crit :

Si nous pouvons simplement supprimer complĂštement l'en-tĂȘte du serveur, nous devrions le faire.

-
Vous recevez ceci parce que vous avez été mentionné.
RĂ©pondez directement Ă  cet e-mail, consultez-le sur GitHub
https://github.com/benoitc/gunicorn/issues/825?email_source=notifications&email_token=AAADRIQBGN2KQRKOKLAYK43Q3AJ2PA5CNFSM4ASCOWF2YY3PNVWWK3TUL52HS4DFVREXG43VMVBW63LN5MVXH2ZJKTDNE
ou se désinscrire
https://github.com/notifications/unsubscribe-auth/AAADRISEUFGD43CKXLV3EZTQ3AJ2PANCNFSM4ASCOWFQ
.

>

Envoyé depuis mon mobile

Salut,

J'utilise gunicorn pour servir des rĂ©ponses sur une connexion oĂč les donnĂ©es
coûte cher, tout ce que je peux enlever est tout ce que je n'ai pas à payer.

L'en-tĂȘte du serveur est petit, mais les petites choses s'additionnent, et parfois
petites choses signifie que vous pouvez tout ranger dans un paquet de moins : le
l'en-tĂȘte du serveur avec la version est de 24 octets, environ 1,7% de la charge utile
avec un MSS de 1460 et des en-tĂȘtes TLS. MĂȘme sans le paquet supplĂ©mentaire,
un paquet plus volumineux est beaucoup plus susceptible de devoir ĂȘtre entiĂšrement renvoyĂ©
lorsque la connexion est mauvaise (comme un réseau cellulaire dans un endroit distant).

Sur une nouvelle connexion HTTPS, la poignée de main et le certificat
l'Ă©change fait la plupart de la charge utile et les petites choses peuvent ĂȘtre
ignoré. Pour les petites demandes répétées utilisant keep-alive, redondant
les en-tĂȘtes deviennent une partie beaucoup plus importante de la demande/rĂ©ponse.

Cela peut Ă©galement ĂȘtre important pour les personnes qui se soucient davantage du client
performances (latence supérieure au débit) que coût.

Pour ce cas d'utilisation, l'option la plus utile est de pouvoir
supprimer entiĂšrement l'en-tĂȘte, pas simplement supprimer la valeur
ou la partie version.

Ce commentaire est principalement limité à l'ajout d'informations de référence/spécifications/RFC pertinentes, et (espérons-le) pour la plupart des interprétations/commentaires sans opinion.

Protocole de transfert hypertexte RFC7231 (HTTP/1.1) : sémantique et contenu https://tools.ietf.org/html/rfc7231#section -7.4.2

... Un serveur d'origine PEUT générer un champ Server dans ses réponses.

Un serveur d'origine NE DEVRAIT PAS gĂ©nĂ©rer un champ Serveur contenant des dĂ©tails inutilement fins et DEVRAIT limiter l'ajout de sous-produits par des tiers. Des valeurs de champ de serveur trop longues et dĂ©taillĂ©es augmentent la latence de rĂ©ponse et rĂ©vĂšlent potentiellement des dĂ©tails de mise en Ɠuvre internes qui pourraient permettre (lĂ©gĂšrement) aux attaquants de trouver et d'exploiter les failles de sĂ©curitĂ© connues.

https://tools.ietf.org/html/rfc7231#section -9.6

9.6. Divulgation des informations sur le produit
Les champs d'en-tĂȘte User-Agent (Section 5.5.3), Via (Section 5.7.1 de [RFC7230]) et Server (Section 7.4.2) rĂ©vĂšlent souvent des informations sur les systĂšmes logiciels de l'expĂ©diteur respectif. En thĂ©orie, cela peut permettre Ă  un attaquant d'exploiter plus facilement les failles de sĂ©curitĂ© connues ; dans la pratique, les attaquants ont tendance Ă  essayer toutes les failles potentielles, quelles que soient les versions logicielles apparentes utilisĂ©es. Les proxys qui servent de portail Ă  travers un pare-feu rĂ©seau doivent prendre des prĂ©cautions particuliĂšres concernant le transfert des informations d'en-tĂȘte qui pourraient identifier les hĂŽtes derriĂšre le pare-feu. Le champ d'en-tĂȘte Via permet aux intermĂ©diaires de remplacer les noms de machines sensibles par des pseudonymes.

De (obsolÚte) RFC2616 :

15.1.2 Transfert d'informations sensibles
Comme tout protocole gĂ©nĂ©rique de transfert de donnĂ©es, HTTP ne peut pas rĂ©guler le contenu des donnĂ©es transfĂ©rĂ©es, et il n'y a pas non plus de mĂ©thode a priori pour dĂ©terminer la sensibilitĂ© d'une information particuliĂšre dans le contexte d'une requĂȘte donnĂ©e. Par consĂ©quent, les applications DEVRAIENT fournir autant de contrĂŽle que possible sur ces informations au fournisseur de ces informations. Quatre champs d'en-tĂȘte mĂ©ritent une mention particuliĂšre dans ce contexte : Server, Via, Referer et From.
La rĂ©vĂ©lation de la version logicielle spĂ©cifique du serveur peut permettre Ă  la machine serveur de devenir plus vulnĂ©rable aux attaques contre les logiciels connus pour contenir des failles de sĂ©curitĂ©. Les implĂ©menteurs DEVRAIENT faire du champ d'en-tĂȘte Server une option configurable.

PEP3333 Interface de passerelle de serveur Web Python v1.0.1 https://www.python.org/dev/peps/pep-3333/#the -start-response-callable

En gĂ©nĂ©ral, le serveur ou la passerelle est chargĂ© de s'assurer que les en-tĂȘtes corrects sont envoyĂ©s au client : si l'application omet un en-tĂȘte requis par HTTP (ou d'autres spĂ©cifications pertinentes en vigueur), le serveur ou la passerelle doit l'ajouter. Par exemple, les en-tĂȘtes HTTP Date : et Server : seraient normalement fournis par le serveur ou la passerelle.

  • L'en-tĂȘte de rĂ©ponse du serveur est facultatif selon HTTP 1.1
  • La RFC reconnaĂźt que des champs de serveur trop dĂ©taillĂ©s peuvent faciliter l'analyse des sites Ă  la recherche de serveurs vulnĂ©rables. De toute Ă©vidence, il s'agit d'une disposition d'obscuritĂ© plus difficile, et la quantitĂ© de dĂ©tails est trop circonstancielle.
  • ObsolĂšte HTTP 1.1 RFC2616 est un peu plus audacieux dans la valeur de masquage de l'en-tĂȘte du serveur.
  • PEP3333 semble dĂ©passer lĂ©gĂšrement lors de la mention de l'en-tĂȘte du serveur dans le contexte des en-tĂȘtes requis ou normaux.

Beaucoup d'opinions Ă  ce sujet, comme dans Apache HTTPD ServerTokens : https://httpd.apache.org/docs/2.4/mod/core.html#servertokens

Il n'est pas recommandĂ© de dĂ©finir ServerTokens sur une valeur infĂ©rieure au minimum car cela rend plus difficile le dĂ©bogage des problĂšmes interopĂ©rationnels. Notez Ă©galement que la dĂ©sactivation de l'en-tĂȘte Server: ne fait rien du tout pour rendre votre serveur plus sĂ©curisĂ©. L'idĂ©e de « sĂ©curitĂ© par l'obscurité » est un mythe et conduit Ă  un faux sentiment de sĂ©curitĂ©.

Changer l'en-tĂȘte du serveur pour dire simplement gunicorn est une solution pratique et je pense que nous devrions le faire, sans configuration.

Des gens comme @kmichel-sereema, qui veulent optimiser la taille de chaque transfert, je pense que ce n'est pas le lieu pour effectuer une telle micro-optimisation. Si les en-tĂȘtes HTTP sont trop lourds, HTTP 1.x n'est pas le protocole idĂ©al Ă  utiliser, et je ne pense pas que nous devrions ajouter une configuration supplĂ©mentaire pour permettre de modifier ou de dĂ©sactiver l'en-tĂȘte du serveur.

La suggestion de @tilgovi me semble ĂȘtre un bon compromis.

Dans de nombreux environnements, cela peut mĂȘme ĂȘtre sans objet. Les documents de dĂ©ploiement de gunicorn recommandent d'avoir un serveur proxy comme nginx devant gunicorn. nginx supprime automatiquement l'en-tĂȘte de

suite à ma suggestion et aux commentaires de @tilgovi & @jamadden, je ferme ce numéro en faveur de #2233. Merci à tous pour le code et les commentaires !

Cette page vous a été utile?
0 / 5 - 0 notes