Changes for page KerberosAndLDAP
Last modified by Sirius Rayner-Karlsson on 2024/05/09 10:54
From version 36.1
edited by Sirius Rayner-Karlsson
on 2024/05/09 10:00
on 2024/05/09 10:00
Change comment:
There is no comment for this version
To version 37.1
edited by Sirius Rayner-Karlsson
on 2024/05/09 10:54
on 2024/05/09 10:54
Change comment:
There is no comment for this version
Summary
-
Page properties (1 modified, 0 added, 0 removed)
Details
- Page properties
-
- Content
-
... ... @@ -35,15 +35,23 @@ 35 35 Having an index on the ##krbPrincipalName## improves performance. Synology OpenLDAP does not use ##mdb## format, it uses ##bdb##. Debian ##slapd## uses ##mdb## format. It is different database format, but the principle is the same. Again, as you are modifying config, the DN is ##cn=config##. Use the main password you set for the Synology LDAP server. Create a file ##step1.ldif## with the following content: 36 36 37 37 (% style="color:#400" %) 38 -##{{{dn: olcDatabase={1}bdb,cn=config add: olcDbIndex olcDbIndex: krbPrincipalName eq,pres,sub}}}## 38 +##{{{ 39 +dn: olcDatabase={1}bdb,cn=config 40 +add: olcDbIndex 41 +olcDbIndex: krbPrincipalName eq,pres,sub}}}## 39 39 40 40 41 41 and apply it with 42 42 43 43 (% style="color:#400" %) 44 -##{{{$ ldapmodify -H ldaps://nas.example.com/ -D cn=config -W -f step1.ldif Enter LDAP Password: modifying entry "olcDatabase={1}bdb,cn=config" $}}}## 47 +##{{{$ ldapmodify -H ldaps://nas.example.com/ -D cn=config -W -f step1.ldif 48 +Enter LDAP Password: 45 45 50 +modifying entry "olcDatabase={1}bdb,cn=config" 46 46 52 +$ }}}## 53 + 54 + 47 47 === Create principals kadmin and kdc === 48 48 49 49 Next, you create and configure two entries which will be used by the Kerberos servers to connect to OpenLDAP. Not running the Kerberos KDC and Admin Server on the same host as OpenLDAP, these steps are required. Keeping things confined, everything will be created under a separate ##organizationalUnit##. My guide differs from the official Debian guide here. Due to Synology OpenLDAP having a strict password policy, it was necessary to adjust the DNs of ##kdc## and ##kadmin##. The official guide use placeholder passwords which does not work with the Synology LDAP server. ... ... @@ -50,90 +50,142 @@ 50 50 Generate the passwords upfront with ##slappasswd -h {SSHA}##. Then create a file ##step2.ldif## with the following content: 51 51 52 52 (% style="color:#400" %) 53 -##{{{dn: ou=kerberos,dc=example,dc=com objectClass: organizationalUnit objectClass: top ou: kerberos dn: cn=kdc,ou=kerberos,dc=example,dc=com cn: kdc sn: kdc objectClass: person objectClass: pwdPolicy pwdAttribute: userPassword pwdMinLength: 8 pwdCheckQuality: 2 pwdPolicySubentry: cn=kdc,ou=kerberos,dc=example,dc=com userPassword: {SSHA}<password-hash> description: Kerberos KDC Account dn: cn=kadmin,ou=kerberos,dc=example,dc=com cn: kadmin sn: kadmin objectClass: person objectClass: pwdPolicy pwdAttribute: userPassword pwdMinLength: 8 pwdCheckQuality: 2 pwdPolicySubentry: cn=kadmin,ou=kerberos,dc=example,dc=com userPassword: {SSHA}<password-hash> description: Kerberos KDC Account}}}## 61 +##{{{ 62 +dn: ou=kerberos,dc=example,dc=com 63 +objectClass: organizationalUnit 64 +objectClass: top 65 +ou: kerberos 54 54 67 +dn: cn=kdc,ou=kerberos,dc=example,dc=com 68 +cn: kdc 69 +sn: kdc 70 +objectClass: person 71 +objectClass: pwdPolicy 72 +pwdAttribute: userPassword 73 +pwdMinLength: 8 74 +pwdCheckQuality: 2 75 +pwdPolicySubentry: cn=kdc,ou=kerberos,dc=example,dc=com 76 +userPassword: {SSHA}<password-hash> 77 +description: Kerberos KDC Account 78 + 79 +dn: cn=kadmin,ou=kerberos,dc=example,dc=com 80 +cn: kadmin 81 +sn: kadmin 82 +objectClass: person 83 +objectClass: pwdPolicy 84 +pwdAttribute: userPassword 85 +pwdMinLength: 8 86 +pwdCheckQuality: 2 87 +pwdPolicySubentry: cn=kadmin,ou=kerberos,dc=example,dc=com 88 +userPassword: {SSHA}<password-hash> 89 +description: Kerberos KDC Account}}}## 90 + 91 + 55 55 Apply it with 56 56 57 57 (% style="color:#400" %) 58 -##{{{$ ldapadd -H ldaps://nas.example.com/ -D uid=root,cn=users,dc=example,dc=com -W -f step2.ldif Enter LDAP Password: adding new entry "ou=kerberos,dc=example,dc=com" adding new entry "cn=kdc,ou=kerberos,dc=example,dc=com" adding new entry "cn=kadmin,ou=kerberos,dc=example,dc=com"}}}## 95 +##{{{$ ldapadd -H ldaps://nas.example.com/ -D uid=root,cn=users,dc=example,dc=com -W -f step2.ldif 96 +Enter LDAP Password: 59 59 98 +adding new entry "ou=kerberos,dc=example,dc=com" 60 60 100 +adding new entry "cn=kdc,ou=kerberos,dc=example,dc=com" 61 61 102 +adding new entry "cn=kadmin,ou=kerberos,dc=example,dc=com" 103 + 104 +$ }}}## 105 + 106 + 107 +A small note on this section: 108 +The ##objectClass: pwdPolicy## must be added to a, to LDAP, physical thing. ##objectClass: person## fits the criteria, but can not have ##uid##. So to make it work, the ##uid## is replaced with ##sn## and ##cn## (yes, both are needed). Then you can set the other four attributes and add the hashed password you got from ##slappasswd##. 109 + 110 + 62 62 === Grant kdc and kadmin permissions === 63 63 64 -This switches back to the ##cn=config## DN as you are changing the permissions. 113 +This switches back to the ##cn=config## DN as you are changing the permissions. Note that we now reference our kdc and kadmin accounts and we grant them permission to the krbContainer which will house all our kerberos principals. Give both of them write access, because we do want to have the ability to track last login and lock accounts if there are too many login failures. We like security. 65 65 66 - $ldapmodify-Hldaps:~/~/ds723.trudheim.com-W -D cn=config<<EOF115 +Create ##step3.ldif## with the following content: 67 67 117 +(% style="color:#400" %) 118 +##{{{ 68 68 dn: olcDatabase={1}bdb,cn=config 69 69 add: olcAccess 70 70 olcAccess: {0}to attrs=krbPrincipalKey 71 71 by anonymous auth 72 - by dn.exact="cn=kdc,ou=kerberos,dc= trudheim,dc=com" write73 - by dn.exact="cn=kadmin,ou=kerberos,dc= trudheim,dc=com" write123 + by dn.exact="cn=kdc,ou=kerberos,dc=example,dc=com" write 124 + by dn.exact="cn=kadmin,ou=kerberos,dc=example,dc=com" write 74 74 by self write 75 75 by * none 76 76 - 77 77 add: olcAccess 78 78 olcAccess: {1}to dn.subtree="cn=krbContainer,ou=kerberos,dc=example,dc=com" 79 - by dn.exact="cn=kdc,ou=kerberos,dc= trudheim,dc=com" write80 - by dn.exact="cn=kadmin,ou=kerberos,dc= trudheim,dc=com" write130 + by dn.exact="cn=kdc,ou=kerberos,dc=example,dc=com" write 131 + by dn.exact="cn=kadmin,ou=kerberos,dc=example,dc=com" write 81 81 by * none 133 +}}}## 82 82 83 -EOF 84 84 85 -Enter LDAP Password: 86 -modifying entry "olcDatabase={1}bdb,cn=config" 136 +**Do not get the domain part above wrong. If you do, you may not be able to use ##kadmin## or ##kinit## and fixing the permissions without breaking something else is a nervous task. Trust me on this (as I screwed them up).** 87 87 88 - $138 +Apply it with 89 89 140 +(% style="color:#400" %) 141 +##{{{ 142 +$ ldapmodify -H ldaps://nas.example.com -W -D cn=config -f step3.ldif 143 +Enter LDAP Password: 90 90 91 - Note that we now reference our kdc and kadmin accounts andwe grant them permissionto thekrbContainerwhich will house all our kerberos principals. Give both of them writeaccess,becausewedo want to have the ability to track last loginand lock accounts ifthere are login failures. We like security.145 +modifying entry "olcDatabase={1}bdb,cn=config" 92 92 147 +$ }}}## 93 93 149 + 94 94 === Create krb5.conf === 95 95 96 - Overtoadjusting/etc/krb5.conf so that it will point to the right thing later. It should look something like this:152 +Next we create (or modify) ##/etc/krb5.conf## so that it will point to the right thing later. It should look something like this: 97 97 154 +(% style="color:#400" %) 155 +##{{{ 156 +[libdefaults] 157 + default_realm = EXAMPLE.COM 158 + dns_lookup_realm = false 159 + dns_lookup_kdc = false 160 + ticket_lifetime = 24h 161 + forwardable = true 162 + proxiable = true 163 + rdns = false 98 98 99 -{{{[libdefaults] 100 - default_realm = EXAMPLE.COM 101 - dns_lookup_realm = false 102 - dns_lookup_kdc = false 103 - ticket_lifetime = 24h 104 - forwardable = true 105 - proxiable = true 106 - rdns = false 107 - 108 108 [realms] 109 - EXAMPLE.COM = { 110 - kdc = debian.example.com 111 - admin_server = debian.example.com 112 - default_domain = example.com 113 - } 114 - [domain_realm] 115 - .example.com = EXAMPLE.COM 116 - example.com = EXAMPLE.COM}}} 166 + EXAMPLE.COM = { 167 + kdc = debian.example.com 168 + admin_server = debian.example.com 169 + default_domain = example.com 170 + } 171 +[domain_realm] 172 + .example.com = EXAMPLE.COM 173 + example.com = EXAMPLE.COM 174 +}}}## 117 117 118 -Make sure your designated debian server have ports 88, 464 and 749 open, both for TCP and UDP, in its firewall. 88 is for the kdc, 464 and 749 is for kadmin. 119 119 177 +Make sure your designated debian server have ports **88**, **464** and **749** open, both for TCP and UDP, in its firewall. 88 is for the kdc, 464 and 749 is for kadmin. 120 120 179 + 121 121 === Create kdc.conf === 122 122 123 -N ext,weneedtowrite up/etc/krb5kdc/kdc.conf. Something like this should work182 +Now we do /etc/krb5kdc/kdc.conf. Something like this should work 124 124 125 - 184 +(% style="color:#400" %) 185 +##{{{ 126 126 [libdefaults] 127 127 128 128 [realms] 129 - TRUDHEIM.COM = {130 - database_module = openldap_ldapconf 131 - max_life = 7d 132 - max_renewable_life = 6d 189 + EXAMPLE.COM = { 190 + database_module = openldap_ldapconf 191 + max_life = 7d 192 + max_renewable_life = 6d 133 133 } 134 134 135 135 [dbdefaults] 136 - ldap_kerberos_container_dn = cn=krbContainer,ou=kerberos,dc= trudheim,dc=com196 + ldap_kerberos_container_dn = cn=krbContainer,ou=kerberos,dc=example,dc=com 137 137 138 138 [dbmodules] 139 139 openldap_ldapconf = { ... ... @@ -141,78 +141,110 @@ 141 141 disable_last_success = false 142 142 disable_lockout = false 143 143 ldap_conns_per_server = 5 144 - ldap_servers = ldaps:~/~/ ds723.trudheim.com145 - ldap_kdc_dn = "cn=kdc,ou=kerberos,dc= trudheim,dc=com"146 - ldap_kadmind_dn = "cn=kadmin,ou=kerberos,dc= trudheim,dc=com"204 + ldap_servers = ldaps:~/~/nas.example.com 205 + ldap_kdc_dn = "cn=kdc,ou=kerberos,dc=example,dc=com" 206 + ldap_kadmind_dn = "cn=kadmin,ou=kerberos,dc=example,dc=com" 147 147 ldap_service_password_file = /etc/krb5kdc/service.keyfile 148 148 } 209 +}}}## 149 149 150 150 151 151 === Create kadm5.acl === 152 152 153 - Then you need to create ##/etc/krb5kdc/kadm5.aclandput in it##214 +Create ##/etc/krb5kdc/kadm5.acl with the following content so that kerberos administrator principals can run ##kadmin## 154 154 155 -##*/admin@EXAMPLE.COM *## 216 +(% style="color:#400" %) 217 +##{{{ 218 +*/admin@EXAMPLE.COM * 219 +}}}## 156 156 157 157 158 -so that administrator principals can run kadmin. Now we are ready to create the domain. And that we do with 159 - 160 - 161 161 === Create the kerberos domain === 162 162 163 -# 224 +Now we are ready to create the domain. And that we do with ##kdb5_ldap_util## as ##root##. Note that this commandline is deceptive and you need all of it. 164 164 165 -kdb5_ldap_util -D uid=root,cn=users,dc=trudheim,dc=com -H ldaps:~/~/ds723.trudheim.com -r TRUDHEIM.COM create -subtrees dc=trudheim,dc=com -maxtktlife '7 Days' -maxrenewlife '6 Days' -s 226 +(% style="color:#400" %) 227 +##{{{ 228 +# kdb5_ldap_util -D uid=root,cn=users,dc=example,dc=com -H ldaps://nas.example.com -r EXAMPLE.COM create -subtrees dc=example,dc=com -maxtktlife '7 Days' -maxrenewlife '6 Days' -s 166 166 Password for "uid=root,cn=users,dc=trudheim,dc=com": 167 -Initializing database for realm ' TRUDHEIM.COM'230 +Initializing database for realm 'EXAMPLE.COM' 168 168 You will be prompted for the database Master Password. 169 169 It is important that you NOT FORGET this password. 170 170 Enter KDC database master key: 171 171 Re-enter KDC database master key to verify: 235 +# }}}## 172 172 173 -kdb5_ldap_util -D uid=root,cn=users,dc=trudheim,dc=com -H ldaps:~/~/ds723.trudheim.com stashsrvpw -f /etc/krb5kdc/service.keyfile cn=kdc,ou=kerberos,dc=trudheim,dc=com 174 -Password for "uid=root,cn=users,dc=trudheim,dc=com": 175 -Password for "cn=kdc,ou=kerberos,dc=trudheim,dc=com": 176 -Re-enter password for "cn=kdc,ou=kerberos,dc=trudheim,dc=com": 177 177 178 -kdb5_ldap_util -D uid=root,cn=users,dc=trudheim,dc=com -H ldaps:~/~/ds723.trudheim.com stashsrvpw -f /etc/krb5kdc/service.keyfile cn=kadmin,ou=kerberos,dc=trudheim,dc=com 179 -Password for "uid=root,cn=users,dc=trudheim,dc=com": 180 -Password for "cn=kadmin,ou=kerberos,dc=trudheim,dc=com": 181 -Re-enter password for "cn=kadmin,ou=kerberos,dc=trudheim,dc=com": 238 +=== Stash the passwords for ##kdc## and ##kadmin## === 182 182 240 +Most likely, you will want your KDC and KAdmin server to start at boot, and for that, we can stash the passwords (into LDAP) for ##cn=kdc,ou=kerberos,dc=example,dc=com## and ##cn=kdc,ou=kerberos,dc=example,dc=com## using the same tool as in the previous step. 183 183 242 +(% style="color:#400" %) 243 +##{{{ 244 +# kdb5_ldap_util -D uid=root,cn=users,dc=example,dc=com -H ldaps://nas.example.com stashsrvpw -f /etc/krb5kdc/service.keyfile cn=kdc,ou=kerberos,dc=example,dc=com 245 +Password for "uid=root,cn=users,dc=example,dc=com": 246 +Password for "cn=kdc,ou=kerberos,dc=example,dc=com": 247 +Re-enter password for "cn=kdc,ou=kerberos,dc=example,dc=com": 248 +# kdb5_ldap_util -D uid=root,cn=users,dc=example,dc=com -H ldaps://nas.example.com stashsrvpw -f /etc/krb5kdc/service.keyfile cn=kadmin,ou=kerberos,dc=example,dc=com 249 +Password for "uid=root,cn=users,dc=example,dc=com": 250 +Password for "cn=kadmin,ou=kerberos,dc=example,dc=com": 251 +Re-enter password for "cn=kadmin,ou=kerberos,dc=example,dc=com": 252 +# }}}## 253 + 254 + 255 +=== Start the services === 256 + 257 +We are now ready to start the services. If this does not work, you need to backtrack and find out where you made a mistake, rectify it, and then walk forward again. 258 + 259 +(% style="color:#400" %) 260 +##{{{ 261 +# systemctl enable --now krb5-kdc krb5-admin-server 262 +# 263 +}}}## 264 + 265 + 266 +Check that they are running and not giving off errors with ##systemctl status krb5-kdc## and ##systemctl status krb5-admin-server##. 267 + 268 + 184 184 === Create the first regular principals === 185 185 186 - Here,you willrun kadmin.local to create first a regular user, and then an admin version of that user.271 +Providing you got to here without issues it is now time to generate your principals that you will use to authenticate into systems with. Run ##kadmin.local## as root to create first a regular user, and then an admin version of that user. 187 187 273 +(% style="color:#400" %) 274 +##{{{ 188 188 # kadmin.local 189 189 190 -Authenticating as principal root/admin@ TRUDHEIM.COM with password.277 +Authenticating as principal root/admin@EXAMPLE.COM with password. 191 191 kadmin.local: addprinc user 192 192 193 -No policy specified for user@ TRUDHEIM.COM; defaulting to no policy194 -Enter password for principal "user@ TRUDHEIM.COM":195 -Re-enter password for principal "user@ TRUDHEIM.COM":196 -Principal "user@ TRUDHEIM.COM" created.280 +No policy specified for user@EXAMPLE.COM; defaulting to no policy 281 +Enter password for principal "user@EXAMPLE.COM": 282 +Re-enter password for principal "user@EXAMPLE.COM": 283 +Principal "user@EXAMPLE.COM" created. 197 197 198 198 kadmin.local: addprinc user/admin 199 -No policy specified for user/admin@ TRUDHEIM.COM; defaulting to no policy200 -Enter password for principal "user/admin@ TRUDHEIM.COM":201 -Re-enter password for principal "user/admin@ TRUDHEIM.COM":202 -Principal "user/admin@ TRUDHEIM.COM" created.286 +No policy specified for user/admin@EXAMPLE.COM; defaulting to no policy 287 +Enter password for principal "user/admin@EXAMPLE.COM": 288 +Re-enter password for principal "user/admin@EXAMPLE.COM": 289 +Principal "user/admin@EXAMPLE.COM" created. 203 203 kadmin.local: q 204 204 205 -# 292 +# }}}## 206 206 207 -Worth to note here is that [[user@EXAMPLE.COM>>mailto:user@EXAMPLE.COM]] and [[user/admin@EXAMPLE.COM>>mailto:user/admin@EXAMPLE.COM]] can have (and should have) different passwords as the admin variant is allowed to do things to the kerberos database. And this is why you want to have the registering of failures to login enabled. Should you have the system exposed to the internet, you can and should expect intrusion attempts. Having Kerberos deployed makes it harder for perpetrators to gain access, but not impossible. 208 208 209 - Ifyoulaterkerberise your storage and leverage itforNFS4mounts fromyourNAS,youcanhaveNFSexposed to the internet aswell.Unless someonehas aalidkerberosticket,eveniftheysomehowcouldmountthe share, theyseenothingonit without the krbtgt.295 +Worth to note here is that ##user@EXAMPLE.COM## and ##user/admin@EXAMPLE.COM## can have (and probably should have) different passwords. The admin variant is allowed to do things to the kerberos database and should therefore have greater security. This is why you want to have the registering of failures to login enabled. Should you have the system exposed to the internet, you can and should expect intrusion attempts. Having Kerberos deployed makes it harder for perpetrators to gain access, but not impossible. 210 210 297 +If you later kerberise your storage and leverage it for NFS4 mounts from your NAS, you can have NFS exposed to the internet as well. Unless someone has a valid kerberos ticket, even if they somehow could mount a share, they see nothing on it without the krbtgt. 211 211 299 + 212 212 === Test your new principal === 213 213 214 - $kinit[[user@EXAMPLE.COM>>mailto:user@EXAMPLE.COM]]302 +Acid test is, can you authenticate with kinit? 215 215 304 +(% style="color:#400" %) 305 +##{{{ 306 +$ kinit user@EXAMPLE.COM 307 + 216 216 Password for user@EXAMPLE.COM: 217 217 218 218 $ klist ... ... @@ -222,9 +222,29 @@ 222 222 Valid starting Expires Service principal 223 223 09/05/24 08:07:35 10/05/24 08:07:35 krbtgt/EXAMPLE.COM@EXAMPLE.COM 224 224 225 -$ 317 +$ }}}## 226 226 227 227 320 +Congratulations - you now have Kerberos working, and to boot, the database sits in LDAP. Which you can inspect with something like: 321 + 322 +(% style="color:#400" %) 323 +##{{{ 324 +$ ldapsearch -H ldaps://nas.example.com -D uid=root,cn=users,dc=example,dc=com -W -b ou=kerberos,dc=example,dc=com 325 +}}}## 326 + 327 + 228 228 === Set up pam and sssd === 229 229 230 - 330 + To fully leverage your shiny new KDC, you will want to install the Kerberos authentication pieces for ##PAM## and also ##sssd## to facilitate caching of authentication, in case your KDC is offline for some reason when you try to authenticate into another system. 331 + 332 +(% style="color:#400" %) 333 +##{{{ 334 +$ sudo apt install krb5-user libpam-krb5 sssd-krb5 335 +... 336 +$ sudo pam-auth-update 337 +}}}## 338 + 339 + 340 +With ##pam-auth-update## you want to enable Kerberos and SSS authentication (and flip on the auto-creation of home directories while you are there). If you now want to test login on another system with kerberos, you need ##/etc/krb5.conf## and the ##krb5-user##, ##libpam-krb5## and ##sssd-krb5## packages installed on this new system and you need to run ##pam-auth-update## to enable Kerberos and SSS. After that, the system does not need local ##user## (in /etc/passwd) - the kerberos ##user## will work instead. 341 + 342 +/S