| # Gerrit SAML Plugin | |
| This plugin allows you to authenticate to Gerrit using a SAML identity | |
| provider. | |
| ## Installation | |
| Gerrit looks for 3 attributes (which are configurable) in the AttributeStatement: | |
| - **DisplayName:** the full name of the user. | |
| - **EmailAddress:** email address of the user. | |
| - **UserName:** username (used for ssh). | |
| If any of these attributes is not found in the assertion, their value is | |
| taken from the NameId field of the SAML assertion. | |
| ### Setting Gerrit in your IdP (Okta, Onelogin, ...) | |
| - Create a new SAML 2.0 application. | |
| - Set the following parameters: | |
| - Single sign on URL: http://gerrit.site.com/plugins/gerrit-saml-plugin/saml | |
| - Check "Use this for Recipient URL and Destination URL". | |
| - Audience URI (SP Entity Id): http://gerrit.site.com/plugins/gerrit-saml-plugin/saml | |
| - We need to set up the attributes in the assertion to send the right | |
| information. Here is how to do it with Okta: | |
| - Application username: "Okta username prefix" | |
| - Add attribute statement: Name: "DisplayName" with Value | |
| "user.displayName" | |
| - Add attribute statement: Name: "EmailAddress" with Value | |
| "user.email" | |
| - **IMPORTANT**: If you are not using Okta, you need to set up an attribute | |
| "UserName" with the value of the username (not email, without @). If you | |
| do not do so, the name will be taken from the NameId provided by | |
| the assertion. This is why in Okta we set the application username to | |
| "Okta username prefix". | |
| - Obtain your IdP metadata (either URL or a local XML file) | |
| ### Download the plugin | |
| Download [gerrit-saml-plugin](https://bintray.com/artifact/download/thesamet/maven/gerrit-saml-plugin-2.11.5-1.jar) and put it in $gerrit_site/lib/. | |
| ### Configure Gerrit to use the SAML filter: | |
| In `$site_path/etc/gerrit.config` file, the `[httpd]` section should contain | |
| ``` | |
| [httpd] | |
| filterClass = com.thesamet.gerrit.plugins.saml.SamlWebFilter | |
| ``` | |
| ### Configure HTTP authentication for Gerrit: | |
| Please make sure you are using Gerrit 2.11.5 or later. | |
| In `$site_path/etc/gerrit.config` file, the `[auth]` section should include | |
| the following lines: | |
| ``` | |
| [auth] | |
| type = HTTP | |
| logoutUrl = https://mysso.example.com/logout | |
| httpHeader = X-SAML-UserName | |
| httpDisplaynameHeader = X-SAML-DisplayName | |
| httpEmailHeader = X-SAML-EmailHeader | |
| httpExternalIdHeader = X-SAML-ExternalId | |
| ``` | |
| The header names are used internally between the SAML plugin and Gerrit to | |
| communicate the user's identity. You can use other names (as long as it will | |
| not conflict with any other HTTP header Gerrit might expect). | |
| ### Create a local keystore | |
| In `$gerrit_site/etc` create a local keystore: | |
| ``` | |
| keytool -genkeypair -alias pac4j -keypass pac4j-demo-password \ | |
| -keystore samlKeystore.jks \ | |
| -storepass pac4j-demo-password -keyalg RSA -keysize 2048 -validity 3650 | |
| ``` | |
| ### Configure SAML | |
| Add a new `[saml]` section to `$site_path/etc/gerrit.config`: | |
| ``` | |
| [saml] | |
| keystorePath = /path/to/samlKeystore.jks | |
| keystorePassword = pac4j-demo-passwd | |
| privateKeyPassword = pac4j-demo-passwd | |
| metadataPath = https://mycompany.okta.com/app/hashash/sso/saml/metadata | |
| ``` | |
| **saml.metadataPath**: Location of IdP Metadata from your SAML identity provider. | |
| The value can be a URL, or a local file (prefix with `file://`) | |
| **saml.keystorePath**: Path to the keystore created above. If not absolute, | |
| the path is resolved relative to `$site_path`. | |
| **saml.privateKeyPassword**: Password protecting the private key of the generated | |
| key pair (needs to be the same as the password provided throguh the `keypass` | |
| flag above.) | |
| **saml.keystorePassword**: Password that is used to protect the integrity of the | |
| keystore (needs to be the same as the password provided throguh the `keystore` | |
| flag above.) | |
| **saml.displayNameAttr**: Gerrit will look for an attribute with this name in | |
| the assertion to find a display name for the user. If the attribute is not | |
| found, the NameId from the SAML assertion is used instead. | |
| Default is `DisplayName` | |
| **saml.emailAddressAttr**: Gerrit will look for an attribute with this name in | |
| the assertion to find a the email address of the user. If the attribute is not | |
| found, the NameId from the SAML assertion is used instead. | |
| Default is `EmailAddress` | |
| **saml.userNameAttr**: Gerrit will look for an attribute with this name in the | |
| assertion to find a the email address of the user. If the attribute is not | |
| found, the NameId from the SAML assertion is used instead. | |
| Default is `UserName` | |
| ## Development | |
| - Clone this repository. | |
| - Install sbt. | |
| - Edit the code. | |
| - Run 'sbt assembly' to build the jar. | |
| - Copy target/out/gerrit-saml-plugin-$VERSION.jar into $site_path/lib/ | |