SSSD in container on Fedora
2015-10-19
Table of Contents
Abstract
SSSD can be run in a container and provide services to the programs on the host, without being even installed on the host. Here we describe proof of concept, available today.
SSSD overview
System Security Services Daemon (SSSD) is a daemon that provides identity, authentication, and authorization services to the operating system and applications. It provides modules and/or plugins for multiple subsystems of the operating system, including NSS, PAM, or sudo. It can cache multiple types of information to speed-up subsequent lookup or authentication operations, and it can use various remote backend types, including FreeIPA, Active Directory, or LDAP.
	SSSD can be configured by editing /etc/sssd/sssd.conf
	directly but due to overlap to other subsystems, those
	subsystems typically need to be configured as well to
	make use of SSSD, like pam_sss.so for PAM,
	or /etc/krb5.* for Kerberos operations.
	For two use cases, setups against FreeIPA and Active
	Directory, setup tools can be used to configure
	SSSD and other components of the operating system in automated
	fashion. For FreeIPA it's ipa-client-install,
	or realm which can also configure the system
	for remote Active Directory backend.
	
IPA-enrolling system
	Configuring operating system and SSSD against FreeIPA is called
	IPA-enrollment. While running the setup tools, credentials
	typically need to be passed to ipa-client-install
	or realm to authenticate the operation
	on the remote system, as well as other options that specify
	to which remote system we are IPA-enrolling the machine,
	or which components should be configured.
	
The typical approach could include pre-creating the host record on the FreeIPA server and generating one-time password for it:
ipa$ ipa host-add --random host.example.com [...] Random password: 3dW742a5rYTXThat password can then be used to authenticate from the client during IPA-enrollment, instead of using credentials of admin or other power user.
But first, the setup tool together with its dependencies that include SSSD needs to be installed:
host# dnf install -y freeipa-client [...] Install 68 Packages [...] Complete!
host# ipa-client-install -w 3dW742a5rYTX [...] Client configuration complete.
Many other options can be used, see
host# ipa-client-install --helpor the man page.
	We can check that things work by for example checking information
	about user that does not exists in local /etc/passwd
	but exists on the FreeIPA server:
	
host# id bob uid=1712400001(bob) gid=1712400001(bob) groups=1712400001(bob)And since IPA enrollment gave the host an identity in FreeIPA server and set up keytab for the Kerberos host principal in
/etc/krb5.keytab, ssh with
	GSSAPIAuthentication not works:
	other-host$ kinit bob Password for bob@EXAMPLE.COM: other-host$ ssh bob@host.example.com Could not chdir to home directory /home/bob: No such file or directory -sh-4.3$ id uid=1712400001(bob) gid=1712400001(bob) groups=1712400001(bob) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 -sh-4.3$We don't have home directories mounted but we see that authentication works.
IPA-enrolling via SSSD in container
	Instead of installing the software on the host with
	dnf install, we can install and run it
	in container. We will use docker service
	and atomic command. The docker daemon manages
	images and containers, and atomic is a utility
	which can use LABELs of docker images to run the containers
	with correct parameters.
	
As of 2015-10-19, we need to install atomic from Fedora 22 updates-testing repository to get resonably new version:
host# dnf install --enablerepo=updates-testing -y atomicThe atomic package will pull docker (among others) as its dependency, so we can start it:
host# systemctl start docker.service
	If we've created host record for our machine on FreeIPA server and
	got one-time password generated, we can then download and configure
	the SSSD container while giving it options that will be passed
	directly to ipa-client-install in the container:
	
host# atomic install fedora/sssd -w OvPJIPluOHNj
	The fedora/sssd container will first copy various configuration
	and data directories into the container, then runs
	ipa-client-install with the parameters that
	were passed to atomic install, and upon successful
	IPA-enrollment copies the config and data files back to the host
	machine.
	
	Unlike ipa-client-install which configures the
	services and leaves SSSD daemon running, atomic install
	container is removed after it finishes and you need to use
	
host# atomic run fedora/sssdto start it.
When we check whether sssd is running, we will see that its processes run as children of the docker daemon:
host# ps xf [...] 11652 ? Ssl 0:29 /usr/bin/docker -d --selinux-enabled 12537 ? Ss 0:00 \_ /bin/bash /bin/run.sh 12545 ? S 0:00 \_ tail -f /var/log/sssd/systemctl.log 12550 ? Ss 0:00 \_ /usr/sbin/sssd -D -f 12551 ? S 0:00 | \_ /usr/libexec/sssd/sssd_be --domain example.com --uid 0 --gid 0 --debug-to-files 12552 ? S 0:00 | \_ /usr/libexec/sssd/sssd_nss --uid 0 --gid 0 --debug-to-files 12553 ? S 0:00 | \_ /usr/libexec/sssd/sssd_sudo --uid 0 --gid 0 --debug-to-files 12554 ? S 0:00 | \_ /usr/libexec/sssd/sssd_pam --uid 0 --gid 0 --debug-to-files 12555 ? S 0:00 | \_ /usr/libexec/sssd/sssd_ssh --uid 0 --gid 0 --debug-to-files 12556 ? S 0:00 | \_ /usr/libexec/sssd/sssd_pac --uid 0 --gid 0 --debug-to-files 12832 ? S 0:00 \_ sleep 1000
	Depending on what packages are installed on your Fedora host,
	running id for user from FreeIPA might fail
	in spite of SSSD running:
	
host# id bob id: bob: no such userIt's because
libnss_sss.so is needed
	for NSS to be able to talk to the daemon. We can either
	install those client bits via dnf
	or as quick fix we can copy it out from the container:
	host# mkdir -p /usr/lib64/sssd/modules host# for i in /usr/lib64/libnss_sss.so.2 \ /usr/lib64/sssd/modules/sssd_krb5_localauth_plugin.so \ /usr/lib64/libsss_sudo.so \ /usr/lib64/security/pam_sss.so \ /usr/lib64/security/pam_oddjob_mkhomedir.so \ /usr/bin/kinit \ /usr/bin/klist \ /usr/sbin/ipa-getkeytab ; do if ! [ -e $i ] ; then docker cp sssd:$i $i ; fi done
Switching to container and back
Since the configuration and data that the SSSD container uses are stored in the exact locations where standard sssd service stores them, it's possible to move from sssd running on the host directly to container, or from container to host.
Existing sssd setup can be converted to containerized using
host# systemctl stop sssd.service host# atomic install fedora/sssd --migrate [... image being downloaded ...] docker run --rm=true --privileged --net=host -v /:/host -e NAME=sssd -e HOST=/host fedora/sssd /bin/install.sh --migrate IPA client is already configured on this system. host# atomic run fedora/sssd docker run [...]
	The containerized service is configured with
	/etc/systemd/system/sssd.service. Thus,
	the steps to move to service running directly on the host,
	include:
	
host# atomic uninstall fedora/sssd host# rm /etc/systemd/system/sssd.service host# systemctl daemon-reload host# systemctl start sssd.service
Note about DNS
In the examples above, we assume that the machines can find the FreeIPA server because they are configured with correct DNS settings.
If you are trying the examples in testing setup, you can use
host# echo nameserver IP-address-of-FreeIPA-server > /etc/resolv.conf
	and set the hostname on those machines with domain matching
	the domain handled by the FreeIPA server:
	host# hostname host.example.com
Source
- Source code: https://github.com/fedora-cloud/Fedora-Dockerfiles/tree/master/sssd
- Docker image: https://hub.docker.com/r/fedora/sssd/
Versions used
- Fedora 22 on host with
		- atomic-1.4-1.git9d724aa.fc22
- docker-1.8.2-7.gitcb216be.fc22.x86_64
 
- SSSD container docker.io/fedora/sssd: 7db1201b9c1f (use docker images)