The community version doesn’t provide SingleSignOn, or SSO like enterprise features out-of-the-box. This is usually not an issue. But once I got used to not putting my credentials in the login screen I didn’t want to go back.
I didn’t find a straight forward how-to-guide so I compiled this from multiple sources. Having a certificate authority (CA), server and client certificates are a prerequisit for this set up to work but creating them is out of scope of this article. This is still not complete but it should be a good starting point.
Configure Rundeck
In the Rundeck documentation are several approaches to authentication listed. I chose the approach that I am most familiar. Turning the Rundeck authentication off and run it through Apache HTTP means I have to ensure that no one can access the default port of Rundeck other than HTTP. A simple firewall rule blocking external traffic will suffice.
rundeck-config.properties
grails.serverURL=https://example.com:4443
framework.properties
framework.server.port = 4443 framework.server.url = https://example.com:4443
profile
RDECK_HTTPS_PORT="${RDECK_HTTPS_PORT:-4443}"
firewall-rules
Providing that external interface is eth0.
iptables -A INPUT -m state --state NEW -p tcp --dport 4443 -i eth0 -j DROP
rundeck-config.properties
rundeck.security.authorization.preauthenticated.enabled=true rundeck.security.authorization.preauthenticated.attributeName=REMOTE_USER_GROUPS rundeck.security.authorization.preauthenticated.delimiter=, rundeck.security.authorization.preauthenticated.userNameHeader=X-Forwarded-Uuid rundeck.security.authorization.preauthenticated.userRolesHeader=X-Forwarded-Roles
Configure Apache
The following modules mod_ssl, mod_ldap and mod_proxy are used. The Apache Documentation is a good starting point but what goes exactly where is not necessarly straigh forward. I hope this helps.
ssl.conf
Listen 443 https ServerName example.com:443 SSLProtocol -all +TLSv1.2 SSLCipherSuite HIGH:!aNULL:!eNULL:!EDH:!DHE:!ADH:!DH:!MD5:!LOW:!EXP:!DES:!RC4:+HIGH SSLHonorCipherOrder on SSLCertificateFile /opt/certificates/example.com.pem SSLCertificateKeyFile /opt/certificates/example.com.pvk SSLCACertificateFile /opt/certificates/ca.pem SSLVerifyClient require SSLVerifyDepth 2 SSLUserName SSL_CLIENT_S_DN_CN RequestHeader set SSL_CLIENT_S_DN "" RequestHeader set SSL_CLIENT_I_DN "" RequestHeader set SSL_SERVER_S_DN_OU "" RequestHeader set SSL_CLIENT_VERIFY "" RequestHeader set X-Forwarded-Uuid "" RequestHeader set X-Forwarded-Groups "" RequestHeader set X-Forwarded-Roles "" AuthType basic AuthName "Client Cert Authentication with LDAP Authorization" AuthBasicProvider ldap AuthLDAPURL "ldaps://example-ldap1.com example-ldap2.com/OU=group,DC=example,DC=com?sAMAccountName?sub?" AuthLDAPBindDN "CN=ldapbinduser,OU=group,DC=example,DC=com" AuthLDAPBindPassword "secure-password" AuthLDAPRemoteUserAttribute sAMAccountName AuthLDAPGroupAttribute member AuthLDAPGroupAttributeIsDN off Require valid-user Require ldap-attribute memberOf="CN=group-name,OU=group,DC=example,DC=com" RequestHeader set SSL_CLIENT_S_DN "%{SSL_CLIENT_S_DN}s" RequestHeader set SSL_CLIENT_I_DN "%{SSL_CLIENT_I_DN}s" RequestHeader set SSL_SERVER_S_DN_OU "%{SSL_SERVER_S_DN_OU}s" RequestHeader set SSL_CLIENT_VERIFY "%{SSL_CLIENT_VERIFY}s" RequestHeader set X-Forwarded-Uuid "%{SSL_CLIENT_S_DN_CN}s" RequestHeader set X-Forwarded-Groups "group-name" RequestHeader set X-Forwarded-Roles "admin" CustomLog /var/log/httpd/tls-clientcert-ldap_log "%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \"%r\" %b \"%{SSL_CLIENT_S_DN_CN}x\" \"%{REMOTE_USER}x\" \"%{SSL_CLIENT_S_DN}x\" \"%{SSL_CLIENT_I_DN}x\" \"%{SSL_SERVER_S_DN_OU}x\" \"%{SSL_CLIENT_VERIFY}x\"" SSLProxyEngine On ProxyPass / https://example.com:4443/ ProxyPassReverse / https://example.com:4443/