Я установил 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. Это полезно для поиска неисправностей.