Проблема с прокси-передачей УДАЛЕННОГО ПОЛЬЗОВАТЕЛЯ из nginx в Django

#django #nginx #proxy #reverse-proxy #nginx-reverse-proxy

#django #nginx #прокси #обратный прокси #nginx-обратный прокси

Вопрос:

У меня есть веб-сервер nginx, который настроен на аутентификацию по сертификату клиента. После проверки подлинности я отправляю прокси-запросы на сервер приложений uWSGI Django. Я настроил свое приложение Django для выполнения аутентификации с использованием REMOTE_USER (https://docs.djangoproject.com/en/3.1/howto/auth-remote-user /), однако, похоже, это не работает, поскольку я получаю сообщение об ошибке «объект ‘AnonymousUser’ не является итеративным» от Django.

Я предполагаю, что мне чего-то не хватает в моей конфигурации nginx:

 server {
  listen 80;
  server_name my.website.net;
  return 301 https://$server_name$request_uri;
}
server {
  listen 443 ssl;
  ssl_certificate /etc/letsencrypt/live/my.website.net/fullchain.pem;
  ssl_certificate_key /etc/letsencrypt/live/my.website.net/privkey.pem;
  ssl_verify_client on;
  ssl_verify_depth 2;
  ssl_client_certificate /etc/nginx/ssl/cas.pem;
  proxy_set_header X-SSL-Client-Serial $ssl_client_serial;
  proxy_set_header X-SSL-Client-Verify $ssl_client_verify;
  proxy_set_header X-SSL-Client-S-DN   $ssl_client_s_dn;
  proxy_set_header X-Remote-User $remote_user;
  proxy_set_header REMOTE_USER $remote_user;

  location / {
    root /var/www/my.website.net;
    index index.html index.htm;
  }

  location /django {
    proxy_set_header Host 10.101.10.228;
    proxy_http_version 1.1;
    proxy_set_header Connection "Keep-Alive";
    proxy_set_header Proxy-Connection "Keep-Alive";

    proxy_pass http://10.101.10.228:8000/webapp;
    proxy_redirect http://10.101.10.228/django/ https://my.website.net/django/;

  }

}
  

Я также пытался использовать директивы nginx uwsgi_ *, но безуспешно:

 upstream django {
  server 10.101.10.228:8000;
}
location /django {
  include         uwsgi_params;
  uwsgi_pass django;
  uwsgi_param SCRIPT_NAME /webapp;
  uwsgi_param REMOTE_USER $remote_user;
  uwsgi_param X-REMOTE-USER $remote_user;
}
  

Кажется, что чего-то не хватает?

Комментарии:

1. Он обязательно должен работать с uwsgi_params, а не через заголовки. Однако заполнен ли $remote_user, потому что аутентификация по сертификату клиента — это не то же самое, что базовая аутентификация. Вы можете записать переменную в журнал nginx, если не уверены, используя log_format .

Ответ №1:

Переменная $remote_user nginx заполняется только для базовой аутентификации HTTP. Вы можете полагаться на $ssl_client_s_dn переменную, чтобы использовать DN клиента в качестве имени пользователя:

 proxy_set_header Remote_User $ssl_client_s_dn;
  

или

 uwsgi_param REMOTE_USER $ssl_client_s_dn;
  

Вы можете использовать map блок для восстановления только некоторого определенного поля из DN клиента, например, для получения только CN (канонического имени):

 map $ssl_client_s_dn $remote_user_cn {
    ~,CN=(?<CN>[^,] ) $CN;
}
  

а затем используйте $remote_user_cn переменную в качестве имени пользователя.

Комментарии:

1. Вы правы, $remote_user не устанавливался автоматически, поэтому я использовал $ssl_client_s_dn (используя uwsgi_pass). Спасибо!