16

Jenkins 和 Gerrit 都有适用于 OpenID 2.0 的插件,但该 API 已于 2014 年 5 月 19 日被 Google 弃用(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

不确定詹金斯。

4

3 回答 3

12

2014/11/05 更新:对于那些来到这里的人,请阅读下面的第一名。感谢hans-zandbelt的反馈。它包含在更新版本中。该设置现在使用建议的改进,并且仅使用 mod_rewrite 将 gerrit 注销 url 重定向到正确的位置。另请注意,不是仅使用电子邮件的非域部分,而是使用未经修改的电子邮件。这意味着如果您碰巧有现有设置,则需要更改用户名映射。

对于詹金斯,请执行以下操作:

  • 将 ${jenkins_home}/users/youruser 移动到 ${jenkins_home}/users/youruser@yourdomain
  • 打开 ${jenkins_home}/config.xml 搜索“youruser”并替换为 youruser@yourdomain

对于格里特:

在机器本身上(将 GERRIT_HOME 更改为它在您机器上的位置):

  • 使用以下两种方法之一打开 sql 数据库:

    1. [推荐]通过 ssh 可用的 gerrit 命令:

      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;
    
  • 外部 ID 将您的帐户映射到不同的用户名、电子邮件等。

  • 以 username 为前缀的那些:例如 username:test@example.com 用于 ssh / git 登录名
  • 以 gerrit 为前缀的那些:例如 gerrit:test@example.com 用于 Web 界面
  • 对于给定的 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 以使用基本身份验证,${gerrit_installation}/etc/gerrit.config 中的 [auth] 部分应如下所示:

[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 上,我们将使用支持 oauth2 的 mod_auth_openidc。有关更多信息和示例文档,请参阅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 转到https://console.developers.google.com/project下的 api 控制台。如果您没有先创建项目,则凭据在项目的上下文中。例如示例验证

开发者控制台项目

在项目上转到 APIs & auth:

  • 在 API 下激活 Google+ API。支持开发者控制台的 API
  • 在凭据下,OAuth 创建新的客户端 ID。开发者控制台创建凭据
  • 在您的 apache 配置中填写 OIDCClientID 和 OIDCClientSecret(例如 gerrit.conf)开发者控制台凭据
  • 在同意屏幕下填写电子邮件和产品名称(如果不这样做,您会收到错误消息)

服务 apache2 重启

你应该完成了!

詹金斯

假设您已经安装了 Jenkins,并且它正在监听 10.10.10.11:8080。

对于 Jenkins,配置几乎相同。您需要安装并激活反向代理身份验证插件http://wiki.jenkins-ci.org/display/JENKINS/Reverse+Proxy+Auth+Plugin。在 Configure Global Security 下,选中“HTTP Header by reverse proxy”单选。 詹金斯激活安全

默认值对应于下面的配置。您需要在 api 控制台https://console.developers.google.com/project中创建与 jenkins 主机名匹配的凭据。像以前一样将它们报告给您的配置(例如 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 身份验证)或等到 mod_auth_openidc 支持它。

于 2014-10-06T11:37:26.610 回答
3

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.comGoogle 域的用户。如果您的应用程序对任何 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

于 2014-11-04T11:14:14.690 回答
2

据我所知,使用 Google 帐户登录 Gerrit 的最快方法是:

  1. 在 Google Developers Console 中创建客户端 ID
  2. 下载此版本的Gerrit 和 Google-OAuth-provider 插件
  3. 重新初始化 Gerrit:java -jar gerrit-2.10.1-4-a83387b.war init -d gerrit_site_path
  4. 并重新启动它:gerrit_site_path/bin/gerrit.sh restart

詹金斯是新的谷歌登录插件。

于 2015-04-10T08:11:52.810 回答