Измените заголовок сервера на всех конечных точках (Flask + Nginx + Gunicorn).

Вопрос или проблема

Я работаю над приложением Flask, которое использует gunicorn и nginx и должно скрывать заголовок сервера, поэтому я смог сделать это только для домашней страницы, вот так:

gunicorn.conf.py

import gunicorn
gunicorn.SERVER = '.'

nginx.conf

events {
    worker_connections  1024;
}


http{

    include /etc/nginx/mime.types;
    # include /etc/nginx/conf.d/*.conf;

    server{

        #server_tokens off;
        proxy_pass_header Server; # get server from gunicorn

     

        # let the browsers know that we only accept HTTPS
        add_header Strict-Transport-Security max-age=2592000;
        
        listen 80;

        add_header Content-Security-Policy $CSPheader;
        gzip on;



        location / {

            proxy_pass  http://127.0.0.1:5000
            proxy_set_header Host $host;
            proxy_set_header X-Forwarded-Proto $scheme;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            
            client_max_body_size 5M;

        }

        location /static/ {
            
            alias /home/app/static/;
            proxy_set_header Cookie $http_cookie;

            add_header X-Content-Type-Options nosniff;


        }

    }
}

Итак, на моей “/” странице я получаю

enter image description here

Но в других местах я отображаю мой сервер:

enter image description here

Я не уверен в том, как работает связь между nginx и gunicorn, но, похоже, у меня похожая проблема, как в этом посте, но я не уверен, как использовать эту информацию.

Любая помощь в скрытии заголовка моего сервера будет очень признательна. Спасибо!

вы можете попытаться скрыть версию nginx, раскомментировав (удалив #) эту директиву:
server_tokens off;

тогда это покажет что-то вроде этого:
скрытая информация о nginx

Ответ или решение

Вопрос касается настройки веб-сервера, который состоит из компонентов Flask, Gunicorn и Nginx. Основная цель заключается в скрытии заголовка сервера для всех конечных точек приложения, а не только для главной страницы. Это важная задача, так как она повышает безопасность приложения, скрывая информацию о сервере, что может помешать потенциальным злоумышленникам понять, с чем они имеют дело. Рассмотрим, как можно решить данную задачу.

Теория

Во-первых, стоит понять, как происходит взаимодействие между компонентами Nginx, Gunicorn и Flask. Flask – это микро-фреймворк на языке Python, который обрабатывает HTTP-запросы и возвращает ответы. Gunicorn – это WSGI HTTP сервер, который запускает Flask-приложение и обрабатывает запросы, поступающие от веб-сервера, в данном случае Nginx. Nginx выполняет роль обратного прокси-сервера, принимая все входящие запросы и перенаправляя их к Gunicorn, который затем взаимодействует с Flask.

Заголовки HTTP, такие как Server, предоставляют информацию о типе и версии сервера и могут быть использованы злоумышленниками для выяснения потенциальных уязвимостей. Скрытие этих заголовков делает сервер менее подверженным атакам, такими как попытка эксплуатации известных уязвимостей для данного сервера или его версии.

Пример

В текущей конфигурации Nginx и Gunicorn есть несколько настроек, которые влияют на формирование заголовка Server:

Gunicorn

Файл конфигурации gunicorn.conf.py включает следующее:

import gunicorn
gunicorn.SERVER = '.'

Это изменение назначает пользовательское значение заголовку Server, и, вероятно, вы уже видели, что оно работает для главной страницы.

Nginx

Конфигурация Nginx выглядит следующим образом:

server{
   #server_tokens off;
   proxy_pass_header Server; # get server from gunicorn

   location / {
      proxy_pass  http://127.0.0.1:5000;
      # Настройки прокси
   }

   location /static/ {
      # Настройки для статики
   }
}
  • Директива proxy_pass_header Server; передает заголовок Server от Gunicorn к клиенту. Чтобы предотвратить это на уровне Nginx, можно убрать эту директиву.

  • server_tokens off;, если раскомментировать, уберет информацию о версии Nginx из ответа.

Применение

Следующие шаги помогут скрыть заголовок Server на всех уровнях.

  1. Gunicorn: Убедитесь, что изменен заголовок SERVER так, как вы уже сделали. Для всех конечных точек это будет применяться автоматически с корректной конфигурацией Nginx.

  2. Nginx: Чтобы убедиться, что заголовок сервера скрыт:

    • Удалите или закомментируйте директиву proxy_pass_header Server;.
    • Раскомментируйте server_tokens off; или добавьте ее, если она отсутствует. Это действие не только скрывает версию Nginx, но и дополняет вашу конфигурацию.
    • Добавьте proxy_hide_header Server; в конфигурацию Nginx для сокрытия заголовков Server, выданных любым upstream сервером, включая Gunicorn.

Итоговая конфигурация может выглядеть так:

server {
    server_tokens off;

    location / {
        proxy_pass http://127.0.0.1:5000;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_hide_header Server; # Скрывает заголовок Server от Gunicorn
    }

    location /static/ {
        alias /home/app/static/;
    }
}

Имейте в виду, что после изменений конфигурации Nginx необходимо выполнить команду nginx -s reload, чтобы применить изменения, не прерывая работу Nginx.

Внедрение этих изменений позволит скрыть серверные заголовки и уменьшит количество информации, доступной для потенциальных атак. Важно следить за обновлениями как Gunicorn, так и Nginx, чтобы поддерживать актуальность и безопасность сервера.

Оцените материал
Добавить комментарий

Капча загружается...