Аутентификация Google для Gerrit и Jenkins

У Jenkins и Gerrit есть оба плагина для OpenID 2.0, но этот API устарел от 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

Не знаю о Дженкинсе.

Ответы

Ответ 1

Обновление 2014/11/05. Для тех, кто здесь, первое место читайте ниже. Благодарим hans-zandbelt за отзывы. Он включен в обновленную версию. Настройка теперь использует предлагаемые улучшения и использует только mod_rewrite для перенаправления URL-адреса выхода gerrit в нужное место. Также обратите внимание, что вместо использования не-доменной части письма электронная почта используется без изменений. Это означает, что если у вас есть существующая настройка, вам нужно изменить сопоставления имени пользователя.

Для Дженкинса сделайте следующее:

  • переместите ${jenkins_home}/users/youruser в ${jenkins_home}/users/youruser @yourdomain
  • откройте файл ${jenkins_home}/config.xml "youruser" и замените его на youruser @yourdomain

Для Gerrit:

либо на самой машине (смените 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;
    
  • внешние идентификаторы отображают вашу учетную запись на разные имена пользователей, электронные письма и т.д.

  • те, которые имеют префикс с именем пользователя: например. имя пользователя: [email protected] для имени пользователя ssh/git
  • те, которые префиксны с gerrit: например. gerrit: [email protected] используются для веб-интерфейса.
  • для данного account_id вы можете просто добавить новые сопоставления для существующих пользователей с помощью sql: например.

    insert into ACCOUNT_EXTERNAL_IDS values(1000032, NULL,NULL, 'username:[email protected]');
    insert into ACCOUNT_EXTERNAL_IDS values(1000032, NULL,NULL, 'gerrit:[email protected]');
    


Решение

Вы можете использовать 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 будет перенаправлять имя пользователя Геррит.

В 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/apache 2/sites-available и активировать его с помощью:

sudo a2ensite gerrit.conf

Файл/etc/apache2/sites-available/gerrit.conf выглядит так:

<VirtualHost *:80>
ServerName gerrit.example.com
ServerAdmin [email protected]
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. Учетные данные находятся в контексте проекта, если вы еще не создали проект. Например. Пример-он-аутентификация

Developer Console projects

В проекте перейдите к API и auth:

  • В API-интерфейсах активируется API Google+. Developer Console enabled APIs
  • В разделе "Учетные данные" OAuth создает новый идентификатор клиента. Developer Console create credentials
  • Заполните OIDCClientID и OIDCClientSecret в вашей конфигурации apache (например, gerrit.conf) Developer Console credentials
  • В окне "Согласие" введите имя электронной почты и продукта (вы получите сообщение об ошибке, если вы этого не сделаете)

service apache2 restart

Вы должны быть готовы!

Дженкинс

Предполагая, что вы уже установили Дженкинса, и он прослушивает 10.10.10.11:8080.

Для Дженкинса конфигурация почти идентична. Вам нужно будет установить и активировать плагин Reverse Proxy Auth http://wiki.jenkins-ci.org/display/JENKINS/Reverse+Proxy+Auth+Plugin. В разделе "Настройка глобальной безопасности" проверьте радиостанцию ​​ "HTTP Header by reverse proxy". Jenkins activating security

Значения по умолчанию соответствуют приведенной ниже конфигурации. Вам нужно будет создать учетные данные, соответствующие имени хоста jenkins в консоли api https://console.developers.google.com/project. Сообщайте о них в свою конфигурацию, как и раньше (например, jenkins.conf). Это должно быть все.

<VirtualHost *:80>
ServerName jenkins.example.com
ServerAdmin [email protected]
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), или подождите, пока он будет поддерживаться mod_auth_openidc.

Ответ 2

Google OpenID 2.0 был заменен на 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

Ответ 3

Как я знаю, самый быстрый способ войти в Gerrit с учетной записью Google:

To Jenkins - новый плагин Google-login.