Based on Toby's answer, I found a way to configure this in a slightly different way on Debian/Ubuntu. For context, see:
So Debian/Ubuntu have this pam-auth-update
command and when you look at /etc/pam.d/sudo
it looks like this:
#%PAM-1.0
@include common-auth
@include common-account
@include common-session-noninteractive
and /etc/pam.d/common-session-noninteractive
looks like this:
#
# /etc/pam.d/common-session-noninteractive - session-related modules
# common to all non-interactive services
#
# This file is included from other service-specific PAM config files,
# and should contain a list of modules that define tasks to be performed
# at the start and end of all non-interactive sessions.
#
# As of pam 1.0.1-6, this file is managed by pam-auth-update by default.
# To take advantage of this, it is recommended that you configure any
# local modules either before or after the default block, and use
# pam-auth-update to manage selection of other modules. See
# pam-auth-update(8) for details.
# here are the per-package modules (the "Primary" block)
session [default=1] pam_permit.so
# here's the fallback if no module succeeds
session requisite pam_deny.so
# prime the stack with a positive return value if there isn't one already;
# this avoids us returning an error just because nothing sets a success code
# since the modules above will each just jump around
session required pam_permit.so
# and here are more per-package modules (the "Additional" block)
session required pam_unix.so
# end of pam-auth-update config
So sure, I could edit either of the above files but clearly there's some "higher power" at work here. How to get my changes to play nice with other packages that might want to add pam rules? To top it off, it seemed I couldn't just add a line in /etc/pam.d/sudo
in between the two @include
s like this..
##### THIS DIDN'T WORK :( ######
@include common-auth
@include common-account
session [default=ignore] pam_succeed_if.so quiet_success service = sudo uid = 0 ruser = myappuser
@include common-session-noninteractive
After reading the above links as well as other examples (see /usr/share/pam-configs/unix
) I came up with this, in /usr/share/pam-configs/myapp
:
# Don't log "session opened" messages for myapp user
# See: https://wiki.ubuntu.com/PAMConfigFrameworkSpec
# https://manpages.debian.org/stretch/libpam-modules/pam_succeed_if.8.en.html
Name: myapp disable session logging
Default: yes
Priority: 300
Session-Type: Additional
Session:
[default=ignore] pam_succeed_if.so quiet_success service = sudo uid = 0 ruser = myappuser
Session
and Session-Type
control which files are edited and Priority
defines what order they go in. After adding that file and running pam-auth-update
, /etc/pam.d/common-session-noninteractive
looks like this (at the bottom:)
#... omitted
session required pam_permit.so
# and here are more per-package modules (the "Additional" block)
session [default=ignore] pam_succeed_if.so quiet_success service = sudo uid = 0 ruser = myappuser
session required pam_unix.so
# end of pam-auth-update config
... which is what we want because our pam_succeed_if
line needs to come before session required pam_unix.so
. (That line comes from /use/share/pam-configs/unix
and has a Priority: 256
so it ends up second.) Note also that I left the service = sudo
predicate since common-session-noninteractive
might also be included in other configs besides sudo
.
In my case, I had already packaged my code as a .deb installer so I added the /usr/share/pam-configs/myapp
file, and added pam-auth-update --package
to my postinst
and prerm
scripts and I'm good to go!
Caveat...
If you read the PAMConfigFrameworkSpec article that I linked above, it defines a Session-Interactive-Only
option, but does not have a way to specify only noninteractive rules. So /etc/pam.d/common-session
was also updated. I don't think there's a way around this. If you're ok with interactive sessions not being logged for that user (it IS a service account, right?) then you should be all set!
Bonus: how to also remove sudo log output
In addition to the session openened|closed
lines that PAM emits, sudo
logs additional information about the command that's run. It looks like this:
[user] : TTY=unknown ; PWD=... ; USER=root ; COMMAND=...
If you also want to remove that, open this link then continue below...
So... you're probably familiar with typical /etc/sudoers.d/___
setup which might do something like this for a service account which needs superuser privs for a some actions:
myuser ALL=(ALL) NOPASSWD: /bin/ping
that might go in /etc/sudoers.d/10_myuser
. Well, among other things you can also specify Defaults
. Note specifically this syntax 'Defaults' ':' User_List
Now, look at the SUDOERS OPTIONS section. Interesting bits include log_input
, log_output
but (probably) more importantly, syslog
and logfile
. It appears to me that in recent versions of Debian, either rsyslog or sudo
log to stdout
or stderr
by default. So for me this was showing up in the journald log for my service, and not e.g. /var/log/auth.log
where it wouldn't get mixed into my application logs. To remove the sudo logging, I added the following to /etc/sudoers.d/10_myuser
so it looks like:
Defaults:myuser !logfile, !syslog
myuser ALL=(ALL) NOPASSWD: /bin/ping
YMMV, if you feel disabling logging creates issues with security audits you might also try to solve this via rsyslog filters.
session closed for user root
and if I filter it in fact I am filtering all messages. I want for a specific user who is not mentioned in the message and I cannot filter by its name... – Aug 20 '15 at 14:22