Bagaimana cara menghentikan pesan PAM sudo di auth.log untuk pengguna tertentu?

16

Saya menggunakan Zabbix untuk memantau lingkungan saya dan zabbix_agentdmengeksekusi sebagai pengguna zabbixskrip khusus setiap 60 detik; digunakan sudountuk menjalankan skrip ini sebagai root.

Dalam /var/log/auth.logsaya melihat setiap 60 detik:

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

Saya ingin menghentikan pesan ini dari membanjiri log saya. Saya menambahkan baris berikut ke /etc/pam.d/sudofile, segera sebelum session required pam_unix.so:

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

dan pesan itu hilang.

Tetapi masalahnya adalah bahwa dengan cara ini saya telah menekan setiap pesan PAM ketika seseorang mengeksekusi skrip dengan sudoas root.

Saya ingin menghentikan pesan hanya untuk pengguna zabbix(tidak semua pengguna lain). sudotahu bahwa zabbixpengguna ingin menjalankan skrip dengan roothak istimewa dan apakah ada cara untuk memberi tahu PAM itu? Bagaimana saya bisa memberi tahu PAM untuk tidak login untuk pengguna tertentu saat menggunakansudo ?

Catatan : Saya mencoba memfilter pesan di syslog; meskipun ini berfungsi, ia memiliki masalah yang sama seperti di atas, yaitu terlalu membabi buta, karena pesan log tidak menunjukkan pengguna mana yang menjadi root.

inivanoff1
sumber
Ini mendukung penyaringan dan penyaringan berfungsi. Saya sudah mencobanya tetapi saya tidak menyukainya, karena penyaringan bukan cara universal. Suatu hari beberapa karakter dalam pesan akan berubah atau sesuatu akan berubah dan filter saya akan gagal. Saya mencari solusi dengan parameter konfigurasi, direktif atau sesuatu yang serupa untuk memastikan bahwa ini akan dihentikan dalam semua kasus. Dan pesannya mengatakan session closed for user rootdan jika saya memfilternya sebenarnya saya memfilter semua pesan. Saya ingin pengguna tertentu yang tidak disebutkan dalam pesan dan saya tidak bisa memfilter dengan namanya ...
inivanoff1

Jawaban:

11

Anda sepertinya cukup dekat dengan baris conf PAM Anda:

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

Melihat halaman manual untuk pam_succeed_if, saya pikir Anda ingin menguji bahwa pengguna yang meminta ( ruser) adalah zabbix.

Jadi saya sarankan:

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

Itu akan menekan tes berikutnya ketika pengguna zabbixmenjadi root(tetapi tidak ada transisi lain). Saya sudah menguji ini dengan sepasang pengguna saya sendiri.

Hapus uid = 0tes di atas jika Anda ingin tetap diam tentang zabbixmenjadi pengguna apa pun, bukan hanya root.

Saya dihapus service in sudotes: berlebihan itu mengingat bahwa baris ini di /etc/pam.d/sudo.

Toby Speight
sumber
1
Terima kasih! Itu yang saya cari. Sempurna! Dan terima kasih atas saran untuk menghapus service in sudo.
inivanoff1
1
Jika Anda juga ingin menghapus [user] : TTY=unknown ; PWD=... ; USER=root ; COMMAND=...baris dari log, Anda dapat menambahkan ini ke file sudoers.d /: Defaults:[user] !logfile, !syslog(ganti [user]jika perlu)
thom_nic
@thom_nic Apa path ke file itu?
not2qubit
File apa pun di bawah /etc/sudoers.d/- Saya lebih suka menggunakan nama pengguna, grup atau aplikasi yang ini berlaku. Lihat sudo.ws/man/1.8.15/sudoers.man.html
thom_nic
@thom_nic Bisakah Anda memposting ini sebagai jawaban yang sedikit lebih berkembang? Saya tidak melihat format yang Anda usulkan di atas. Selain itu saya tidak berpikir ada :di sana. Dan apakah logfileseksplisit atau sesuatu yang harus diganti?
not2qubit
3

Berdasarkan jawaban Toby, saya menemukan cara untuk mengkonfigurasi ini dengan cara yang sedikit berbeda di Debian / Ubuntu. Untuk konteks, lihat:

Jadi Debian / Ubuntu memiliki pam-auth-updateperintah ini dan ketika Anda melihatnya /etc/pam.d/sudoterlihat seperti ini:

#%PAM-1.0

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

dan /etc/pam.d/common-session-noninteractiveterlihat seperti ini:

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

Jadi yakin, saya bisa mengedit salah satu file di atas tetapi jelas ada beberapa "kekuatan yang lebih tinggi" yang bekerja di sini. Bagaimana cara mendapatkan perubahan agar saya bisa bermain baik dengan paket lain yang mungkin ingin menambahkan aturan pam? Terlebih lagi, sepertinya saya tidak bisa hanya menambahkan garis /etc/pam.d/sudodi antara keduanya @includeseperti ini ..

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

Setelah membaca tautan di atas dan juga contoh-contoh lain (lihat /usr/share/pam-configs/unix) saya menemukan ini, di /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

Sessiondan Session-Typemengontrol file mana yang diedit dan Prioritymenentukan urutannya. Setelah menambahkan file itu dan berjalan pam-auth-update, /etc/pam.d/common-session-noninteractiveterlihat seperti ini (di bagian bawah :)

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

... yang kami inginkan karena pam_succeed_ifsaluran kami harus datang sebelumnya session required pam_unix.so. (Baris itu berasal dari /use/share/pam-configs/unixdan memiliki Priority: 256sehingga berakhir di urutan kedua.) Perhatikan juga bahwa saya meninggalkan service = sudopredikat karena common-session-noninteractivemungkin juga termasuk dalam konfigurasi lain di samping sudo.

Dalam kasus saya, saya sudah dikemas kode saya sebagai installer deb jadi saya menambahkan /usr/share/pam-configs/myappfile, dan menambahkan pam-auth-update --packageuntuk saya postinstdan prermskrip dan aku baik untuk pergi!

Peringatan ...

Jika Anda membaca artikel PAMConfigFrameworkSpec yang saya tautkan di atas , itu mendefinisikan Session-Interactive-Onlyopsi, tetapi tidak memiliki cara untuk menentukan hanya aturan non-aktif . Jadi /etc/pam.d/common-sessionitu juga diperbarui . Saya tidak berpikir ada jalan keluarnya. Jika Anda setuju dengan sesi interaktif yang tidak dicatat untuk pengguna tersebut (ini ADA akun layanan, kan?) Maka Anda harus siap!

Bonus: cara juga menghapus output log sudo

Selain session openened|closedbaris yang dipancarkan PAM, catat sudoinformasi tambahan tentang perintah yang dijalankan. Ini terlihat seperti ini:

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

Jika Anda juga ingin menghapusnya, buka tautan ini kemudian lanjutkan di bawah ...

Jadi ... Anda mungkin terbiasa dengan /etc/sudoers.d/___pengaturan tipikal yang mungkin melakukan hal seperti ini untuk akun layanan yang membutuhkan superuser privs untuk beberapa tindakan:

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

yang mungkin masuk /etc/sudoers.d/10_myuser. Nah, antara lain Anda juga bisa menentukanDefaults . Perhatikan secara khusus sintaks ini'Defaults' ':' User_List

Sekarang, lihat bagian PILIHAN SUDOERS . Bit yang menarik termasuk log_input, log_outputtetapi (mungkin) lebih penting, syslogdan logfile. Tampaknya bagi saya bahwa dalam versi terbaru Debian, baik rsyslog atau sudomasuk ke stdoutatau stderrsecara default. Jadi bagi saya ini muncul di jurnal journald untuk layanan saya, dan tidak misalnya di /var/log/auth.logmana tidak akan dicampur ke dalam log aplikasi saya. Untuk menghapus sudo logging, saya menambahkan yang berikut ini /etc/sudoers.d/10_myusersehingga terlihat seperti:

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

YMMV, jika Anda merasa menonaktifkan pencatatan menciptakan masalah dengan audit keamanan Anda mungkin juga mencoba menyelesaikannya melalui filter rsyslog.

thom_nic
sumber
Cara Anda menerapkan hal-hal "sesi dibuka / tutup" tidak berhasil untuk saya. Ada dua alasan: (1) Anda tidak menentukan untuk digunakan success=1, (yang melewatkan klausa berikutnya), dan (2) Karena bagaimana Anda menentukan service = sudo, setiap pekerjaan CRON berjalan, menghasilkan requirement "service = sudo" not met by user "root". (Dan mungkin efek samping lainnya.) Namun, bonus Anda bekerja dengan baik! Terima kasih.
not2qubit
Bagaimana tampilan skrip Anda postinstdan prerm?
not2qubit
@ not2qubit re: success=1- Saya lebih suka tidak melewatkan pam_unixsama sekali. Saya hanya ingin berhenti mencatat output yang [default=ignore]tampaknya berhasil dengan baik tanpa melewatkan pam_unix.
thom_nic
re: cronjobs and service = sudo: Mungkinkah pekerjaan cron Anda berjalan sebagai pengguna unpriv, tetapi Anda tidak menelepon sudosebagai bagian dari pekerjaan cron?
thom_nic
2

Setelah melakukan beberapa pengujian dan penelitian yang menakutkan, saya telah menemukan solusi yang berfungsi untuk Debian Stretch (di Raspberry). Pasti ada lebih dari satu cara untuk mencapai apa yang diminta OP. Tetapi dokumentasi PAM luar biasa, sehingga sebagian besar barang benar-benar TL; DR.

  1. Anda dapat menambahkan filter string khusus untuk rsyslog di: /etc/rsyslog.d/anyname.confdengan menggunakan:
    :msg, contains, "session opened for user root by pi" stop
  2. Anda bisa langsung mengedit /etc/pam.d/sudo
  3. Anda dapat melakukannya dengan cara yang benar dengan membuat file konfigurasi PAM khusus di: /usr/share/pam-configs/
  4. Anda dapat melakukannya dengan membuat file sudoers khusus di:/etc/sudoers.d/020_pi

Saya akan menunjukkan caranya (2) dan (4).

PERINGATAN

Jangan mengedit file apa pun /etc/pam.d/tanpa terlebih dahulu mengubah izin tulis dunia mereka. Jika tidak, dan membuat kesalahan, Anda dapat dikunci dari penggunaan sudo / su di masa mendatang ! Jadi pastikan Anda telah menguji pengaturan baru sebelum Anda mengubahnya kembali. (Default adalah 644 )


Untuk menghilangkan "sesi buka / tutup":

Kami ingin menyingkirkan /var/log/auth.logspam berikut :

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

Melakukan hal ini:

# 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

Apa yang sangat penting di sini, adalah bahwa success=1, berarti melewatkan 1 klausa berikutnya (atau dalam istilah PAM "melompati modul berikutnya dalam tumpukan"), jika berhasil.

Dari man pam.conf:

abaikan - ketika digunakan dengan setumpuk modul, status pengembalian modul tidak akan berkontribusi pada kode pengembalian yang diperoleh aplikasi.

selesai - setara dengan ok dengan efek samping mengakhiri tumpukan modul dan PAM segera kembali ke aplikasi.

N - setara dengan ok dengan efek samping melompati modul N berikutnya dalam tumpukan.

Selanjutnya, reboot dan biarkan beroperasi beberapa jam (misalnya untuk memeriksa tugas cron) untuk menguji apakah ini berfungsi. Kemudian pastikan untuk menginstal kembali izin file, jika tidak Anda akan memiliki lubang keamanan yang menganga di sistem Anda. ( sudo chmod 644 /etc/pam.d/sudo)


Untuk menghilangkan pesan "TTY PWD COMMAND" yang berulang:

Kami juga ingin menyingkirkan pesan seperti ini:

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

Dalam kasus saya, ini dibuat oleh skrip IDS yang menjalankan arp-scan setiap beberapa menit. Untuk menghapusnya agar tidak muncul di log, buat file berikut:

# 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

(Ini xxxadalah nama mesin Anda, dan piadalah nama pengguna.)

not2qubit
sumber
1
> Jangan mengedit file apa pun di /etc/pam.d/ tanpa terlebih dahulu mengubah izin tulis dunia mereka .... Sangat disarankan untuk menjalankan sesi terminal lainnya sebagai root, misalnya. sudo su - Maka Anda tidak harus menetapkan izin berbahaya dan berisiko lupa untuk mengubah kembali.
thom_nic
@ thom_nic Sudahkah Anda menguji ini? Dugaan saya adalah bahwa jika Anda secara tidak sengaja memblokir penggunaan sudo / su di PAM, maka apa pun yang Anda lakukan, akan menghasilkan kesalahan, bahkan di shell root. Jika tidak, maka PAM mungkin tidak berfungsi sebagaimana mestinya.
not2qubit
-2

Kamu akan mendapatkan:

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

dengan jawaban Anda.

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

berfungsi tetapi Anda masih akan mendapatkan:

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

di log Anda.

golfdq
sumber
1
Silakan tentukan: 1. file apa yang Anda edit, 2. siapa "Anda" dan apa yang dipecahkannya.
not2qubit