จะหยุด sudo PAM ข้อความใน auth.log สำหรับผู้ใช้ที่เฉพาะเจาะจงได้อย่างไร


16

ฉันใช้ Zabbix เพื่อตรวจสอบสภาพแวดล้อมของฉันและzabbix_agentdดำเนินการในฐานะผู้ใช้zabbixสคริปต์ที่กำหนดเองหนึ่งครั้งทุก ๆ 60 วินาที; จะใช้ในการเรียกใช้สคริปต์นี้เป็นsudoroot

ใน/var/log/auth.logฉันเห็นทุก ๆ 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 เมื่อมีคนสคริปต์ที่มีฐานะsudoroot

ฉันต้องการหยุดข้อความสำหรับผู้ใช้เท่านั้น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เป็นผู้ใช้แทนที่จะเป็นเพียงผู้ใช้

ฉันออก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

จากคำตอบของ Toby ฉันพบวิธีกำหนดค่านี้ในวิธีที่แตกต่างกันเล็กน้อยใน 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

ดังนั้นแน่นอนฉันสามารถแก้ไขไฟล์ใดไฟล์หนึ่งข้างต้น แต่เห็นได้ชัดว่ามี "พลังงานที่สูงกว่า" ในที่ทำงานที่นี่ จะทำให้การเปลี่ยนแปลงของฉันเล่นกับแพคเกจอื่น ๆ ที่อาจต้องการเพิ่มกฎ pam ได้อย่างไร ดูเหมือนว่าฉันจะไม่สามารถเพิ่มบรรทัด/etc/pam.d/sudoระหว่างสอง@includes เช่นนี้ ..

##### 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 log output ได้อย่างไร

นอกเหนือจากsession openened|closedบรรทัดที่ PAM ปล่อยออกมาแล้วให้sudoบันทึกข้อมูลเพิ่มเติมเกี่ยวกับคำสั่งที่ทำงาน ดูเหมือนว่านี้:

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

หากคุณยังต้องการที่จะลบที่เปิดลิงก์นี้แล้วดำเนินการต่อด้านล่าง ...

ดังนั้น ... คุณอาจคุ้นเคยกับ/etc/sudoers.d/___การตั้งค่าทั่วไปซึ่งอาจทำสิ่งนี้สำหรับบัญชีบริการที่ต้องการ superuser privs สำหรับการกระทำบางอย่าง:

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

/etc/sudoers.d/10_myuserที่อาจจะไปใน เหนือสิ่งอื่นใดคุณยังสามารถระบุDefaultsได้ โปรดทราบว่าไวยากรณ์นี้โดยเฉพาะ'Defaults' ':' User_List

ตอนนี้ดูที่ส่วน sudoers OPTIONS บิตที่น่าสนใจ ได้แก่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 อีกครั้ง: success=1- ฉันไม่อยากข้ามpam_unixเลย ฉันต้องการหยุดการบันทึกผลลัพธ์ที่[default=ignore]ดูเหมือนว่าจะทำได้ดีโดยไม่ต้องข้าม pam_unix
thom_nic

เรื่องcronงานและservice = sudo: เป็นไปได้ไหมที่งาน cron ของคุณกำลังทำงานในฐานะผู้ใช้ที่ไม่ได้รับความช่วยเหลือ แต่คุณไม่ได้โทรติดต่อsudoในฐานะเป็นส่วนหนึ่งของงาน cron
thom_nic

2

หลังจากการทดสอบและการวิจัยที่น่ากลัวฉันพบวิธีแก้ปัญหาสำหรับ Debian Stretch (บน Raspberry) มีมากกว่าหนึ่งวิธีในการบรรลุสิ่งที่ OP ต้องการ แต่เอกสาร 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/โดยไม่ต้องเปลี่ยนการอนุญาตในการเขียนโลกก่อน หากคุณทำไม่ได้และทำผิดพลาดคุณสามารถถูกล็อคไม่ให้ใช้sudo / suในอนาคต! ดังนั้นให้แน่ใจว่าคุณได้ทดสอบการตั้งค่าใหม่ก่อนที่จะเปลี่ยนกลับ (ค่าเริ่มต้นคือ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หมายความว่าจะข้ามประโยค 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 ที่รันarp-scanทุกสองสามนาที หากต้องการลบออกจากการแสดงในบันทึกให้สร้างไฟล์ต่อไปนี้:

# 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 - จากนั้นคุณไม่ต้องตั้งค่าการอนุญาตที่เป็นอันตรายและความเสี่ยงที่ลืมเปลี่ยน มันกลับมา
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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.