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 одним из следующих двух способов:

    1. [Рекомендуется] Либо с помощью команды gerrit, доступной через ssh:

      ssh  gerrit.revault.ch gerrit  gsql
      
    2. ИЛИ на самой машине (измените 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. 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:

  1. Создать идентификатор клиента в консоли разработчиков Google
  2. Загрузите этот выпуск плагина Gerrit и Google-OAuth-провайдера
  3. Переинициализировать Геррит: java -jar gerrit-2.10.1-4-a83387b.war init -d gerrit_site_path
  4. И перезапустите его: gerrit_site_path/bin/gerrit.sh restart

Для Дженкинса новый плагин для входа в Google.

Другие вопросы по тегам