Содержание

GitLab

Добавление репозитория:

wget --quiet https://packages.gitlab.com/gitlab/gitlab-ce/gpgkey -O - | sudo apt-key add -
echo deb https://packages.gitlab.com/gitlab/gitlab-ce/ubuntu/ xenial main | sudo tee /etc/apt/sources.list.d/gitlab.list
sudo apt update

Установка:

sudo EXTERNAL_URL="http://git.domain.com" apt-get install gitlab-ce

https://about.gitlab.com/installation/#ubuntu

Nginx

Нажмите, чтобы отобразить

Нажмите, чтобы скрыть

server {
    listen 80;
    server_name git git.domain.com;

    server_tokens off;
    client_max_body_size 200m;

    location / {
        gzip off;

        proxy_read_timeout      600;
        proxy_send_timeout      600;
        proxy_connect_timeout   600;
        send_timeout            600;
        proxy_redirect          off;

        proxy_set_header    Host                $http_host;
        proxy_set_header    X-Real-IP           $remote_addr;
        proxy_set_header    X-Forwarded-Ssl     on;
        proxy_set_header    X-Forwarded-For     $proxy_add_x_forwarded_for;
        proxy_set_header    X-Forwarded-Proto   $scheme;
        proxy_set_header    X-Frame-Options     SAMEORIGIN;

        proxy_pass http://172.17.0.1:1080;
    }
}

server {
    listen 443 ssl http2;
    server_name  git git.domain.com;

    server_tokens off;
    client_max_body_size 200m;

  location / {
        gzip off;

        proxy_read_timeout      600;
        proxy_send_timeout      600;
        proxy_connect_timeout   600;
        send_timeout            600;
        proxy_redirect          off;

        proxy_set_header    Host                $http_host;
        proxy_set_header    X-Real-IP           $remote_addr;
        proxy_set_header    X-Forwarded-Ssl     on;
        proxy_set_header    X-Forwarded-For     $proxy_add_x_forwarded_for;
        proxy_set_header    X-Forwarded-Proto   $scheme;
        proxy_set_header    X-Frame-Options     SAMEORIGIN;

        proxy_pass http://172.17.0.1:1080;
    }
    ssl_protocols	SSLv3 TLSv1 TLSv1.1 TLSv1.2;
    ssl_certificate	/etc/nginx/ssl/selfsigned.crt;
    ssl_certificate_key	/etc/nginx/ssl/selfsigned.key;
    ssl_dhparam /etc/nginx/ssl/dhparam.pem;
}


Сбросить пароль

Заходим в консоль Ruby on Rails:

sudo gitlab-rails console production

Задаём пользователя и пароль к нему (пример для root):

user = User.where(id: 1).first
user.password = 'secret_pass'
user.password_confirmation = 'secret_pass'
user.save!

https://docs.gitlab.com/ee/security/reset_root_password.html

Настройка

Загрузка внешнего конфигурационного файла

Пример загрузки конфигурационного файла /home/admin/external_gitlab.rb:

В /etc/gitlab/gitlab.rb добавить:

from_file "/home/admin/external_gitlab.rb"

https://docs.gitlab.com/omnibus/settings/configuration.html#loading-external-configuration-file-from-non-root-user

Интеграция с LDAP

Конфигурацию приводим к виду (пример для AD):

gitlab_rails['ldap_enabled'] = true
gitlab_rails['ldap_servers'] = YAML.load <<-'EOS'
   main: # 'main' is the GitLab 'provider ID' of this LDAP server
     label: 'LDAP'
     host: 'domain.com'
     port: 389
     uid: 'sAMAccountName'
     bind_dn: 'CN=gitlab,OU=SERVICE,DC=domain,DC=com'
     password: 'пароль_bind_dn'
     encryption: 'plain' # "start_tls" or "simple_tls" or "plain"
     verify_certificates: false
     active_directory: true
     allow_username_or_email_login: false
     block_auto_created_users: true
     base: 'OU=IT,OU=AE Staff,OU=Staff,DC=domain,DC=com'
     user_filter: '(&(objectClass=user)(objectCategory=person)(!(userAccountControl:1.2.840.113556.1.4.803:=2)))'
     attributes:
       username: ['uid', 'userid', 'sAMAccountName']
       email:    ['mail', 'email', 'userPrincipalName']
       name:       'cn'
       first_name: 'givenName'
       last_name:  'sn'
EOS

Обновляем конфигурацию:

sudo gitlab-ctl reconfigure

Проверка подключения:

sudo gitlab-rake gitlab:ldap:check

https://docs.gitlab.com/ce/administration/auth/how_to_configure_ldap_gitlab_ce/index.html

Rack attack. Защита от перебора

Пример для блокировки IP на час, которые сделали 10 попыток входа в течении 1 минуты («127.0.0.1»,«192.168.0.0/16» при этом не учитываются):

В /etc/gitlab/gitlab.rb редактируем:

gitlab_rails['rack_attack_git_basic_auth'] = {
 'enabled' => true,
 'ip_whitelist' => ["127.0.0.1","192.168.0.0/16"],
 'maxretry' => 10,
 'findtime' => 60,
 'bantime' => 3600
 }

Обновляем конфигурацию:

sudo gitlab-ctl reconfigure

Значения:

https://docs.gitlab.com/ce/security/rack_attack.html

SSH keys

  1. Создать пару ключей:
    ssh-keygen -t rsa -b 4096 -C "gitlab@domain.com" -P "" -q -f ~/.ssh/gitlab_rsa
  2. Копировать в буфер публичный ключ ~/.ssh/gitlab_rsa.pub:
    xclip -sel clip < ~/.ssh/gitlab_rsa.pub
  3. Добавить пользователю публичный ключ (http://git.domain.com/profile/keys)
  4. При подключении использовать имя пользователя git. Проверить:
    ssh -T -o IdentitiesOnly=yes -i ~/.ssh/gitlab_rsa -F /dev/null git@git.domian.com -p2222

Для постоянного подключения по ключу создать ~/.ssh/config:

Host git.domain.com
 User git
 Hostname git.domain.com
 Port 2222
 PreferredAuthentications publickey
 IdentityFile ~/.ssh/gitlab_rsa
 TCPKeepAlive yes
 IdentitiesOnly yes

Проверить:

ssh -T git.domain.com

Пример строки для подключения в CI: ssh://git.domain.com:2222/project/patient-account.git

https://docs.gitlab.com/ce/ssh/

Чтение секретов Vault

Пример использования API Vault для GitLab

https://docs.gitlab.com/ce/ci/examples/authenticating-with-hashicorp-vault/index.html

Опции

gitlab_rails['username_changing_enabled'] = false - отключить изменение логина пользователем
gitlab_rails['gitlab_default_can_create_group'] = false - запретить новым пользователям создавать группы
Admin area → Setting → General → Sign-up restrictions: Sign-up enabled - отключить/включить регистрацию на странице входа

Container Registry

Для включения встроенного сервиса Docker Registry, добавить в gitlab.rb:

registry_external_url 'http://registry.git.domain.com:5005'
gitlab_rails['registry_enabled'] = true

после переконфигурации Registry доступен в insecure режиме.

Очистить Registry от удалённых тэгов:

gitlab-ctl registry-garbage-collect -m

https://docs.gitlab.com/ce/administration/packages/container_registry.html
https://docs.gitlab.com/omnibus/maintenance/#container-registry-garbage-collection

Container Registry API

API для просмотра списков контейнеров их детализации и удаления

https://docs.gitlab.com/ce/api/container_registry.html

Показать id и имя всех проектов:

curl --header "PRIVATE-TOKEN: 41Mdoaejw2SvJnjDrp53" "http://git.domain.com/api/v4/projects" | jq '.[]|.id,.name'

Показать список тегов в registry проекта:

curl -k --header "PRIVATE-TOKEN: 41Mdoaejw2SvJnjDrp53" "https://git.domain.com/api/v4/projects/5/registry/repositories/5/tags" | jq

Удалить тэги в registry старше 30 дней по шаблону '.*' исключая шаблон 'stable.*' и оставляя не менее 3-х тэгов:

curl -k --request DELETE --data 'name_regex=.*' --data 'name_regex_keep=stable.*' --data 'keep_n=3' --data 'older_than=30d' --header "PRIVATE-TOKEN: VywyTf4oc6-2JyasiQjv" "https://git.domain.com/api/v4/projects/5/registry/repositories/5/tags"

Docker

GitLab

Пример запуска GitLab:

docker run --detach --restart always \
  --hostname git.domain.com \
  --publish 443:443 --publish 80:80 --publish 2222:22 --publish 5005:5005 \
  --volume /data/docker/gitlab/etc_gitlab:/etc/gitlab \
  --volume /data/docker/gitlab/var_log_gitlab:/var/log/gitlab \
  --volume /data/docker/gitlab/var_opt_gitlab:/var/opt/gitlab \
  --volume /data/docker/registry/certs:/certs \
  --volume /data/docker/registry/var_lib_registry:/registry\
  --name gitlab gitlab/gitlab-ce:latest

https://docs.gitlab.com/omnibus/docker/

Backup/Restore

Резервное копирование:

docker exec -t gitlab gitlab-backup create

Для полного резервного копирования необходимо дополнительно скопировать файлы:

  • /etc/gitlab/gitlab-secrets.json
  • /etc/gitlab/gitlab.rb

Версии gitlab должны совпадать с той версией с которой делалась резервная копия и на которую идёт восстановление.

Восстановление:

  1. Скопировать файл бэкапа (пример 1580399970_2020_01_30_12.7.2_gitlab_backup.tar) с которого будет восcтановлен gitlab в /var/opt/gitlab/backups/ и назначить ему права:
    sudo cp 1580399970_2020_01_30_12.7.2_gitlab_backup.tar /data/docker/gitlab/var_opt_gitlab/backups/
    docker exec gitlab chown git.git /var/opt/gitlab/backups/1580399970_2020_01_30_12.7.2_gitlab_backup.tar
  2. Остановить службы подключаемые к базе и проверить:
    docker exec gitlab gitlab-ctl stop unicorn
    docker exec gitlab gitlab-ctl stop puma
    docker exec gitlab gitlab-ctl stop sidekiq
    docker exec gitlab gitlab-ctl status
  3. Восстановить
    docker exec -it gitlab gitlab-backup restore
  4. Восстановить gitlab-secrets.json и gitlab.rb
  5. Перегрузить конфигурацию, gitlab и проверить
    docker exec gitlab gitlab-ctl reconfigure
    docker exec gitlab gitlab-ctl restart
    docker exec gitlab gitlab-rake gitlab:check SANITIZE=true

https://docs.gitlab.com/ce/raketasks/backup_restore.html

gitlab-runner

Регистрация Runner'а:

docker run --rm -t -i -v /data/docker/gitlab-runner/etc_gitlab-runner:/etc/gitlab-runner gitlab/gitlab-runner:alpine register

Во время регистрации вводим URL, token со страницы GiTLab → Admin Area → Overview → Runners
Далее вводим description, tags, executor (shell, docker-ssh+machine, docker, parallels, ssh, virtualbox, docker+machine, kubernetes, custom, docker-ssh)
Для executor docker указать образ по умолчанию (например для dotnet: mcr.microsoft.com/dotnet/core/sdk:3.1)

Если из контейнера нужен доступ через прокси, добавляем в /etc/gitlab-runner/config.toml в секцию [[runners]]:

environment = ["https_proxy=http://d2proxy.domain.com:3128", "http_proxy=http://d2proxy.domain.com:3128", "HTTPS_PROXY=d2proxy.domain.com:3128", "HTTP_PROXY=d2proxy.domain.com:3128"]

Если будет использоваться режим docker-in-docker, то при регистрации использовать привилегированный режим, добавить:

--docker-privileged

или добавить в /etc/gitlab-runner/config.toml в секцию [runners.docker]:

privileged = true

Запуск зарегистрированного Runner'а:

docker run -d --name gitlab-runner --restart always -v /data/docker/gitlab-runner/etc_gitlab-runner:/etc/gitlab-runner gitlab/gitlab-runner:alpine

https://docs.gitlab.com/runner/register/index.html#docker
https://docs.gitlab.com/runner/install/docker.html
https://docs.gitlab.com/runner/configuration/proxy.html
https://docs.gitlab.com/runner/executors/docker.html#use-docker-in-docker-with-privileged-mode
https://about.gitlab.com/releases/2019/07/31/docker-in-docker-with-docker-19-dot-03/ - Configure GitLab Runner to use TLS or Explicitly turn off TLS

Ссылки

https://packages.gitlab.com/app/gitlab/gitlab-ce/search?filter=debs&q=&dist=ubuntu%2Fxenial - Поиск пакетов
https://source.isimplelab.com/help/ci/docker/using_docker_build.md - Использование Docker Build