Como parar mensagens PAM do sudo no auth.log para um usuário específico?

16

Estou usando o Zabbix para monitorar meu ambiente e zabbix_agentdexecuta como usuário zabbixum script personalizado a cada 60 segundos; Ele usa sudopara executar este script como root.

Em /var/log/auth.logvejo a cada 60 segundos:

Aug 11 17:40:32 my-server sudo: pam_unix(sudo:session): session opened for user root by (uid=0)
Aug 11 17:40:32 my-server sudo: pam_unix(sudo:session): session closed for user root

Quero impedir que esta mensagem inunde meu log. Adicionei a seguinte linha ao /etc/pam.d/sudoarquivo, imediatamente antes session required pam_unix.so:

session [success=1 default=ignore] pam_succeed_if.so service in sudo quiet uid = 0

e a mensagem desapareceu.

Mas o problema é que dessa forma eu suprimi todas as mensagens do PAM quando alguém está executando um script com sudoas root.

Quero parar a mensagem apenas para o usuário zabbix(nem todos os outros usuários). sudosabe que o zabbixusuário deseja executar o script com rootprivilégios e existe alguma maneira de informar isso ao PAM? Como posso dizer ao PAM para não registrar um usuário específico ao usar sudo?

Nota : Tentei filtrar as mensagens no syslog; embora isso funcione, ele tem o mesmo problema que o acima, ou seja, é indiscriminado demais, pois a mensagem de log não indica qual usuário está se tornando raiz.

inivanoff1
fonte
Ele suporta filtragem e com a filtragem funciona. Eu tentei isso, mas não gosto, porque a filtragem não é uma maneira universal. Um dia, algum caractere da mensagem mudará ou algo mudará e meu filtro falhará. Estou procurando uma solução com parâmetro de configuração, diretiva ou algo semelhante para ter certeza de que isso será interrompido em todos os casos. E a mensagem diz session closed for user roote se eu filtrar de fato, estou filtrando todas as mensagens. Quero para um usuário específico que não é mencionado na mensagem e eu não posso filtrar por seu nome ...
inivanoff1

Respostas:

11

Você parece bem próximo da sua linha de conf PAM:

session [success=1 default=ignore] pam_succeed_if.so service in sudo quiet uid = 0

Olhando para a página de manual pam_succeed_if, acho que você deseja testar se o usuário solicitante ( ruser) é zabbix.

Então eu sugiro:

session [success=1 default=ignore] pam_succeed_if.so quiet uid = 0 ruser = zabbix

Isso suprimirá o próximo teste quando o usuário zabbixse tornar root(mas nenhuma outra transição). Eu testei isso com um par de meus próprios usuários.

Remova o uid = 0teste acima, se você quiser se zabbixtornar um usuário silencioso , em vez de apenas fazer root.

Eu removi o service in sudoteste: é redundante, pois essa linha está inserida /etc/pam.d/sudo.

Toby Speight
fonte
1
Obrigado! É isso que estou procurando. Perfeito! E obrigado pela sugestão para remover service in sudo.
precisa saber é o seguinte
1
Se você também quiser remover a [user] : TTY=unknown ; PWD=... ; USER=root ; COMMAND=...linha do log, bem como, você pode adicionar este a um sudoers.d / arquivo: Defaults:[user] !logfile, !syslog(substitua [user]quando necessário)
thom_nic
@thom_nic Qual é o caminho para esse arquivo?
Not2qubit
Qualquer arquivo abaixo /etc/sudoers.d/- eu prefiro usar o nome do usuário, grupo ou aplicativo ao qual isso se aplica. Veja sudo.ws/man/1.8.15/sudoers.man.html
thom_nic
@thom_nic Você poderia postar isso como uma resposta um pouco mais expandida? Não vejo o formato que você propõe acima. Além disso, acho que não há um :lá dentro. E o logfilesexplícito ou algo que deve ser substituído?
Not2qubit
3

Baseado na resposta de Toby, eu encontrei uma maneira de configurar isso de uma maneira um pouco diferente no Debian / Ubuntu. Para o contexto, consulte:

Portanto, o Debian / Ubuntu tem este pam-auth-updatecomando e, quando você olha /etc/pam.d/sudo, fica assim:

#%PAM-1.0

@include common-auth
@include common-account
@include common-session-noninteractive

e /etc/pam.d/common-session-noninteractivefica 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, com certeza, eu poderia editar qualquer um dos arquivos acima, mas claramente há um "poder superior" em ação aqui. Como fazer minhas alterações funcionarem bem com outros pacotes que podem querer adicionar regras do pam? Ainda por cima, parecia que eu não poderia simplesmente adicionar uma linha /etc/pam.d/sudoentre os dois @includesegundos 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 (consulte /usr/share/pam-configs/unix), vim com isso, 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

Sessione Session-Typecontrolar quais arquivos são editados e Prioritydefine em que ordem eles entram. Depois de adicionar esse arquivo e executá-lo pam-auth-update, /etc/pam.d/common-session-noninteractivefica assim (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

... o que queremos, porque nossa pam_succeed_iflinha precisa vir antes session required pam_unix.so. (Essa linha vem /use/share/pam-configs/unixe tem um, Priority: 256então termina em segundo.) Observe também que deixei o service = sudopredicado, pois common-session-noninteractivetambém pode ser incluído em outras configurações sudo.

No meu caso, eu já tinha embalado meu código como um instalador .deb então eu adicionei o /usr/share/pam-configs/myapparquivo, e acrescentou pam-auth-update --packageaos meus postinste prermroteiros e eu sou bom para ir!

Embargo...

Se você ler o artigo PAMConfigFrameworkSpec vinculado acima , ele definirá uma Session-Interactive-Onlyopção, mas não poderá especificar apenas regras não interativas . Então também/etc/pam.d/common-session foi atualizado . Eu não acho que há uma maneira de contornar isso. Se você concorda que as sessões interativas não estão sendo registradas para esse usuário (é uma conta de serviço, certo?), Você deve estar pronto!

Bônus: como remover também a saída do log do sudo

Além das session openened|closedlinhas que o PAM emite, sudoregistra informações adicionais sobre o comando executado. Se parece com isso:

[user] : TTY=unknown ; PWD=... ; USER=root ; COMMAND=...

Se você também deseja remover isso, abra este link e continue abaixo ...

Então ... você provavelmente conhece a /etc/sudoers.d/___configuração típica, que pode fazer algo assim para uma conta de serviço que precisa de privilégios de superusuário para algumas ações:

myuser ALL=(ALL) NOPASSWD: /bin/ping

que pode entrar /etc/sudoers.d/10_myuser. Bem, entre outras coisas, você também pode especificarDefaults . Observe especificamente esta sintaxe'Defaults' ':' User_List

Agora, veja a seção SUDOERS OPTIONS . Bits interessantes incluem log_input, log_outputmas (provavelmente) mais importante, sysloge logfile. Parece-me que nas versões recentes do Debian, rsyslog ou sudolog para stdoutou stderrpor padrão. Então, para mim, isso estava aparecendo no log de diário do meu serviço, e não por exemplo, /var/log/auth.logonde não seria misturado nos logs de aplicativos. Para remover o registro do sudo, adicionei o seguinte ao seguinte /etc/sudoers.d/10_myuser:

Defaults:myuser !logfile, !syslog
myuser ALL=(ALL) NOPASSWD: /bin/ping

YMMV, se você sentir que desabilitar o log cria problemas com as auditorias de segurança, você também pode tentar resolver isso por meio de filtros rsyslog.

thom_nic
fonte
A maneira como você implementou o material "sessão aberta / fechada" não funcionou para mim. Há dois motivos: (1) você não especificou o uso success=1(que ignora a próxima cláusula) e (2) porque como você especificou service = sudo, qualquer trabalho CRON em execução resulta em requirement "service = sudo" not met by user "root". (E possivelmente outros efeitos colaterais.) No entanto, seu material de bônus funcionou muito bem! Obrigado.
Not2qubit 12/0518
Como são seus scripts postinste prerm?
Not2qubit
@ not2qubit re: success=1- Prefiro não pular pam_unixcompletamente. Eu só quero parar de registrar a saída que [default=ignore]parece conseguir muito bem sem pular o pam_unix.
Thom_nic
re: cronjobs e service = sudo: É possível que seus jobs cron estejam sendo executados como um usuário privado, mas você não está chamando sudocomo parte dos jobs cron?
Thom_nic
2

Após alguns testes e pesquisas assustadores, eu encontrei uma solução funcional para o Debian Stretch (no Raspberry). Certamente há mais de uma maneira de realizar o que o OP pede. Mas a documentação do PAM é impressionante, então a maioria das coisas é realmente TL; DR.

  1. Você pode adicionar um filtro de string personalizado para rsyslog em: /etc/rsyslog.d/anyname.confusando:
    :msg, contains, "session opened for user root by pi" stop
  2. Você pode editar diretamente /etc/pam.d/sudo
  3. Você pode fazer isso da maneira certa criando um arquivo de configuração PAM personalizado em: /usr/share/pam-configs/
  4. Você pode fazer isso criando um arquivo de sudoers personalizado em:/etc/sudoers.d/020_pi

Eu vou te mostrar como fazer (2) e (4).

ATENÇÃO

Não edite nenhum arquivo /etc/pam.d/sem antes alterar suas permissões de gravação mundial. Se não o fizer, e cometer um erro, poderá ficar bloqueado de qualquer uso futuro do sudo / su ! Portanto, verifique se você testou as novas configurações antes de alterá-las novamente. (O padrão é 644 )


Para se livrar da "sessão abrir / fechar":

Queremos nos livrar do seguinte /var/log/auth.logspam:

May 10 11:28:03 xxx sudo[26437]: pam_unix(sudo:session): session opened for user root by (uid=0)
May 10 11:28:07 xxx sudo[26437]: pam_unix(sudo:session): session closed for user root

Faça isso:

# sudo chmod 666 /etc/pam.d/sudo
# sudo cat /etc/pam.d/sudo

#%PAM-1.0

@include common-auth
@include common-account
session [success=1 default=ignore] pam_succeed_if.so quiet_success uid = 0 ruser = pi
@include common-session-noninteractive

O que é de importância crucial aqui é que isso success=1significa pular a próxima cláusula 1 (ou no jargão do PAM "pule o próximo módulo na pilha"), se for bem-sucedida.

De man pam.conf:

ignorar - quando usado com uma pilha de módulos, o status de retorno do módulo não contribuirá para o código de retorno obtido pelo aplicativo.

done - equivalente a ok com o efeito colateral de encerrar a pilha de módulos e o PAM retornar imediatamente ao aplicativo.

N - equivalente a ok com o efeito colateral de pular os próximos N módulos na pilha.

Em seguida, reinicie e deixe executar algumas horas (para verificar tarefas cron, por exemplo) para testar se isso funciona. Em seguida, certifique-se de reinstalar as permissões de arquivo, caso contrário, haverá uma brecha de segurança no sistema. ( sudo chmod 644 /etc/pam.d/sudo)


Para se livrar das mensagens repetidas "TTY PWD COMMAND":

Também queremos nos livrar de mensagens como esta:

May 11 18:23:20 xxx sudo:       pi : TTY=unknown ; PWD=... ; USER=root ; COMMAND=/usr/bin/arp-scan -q -l

No meu caso, isso foi gerado por um script IDS que executava o arp-scan a cada poucos minutos. Para impedir que ele apareça nos logs, crie o seguinte arquivo:

# sudo nano /etc/sudoers.d/020_pi
# sudo cat /etc/sudoers.d/020_pi

Defaults:pi     !logfile, !syslog
pi xxx = (root) NOPASSWD: /usr/bin/arp-scan

(Aqui xxxestá o nome da sua máquina e pié o nome de usuário.)

not2qubit
fonte
1
> Não edite nenhum arquivo no /etc/pam.d/ sem antes alterar suas permissões mundiais de gravação .... Sugira altamente a execução de outra sessão do terminal como root. Por exemplo, sudo su - você não precisa definir permissões perigosas e corre o risco de esquecer de mudar de volta.
Thom_nic 15/05
@thom_nic Você já testou isso? Meu palpite é que, se você bloquear acidentalmente o uso de sudo / su no PAM, não importa o que faça, produzirá um erro, mesmo em um shell raiz. Caso contrário, o PAM provavelmente não está funcionando como deveria.
Not2qubit #
-2

Você vai ter:

pam_succeed_if(sudo:session): unknown attribute "ruser"

com sua resposta.

#%PAM-1.0

@include common-auth
@include common-account
@include common-session-noninteractive
session     [success=1 default=ignore] pam_succeed_if.so service in zabbix quiet use_uid
session     [success=1 default=ignore] pam_succeed_if.so service in crond quiet use_uid

funciona, mas você ainda terá um:

pam_unix(sudo:session): session opened for user root by (uid=0)

nos seus logs.

golfdq
fonte
1
Especifique: 1. qual arquivo você está editando, 2. quem é "você" e o que ele resolve.
Not2qubit