Com base na resposta de Toby, encontrei uma maneira de configurar isso de uma maneira um pouco diferente no Debian / Ubuntu. Para o contexto, veja:
Então o Debian / Ubuntu tem esse comando pam-auth-update
e quando você olha para /etc/pam.d/sudo
ele se parece com isto:
#%PAM-1.0
@include common-auth
@include common-account
@include common-session-noninteractive
e /etc/pam.d/common-session-noninteractive
são assim:
#
# /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
Então, eu poderia editar qualquer um dos arquivos acima, mas claramente há algum "maior poder" no trabalho aqui. Como fazer com que minhas alterações sejam compatíveis com outros pacotes que podem querer adicionar regras de pam? Como se não bastasse, parece que não pude simplesmente adicionar uma linha em /etc/pam.d/sudo
entre os dois @include
s assim.
##### 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
Depois de ler os links acima, bem como outros exemplos (veja /usr/share/pam-configs/unix
), eu criei isto, em /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
e Session-Type
controlam quais arquivos são editados e Priority
define em que ordem eles entram. Depois de adicionar esse arquivo e executar pam-auth-update
, /etc/pam.d/common-session-noninteractive
se parece com isso (na parte inferior:)
#... 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
... é isso que queremos porque nossa linha pam_succeed_if
precisa vir antes de session required pam_unix.so
. (Essa linha vem de /use/share/pam-configs/unix
e tem um Priority: 256
, então acaba em segundo.) Observe também que deixei o predicado service = sudo
, pois common-session-noninteractive
também pode ser incluído em outras configurações além de sudo
.
No meu caso, eu já tinha empacotado meu código como um instalador .deb, então adicionei o arquivo /usr/share/pam-configs/myapp
, e adicionei pam-auth-update --package
aos meus scripts postinst
e prerm
e estou pronto!
Advertência ...
Se você ler o artigo PAMConfigFrameworkSpec que eu associei acima , ele define uma opção Session-Interactive-Only
, mas não tem uma maneira de especificar apenas regras não interativas . Por isso, /etc/pam.d/common-session
foi também atualizado . Eu não acho que há uma maneira de contornar isso. Se você está bem com sessões interativas não sendo registradas para esse usuário (é uma conta de serviço, certo?), Então você deve estar tudo pronto!
Bônus: como remover também a saída do sudo log
Além das linhas session openened|closed
que o PAM emite, sudo
registra informações adicionais sobre o comando executado. Parece assim:
[user] : TTY=unknown ; PWD=... ; USER=root ; COMMAND=...
Se você também quiser removê-lo, abra este link e continue abaixo ...
Então ... você provavelmente está familiarizado com a típica /etc/sudoers.d/___
setup, que pode fazer algo assim para uma conta de serviço que precisa de superusuários privs para algumas ações:
myuser ALL=(ALL) NOPASSWD: /bin/ping
que pode ir em /etc/sudoers.d/10_myuser
. Bem, entre outras coisas, você também pode especificar Defaults
. Observe especificamente essa sintaxe 'Defaults' ':' User_List
Agora, veja a seção SUDOERS OPTIONS . Bits interessantes incluem log_input
, log_output
mas (provavelmente) mais importante, syslog
e logfile
. Parece-me que em versões recentes do Debian, o rsyslog ou sudo
log para stdout
ou stderr
por padrão. Então, para mim, isso estava aparecendo no registro do diário para o meu serviço e não, por exemplo, /var/log/auth.log
onde não seria misturado nos logs do meu aplicativo. Para remover o log do sudo, adicionei o seguinte a /etc/sudoers.d/10_myuser
, de modo que pareça:
Defaults:myuser !logfile, !syslog
myuser ALL=(ALL) NOPASSWD: /bin/ping
YMMV, se você sentir que desabilitar o registro cria problemas com auditorias de segurança, você também pode tentar resolver isso por meio de filtros rsyslog.