Вопрос или проблема
Я работаю над приложением 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;
}
}
}
Итак, на моей “/” странице я получаю
Но в других местах я отображаю мой сервер:
Я не уверен в том, как работает связь между 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
на всех уровнях.
-
Gunicorn: Убедитесь, что изменен заголовок
SERVER
так, как вы уже сделали. Для всех конечных точек это будет применяться автоматически с корректной конфигурацией Nginx. -
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, чтобы поддерживать актуальность и безопасность сервера.