blob: 5271aba27ddcbca7f02525547e1b815a293274ba [file] [log] [blame]
Gerrit2 - Single Sign-On Security
=================================
Gerrit2 supports integration with some types of single sign-on
security solutions, making it possible for end-users to setup
and manage accounts, without administrator involvement.
OpenID
------
By default a new Gerrit installation relies upon OpenID to perform
user authentication services. To enable OpenID, the `system_config`
table needs `login_type` set to `OPENID`:
====
UPDATE system_config SET login_type = 'OPENID';
====
As this is the default setting for new installations there is
nothing required from the site administrator to make use of the
OpenID authentication services.
* http://openid.net/[openid.net]
If Jetty is being used, you may need to increase the header
buffer size parameter, due to very long header lines.
Add the following to `$JETTY_HOME/etc/jetty.xml` under
`org.mortbay.jetty.nio.SelectChannelConnector`:
====
<Set name="headerBufferSize">16384</Set>
====
In order to use permissions beyond those granted to the
`Anonymous Users` and `Registered Users` groups, an account
must only have OpenIDs which match at least one pattern from the
`trusted_external_ids` table. Patterns may be either a regular
expression (must start with `^` and end with `$`) or be a simple
prefix (any other string).
Out of the box Gerrit is configured to trust three patterns:
* `http://` -- trust all OpenID providers using the HTTP protocol
* `https://` -- trust all OpenID providers using the HTTPS protocol
* `https://www.google.com/accounts/o8/id?id=` -- trust Google Accounts
The first two patterns trust all OpenID providers on the Internet.
The Google specific pattern is obviously also implied by the second
pattern (`https://`), but is inserted by default in order to permit
securing Gerrit to trust only Google Accounts easier:
====
DELETE FROM trusted_external_ids
WHERE external_id IN ('http://', 'https://');
====
After making changes to `trusted_external_ids`, either restart
Gerrit, or force a cache flush over SSH:
====
ssh -p 29418 review.example.com gerrit flush-caches
====
Database Schema
~~~~~~~~~~~~~~~
User identities obtained from OpenID providers are stored into the
`account_external_ids` table. Users may link more than one OpenID
identity to the same Gerrit account (use Settings, Web Identities
to manage this linking), making it easier for their browser to sign
in to Gerrit if they are frequently switching between different
unique OpenID accounts.
HTTP Basic/Digest Authentication
--------------------------------
When using HTTP authentication, Gerrit assumes that the servlet
container or the frontend web server has performed all user
authentication prior to handing the request off to Gerrit.
As a result of this assumption, Gerrit can assume that any and
all requests have already been authenticated. The "Sign In" and
"Sign Out" links are therefore not displayed in the web UI.
To enable this form of authentication, update `system_config`:
====
UPDATE system_config
SET
login_type='HTTP'
,login_http_header=NULL
,email_format='{0}@example.com';
====
The `login_type` must always be `HTTP`, indicating the user identity
will be obtained from the HTTP authorization data.
The `login_http_header` must always be `NULL`. If non-null then
Gerrit won't correctly honor the `Authorization` HTTP header.
The `email_format` field ('optional') sets the preferred email
address during first login. Gerrit will replace `\{0\}` with the
username, as obtained from the Authorization header. A format such
as shown in the example would be typical, to add the domain name
of the organization.
If Apache HTTPd is being used as the primary web server and Apache
will be handling authentication, a configuration such as the
following is recommended to ensure repo can obtain the `/ssh_info`
URL during `repo upload`:
====
<Location "/ssh_info">
# We don't want authentication for this one location,
# as repo uses it to grab our hostname and ssh port
#
ProxyPass http://127.0.0.1:8081/ssh_info
Allow from all
Satisfy Any
</Location>
#
<Location "/">
# Everything else should be protected by password
#
ProxyPass http://127.0.0.1:8081/
AuthType Basic
AuthName "Gerrit Review Server"
Require valid-user
...
</Location>
====
Database Schema
~~~~~~~~~~~~~~~
User identities are stored in the `account_external_ids` table.
The user string obtained from the authorization header has the prefix
"gerrit:" and is stored in the `external_id` field. For example,
if a username was "foo" then the external_id field would be populated
with "gerrit:foo".
Computer Associates Siteminder
------------------------------
Siteminder is a commercial single sign on solution marketed by
Computer Associates. It is very common in larger enterprise
environments.
When using Siteminder, Gerrit assumes it has been installed in a
servlet container which is running behind an Apache web server,
and that the Siteminder authentication module has been configured
within Apache to protect the entire Gerrit application. In this
configuration all users must authenticate with Siteminder before
they can access any resource on Gerrit.
As a result of this assumption, Gerrit can assume that any and
all requests have already been authenticated. The "Sign In" and
"Sign Out" links are therefore not displayed in the web UI.
To enable this form of authentication, update `system_config`:
====
UPDATE system_config
SET
login_type='HTTP'
,login_http_header='SM_USER'
,email_format='{0}@example.com';
====
The `login_type` must always be `HTTP`, indicating the user identity
will be obtained from an HTTP header.
The `login_http_header` indicates which HTTP header field the
Siteminder product has stored the username. Usually this is
"SM_USER", but may differ in your environment. Please refer to
your organization's single sign-on or security group to ensure the
setting is correct.
The `email_format` field ('optional') sets the user's preferred email
address when they first login. Gerrit will replace `\{0\}` with the
username, as supplied by Siteminder. A format such as shown in the
example would be typical, to add the domain name of the organization.
If Apache HTTPd is being used, see the section above to configure
the `/ssh_info` URL to be available to `repo upload`.
If Jetty is being used, you may need to increase the header
buffer size parameter, due to very long header lines.
Add the following to `$JETTY_HOME/etc/jetty.xml` under
`org.mortbay.jetty.nio.SelectChannelConnector`:
====
<Set name="headerBufferSize">16384</Set>
====
Database Schema
~~~~~~~~~~~~~~~
User identities are stored in the `account_external_ids` table.
The user string obtained from Siteminder (e.g. the value in the
"SM_USER" HTTP header) has the prefix "gerrit:" and is stored in the
`external_id` field. For example, if a Siteminder username was "foo"
then the external_id field would be populated with "gerrit:foo".