Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
Beide Seiten der vorigen Revision Vorhergehende Überarbeitung Nächste Überarbeitung | Vorhergehende Überarbeitung | ||
content:serverbasics:docker-freeipa [2025/03/25 13:50] – [Setup Cronjob on Host for Certificate- Renewal] Daniel | content:serverbasics:docker-freeipa [2025/04/09 15:24] (aktuell) – [Setup your Browser to trust your IPA-Server] Daniel | ||
---|---|---|---|
Zeile 7: | Zeile 7: | ||
This chapter will describe, how to install FreeIPA in a rootless Docker- Environement, | This chapter will describe, how to install FreeIPA in a rootless Docker- Environement, | ||
- | ===== Prerequiusite | + | ===== Prerequisites |
You will need a Docker- Host, that is rechable from the Internet with its fully qualifierd Domain- Name (FQDN) as described in the chapters before. The given Ports must be reachable from the clients. | You will need a Docker- Host, that is rechable from the Internet with its fully qualifierd Domain- Name (FQDN) as described in the chapters before. The given Ports must be reachable from the clients. | ||
Zeile 245: | Zeile 245: | ||
</ | </ | ||
+ | ==== What if... ==== | ||
+ | |||
+ | you did not setup that cron or there was an error and now everything is not working any more? | ||
+ | |||
+ | This may look like: | ||
+ | |||
+ | < | ||
+ | cannot connect to ' | ||
+ | The ipa-server-certinstall command failed. | ||
+ | |||
+ | </ | ||
+ | |||
+ | Well, you're in trouble. The only way, i found to fix this, is to adjust the Hosts time to some time before that expiration- date, start the Container with " | ||
+ | |||
+ | ===== Web- Gui / Logon ===== | ||
+ | |||
+ | Now, you should be able to login to your instance using User admin and the Password of your docker-compose file at [[https:// | ||
===== LDAP - Zentrales AD ===== | ===== LDAP - Zentrales AD ===== | ||
- | Coming soon… | + | The LDAP- Servie ist the most basic and most important Service that the whole Domain relies on. It will contain all Details about Users, PCs (Server and Clients), Groups, Keys and Services. So pay strong Attention to the Security. |
+ | |||
+ | As of now, you should be able to query the LDAP already with your certificates in Place using your Admin- Password: | ||
+ | < | ||
+ | |||
+ | docker@servername: | ||
+ | ldap_initialize( ldaps:// | ||
+ | Enter LDAP Password: | ||
+ | filter: objectclass=account | ||
+ | requesting: All userApplication attributes | ||
+ | # extended LDIF | ||
+ | # | ||
+ | # LDAPv3 | ||
+ | # base < | ||
+ | # filter: objectclass=account | ||
+ | # requesting: ALL | ||
+ | # | ||
+ | |||
+ | # search result | ||
+ | search: 2 | ||
+ | result: 32 No such object | ||
+ | matchedDN: dc=domain, | ||
+ | |||
+ | # numResponses: | ||
+ | |||
+ | </ | ||
+ | |||
+ | This will return empty, but no errors. | ||
+ | |||
+ | You can also check the certificates of that service: | ||
+ | |||
+ | < | ||
+ | docker@servername: | ||
+ | CONNECTED(00000003) | ||
+ | depth=2 C = US, O = Internet Security Research Group, CN = ISRG Root X1 | ||
+ | verify return:1 | ||
+ | depth=1 C = US, O = Let's Encrypt, CN = E5 | ||
+ | verify return:1 | ||
+ | depth=0 CN = ipa.domain.tld | ||
+ | verify return:1 | ||
+ | --- | ||
+ | Certificate chain | ||
+ | 0 s:CN = ipa.domain.tld | ||
+ | i:C = US, O = Let's Encrypt, CN = E5 | ||
+ | | ||
+ | | ||
+ | 1 s:C = US, O = Let's Encrypt, CN = E5 | ||
+ | i:C = US, O = Internet Security Research Group, CN = ISRG Root X1 | ||
+ | | ||
+ | | ||
+ | 2 s:C = US, O = Internet Security Research Group, CN = ISRG Root X1 | ||
+ | i:C = US, O = Internet Security Research Group, CN = ISRG Root X1 | ||
+ | | ||
+ | | ||
+ | |||
+ | ..... | ||
+ | |||
+ | </ | ||
+ | |||
+ | If there is another Certificate in place, check for the renewal above. | ||
+ | |||
+ | ==== Security: No Anonymous access ==== | ||
+ | |||
+ | By default, sadly that service is open to anonymous access, check out: | ||
+ | |||
+ | < | ||
+ | docker@servername: | ||
+ | ldap_initialize( ldaps:// | ||
+ | filter: (objectclass=*) | ||
+ | requesting: All userApplication attributes | ||
+ | # extended LDIF | ||
+ | # | ||
+ | # LDAPv3 | ||
+ | # base < | ||
+ | # filter: (objectclass=*) | ||
+ | # requesting: ALL | ||
+ | # | ||
+ | |||
+ | # search result | ||
+ | search: 2 | ||
+ | result: 0 Success | ||
+ | |||
+ | # numResponses: | ||
+ | |||
+ | </ | ||
+ | |||
+ | This is partly important, because Clients need to retrieve some basic Informations about the Service before Connecting to it with user- atuhentication. But you need to diable the full anonymous access by doing: | ||
+ | |||
+ | < | ||
+ | docker@servername: | ||
+ | Enter password for cn=Directory Manager on ldaps:// | ||
+ | SELinux is disabled, will not relabel ports or files. | ||
+ | Successfully replaced " | ||
+ | |||
+ | </ | ||
+ | |||
+ | And now you see: | ||
+ | |||
+ | < | ||
+ | docker@servername: | ||
+ | ldap_initialize( ldaps:// | ||
+ | filter: (objectclass=*) | ||
+ | requesting: All userApplication attributes | ||
+ | # extended LDIF | ||
+ | # | ||
+ | # LDAPv3 | ||
+ | # base < | ||
+ | # filter: (objectclass=*) | ||
+ | # requesting: ALL | ||
+ | # | ||
+ | |||
+ | # search result | ||
+ | search: 2 | ||
+ | result: 48 Inappropriate authentication | ||
+ | text: Anonymous access is not allowed. | ||
+ | |||
+ | # numResponses: | ||
+ | |||
+ | </ | ||
+ | |||
+ | ==== Security: Disable non encrypted access ==== | ||
+ | |||
+ | Your Service is now reachable with SSL on Port 636 and with plain connection to port 389. The plain connection my by necessary for services, that do TLS, which is basically the same as SSL, but after the connection has been made to the plain port. | ||
+ | |||
+ | Without any further settings, the plain port will also accept non- encrypted connections and user- requests. That way, anyone could sniff your passwords: | ||
+ | |||
+ | < | ||
+ | docker@servername: | ||
+ | ldap_initialize( ldap:// | ||
+ | ldap_bind: Invalid credentials (49) | ||
+ | |||
+ | </ | ||
+ | |||
+ | As you can see, the password is checked - which would alread be to late - it could already be sniffed. | ||
+ | |||
+ | Disable this: | ||
+ | |||
+ | < | ||
+ | docker@servername: | ||
+ | [sudo] Passwort für root: | ||
+ | Enter password for cn=Directory Manager on ldaps:// | ||
+ | SELinux is disabled, will not relabel ports or files. | ||
+ | Successfully replaced " | ||
+ | |||
+ | </ | ||
+ | |||
+ | And now: | ||
+ | |||
+ | < | ||
+ | docker@pcserver2023: | ||
+ | ldap_initialize( ldap:// | ||
+ | ldap_bind: Confidentiality required (13) | ||
+ | additional info: Operation requires a secure connection | ||
+ | |||
+ | </ | ||
+ | |||
+ | Now, finally test if the TLS is still working: | ||
+ | |||
+ | < | ||
+ | docker@servername: | ||
+ | ldap_initialize( ldap:// | ||
+ | Enter LDAP Password: | ||
+ | filter: (objectclass=*) | ||
+ | requesting: All userApplication attributes | ||
+ | # extended LDIF | ||
+ | # | ||
+ | # LDAPv3 | ||
+ | # base < | ||
+ | # filter: (objectclass=*) | ||
+ | # requesting: ALL | ||
+ | # | ||
+ | |||
+ | # search result | ||
+ | search: 3 | ||
+ | result: 32 No such object | ||
+ | matchedDN: dc=domain, | ||
+ | |||
+ | # numResponses: | ||
+ | |||
+ | </ | ||
+ | |||
+ | ==== Usage: CN=Config ==== | ||
+ | |||
+ | To see your full config: | ||
+ | |||
+ | < | ||
+ | docker@servername: | ||
+ | |||
+ | </ | ||
+ | |||
+ | or only the root-dse with anonymous access: | ||
+ | |||
+ | < | ||
+ | docker@servername: | ||
+ | # extended LDIF | ||
+ | # | ||
+ | # LDAPv3 | ||
+ | # base <> with scope baseObject | ||
+ | # filter: objectclass=* | ||
+ | # requesting: ALL | ||
+ | # | ||
+ | |||
+ | # | ||
+ | dn: | ||
+ | objectClass: | ||
+ | ... | ||
+ | |||
+ | </ | ||
+ | |||
+ | You will find many docs like [[https:// | ||
+ | |||
+ | ==== Test User- Access ==== | ||
+ | |||
+ | Now you can add an User in the FreeIPA- Web-GUI and test the connection. | ||
+ | |||
+ | To do this, logon to FreeIPA- Gui as Admin, than create a new user with some stupid password (not the real one!). You may change the e-Mail instantly after creation and don't forget to save after changes at the user. | ||
+ | |||
+ | Than, logout from FreeIPA and login as your new User. You now need to change the password to the real password you want. | ||
+ | |||
+ | After that, the LDAP- Query should work. Test it: | ||
+ | < | ||
+ | |||
+ | docker@servername: | ||
+ | ldap_initialize( ldaps:// | ||
+ | Enter LDAP Password: | ||
+ | filter: (objectclass=*) | ||
+ | requesting: All userApplication attributes | ||
+ | # extended LDIF | ||
+ | # | ||
+ | # LDAPv3 | ||
+ | # base < | ||
+ | # filter: (objectclass=*) | ||
+ | # requesting: ALL | ||
+ | # | ||
+ | |||
+ | # users, accounts, domain.tld | ||
+ | dn: cn=users, | ||
+ | objectClass: | ||
+ | objectClass: | ||
+ | cn: users | ||
+ | |||
+ | ... | ||
+ | |||
+ | # search result | ||
+ | search: 2 | ||
+ | result: 0 Success | ||
+ | |||
+ | # numResponses: | ||
+ | # numEntries: 3 | ||
+ | |||
+ | </ | ||
+ | |||
+ | ==== Jxplorer - GUI for LDAP ==== | ||
+ | |||
+ | A very nice tool for exploring your LDAP- Tree is: [[http:// | ||
+ | |||
+ | ===== Port opening ===== | ||
+ | |||
+ | Now, the Server should be secured enough - you can open the firewall at the external ports in docker-compose and test the access from somewhere not in your network. | ||
+ | |||
+ | ===== Central DNS for the Domain ===== | ||
+ | |||
+ | Finally, the Hosts in the Domain will be managed by FreeIPA- DNS- Service, meaning every host that is integrated in the Domain will get a name (can be chosen freely) and will get an host-entry where the secure key for that host is attached to. To get this working, FreeIPAs DNS needs to manage the Sub-Domain you created in dokcer-compose. | ||
+ | |||
+ | In our Example, the subdamin would be: clients.domain.tld | ||
+ | |||
+ | Every Host will then get somename.clients.domain.tld as hostname. | ||
+ | |||
+ | That means, you have to tell your internet DNS- Provider, that clients.domain.tld will be managed by DNS- Server ipa.domain.tld | ||
+ | |||
+ | This is done by adding an NS- Entry to you Internet-DNS. Please check yout ISP- Docs for how to add that NS entry for your domain: | ||
+ | < | ||
+ | |||
+ | clients.domain.tld | ||
+ | |||
+ | </ | ||
+ | |||
+ | Check out, if this works by: | ||
+ | |||
+ | < | ||
+ | dig +noall +answer +multiline clients.domain.tld NS | ||
+ | |||
+ | </ | ||
+ | |||
+ | And at last: | ||
+ | |||
+ | < | ||
+ | nslookup ipa-ca.clients.domain.tld | ||
+ | |||
+ | </ | ||
+ | |||
+ | This should return the IP of yout IPA- Server. If this works, you are done with the basic setup. | ||
+ | |||
+ | ===== Client Setup ===== | ||
+ | |||
+ | to fully use Single Sign On on your Client, you will need to | ||
+ | |||
+ | - Setup your Browser to trust your IPA-Server | ||
+ | - Install a working Kerberos-Client and enroll your PC to the Domain | ||
+ | - Logon to your Linux- PC using SSSD/ | ||
+ | |||
+ | ==== Install Kerberos-Client and enroll your PC to the Domain ==== | ||
+ | |||
+ | Currently unfortunatelly i was not able to get Leap 15.6 working with freeipa-client (which worked for 15.5). So i switched to fedora (the KDE- Spin is very nice) | ||
+ | |||
+ | On Fedora, you can archive the Installation like this (Docs at [[https:// | ||
+ | < | ||
+ | |||
+ | #:> sudo yum install ipa-client | ||
+ | |||
+ | </ | ||
+ | |||
+ | After that, go on with the next chapter https:// | ||
+ | |||
+ | ---- | ||
+ | |||
+ | Using Ferdora, skip this! | ||
+ | |||
+ | After a fresh Install of OpenSUSE, you frist need to get the Package freeipa-client. | ||
+ | |||
+ | I personally made it working that way: | ||
+ | |||
+ | * Open Yast | ||
+ | * Choose User and Group- Management | ||
+ | * Go to Authentication Settings | ||
+ | * Select SSSD and Add a new FreeIPA-Domain. | ||
+ | * Enable Domain Logons | ||
+ | * Create Home-Directory = yes | ||
+ | * Sync Users and Groups | ||
+ | * SSH + Sudo = yes | ||
+ | |||
+ | As IPA- Server use '' | ||
+ | |||
+ | After those settings, exit from Yast. Do not care about Errors, that SSSD is not working: Your Client is missing important Domain Integration, | ||
+ | |||
+ | As the time beeing, there is no official Package for Leap 15.6. So you may use mine: | ||
+ | |||
+ | < | ||
+ | zypper addrepo https:// | ||
+ | zypper refresh | ||
+ | zypper install freeipa-client | ||
+ | |||
+ | #Add Additional Packages / setup some needed files | ||
+ | pip3 install ifaddr | ||
+ | ln / | ||
+ | |||
+ | </ | ||
+ | |||
+ | |||
+ | === Integrate to the Domain === | ||
+ | |||
+ | After that, you need to setup your Client maybe with this small script, called ipa_register_host.sh which you can put to /root: | ||
+ | |||
+ | < | ||
+ | # | ||
+ | TLDOMAIN=domain.tld | ||
+ | DOMAIN=clients.${TLDOMAIN} | ||
+ | SERVERFQDN=ipa.${TLDOMAIN} | ||
+ | #Serialnr of this device | ||
+ | HOSTNM=pc$(dmidecode -t system|grep -i " | ||
+ | FQDN=${HOSTNM}.${DOMAIN} | ||
+ | echo " | ||
+ | hostnamectl set-hostname ${HOSTNM} | ||
+ | #Check, if hostname is resolvable to this host - if not, add entry to / | ||
+ | if ! grep -q ${FQDN} "/ | ||
+ | echo " | ||
+ | echo "">>"/ | ||
+ | echo " | ||
+ | fi | ||
+ | INSTCMD=" | ||
+ | echo ${INSTCMD} | ||
+ | ${INSTCMD} | ||
+ | echo "Ende Installation, | ||
+ | |||
+ | </ | ||
+ | |||
+ | This script will integrate your PC into your IPA- Domain. Have the Password of your IPA- Admin ready. | ||
+ | |||
+ | After that, the SSSD should start, you may start, check and enable the Service. | ||
+ | < | ||
+ | |||
+ | To prevent this, use a network- cable and configure Networking at system start, OR configure your wireless lan to be setup first. Or first logon as root, then as User. | ||
+ | |||
+ | You should frist check on non-graphical terminal if this will work, because errors will be shown there. Good Luck. | ||
+ | |||
+ | |||
+ | ==== Setup your Browser to trust your IPA-Server ==== | ||
+ | |||
+ | This one is on Firefox, as it works. | ||
+ | |||
+ | Go to your IPAs ipa.domain.tld/ | ||
+ | |||
+ | For me, the Button '' | ||
+ | |||
+ | Than open Firefox settings, Privacy and Security, Authorities- Tab and select Import. Use the downloaded file and select all Checkboxes. This installs your IPA- Authority to your Browser as trusted CA. | ||
+ | |||
+ | Do Steps 2 - 5 as described. | ||
+ | |||
+ | After that, and after loggon to your pc with your FreeIPA-User, | ||
+ | |||
+ | If not, check if your klist shows some vaild Tickets. Otherwise inspect if this works: | ||
+ | |||
+ | < | ||
+ | HOSTNAME:~ # kinit admin | ||
+ | Password for admin@DOMAIN.TLD: | ||
+ | HOSTNAME:~ # klist | ||
+ | Ticket cache: KEYRING: | ||
+ | Default principal: admin@DOMAIN.TLD | ||
+ | |||
+ | Valid starting | ||
+ | 04/07/25 12: | ||
+ | |||
+ | </ | ||
+ | |||
+ | This should be all needed to work for Firefox. | ||
+ | |||
+ | ==== Setup Sudoers with FreeIPA/ | ||
+ | |||
+ | This is quite a cool feature to have client admin- users managed by putting them in an IPA- group. When Loggin in with SSSD they will get added to the sudoers, making them admin on the given machines. Check this out: [[https:// | ||
+ | |||
+ | |||
+ | ===== Next Steps ===== | ||
+ | |||
+ | Next, you can integrate a Middleware for Authentication. You could, but you should NOT use FreeIPAs LDAP- Service directly as Authentication- Source for anything, as LDAP is very costy and would not deliver all needed APIs e.g. for SSO. This is part of your Middleware, so checkout [[.: | ||