![Ошибка 500 при попытке отправить данные в GitLab с аутентификацией Active Directory](https://rvso.com/image/1604277/%D0%9E%D1%88%D0%B8%D0%B1%D0%BA%D0%B0%20500%20%D0%BF%D1%80%D0%B8%20%D0%BF%D0%BE%D0%BF%D1%8B%D1%82%D0%BA%D0%B5%20%D0%BE%D1%82%D0%BF%D1%80%D0%B0%D0%B2%D0%B8%D1%82%D1%8C%20%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D0%B5%20%D0%B2%20GitLab%20%D1%81%20%D0%B0%D1%83%D1%82%D0%B5%D0%BD%D1%82%D0%B8%D1%84%D0%B8%D0%BA%D0%B0%D1%86%D0%B8%D0%B5%D0%B9%20Active%20Directory.png)
В настоящее время мы используем SubVersion, но хотим перейти на решение на основе Git, чтобы иметь возможность проводить предкоммит-проверки кода. Требования таковы: центральный репозиторий Git должен размещаться локально, иметь визуальный интерфейс для управления проектами и использовать аутентификацию Active Directory.
В качестве пробы я установил GitLab EE на виртуальную машину под управлением Ubuntu Server 18.04. Я настроил аутентификацию AD, используя следующую конфигурацию:
gitlab_rails['ldap_enabled'] = true
gitlab_rails['ldap_servers'] = YAML.load <<-'EOS'
main:
label: 'MyOrganisation'
host: '172.16.0.6'
port: 389
uid: 'sAMAccountName'
bind_dn: 'CN=ldapbinduser,CN=Users,DC=myorganisation,DC=com'
password: 'password'
timeout: 30
active_directory: true
allow_username_or_mail_login: false
lowercase_usernames: true
block_auto_created_users: true
base: 'OU=Software,OU=Engineering,DC=myorganisation,DC=com'
group_base: 'OU=Software,OU=Engineering,DC=myorganisation,DC=com'
admin_group: 'internal software dept'
EOS
Это частично удалось. Вкладка MyOrganisation появляется на странице входа в GitLab, и члены группы Software могут входить в систему, используя свои имя пользователя и пароль AD, а не члены — нет. Членам группы «Internal Software Dept» автоматически не назначаются права администратора, но это нормально, поскольку мы можем добавлять их вручную.
Проблема возникает при попытке отправить историю репозитория SVN в GitLab или клонировать репозиторий. Я создал группу Internal Software в GitLab и добавил в нее проект TestProject с файлом readme.txt. На моем ПК с Windows 10 я установил Git Credential Manager для Windows. Когда я пытаюсь клонировать это на свой ПК с помощью: git clonehttp://gitlab/internal-software/testproject.git Я получаю сообщение:
фатально: невозможно получить доступ 'http://gitlab/internal-software/testproject.git/': Запрошенный URL-адрес вернул ошибку: 500 WireShark показывает две попытки подключения с ответом 401 – Несанкционированный на первую попытку, за которым следует ответ 500 – Внутренняя ошибка сервера на вторую попытку:
1 local IP gitlab IP TCP 66 59710 → 80 [SYN] Seq=0 Win=64240 Len=0 MSS=1460 WS=256 SACK_PERM=1
2 gitlab IP local IP TCP 66 80 → 59710 [SYN, ACK] Seq=0 Ack=1 Win=29200 Len=0 MSS=1460 SACK_PERM=1 WS=128
3 local IP gitlab IP TCP 54 59710 → 80 [ACK] Seq=1 Ack=1 Win=525568 Len=0
4 local IP gitlab IP HTTP 241 GET /internal-software/testproject.git/info/refs?service=git-upload-pack HTTP/1.1
5 gitlab IP local IP TCP 60 80 → 59710 [ACK] Seq=1 Ack=188 Win=30336 Len=0
6 gitlab IP local IP HTTP 618 HTTP/1.1 401 Unauthorized (text/plain)
7 local IP gitlab IP TCP 54 59710 → 80 [ACK] Seq=188 Ack=565 Win=524800 Len=0
8 local IP gitlab IP HTTP 292 GET /internal-software/testproject.git/info/refs?service=git-upload-pack HTTP/1.1
9 gitlab IP local IP TCP 60 80 → 59710 [ACK] Seq=565 Ack=426 Win=31360 Len=0
10 gitlab IP local IP TCP 1514 80 → 59710 [ACK] Seq=565 Ack=426 Win=31360 Len=1460 [TCP segment of a reassembled PDU]
11 gitlab IP local IP TCP 1514 80 → 59710 [ACK] Seq=2025 Ack=426 Win=31360 Len=1460 [TCP segment of a reassembled PDU]
12 gitlab IP local IP HTTP 309 HTTP/1.1 500 Internal Server Error (text/html)
13 local IP gitlab IP TCP 54 59710 → 80 [ACK] Seq=426 Ack=3740 Win=525568 Len=0
14 local IP gitlab IP TCP 54 59710 → 80 [RST, ACK] Seq=426 Ack=3740 Win=0 Len=0
Содержимое ответа 500 – Внутренняя ошибка сервера представляет собой стандартную страницу GitLab 500 – «Упс, что-то пошло не так на нашей стороне».
На сервере я просмотрел файлы .log в var/logs/gitlab/gitlab-rails и нашел следующее в production_json.log:
{"method":"GET","path":"/internal-software/testproject/git/info/refs","format":"/","controller":"Проекты::GitHttpController","action":"info_refs","status":401,"duration":35.81,"view":1.05,"db":9.7,"time":"2019-09-19T08:37:55.371Z","params":[{"key":"service","value":git-upload-pack"},{"key":"namespage_id","value":"internal-software"},{"key":"project_id","value":"testproject.git"}],"remote_ip":"172.16.1.46","user_id":null,"username":null,"ua":git/2.17.0.windows.1","queue_duration":null,"correlation_id":"long_uid"} {"method":"GET","path":"/internal-software/testproject/git/info/refs","format":"/","controller":"Projects::GitHttpController","action":"info_refs","status":500,"error":"ArgumentError: шифрование или метод ДОЛЖНЫ быть provided","duration":215.3,"view":0.0,"db":14.11,"time":"2019-09-19T08:37:55.803Z","params":[{"key":"service","value":git-upload-pack"},{"key":"namespage_id","value":"internal-software"},{"key":"project_id","value":"testproject.git"}],"remote_ip":"172.16.1.46","user_id":null,"username":null,"ua":git/2.17.0.windows.1","queue_duration":null,"correlation_id":"long_uid"}
Они, по-видимому, соответствуют HTTP-запросам и ответам выше. Первый — 401, а второй — 500.
Сообщение об ошибке: ArgumentError: ДОЛЖНО быть указано шифрование или метод. Я пробовал искать это на сайте GitLab, Stack Overflow, Stack Exchange и некоторых известных поисковых системах, но получаю только приблизительные результаты, которые не соответствуют моей проблеме.
решение1
Ответ, предоставленный службой поддержки GitLab, состоял в том, что в конфигурации отсутствуют следующие настройки:
encryption: 'plain'
verify_certificates: true
С этими настройками я смог клонировать и отправлять. Я заметил, что всем остальным, кто подключался, сообщалось, что их учетная запись заблокирована, пока я не разблокирую их с помощью учетной записи администратора.