Comment vérifier que les jetons du serveur sont désactivés?

11

Nous avons reçu des commentaires de notre rapport pentest disant que nous devrions désactiver les jetons de serveur. Cela empêche les gens de voir quelle version de PHP nous utilisons et limite leur capacité à cibler la version spécifique de PHP.

J'ai ajouté ce qui suit à nginx.conf, sous le bloc http:

server_tokens off;

Mais quels outils puis-je utiliser pour vérifier que cette modification a pris effet?

fyberoptik
la source
1
server_tokenn'a rien à voir avec la version PHP. Il est généralement envoyé dans un en-tête séparé X-Powered-By. Je suppose que vous avez besoin de php.net/manual/en/ini.core.php#ini.expose-php
Alexey Ten
Bonne prise Alexey, les jetons de serveur ne sont qu'une partie de ma solution. J'ai besoin d'ajouter un paramètre supplémentaire pour arrêter la divulgation de la version PHP. Merci!
fyberoptik

Réponses:

14

Dans le manuel, vous savez ce que fait le paramètre:

Syntaxe : server_tokens on | off;
Par défaut : server_tokens on;
Contexte : http, serveur, emplacement

Active ou désactive l'émission de la version nginx dans les messages d'erreur et dans le champ d'en-tête de réponse «Serveur».

Vos options sont donc:

  • générer un message d'erreur, par exemple si vous n'avez pas de message d'erreur 404 personnalisé, demandez simplement une page non existante et dans le pied de page, vous ne verrez plus les informations de version nginx/1.2.3.
  • inspecter les en-têtes de serveur et confirmer que la version n'est plus affichée.

Une simple vérification pour voir les en-têtes de réponse HTTP consiste à se connecter manuellement, c'est-à-dire avec: telnet www.example.com 80 où les lignes client sont ce que vous entrez:

client: HEAD / HTTP / 1.1
client: hôte: www.example.com

serveur: HTTP / 1.1 200 OK
serveur: Date: mer, 1 jan 1970 22:13:05 GMT
serveur: Serveur: Nginx / 1.2.3
serveur: Connexion: fermer
serveur: Type de contenu: text / html

HBruijn
la source
1
Merci pour votre réponse HBruijn, viens d'essayer avec Windows 7 Telnet, sans succès. A eu un peu plus de succès avec curl -I example.com mais cela ne montre aucune information PHP.
fyberoptik
Cela n'affectera pas PHP, car c'est généralement un en-tête différent dans les pages ...
Thomas Ward
4

Après un peu plus de recherche sur Google, j'ai trouvé que la commande curl peut vérifier les en-têtes du serveur qui montre à la fois les jetons du serveur et les versions php:

curl -I -L www.example.com

Merci à Alexey d'avoir signalé le changement nécessaire en PHP.

HTTP/1.1 301 Moved Permanently
Server: nginx
Date: Thu, 04 Jun 2015 10:49:35 GMT
Content-Type: text/html
Content-Length: 178
Connection: keep-alive
Location: https://www.example.com

HTTP/1.1 200 OK
Server: nginx
Date: Thu, 04 Jun 2015 10:49:36 GMT
Content-Type: text/html; charset=utf-8
Connection: keep-alive
Expires: Sun, 19 Nov 1978 05:00:00 GMT
Last-Modified: Thu, 04 Jun 2015 10:49:35 GMT
Cache-Control: no-cache, must-revalidate, post-check=0, pre-check=0
ETag: "1433414975"
Content-Language: en
fyberoptik
la source
1

De plus, si vous servez de projets PHP, vous devrez peut-être /etc/nginx/{fastcgi,fastcgi_params).conf

fastcgi_param  SERVER_SOFTWARE    nginx;
Alexander Br.
la source
0

Jetez un œil à InSpec, un outil qui vous permet de «transformer vos exigences de conformité, de sécurité et autres politiques en tests automatisés».

https://www.inspec.io

Il peut effectuer tous les tests de configuration dont vous avez besoin pour votre serveur Nginx. Voici une façon de tester l'existence du fichier conf et la valeur de server_tokens:

conf_path = '/etc/nginx/nginx.conf'

control 'Server tokens should be off' do
  describe file(conf_path) do
    it 'The config file should exist and be a file.' do
      expect(subject).to(exist)
      expect(subject).to(be_file)
    end
  end
  if (File.exist?(conf_path))
    Array(nginx_conf(conf_path).params['http']).each do |http|
      describe "http:" do
        it 'server_tokens should be off if found in the http context.' do
          Array(http["server_tokens"]).each do |tokens|
            expect(tokens).to(cmp 'off')
          end
        end
      end
    end
  end
end

S'il est correctement défini, InSpec renvoie:

  ✔  Server tokens should be off: File /etc/nginx/nginx.conf
     ✔  File /etc/nginx/nginx.conf The config file should exist and be a file.
     ✔  http: server_tokens should be off if found in the http context.

Si non:

  ×  Server tokens should be off: File /etc/nginx/nginx.conf (1 failed)
     ✔  File /etc/nginx/nginx.conf The config file should exist and be a file.
     ×  http: server_tokens should be off if found in the http context.

     expected: "off"
          got: ["on"]

     (compared using `cmp` matcher)
james.garriss
la source