Added documentation for LDAP (#658)
* Added documentation for LDAP Related to #133 Inspired by https://github.com/jenkinsci/kubernetes-operator/issues/133#issuecomment-555976832
This commit is contained in:
		
							parent
							
								
									14b0018a7f
								
							
						
					
					
						commit
						b4345b2905
					
				|  | @ -0,0 +1,128 @@ | ||||||
|  | --- | ||||||
|  | title: "LDAP" | ||||||
|  | linkTitle: "LDAP" | ||||||
|  | weight: 9 | ||||||
|  | date: 2021-09-30 | ||||||
|  | description: > | ||||||
|  |     Additional configuration for LDAP | ||||||
|  | --- | ||||||
|  | 
 | ||||||
|  | Configuring LDAP is not supported out of the box, but can be achieved through | ||||||
|  | plugins and some well tuned configurations. | ||||||
|  | 
 | ||||||
|  | The plugin we will use is: <https://plugins.jenkins.io/ldap/> | ||||||
|  | 
 | ||||||
|  | > Note: This is an example of how LDAP authentication can be achieved. The LDAP | ||||||
|  | > plugin is from a third-party, and there may be other alternatives that suits | ||||||
|  | > your use case better. Use this guide with a grain of salt. | ||||||
|  | 
 | ||||||
|  | ## Requirements | ||||||
|  | 
 | ||||||
|  | - LDAP server accessible from the Kubernetes cluster where your Jenkins | ||||||
|  |   instance will live. | ||||||
|  | 
 | ||||||
|  | - Credentials to a manager account in your AD. Jenkins Operator will use | ||||||
|  |   this account to authenticate with Jenkins for health checks, seed jobs, etc. | ||||||
|  | 
 | ||||||
|  | ## Steps | ||||||
|  | 
 | ||||||
|  | In your Jenkins configuration, add the following plugin: | ||||||
|  | 
 | ||||||
|  | ```yaml | ||||||
|  | plugins: | ||||||
|  |     # Check https://plugins.jenkins.io/ldap/ to find the latest version. | ||||||
|  |   - name: ldap | ||||||
|  |     version: "2.7" | ||||||
|  | ``` | ||||||
|  | 
 | ||||||
|  | Easiest step is to then start up Jenkins then navigate to your instance's | ||||||
|  | "Configure Global Security" page and configure it accordingly. | ||||||
|  | 
 | ||||||
|  | `http://jenkins.example.com/configureSecurity/` | ||||||
|  | 
 | ||||||
|  | Once it's set up and tested, you can navigate to your JCasC page and export | ||||||
|  | the LDAP settings. | ||||||
|  | 
 | ||||||
|  | `https://jenkins.example.com/configuration-as-code/` | ||||||
|  | 
 | ||||||
|  | Feed the relevant new settings into your Kubernetes ConfigMap for your JCasC | ||||||
|  | settings. | ||||||
|  | 
 | ||||||
|  | Here's a snippet of the LDAP-related configurations: | ||||||
|  | 
 | ||||||
|  | ```yaml | ||||||
|  | apiVersion: v1 | ||||||
|  | kind: ConfigMap | ||||||
|  | metadata: | ||||||
|  |   name: jenkins-casc | ||||||
|  | data: | ||||||
|  |   ldap.yaml: | | ||||||
|  |     jenkins: | ||||||
|  |       securityRealm: | ||||||
|  |         ldap: | ||||||
|  |           configurations: | ||||||
|  |             - displayNameAttributeName: "name" | ||||||
|  |               groupSearchBase: "OU=Groups,OU=MyCompany" | ||||||
|  |               groupSearchFilter: "(& (cn={0}) (objectclass=group) )" | ||||||
|  |               inhibitInferRootDN: false | ||||||
|  |               managerDN: "CN=Jenkins Admin,OU=UsersSystem,OU=UsersOther,OU=MyCompany,DC=mycompany,DC=local" | ||||||
|  |               managerPasswordSecret: "${LDAP_MANAGER_PASSWORD}" | ||||||
|  |               rootDN: "DC=mycompany,DC=local" | ||||||
|  |               server: "MyCompany.local" | ||||||
|  |               userSearch: "SamAccountName={0}" | ||||||
|  |               userSearchBase: "OU=MyCompany" | ||||||
|  |           disableMailAddressResolver: false | ||||||
|  |           disableRolePrefixing: true | ||||||
|  |           groupIdStrategy: "caseInsensitive" | ||||||
|  |           userIdStrategy: "caseInsensitive" | ||||||
|  | ``` | ||||||
|  | 
 | ||||||
|  | > Note the use of `${LDAP_MANAGER_PASSWORD}` above. You can reference | ||||||
|  | > Kubernetes secrets in your JCasC ConfigMaps by adding the following to your | ||||||
|  | > Jenkins object: | ||||||
|  | > | ||||||
|  | > ```yaml | ||||||
|  | > kind: Jenkins | ||||||
|  | > spec: | ||||||
|  | >   configurationAsCode: | ||||||
|  | >     configurations: | ||||||
|  | >       - name: jenkins-casc | ||||||
|  | >     secret: | ||||||
|  | >       # This here | ||||||
|  | >       name: jenkins-casc-secrets | ||||||
|  | > ``` | ||||||
|  | > | ||||||
|  | > ```yaml | ||||||
|  | > apiVersion: v1 | ||||||
|  | > kind: Secret | ||||||
|  | > metadata: | ||||||
|  | >   name: jenkins-cred-conf-secrets | ||||||
|  | > stringData: | ||||||
|  | >   LDAP_MANAGER_PASSWORD: <password-for-manager-created-in-ldap> | ||||||
|  | > ``` | ||||||
|  | > | ||||||
|  | > Schema reference: [v1alpha2.ConfigurationAsCode](./schema/#github.com/jenkinsci/kubernetes-operator/pkg/apis/jenkins/v1alpha2.ConfigurationAsCode) | ||||||
|  | 
 | ||||||
|  | Finally you must configure the Jenkins operator to use the manager's | ||||||
|  | credentials from the AD. | ||||||
|  | 
 | ||||||
|  | This is because this procedure will disable Jenkins' own user database, and the | ||||||
|  | Jenkins operator still needs to be able to talk to Jenkins in an authorized | ||||||
|  | manner. | ||||||
|  | 
 | ||||||
|  | Create the following Kubernetes secret: | ||||||
|  | 
 | ||||||
|  | ```yaml | ||||||
|  | apiVersion: v1 | ||||||
|  | kind: Secret | ||||||
|  | metadata: | ||||||
|  |   name: jenkins-operator-credentials-<jenkins-cr-name> | ||||||
|  |   namespace: <jenkins-cr-namespace> | ||||||
|  | stringData: | ||||||
|  |   user: <username-for-manager-created-in-ldap> | ||||||
|  |   password: <password-for-manager-created-in-ldap> | ||||||
|  | ``` | ||||||
|  | 
 | ||||||
|  | > Note: Values in stringData do not need to be base64 encoded. They are | ||||||
|  | > encoded by Kubernetes when the manifest is applied. | ||||||
|  | 
 | ||||||
		Loading…
	
		Reference in New Issue