[Bug 1754270] [NEW] systemd-user PAM configuration should initialize the keyring with pam_keyinit

Trent Lloyd trent.lloyd at canonical.com
Thu Mar 8 08:39:38 UTC 2018


Public bug reported:

/etc/pam.d/systemd-user does not currently call pam_keyinit.so -- it's
possible this should instead be added to common-session-noninteractive
but I am not entirely sure about that - someone with more understanding
of the PAM modules would probably need to weigh in on that.  In any case
systemd-user itself should at least have it - as it has it's own special
PAMname for processes it launches.

This means that the keyring does not link to the user keyring as it
should, and will cause issues with programs needing a key from the
keyring.  In particular the use case that breaks for me is using
'fscrypt' and 'libpam-fscrypt' however anything making use of kernel
keyrings would be affected.

Something non-obvious about this, is that many desktop session processes
are started under 'systemd-user' instead of the 'session' - this
includes gnome-terminal-server which means any gnome-terminal shell runs
under this context.  If you start xterm instead of gnome-terminal, you
get a different keyring and this can cause confusion when debugging the
issue as some processes are in one state and the others are in another
including your primary debug tool gnome-terminal.  You can verify this
by running 'systemctl status $(pidof gnome-terminal)' and 'systemctl
status $(pidof xterm)' and note the different hierachy.

The change to add pam_keyinit.so was made upstream in December 2016:
https://github.com/systemd/systemd/commit/ab79099d1684457d040ee7c28b2012e8c1ea9a4f

Ubuntu should make the same change so that services needing a keyring
will work correctly in the desktop session, and the same keyring is used
for processes launched under both methods.  In my test I add the usual
pam_keyinit.so line after "pam_limits.so" and before "common-session-
noninteractive".  I am not sure if this is the most ideal location (but
it appears to work).


You can test the behavior by running "keyctl show @s" in both contexts

Working contexts:
- xterm
- SSH login

Broken contexts:
- gnome-terminal
- systemd-run --user keyctl show @s (then check output with journalctl --user --follow)


When the configuration is broken you will see this output:
lathiat at ubuntu:~/src/systemd$ keyctl show @s
Keyring
  59654779 --alswrv   1000  1000  keyring: _ses
   6806191 ----s-rv      0     0   \_ user: invocation_id

When the configuration is working, you will see a link to the user session instead:
lathiat at ubuntu:~/src/systemd$ keyctl show @s
Keyring
  59654779 --alswrv   1000  1000  keyring: _ses
   6806191 ----s-rv      0     0   \_ keyring: _uid.1000


As background, what is broken on my test setup with libpam-fscrypt?
gnome-terminal for example is unable to write any file in my encrypted /home which means that it cannot save preferences, so if you go into preferences and try to tick a checkbox it will immediately revert and an error is logged to the journal.  You can use the guide at https://github.com/google/fscrypt to setup such a system if you wish to fully test my case.  But you can simply verify the behavior as above.

Verified on bionic (its the only version with fscrypt) however this
issue extends back to at least xenial.

** Affects: systemd (Ubuntu)
     Importance: Undecided
         Status: New

-- 
You received this bug notification because you are a member of Ubuntu
Foundations Bugs, which is subscribed to systemd in Ubuntu.
https://bugs.launchpad.net/bugs/1754270

Title:
  systemd-user PAM configuration should initialize the keyring with
  pam_keyinit

Status in systemd package in Ubuntu:
  New

Bug description:
  /etc/pam.d/systemd-user does not currently call pam_keyinit.so -- it's
  possible this should instead be added to common-session-noninteractive
  but I am not entirely sure about that - someone with more
  understanding of the PAM modules would probably need to weigh in on
  that.  In any case systemd-user itself should at least have it - as it
  has it's own special PAMname for processes it launches.

  This means that the keyring does not link to the user keyring as it
  should, and will cause issues with programs needing a key from the
  keyring.  In particular the use case that breaks for me is using
  'fscrypt' and 'libpam-fscrypt' however anything making use of kernel
  keyrings would be affected.

  Something non-obvious about this, is that many desktop session
  processes are started under 'systemd-user' instead of the 'session' -
  this includes gnome-terminal-server which means any gnome-terminal
  shell runs under this context.  If you start xterm instead of gnome-
  terminal, you get a different keyring and this can cause confusion
  when debugging the issue as some processes are in one state and the
  others are in another including your primary debug tool gnome-
  terminal.  You can verify this by running 'systemctl status $(pidof
  gnome-terminal)' and 'systemctl status $(pidof xterm)' and note the
  different hierachy.

  The change to add pam_keyinit.so was made upstream in December 2016:
  https://github.com/systemd/systemd/commit/ab79099d1684457d040ee7c28b2012e8c1ea9a4f

  Ubuntu should make the same change so that services needing a keyring
  will work correctly in the desktop session, and the same keyring is
  used for processes launched under both methods.  In my test I add the
  usual pam_keyinit.so line after "pam_limits.so" and before "common-
  session-noninteractive".  I am not sure if this is the most ideal
  location (but it appears to work).

  
  You can test the behavior by running "keyctl show @s" in both contexts

  Working contexts:
  - xterm
  - SSH login

  Broken contexts:
  - gnome-terminal
  - systemd-run --user keyctl show @s (then check output with journalctl --user --follow)

  
  When the configuration is broken you will see this output:
  lathiat at ubuntu:~/src/systemd$ keyctl show @s
  Keyring
    59654779 --alswrv   1000  1000  keyring: _ses
     6806191 ----s-rv      0     0   \_ user: invocation_id

  When the configuration is working, you will see a link to the user session instead:
  lathiat at ubuntu:~/src/systemd$ keyctl show @s
  Keyring
    59654779 --alswrv   1000  1000  keyring: _ses
     6806191 ----s-rv      0     0   \_ keyring: _uid.1000

  
  As background, what is broken on my test setup with libpam-fscrypt?
  gnome-terminal for example is unable to write any file in my encrypted /home which means that it cannot save preferences, so if you go into preferences and try to tick a checkbox it will immediately revert and an error is logged to the journal.  You can use the guide at https://github.com/google/fscrypt to setup such a system if you wish to fully test my case.  But you can simply verify the behavior as above.

  Verified on bionic (its the only version with fscrypt) however this
  issue extends back to at least xenial.

To manage notifications about this bug go to:
https://bugs.launchpad.net/ubuntu/+source/systemd/+bug/1754270/+subscriptions



More information about the foundations-bugs mailing list