wow titulos titulo roca negra logro leeroy leeeeeeeeeeeeeroy hacer grajero cumbre como jenkins google-oauth gerrit google-openid mod-auth-openidc

titulos - Autenticación de Google para Gerrit y Jenkins



titulo jenkins (3)

Jenkins y Gerrit tienen ambos complementos para OpenID 2.0, pero esta API ha sido desaprobada por Google el 19 de mayo de 2014 ( https://developers.google.com/accounts/docs/OpenID ), lo que hace imposible que la nueva instalación se utilice y las instalaciones existentes deben migrar a OAuth2.0 (conexión OpendID). Cuando intente utilizar OpenID 2.0, aparecerá el mensaje de error "Error 400: la solicitud de autenticación de OpenID contiene un dominio no registrado".

El equipo de Gerrit es consciente del problema, pero aún no hay una solución: https://code.google.com/p/gerrit/issues/detail?id=2677

No estoy seguro de Jenkins.


Como sé, la forma más rápida de iniciar sesión en Gerrit con la cuenta de Google es:

  1. Crear ID de cliente en la consola de desarrolladores de Google
  2. Descargue esta versión de Gerrit y el complemento proveedor de Google-OAuth
  3. java -jar gerrit-2.10.1-4-a83387b.war init -d gerrit_site_path Gerrit: java -jar gerrit-2.10.1-4-a83387b.war init -d gerrit_site_path
  4. Y reinícielo: gerrit_site_path/bin/gerrit.sh restart

Para Jenkins es el nuevo complemento de Google-login .


OpenID 2.0 de Google ha sido reemplazado por OpenID Connect . El módulo Apache https://github.com/pingidentity/mod_auth_openidc implementa OpenID Connect, por lo que se puede usar en un proxy inverso que enfrenta a Gerrit / Jenkins como lo describe .

Sin embargo, tenga en cuenta que confiar en la parte que no pertenece al dominio de una dirección de correo electrónico como un identificador único es inseguro a menos que restrinja los inicios de sesión a un dominio específico mediante los siguientes dos ajustes de configuración:

OIDCAuthRequestParams hd=example.com

para omitir la pantalla del selector de cuentas de Google, y en la sección <Location> :

Require claim hd:example.com

para restringir el acceso solo a los usuarios del dominio de Google example.com . Si su aplicación está abierta a cualquier cuenta de Google, no debe usar el prefijo de correo electrónico como el identificador principal porque corre el riesgo de colisión de que los usuarios en diferentes dominios tengan el mismo prefijo de usuario.

Por eso es mejor confiar en la dirección de correo electrónico completa, por ejemplo,

OIDCRemoteUserClaim email

o el identificador primario (opaco) que Google usa en la sub , por ejemplo:

OIDCRemoteUserClaim sub

Además, en lugar de volver a escribir las reclamaciones en los encabezados, puede utilizar:

OIDCAuthNHeader X-Forwarded-User

La migración de OpenID 2.0 a OpenID Connect (que conserva los identificadores de usuario de OpenID 2.0) es posible, como se describe https://developers.google.com/accounts/docs/OpenID y here , por lo que usaría:

OIDCAuthRequestParams openid.realm=<urlencoded-realm-value> OIDCRemoteUserClaim openid_id

Para obtener una descripción exhaustiva de las primitivas de configuración, consulte: https://github.com/pingidentity/mod_auth_openidc/blob/master/auth_openidc.conf


Actualización 2014/11/05 : Para los que vienen aquí, lea primero el primer lugar. Gracias hans-zandbelt por los comentarios. Se incorpora en la versión actualizada. La configuración ahora usa las mejoras sugeridas y solo usa mod_rewrite para redireccionar la URL de cierre de sesión de Gerrit al lugar correcto. También tenga en cuenta que en lugar de utilizar solo la parte que no pertenece al dominio del correo electrónico, el correo electrónico se utiliza sin modificaciones. Esto significa que si tiene una configuración existente, necesita cambiar las asignaciones de nombre de usuario.

Para Jenkins hacer lo siguiente:

  • mueva $ {jenkins_home} / users / youruser a $ {jenkins_home} / users / youruser @ yourdomain
  • abre $ {jenkins_home} /config.xml busca "youruser" y reemplaza con youruser @ yourdomain

Para Gerrit:

ya sea en la propia máquina (cambie GERRIT_HOME a donde está en su máquina):

  • Abra la base de datos SQL con uno de los dos métodos a continuación:

    1. [Recomendado] A través del comando gerrit disponible a través de ssh:

      ssh gerrit.revault.ch gerrit gsql

    2. O en la propia máquina (cambie GERRIT_HOME a donde está en su máquina):

      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"

  • mostrar externo

    select * from ACCOUNT_EXTERNAL_IDS;

  • Los ID externos asignan su cuenta a diferentes nombres de usuario, correos electrónicos, etc.

  • los prefijados con nombre de usuario: por ejemplo, nombre de usuario: [email protected] son para nombres de inicio de sesión de ssh / git
  • los prefijados con gerrit: por ejemplo, gerrit: [email protected] se utilizan para la interfaz web
  • para un account_id determinado, solo puede agregar nuevas asignaciones para usuarios existentes utilizando sql: por ejemplo,

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

Solución

Puede utilizar un Apache como autenticación de gestión de proxy inverso para usted:

Gerrit

Suponiendo que ya ha instalado Gerrit y está escuchando en la dirección 10.10.10.10:8080. Deberá configurar gerrit para utilizar la autenticación básica, la sección [auth] en su $ {gerrit_installation} /etc/gerrit.config debería tener este aspecto:

[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

El nombre de usuario estará en el encabezado X-Forwarded-User. Así es como Apache enviará el nombre de usuario a Gerrit.

En Apache usaremos mod_auth_openidc que tiene soporte para oauth2. Para obtener más información y ejemplos de documentos, consulte https://github.com/pingidentity/mod_auth_openidc . En un Ubuntu reciente, la instalación se ve así:

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

Deberá agregar una configuración de sitio, por ejemplo gerrit.conf similar a la que se encuentra a continuación (probablemente también desee TLS) a / etc / apache2 / sites-available y activarlo con:

sudo a2ensite gerrit.conf

El archivo /etc/apache2/sites-available/gerrit.conf tiene este aspecto:

<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>

Para obtener los parámetros OIDCClientID y OIDCClientSecret, vaya a la consola de la API en https://console.developers.google.com/project . Las credenciales están en el contexto de un proyecto, si no tiene una, cree un proyecto primero. Por ejemplo, autenticación de ejemplo.

En el proyecto vaya a APIs y auth:

  • Bajo APIs activa la API de Google+.
  • En Credenciales, OAuth crea un nuevo ID de cliente.
  • Rellene OIDCClientID y OIDCClientSecret en su configuración de apache (por ejemplo, gerrit.conf)
  • En la pantalla de consentimiento, complete el correo electrónico y el nombre del producto (obtendrá un error si no lo hace)

servicio apache2 reinicio

Deberías haber terminado!

Jenkins

Suponiendo que ya tiene instalado Jenkins y está escuchando el 10.10.10.11:8080.

Para Jenkins la configuración es casi idéntica. Deberá instalar y activar el complemento de autenticación de proxy inverso http://wiki.jenkins-ci.org/display/JENKINS/Reverse+Proxy+Auth+Plugin . En Configurar la seguridad global, verifique la radio "Encabezado HTTP por proxy inverso".

Los valores predeterminados corresponden a la configuración de abajo. Deberá crear credenciales que coincidan con el nombre de host de jenkins en la consola de la API https://console.developers.google.com/project . Informe a su configuración como antes (por ejemplo, jenkins.conf). Eso debería ser todo.

<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>

Actualmente no parece haber soporte para grupos en mod_auth_openidc. Si necesita grupos, puede instalar un LDAP que los almacene (pero esto probablemente no sea lo que desea ya que está usando la autenticación de Google) o esperar hasta que sea compatible con mod_auth_openidc.