Why is it needed to set `pam_loginuid` to its `optional` value with docker?

pam_loginuid is used to set the loginuid audit attribute of a process when a user logs in through SSH, X, or anything like that. This attribute can then be used by the audit framework for various purposes.

However, setting this audit attributes requires some audit-related capabilities to be enabled; and by default, Docker drops them, so the audit_setloginuid call will fail.

When the PAM module is configured to required, such failures are fatal (and PAM prevents the login from going on); while optional means "go on anyway".

I might be wrong, but I believe that while pam_loginuid is available in previous versions (I tested with 12.04) it wasn't enabled anyway; so that's why 13.10 and higher require this special setting.


This investigation is too long for a comment. As @jpetazzo indicated, this problem is likely due to lack of the CAP_AUDIT_WRITE capability. Which apparently affects some versions of Docker and Linux, but not others. So here I'll try to investigate the evolution of this.

  • #3015 (2013-12-13, 0.7.2) introduced cap dropping for lxc daemon and included AUDIT_WRITE in the list of dropped capabilities
  • #5810 (2014-05-16, 0.12.0) made container library drop all capabilities except for whitelisted ones
  • #6527 (2014-06-19, 1.0.1) moved from blacklist to whitelist and didn't include AUDIT_WRITE in that
  • #7179 (2014-07-24, 1.2.0) added the AUDIT_WRITE capability to a whitelist
  • #20662 (2016-03-19, 1.11.0) moved files around so the setting is now in oci/defaults_linux.go

So it would seem as though all versions before 0.7.2 and also all versions since 1.2.0 should keep CAP_AUDIT_WRITE. As I'm seeing pam_loginuid-related problems with 1.12.5 there might be some other capability involved here.

Tags:

Docker

Ubuntu