Як зупинити судо PAM-повідомлення в auth.log для конкретного користувача?


16

Я використовую Zabbix для моніторингу свого оточення та виконую zabbix_agentdяк користувач zabbixодин користувацький сценарій кожні 60 секунд; він використовується sudoдля запуску цього сценарію як root.

У /var/log/auth.logI см через кожні 60 секунд:

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

Я хочу зупинити це повідомлення від затоплення мого журналу. Я додав у /etc/pam.d/sudoфайл наступний рядок , безпосередньо перед цим session required pam_unix.so:

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

і повідомлення зникло.

Але проблема полягає в тому, що таким чином я придушував кожне повідомлення PAM, коли хтось виконує сценарій з sudoсимволом root.

Я хочу зупинити повідомлення лише для користувача zabbix(не для всіх інших користувачів). sudoзнає, що zabbixкористувач хоче виконати сценарій з rootпільгами і чи є спосіб сказати PAM про це? Як я можу сказати PAM не входити для конкретного користувача під час використання sudo?

Примітка : я спробував фільтрувати повідомлення в syslog; Хоча це працює, він має таку ж проблему, що і вище, а саме - це занадто нерозбірливо, оскільки повідомлення журналу не вказує, який користувач стає корінним.


Він підтримує фільтрацію і з фільтруванням працює. Я спробував це, але мені це не подобається, оскільки фільтрація - це не універсальний спосіб. Одного разу якийсь символ у повідомленні зміниться або щось зміниться, і мій фільтр вийде з ладу. Я шукаю рішення з параметром конфігурації, директивою чи чимось подібним, щоб бути впевненим, що це буде зупинено у всіх випадках. І повідомлення говорить, session closed for user rootі якщо я його фільтрую насправді, я фільтрую всі повідомлення. Я хочу, щоб конкретний користувач, який не згадується в повідомленні, і не можу відфільтрувати його ім'я ...
inivanoff1

Відповіді:


11

Ви, здається, дуже близькі зі своєю конфліктною лінією PAM:

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

Переглядаючи сторінку керівництва для pam_succeed_if, я думаю, ви хочете перевірити, що запитуючий користувач ( ruser) є zabbix.

Тому я пропоную:

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

Це придушить наступний тест, коли користувач zabbixстане root(але інших переходів немає). Я перевірив це разом з парою власних користувачів.

Видаліть uid = 0тест у вищесказаному, якщо ви хочете мовчати про те, щоб zabbixстати будь-яким користувачем, а не просто root.

Я вилучив service in sudoтест: це зайве, враховуючи, що цей рядок є /etc/pam.d/sudo.


1
Дякую! Це те, що я шукаю. Ідеально! І дякую за пропозицію зняти service in sudo.
inivanoff1

1
Якщо ви також хочете видалити [user] : TTY=unknown ; PWD=... ; USER=root ; COMMAND=...рядок із журналу, ви можете додати це до sudoers.d / file: Defaults:[user] !logfile, !syslog(замінити, [user]де це доречно)
thom_nic

@thom_nic Який шлях до цього файлу?
not2qubit

Будь-який файл під /etc/sudoers.d/- я вважаю за краще використовувати ім’я користувача, групи чи програми, до якої це стосується. Дивіться sudo.ws/man/1.8.15/sudoers.man.html
thom_nic

@thom_nic Чи можете ви, будь ласка, опублікувати це як відповідь трохи розширенішу? Я не бачу формату, який ви пропонуєте вище. Крім того, я не думаю, що там є :. А чи є logfilesявне чи щось таке, що слід замінити?
not2qubit

3

На основі відповіді Тобі я знайшов спосіб налаштувати це дещо по-іншому на Debian / Ubuntu. Для контексту див.

Отже, Debian / Ubuntu мають цю pam-auth-updateкоманду, і коли ви дивитесь, /etc/pam.d/sudoвона виглядає приблизно так:

#%PAM-1.0

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

і /etc/pam.d/common-session-noninteractiveвиглядає так:

#
# /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

Так що я можу редагувати будь-який із наведених вище файлів, але явно тут є якась «більша потужність». Як змусити мої зміни грати добре з іншими пакунками, до яких можна додати правила пам’яті? На завершення, здавалося, що я не можу просто додати рядок/etc/pam.d/sudo між двома @includeподібними.

##### 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

Прочитавши вищезазначені посилання, а також інші приклади (див /usr/share/pam-configs/unix ), Я придумав це в /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і Session-Typeконтролювати, які файли редагуються таPriority визначає, в якому порядку вони входять. Після додавання цього файлу та запуску pam-auth-update, /etc/pam.d/common-session-noninteractiveвиглядає так (внизу :)

#... 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

... чого ми хочемо, тому що наша pam_succeed_ifлінія повинна пройти раніше session required pam_unix.so. (Цей рядок походить /use/share/pam-configs/unixі має, таким Priority: 256чином, він закінчується другим.) Зауважте також, що я залишив service = sudoпредикат, оскільки він common-session-noninteractiveможе бути включений до інших конфігурацій sudo.

У моєму випадку я вже запакував свій код як інсталятор .deb, тому я додав /usr/share/pam-configs/myappфайл і додав pam-auth-update --packageдо моїх postinstта prermсценаріїв, і мені добре!

Закрити ...

Якщо ви читаєте статтю PAMConfigFrameworkSpec, яку я пов’язував вище , вона визначає Session-Interactive-Onlyваріант, але не має способу вказати лише неінтерактивні правила . Так само /etc/pam.d/common-sessionбуло оновлено . Я не думаю, що це існує. Якщо у вас все в порядку, коли інтерактивні сеанси не реєструються для цього користувача (це - обліковий запис служби, правда?), Вам слід все налаштувати!

Бонус: як також видалити вихідний журнал sudo

На додаток до session openened|closedрядків, які випромінює PAM, sudoзаписує додаткову інформацію про виконану команду. Це виглядає приблизно так:

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

Якщо ви також хочете видалити це, відкрийте це посилання, а потім продовжуйте нижче ...

Отже ... ви, мабуть, знайомі з типовою /etc/sudoers.d/___установкою, яка може зробити щось подібне для облікового запису послуги, який потребує надпривісних приватних даних для деяких дій:

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

що може зайти /etc/sudoers.d/10_myuser. Ну, крім іншого, ви також можете вказатиDefaults . Зверніть увагу саме на цей синтаксис'Defaults' ':' User_List

А тепер подивіться розділ СУДОЕРИ . Цікаві біти включають log_input, log_outputале (напевно) важливіше syslogі logfile. Мені здається, що в останніх версіях Debian або rsyslog, або sudoувійти до, stdoutабо stderrза замовчуванням. Тож для мене це відображалось в журналі журналу для моєї служби, а не, наприклад, /var/log/auth.logтам, де він не змішався б у моїх журналах програм. Щоб видалити журнал sudo, я додав таке, щоб /etc/sudoers.d/10_myuserвоно виглядало так:

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

YMMV, якщо у вас відмова від реєстрації створює проблеми з аудитами безпеки, ви також можете спробувати вирішити це за допомогою фільтрів rsyslog.


Те, як ви реалізували матеріали "відкриття / закриття сесії", для мене не працювало. Є дві причини: (1) Ви не вказали використовувати success=1, (що пропускає наступне застереження), і (2) Оскільки, як ви вказали service = sudo, будь-які запущені завдання CRON призводять до requirement "service = sudo" not met by user "root". (І, можливо, інші побічні ефекти.) Однак, ваш бонус працював чудово! Дякую.
not2qubit

Як виглядають ваші postinstта prermсценарії?
not2qubit

@ not2qubit re: success=1- Я краще не пропускаю pam_unixзовсім. Я хочу лише перестати реєструвати вихід, який, [default=ignore]здається, досягає прекрасного без пропуску пам_унікс.
thom_nic

re: cronвакансії та service = sudo: чи можливо, що ваші завдання cron виконуються як неприйнятний користувач, але ви не дзвоните sudoяк частина роботи cron?
thom_nic

2

Після зовсім небагато тестування та досліджень я знайшов робоче рішення для Debian Stretch (на малиновому). Звичайно, існує більше ніж один спосіб здійснити те, про що вимагають ОП. Але документація PAM є надзвичайною, тому більшість матеріалів справді TL; DR.

  1. Ви можете додати спеціальний фільтр рядків для rsyslog в: /etc/rsyslog.d/anyname.confвикористовуючи:
    :msg, contains, "session opened for user root by pi" stop
  2. Ви можете безпосередньо редагувати /etc/pam.d/sudo
  3. Ви можете зробити це правильно, створивши спеціальний файл конфігурації PAM у: /usr/share/pam-configs/
  4. Ви можете зробити це, створивши спеціальний файл sudoers у:/etc/sudoers.d/020_pi

Я покажу вам, як це робити (2) і (4).

УВАГА

Не редагуйте жодні файли, /etc/pam.d/не попередньо змінивши їхні світові дозволи на запис. Якщо ви цього не зробите і помилитесь, ви можете бути заблоковані від будь-якого майбутнього використання судо / су ! Тому переконайтесь, що ви протестували нові налаштування, перш ніж змінити їх назад. (За замовчуванням - 644 )


Щоб позбутися "сеансу відкриття / закриття":

Ми хочемо позбутися наступного /var/log/auth.logспаму:

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

Зробити це:

# 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

Тут є вирішальне значення success=1 , що означає пропуск наступного пункту (або в мові PAM "перехід через наступний модуль у стеку"), якщо це вдало.

Від man pam.conf:

ігнорувати - при використанні зі стеком модулів стан повернення модуля не сприятиме поверненню коду, який отримує програма.

зроблено - еквівалентно нормально з побічним ефектом припинення стека модуля і PAM негайно повертається до програми.

N - еквівалент ок з побічним ефектом перестрибування наступних N модулів у стеку.

Далі перезавантажте і дайте йому працювати декілька годин (наприклад, щоб перевірити завдання Cron), щоб перевірити, чи працює це. Потім переконайтеся, що заново встановите дозволи файлу, інакше у вас буде розбіжна безпека у вашій системі. ( sudo chmod 644 /etc/pam.d/sudo)


Щоб позбутися від повторних повідомлень "TTY PWD COMMAND":

Ми також хочемо позбутися таких повідомлень:

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

У моєму випадку це було створено за допомогою сценарію IDS, який виконував ар-сканування кожні кілька хвилин. Щоб видалити його з відображення в журналах, створіть такий файл:

# 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

(Ось xxxваше ім’я машини та piім’я користувача.)


1
> Не редагуйте жодних файлів у /etc/pam.d/, не змінюючи їхніх світових дозволів на запис .... Настійно пропонуйте замість sudo su - цього запустити інший сеанс терміналу як root, наприклад, тоді вам не доведеться встановлювати небезпечні дозволи та ризикувати забути змінити це назад.
thom_nic

@thom_nic Ви протестували це? Я здогадуюсь, що якщо ви випадково заблокуєте використання sudo / su в PAM, то незалежно від того, що ви робите, ви отримаєте помилку навіть у кореневій оболонці. Якщо це не так, то PAM, ймовірно, не працює як слід.
not2qubit

-2

Ти отримаєш:

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

з вашою відповіддю.

#%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

працює, але ви все одно отримаєте:

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

у ваших журналах.


1
Вкажіть, будь ласка: 1. який файл ви редагуєте, 2. хто "ви" і що він вирішує.
not2qubit
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.