HTTPS-защита подключений к GITLAB


Отключаем встроенный web-сервер Nginx, для чего в файле /etc/gitlab/gitlab.rb устанавливаем значение:

nginx['enable'] = false

Просто так поменять параметры конфигурации GITLAB ничего не даст, вам потребуется запустить дополнительный скрипт реконфигурации, а уже потом перезапустить службу:

# gitlab-ctl reconfigure
# systemctl restart gitlab-runsvdir.service

Проверяем, что встроенный nginx более не использует порт 80, и для этого используем типовую утилиту netstat:

# netstat -tulpn | grep :80 
tcp       0     0 127.0.0.1:8080         0.0.0.0:*              LISTEN     5478/config.ru  
tcp       0     0 127.0.0.1:8082         0.0.0.0:*              LISTEN     5350/sidekiq 5.1.3

После того как мы остановили встроенный Nginx наше web-приложение будет доступно на порту 8080, но слушает оно только localhost, проверить работу мы можем следующим образом:

# curl -I http://127.0.0.1:8080

Следующим этапом, мы устанавливаем штатный nginx:

# apt-get install nginx

Если вы как и я решите использовать SOCKET для взаимодействия с GITLAB, то вам надо будет задать еще один параметр в глобальной конфигурации nginx:

web_server['external_users'] = ['www-data']

Выполняем реконфигурацию GITLAB и создаем конфигурационный файл который будет проксировать входящие подключения к определенному домену на GitLAB сервер и побочно защищать соединение при помощи Let's Encrypt (стандартный virtualhost для Nginx):

upstream gitlab-workhorse { 
 server unix:/var/opt/gitlab/gitlab-workhorse/socket; 
} 

server { 
  listen 80; 
  server_name git.solomonov.ru; 
  return 301 https://$host$request_uri; 
} 

server { 
 server_tokens off; 
 client_max_body_size 0; 

 listen 443 ssl; 
 server_name git.solomonov.ru; 
 ssl_certificate /etc/letsencrypt/live/git.solomonov.ru/fullchain.pem; 
 ssl_certificate_key /etc/letsencrypt/live/git.solomonov.ru/privkey.pem; 
 include /etc/letsencrypt/options-ssl-nginx.conf; 
 ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; 

 add_header Strict-Transport-Security "max-age=31536000"; 

 access_log /var/log/gitlab/nginx/gitlab_access.log combined; 
 error_log /var/log/gitlab/nginx/gitlab_error.log; 

 if ($http_host = "") { 
  set $http_host_with_default "git.solomonov.ru"; 
 } 

 if ($http_host != "") { 
  set $http_host_with_default $http_host; 
 } 

 gzip on; 
 gzip_static on; 
 gzip_comp_level 2; 
 gzip_http_version 1.1; 
 gzip_vary on; 
 gzip_disable "msie6"; 
 gzip_min_length 10240; 
 gzip_proxied no-cache no-store private expired auth; 
 gzip_types text/plain text/css text/xml text/javascript application/x-javascript application/json application/xml application/rss+xml; 

 proxy_read_timeout   3600; 
 proxy_connect_timeout 300; 
 proxy_redirect     off; 
 proxy_http_version 1.1; 

 proxy_set_header Host $http_host_with_default; 
 proxy_set_header X-Real-IP $remote_addr; 
 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
 proxy_set_header Upgrade $http_upgrade; 
 proxy_set_header X-Forwarded-Proto http; 

 location ~ (\.git/gitlab-lfs/objects|\.git/info/lfs/objects/batch$) { 
  proxy_cache off; 
  proxy_pass http://gitlab-workhorse; 
  proxy_request_buffering off; 
 } 

 location / { 
  proxy_cache off; 
  proxy_pass http://gitlab-workhorse; 
 } 

 location /assets { 
  proxy_pass http://gitlab-workhorse; 
 } 

 error_page 404 /404.html; 
 error_page 500 /500.html; 
 error_page 502 /502.html; 
 location ~ ^/(404|500|502)(-custom)?\.html$ { 
   root /opt/gitlab/embedded/service/gitlab-rails/public; 
   internal; 
 } 
}

За основу берем штатный конфигурационный файл /var/opt/gitlab/nginx/conf/gitlab-http.conf и если вы все сделали правильно, то ваш GITLAB будет доступен по HTTPS-протоколу на порту 443 с принудительным редиректом HTTP на HTTPS.