Puis-je masquer toutes les informations serveur / os?

81

Je ne veux pas que quiconque soit capable de détecter que j'utilise NGINX ou même Ubuntu à partir d'Internet. Il existe des outils (tels que BuiltWith) qui analysent les serveurs pour détecter les outils qu'ils utilisent. En outre, certains outils de craquage peuvent aider à la détection. Quel est le meilleur / le plus proche de ce que je peux arriver à cacher toutes ces informations de l'extérieur?

Orokusaki
la source

Réponses:

116

Vous pouvez empêcher la sortie de la version de Nginx et du système d'exploitation en ajoutant

server_tokens off;

à un http, serverou un locationcontexte.

Ou si vous souhaitez supprimer complètement l'en-tête du serveur, vous devez compiler Nginx avec le module En-têtes More dans, car l'en-tête est codé en dur dans la source Nginx et ce module permet de modifier les en-têtes http.

 more_clear_headers Server;

Cependant, il existe de nombreuses façons cachées que les serveurs effectuent par accident lors de leur mise en œuvre, ce qui peut aider à identifier le système. Par exemple, comment il répond à une requête SSL incorrecte. Je ne vois pas de moyen pratique d'empêcher cela.

Certaines des choses que je pourrais suggérer:

  • changer les modèles d'erreur
  • bloquer tous les ports sauf les services nécessaires
Andy
la source
15
D'accord. Regardez, par exemple, la détection du système d'exploitation de nmap - cela examine les réponses des hôtes cibles aux demandes IP / TCP et permet de déterminer le système d'exploitation de cette manière. Cela ne vaut vraiment pas la peine de faire des efforts.
EEAA
6
+1 sur le conseil d'ErikA. Mieux vaut sécuriser votre serveur du mieux que vous pouvez plutôt que de compter sur la sécurité à travers l'obscurité.
Andy Smith
4
Les jetons de serveur désactivent uniquement le numéro de version. Nginx ne permet pas de supprimer complètement l'en-tête.
Martin Fjordvald
45
ignorer des facteurs de sécurité importants tels que "pas de numéro de version" et probablement même "pas de nom de fournisseur de serveur" est tout à fait ... une erreur pour les débutants. Bien sûr, la sécurité par l'obscurité ne fait rien pour votre sécurité elle-même, mais elle vous protégera au moins contre les vecteurs d'attaque les plus banals et les plus simplistes. La sécurité par l'obscurité est une étape nécessaire . Elle peut être la première et ne doit jamais être la dernière sécurité. Mesure - le supprimer complètement est une très grave erreur, même les serveurs Web les plus sécurisés peuvent être craqués si un vecteur d'attaque spécifique à la version est connu.
Spécialist
1
Il y a toujours un nom de serveur ennuyeux "Nginx" renvoyé dans le corps d'une réponse de redirection 301 et n'a trouvé aucun moyen de l'éviter, la règle d'utilisation d'un modèle HTML personnalisé ne fonctionne pas pour 301.
Guillaume Perrot
32

Si vous avez installé nginx à l'aide d'apt-get dans Debian ou Ubuntu, vous devrez peut-être installer le paquet nginx-extras pour définir ou effacer l'en-tête "Server".

Une fois que cela est fait, vous pouvez ajouter les lignes ci-dessous dans nginx.conf (généralement /etc/nginx/nginx.conf):

Pour effacer complètement l'en-tête "Serveur":

more_clear_headers Server; 

Pour définir une chaîne personnalisée en tant que "Serveur"

more_set_headers 'Server: some-string-here';
paquetlord
la source
1
Confirmé more_clear_headers Server;fonctionne également sur Debian Jessie 8.5 Version nginx: nginx / 1.6.2
Brandon
Cette réponse nécessite plus de votes positifs. Bien que peut-être il convient de noter que la directive doit être placée dans le bloc http du fichier conf (je pense)
Andy
2
Cela fonctionne http, server, location, et location ifcontextes. Source: ngx_headers_more documentation
Kelvin
1
Pour les utilisateurs d'ubuntu: sudo apt-get install nginx-extras puis définissez les en
jchnxu
Pour moi cela a échoué avec unknown directive "more_set_headers". Résolu via l'activation explicite du module dans /etc/nginx/nginx.conf. Ajoutez simplement load_module modules/ngx_http_headers_more_filter_module.so;au début du fichier de configuration.
Rapstacke
18

@ Martin F. Oui, c'est le cas. Vous devrez le compiler à partir du source et changer ce qui est nécessaire avant de compiler le source.

Je suppose que vous avez téléchargé la dernière version stable que vous avez décompressée et que vous savez où se trouvent les fichiers. Si c'est le cas, procédez comme suit:

nano src/http/ngx_http_header_filter_module.c

Ensuite, cherchez la ligne 48 si je me souviens bien.

static char ngx_http_server_string[] = "Server: nginx" CRLF;

Remplacez nginx par MyWitelyServerNameIWant, par exemple

static char ngx_http_server_string[] = "Server: MyWhateverServerNameIWant" CRLF; 

ensuite

nano src/core/nginx.h 

cherche la ligne

#define NGINX_VER          "nginx/" NGINX_VERSION

remplacez "nginx /" par "MyWurtherServerNameIWant /" afin qu'il soit lu

#define NGINX_VER          "MyWhateverServerNameIWant" NGINX_VERSION

Enfin si vous voulez aussi changer le numéro de version

cherche la ligne #define NGINX_VERSION "1.0.4"

et changez "1.0.4" pour la version de votre choix. Par exemple, il va lire

#define NGINX_VERSION      "5.5.5"

J'espère que ça aide. Néanmoins. Sécuriser un serveur va bien au-delà de ne pas montrer ce qui fonctionne. PHP est par nature peu sûr, de même que Linux. Bien sûr, Linux peut être assez sécurisé si toutes les mesures nécessaires sont prises afin de parvenir à une sécurité décente. En ce qui concerne PHP, je recommanderais d'utiliser Suoshin pour renforcer la sécurité de votre code.

Martin M
la source
4
+1, merci. Je quitte @ Andy's en tant qu'officiel, pour des raisons de facilité, mais c'est une excellente information.
Orokusaki
Je pense que vous voulez dire Suhosin.
Beetle
7

Après avoir longuement réfléchi à la création d’une version personnalisée de nginx sur Ubuntu, j’ai réalisé que vous pouviez utiliser le module lua à cet effet.

Sur Ubuntu 14.04, si vous installez le nginx-extraspaquet, vous pouvez supprimer l’en-tête du serveur en utilisant:

header_filter_by_lua 'ngx.header["server"] = nil';

Jetez ceci dans le bloc http et chaque demande manquera d'un en- Servertête.

Si cela ne fonctionne nginx -Vpas, vérifiez que le module lua a bien été compilé dans votre copie de nginx. Sinon, il y a probablement un autre paquet que vous pouvez utiliser pour l'obtenir.

matschaffer
la source
A confirmé que cela fonctionnait pour Debian Jessie 8.5 Version nginx: nginx / 1.6.2
Brandon
1
Lors des tests Debian, cela ne semble pas fonctionner MAIS l’installation nginx-extraa more_set_headers "Server: whatever";fonctionné, donc +1: D
Shautieh
Vous devez uniquement activer LUA pour que cela fonctionne. Tnx
glavić
6

Au lieu de header_filter_by_lua, il est recommandé d'utiliser la nouvelle directive header_filter_by_lua_block qui insère la source Lua directement entre accolades ( {}). Avec cela, il n'est pas nécessaire d'échapper aux caractères spéciaux.

header_filter_by_lua_block { ngx.header["server"] = nil }

https://github.com/openresty/lua-nginx-module#header_filter_by_lua_block

Juergen Kraus
la source
1

Tout d’abord: pourquoi utiliser un module supplémentaire en-tête More Nginx? Seulement pour cacher l'en-tête du serveur. Si quelques lignes, simple patch peut atteindre la même solution pour vous.

L'utilisation d'un module supplémentaire risquerait d'entraîner une instabilité (dans quelle mesure at-il été testé avec votre environnement? Avec vos autres modules, etc.) ou une insécurité (ce module est-il régulièrement mis à jour avec des correctifs liés aux bogues et à la sécurité?)

Deuxièmement. Cette discussion décrit comme réponse 279389 comment vous pouvez ajuster le code Nginx pour modifier l'en-tête du serveur. Le problème est qu'ils ont oublié HTTP / 2. En bref, rien ne changera. L'en-tête du serveur sera toujours visible.

Moins c'est plus c'est mieux. Ok, je l’avoue, je cherche aussi depuis longtemps une bonne solution. Mais finalement trouvé:

Patch de suppression d'en-tête de serveur Nginx

Je suis finalement racheté de cet en-tête ennuyeux du serveur Nginx.

Bertus Du Jang
la source
0

Exécutez cette fonction bash dans le dossier du code source nginx. Dans nginx- $ version, pas dans src /.

Basé sur cette réponse .

hidengxver () {
read -r -p "Your own http_server_string for safety: " http_server_string
first_string="static char ngx_http_server_string\[\] = \"Server: nginx\" CRLF;"
second_string="static char ngx_http_server_string\[\] = \"$http_server_string\" CRLF;"
sed -ire "s/$first_string/$second_string/g" src/http/ngx_http_header_filter_module.c

read -r -p "Your own NGINX_VER const: " nginx_ver
third_string="\#define NGINX\_VER          \"nginx\/\" NGINX\_VERSION"
forth_string="\#define NGINX\_VER          \"$nginx_ver\" NGINX\_VERSION"
sed -ire "s/$third_string/$forth_string/g" src/core/nginx.h

real_nginx_version=$( grep '#define NGINX_VERSION' src/core/nginx.h | gawk -F'"' '{print $2}' )
read -r -p "Your own NGINX_VERSION const: " new_nginx_version
fifth_string="\#define NGINX\_VERSION      \"$real_nginx_version\""
sixth_string="\#define NGINX\_VERSION      \"$new_nginx_version\""
sed -ire "s/$fifth_string/$sixth_string/g" src/core/nginx.h
}
étranger777
la source
-1

Reportez-vous à cette essence . Va sûrement vous aider.

Baloch Aamish
la source
9
Bienvenue sur Server Fault! Bien que cela puisse théoriquement répondre à la question, il serait préférable d’inclure ici les parties essentielles de la réponse et de fournir le lien à titre de référence.
Gerald Schneider