Google аутентификация для Геррита и Дженкинса
У Jenkins и Gerrit есть оба плагина для OpenID 2.0, но этот API устарел в Google 19 мая 2014 года ( https://developers.google.com/accounts/docs/OpenID), что делает невозможным использование новой установки, а существующие установки должны перейти на OAuth2.0(подключение OpendID). При попытке использовать OpenID 2.0 вы получите сообщение об ошибке "Ошибка 400: запрос авторизации OpenID содержит незарегистрированный домен".
Команда Gerrit знает о проблеме, но пока не имеет решения: https://code.google.com/p/gerrit/issues/detail?id=2677
Не уверен насчет Дженкинса.
3 ответа
Обновление 2014/11/05: Для тех, кто приезжает сюда, первое место читайте ниже. Спасибо Hans Z. за отзыв. Он включен в обновленную версию. Настройка теперь использует предложенные улучшения и использует только mod_rewrite для перенаправления URL выхода из Gerrit в нужное место. Также обратите внимание, что вместо использования не относящейся к домену части электронного письма электронное письмо используется без изменений. Это означает, что если у вас есть существующая настройка, вам нужно изменить сопоставления имен пользователей.
Для Дженкинса сделайте следующее:
- переместите ${jenkins_home}/users/youruser в ${jenkins_home}/users/youruser@yourdomain
- откройте ${jenkins_home}/config.xml и найдите "youruser" и замените его на youruser @ yourdomain
Для Геррита:
либо на самой машине (измените GERRIT_HOME на то место, где она находится на вашей машине):
откройте базу данных sql одним из следующих двух способов:
[Рекомендуется] Либо с помощью команды gerrit, доступной через ssh:
ssh gerrit.revault.ch gerrit gsql
ИЛИ на самой машине (измените GERRIT_HOME на то место, где она находится на вашей машине):
export GERRIT_HOME=/var/gerrit_home pushd ${GERRIT_HOME} java -cp $(find . -name "h2*.jar") org.h2.tools.Shell -url "jdbc:h2:file:${GERRIT_HOME}/db/ReviewDB;IFEXISTS=TRUE"
показать внешний
select * from ACCOUNT_EXTERNAL_IDS;
внешние идентификаторы сопоставляют вашу учетную запись с различными именами пользователей, адресами электронной почты и т. д.
- те, с префиксом username: например, username:test@example.com предназначены для имен входа ssh / git
- те, с префиксом gerrit: например, gerrit:test@example.com, используются для веб-интерфейса
для данного account_id вы можете просто добавить новые сопоставления для существующих пользователей, используя sql: например,
insert into ACCOUNT_EXTERNAL_IDS values(1000032, NULL,NULL, 'username:test@example.com'); insert into ACCOUNT_EXTERNAL_IDS values(1000032, NULL,NULL, 'gerrit:test@example.com');
Решение
Вы можете использовать Apache в качестве аутентификации для обработки обратного прокси-сервера:
Геррит
Предполагая, что вы уже установили Gerrit и он прослушивает адрес 10.10.10.10:8080. Вам нужно настроить gerrit для использования базовой аутентификации, раздел [auth] в вашем ${gerrit_installation}/etc/gerrit.config должен выглядеть следующим образом:
[gerrit]
basePath = git
canonicalWebUrl = http://gerrit.example.com
[database]
type = h2
database = db/ReviewDB
[index]
type = LUCENE
[auth]
type = HTTP
emailFormat = {0}@example.com
httpHeader = X-Forwarded-User
[sendemail]
smtpServer = localhost
[container]
user = gerrit
javaHome = /usr/lib/jvm/java-8-oracle/jre
[sshd]
listenAddress = 10.10.10.10:2222
[httpd]
listenUrl = http://10.10.10.10:8080/
[cache]
directory = cache
Имя пользователя будет в заголовке X-Forwarded-User. Вот как Apache перенаправит имя пользователя в Gerrit.
На Apache мы будем использовать mod_auth_openidc, который поддерживает oauth2. Для получения дополнительной информации и примеров документов см. https://github.com/pingidentity/mod_auth_openidc. На недавней Ubuntu установка выглядит так:
sudo aptitude install libjansson-dev apache2 apache2-dev libcurl4-openssl-dev build-essential autoconf libhiredis-dev
git clone https://github.com/pingidentity/mod_auth_openidc.git
cd mod_auth_openidc
./autogen.sh
./configure
make
sudo make install
sudo a2enmod auth_openidc
sudo a2enmod proxy
sudo a2enmod proxy_http
sudo a2enmod headers
sudo a2enmod rewrite
Вам нужно будет добавить конфигурацию сайта, например, gerrit.conf, аналогичную приведенной ниже (вы, вероятно, тоже хотите использовать TLS) в /etc/apache2/sites-available и активировать ее с помощью:
sudo a2ensite gerrit.conf
Файл /etc/apache2/sites-available/gerrit.conf выглядит следующим образом:
<VirtualHost *:80>
ServerName gerrit.example.com
ServerAdmin webmaster@localhost
DocumentRoot /var/www/html
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
OIDCProviderMetadataURL https://accounts.google.com/.well-known/openid-configuration
OIDCClientID <from api console>
OIDCClientSecret <from api console>
OIDCScope "openid email profile"
OIDCRedirectURI http://gerrit.example.com/oauth2callback
OIDCCryptoPassphrase <generate long random passphrase here, no sure if used>
OIDCSessionInactivityTimeout 600
OIDCCookiePath /
OIDCAuthRequestParams hd=example.com
OIDCRemoteUserClaim email
OIDCAuthNHeader X-Forwarded-User
RewriteEngine On
#LogLevel alert rewrite:trace2
RewriteRule ^/logout$ /oauth2callback?logout=http://gerrit.example.com/ [R]
ProxyPass / http://gerrit.example.com:8080/ nocanon
ProxyPassReverse / http://gerrit.example.com:8080/
ProxyRequests Off
AllowEncodedSlashes NoDecode
<Proxy http://gerrit.example.com:8080/*>
# add rewrites here if necessary
</Proxy>
<Location />
AuthType openid-connect
Require claim hd:example.com
Require valid-user
</Location>
</VirtualHost>
Чтобы получить параметры OIDCClientID и OIDCClientSecret, перейдите в консоль api по https://console.developers.google.com/project. Учетные данные находятся в контексте проекта, если у вас нет первого проекта. Например, пример-это-аутентификация
В проекте перейдите к APIs & auth:
- Под API активируйте Google+ API.
- В разделе "Учетные данные" OAuth создает новый идентификатор клиента.
- Заполните OIDCClientID и OIDCClientSecret в вашей конфигурации apache (например, gerrit.conf)
- Под экраном "Согласие" заполните адрес электронной почты и название продукта (если вы этого не сделаете, вы получите сообщение об ошибке)
перезапуск службы apache2
Вы должны быть сделаны!
Дженкинс
Предполагая, что вы уже установили Jenkins, и он прослушивает 10.10.10.11:8080.
Для Дженкинса конфигурация практически идентична. Вам нужно будет установить и активировать плагин проверки подлинности обратного прокси-сервера http://wiki.jenkins-ci.org/display/JENKINS/Reverse+Proxy+Auth+Plugin. В разделе "Настройка глобальной безопасности" установите флажок "Заголовок HTTP с помощью обратного прокси-сервера".
Значения по умолчанию соответствуют конфигурации ниже. Вам нужно будет создать учетные данные, соответствующие имени хоста jenkins, в консоли API https://console.developers.google.com/project. Сообщите о них в вашу конфигурацию, как и раньше (например, jenkins.conf). Это должно быть все.
<VirtualHost *:80>
ServerName jenkins.example.com
ServerAdmin webmaster@localhost
DocumentRoot /var/www/html
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
OIDCProviderMetadataURL https://accounts.google.com/.well-known/openid-configuration
OIDCClientID <from api console>
OIDCClientSecret <from api console>
OIDCScope "openid email profile"
OIDCRedirectURI http://jenkins.example.com/oauth2callback
OIDCCryptoPassphrase <generate long random passphrase here, no sure if used>
OIDCSessionInactivityTimeout 600
OIDCCookiePath /
OIDCAuthRequestParams hd=example.com
OIDCRemoteUserClaim email
OIDCAuthNHeader X-Forwarded-User
ProxyPass / http://jenkins.example.com:8080/ nocanon
ProxyPassReverse / http://jenkins.example.com:8080/
ProxyRequests Off
AllowEncodedSlashes NoDecode
<Proxy http://jenkins.example.com:8080/*>
# add rewrites here if necessary
</Proxy>
<Location />
AuthType openid-connect
Require claim hd:example.com
Require valid-user
</Location>
<Location ~ "^/(cli|jnlpJars|subversion|whoAmI|computer/[^/]+/slave-agent.jnlp|tcpSlaveAgentListener)">
Satisfy Any
Allow from all
</Location>
</VirtualHost>
В настоящее время, похоже, нет поддержки групп в mod_auth_openidc. Если вам нужны группы, вы можете установить LDAP, в котором они хранятся (но, вероятно, это не то, что вам нужно, так как вы используете Google auth) или подождать, пока он не будет поддержан mod_auth_openidc.
OpenID 2.0 от Google был заменен OpenID Connect. Модуль Apache mod_auth_openidc реализует OpenID Connect, поэтому его можно использовать в обратном прокси-сервере, обращенном к Gerrit/Jenkins, как описано в revau.lt.
Однако имейте в виду, что использование не-доменной части адреса электронной почты в качестве уникального идентификатора небезопасно, если вы не ограничиваете вход в систему конкретным доменом, используя следующие два параметра конфигурации:
OIDCAuthRequestParams hd=example.com
пропустить экран выбора учетной записи Google, и в <Location>
раздел:
Require claim hd:example.com
ограничить доступ только пользователям из example.com
Домен Google. Если ваше приложение открыто для любой учетной записи Google, вы не должны использовать префикс электронной почты в качестве основного идентификатора, поскольку вы рискуете столкнуться с тем, что пользователи в разных доменах имеют одинаковый префикс пользователя.
Вот почему лучше полагаться на полный адрес электронной почты, например
OIDCRemoteUserClaim email
или (непрозрачный) первичный идентификатор, который Google использует в sub
претензия, например:
OIDCRemoteUserClaim sub
Кроме того, вместо переписывания утверждений в заголовки вы можете просто использовать:
OIDCAuthNHeader X-Forwarded-User
Миграция с OpenID 2.0 на OpenID Connect (сохраняя идентификаторы пользователей OpenID 2.0) возможна, как описано здесь и здесь, поэтому вы должны использовать:
OIDCAuthRequestParams openid.realm=<urlencoded-realm-value>
OIDCRemoteUserClaim openid_id
Для полного обзора конфигурационных примитивов смотрите: https://github.com/pingidentity/mod_auth_openidc/blob/master/auth_openidc.conf
Как я знаю, самый быстрый способ войти в Gerrit с помощью учетной записи Google:
- Создать идентификатор клиента в консоли разработчиков Google
- Загрузите этот выпуск плагина Gerrit и Google-OAuth-провайдера
- Переинициализировать Геррит:
java -jar gerrit-2.10.1-4-a83387b.war init -d gerrit_site_path
- И перезапустите его:
gerrit_site_path/bin/gerrit.sh restart
Для Дженкинса новый плагин для входа в Google.