Назад | Перейти на главную страницу

Как настроить базовую HTTP-аутентификацию Jenkins с помощью Nginx?

Я установил nginx и сделал следующий хост:

server {
  listen          80;       # Listen on port 80 for IPv4 requests

  server_name     jenkins.mydomain.ru;
  root            /var/lib/jenkins;

  access_log      /var/log/nginx/jenkins_access.log;
  error_log       /var/log/nginx/jenkins_error.log;

  location / {
      auth_basic            "Restricted";
      auth_basic_user_file  /etc/nginx/passwd/htpasswd;

      proxy_pass         http://127.0.0.1:8080/;
      proxy_redirect     off;

      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_max_temp_file_size 0;

      client_max_body_size       10m;
      client_body_buffer_size    128k;

      proxy_connect_timeout      90;
      proxy_send_timeout         90;
      proxy_read_timeout         90;

      proxy_buffer_size          4k;
      proxy_buffers              4 32k;
      proxy_busy_buffers_size    64k;
      proxy_temp_file_write_size 64k;

      # Optional configuration to detect and redirect iPhones
      if ($http_user_agent ~* '(iPhone|iPod)') {
          rewrite ^/$ /view/iphone/ redirect;
      }
  }
}

После этого я могу получить доступ к Jenkinks в jenkins.mydomain.ru, и для этого потребуется пароль. Но я все еще могу получить доступ к Jenkinks в http://mydomain.ru:8080/ без пароля. Как я могу запретить доступ к Jenkinks в http://mydomain.ru:8080/?

Похоже, что Jenkins прослушивает порт 8080, поэтому nginx не контролирует его - вам нужно перейти в файл конфигурации jenkins и сказать ему, чтобы он прослушивал 127.0.0.1 (только локальные соединения), где я предполагаю, что он в настоящее время установлен до 0.0.0.0 (открыт для всех)

Вы также можете запустить jenkins в контейнере докера и полностью контролировать доступные порты. Я подключил 2 док-контейнера jenkins, один из которых является nginx для обратного прокси. хост-машина не имела доступа к контейнеру jenkins, но через URL-адрес, передаваемый в nginx, который перенаправлял его в изолированный контейнер в той же сети докеров.

Вы можете ограничить адрес, к которому привязывается Дженкинс, используя --httpListenAddress (например, localhost). Видеть: Запуск и доступ к Jenkins и Как я могу заставить Дженкинса прекратить прослушивание удаленных подключений?

В Linux это можно настроить в JAVA_ARGS в /etc/default/jenkins файл, но он может отличаться в зависимости от вашего дистрибутива Linux или операционной системы.

Вы также можете рассмотреть возможность использования Обратный прокси Auth плагин, чтобы делегировать аутентификацию обратному прокси-серверу, который вы запускаете перед Jenkins.

Вот несколько дополнительных примечаний:

  • Убедитесь, что клиенты не могут обойти обратный прокси. Если они могут отправлять запросы напрямую Jenkins, тогда злонамеренный клиент может отправлять произвольное имя заголовка с произвольным значением, тем самым ставя под угрозу безопасность Jenkins.
  • Убедитесь, что вы настроили обратный прокси-сервер для удаления заголовка, который вы используете для передачи аутентифицированного имени пользователя. Это предотвращает возможность злонамеренного клиента установить имя заголовка с произвольным значением, которое может нарушить безопасность.
  • Если ваша авторизация проста (например, каждый действующий пользователь получает полный доступ, а все остальные не имеют доступа), вам не нужно использовать этот плагин, так как вы можете выполнять как аутентификацию, так и авторизацию в обратном прокси-сервере.
  • Ударить http://yourserver/whoAmI чтобы увидеть фактические HTTP-заголовки, которые ваш Apache отправляет Jenkins. Это полезно для поиска неисправностей.