Làm cách nào để dừng tin nhắn PAM sudo trong auth.log cho một người dùng cụ thể?


16

Tôi đang sử dụng Zabbix để theo dõi môi trường của mình và zabbix_agentdthực thi như zabbixmột người dùng một tập lệnh tùy chỉnh cứ sau 60 giây; nó sử dụng sudođể chạy tập lệnh này như root.

Trong /var/log/auth.logtôi thấy cứ sau 60 giây:

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

Tôi muốn ngăn chặn tin nhắn này tràn ngập nhật ký của tôi. Tôi đã thêm dòng sau vào /etc/pam.d/sudotập tin, ngay trước khi session required pam_unix.so:

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

và tin nhắn biến mất.

Nhưng vấn đề là cách này tôi đã bị ức chế mỗi tin nhắn PAM khi ai đó đang thực hiện một kịch bản với sudonhư root.

Tôi muốn dừng tin nhắn chỉ dành cho người dùng zabbix(không phải tất cả người dùng khác). sudobiết rằng zabbixngười dùng muốn thực thi tập lệnh với các rootđặc quyền và có cách nào để nói với PAM không? Làm cách nào tôi có thể yêu cầu PAM không đăng nhập cho một người dùng cụ thể khi sử dụng sudo?

Lưu ý : Tôi đã thử lọc các tin nhắn trong syslog; Mặc dù điều này hoạt động, nó có cùng một vấn đề như ở trên, cụ thể là nó quá bừa bãi, vì thông điệp tường trình không cho biết người dùng nào đang trở thành root.


Nó hỗ trợ lọc và với bộ lọc nó hoạt động. Tôi đã thử nó nhưng tôi không thích nó, vì lọc không phải là một cách phổ quát. Một ngày nào đó một số ký tự trong tin nhắn sẽ thay đổi hoặc một cái gì đó sẽ thay đổi và bộ lọc của tôi sẽ thất bại. Tôi đang tìm kiếm một giải pháp với tham số cấu hình, chỉ thị hoặc một cái gì đó tương tự để chắc chắn rằng điều này sẽ bị dừng trong mọi trường hợp. Và thông báo nói session closed for user rootvà nếu tôi lọc nó trong thực tế tôi đang lọc tất cả các tin nhắn. Tôi muốn cho một người dùng cụ thể không được đề cập trong tin nhắn và tôi không thể lọc theo tên của nó ...
inivanoff1

Câu trả lời:


11

Bạn có vẻ khá gần với dòng conf PAM của bạn:

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

Nhìn vào trang hướng dẫn pam_succeed_if, tôi nghĩ bạn muốn kiểm tra xem người dùng yêu cầu ( ruser) có phải không zabbix.

Vì vậy, tôi đề nghị:

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

Điều đó sẽ ngăn chặn thử nghiệm tiếp theo khi người dùng zabbixtrở thành root(nhưng không có chuyển đổi nào khác). Tôi đã thử nghiệm điều này với một cặp người dùng của riêng tôi.

Xóa uid = 0bài kiểm tra ở trên nếu bạn muốn giữ im lặng về việc zabbixtrở thành bất kỳ người dùng nào, thay vì chỉ root.

Tôi đã xóa service in sudobài kiểm tra: dự phòng rằng dòng này nằm trong /etc/pam.d/sudo.


1
Cảm ơn bạn! Đó là những gì tôi đang tìm kiếm. Hoàn hảo! Và cảm ơn cho lời đề nghị để loại bỏ service in sudo.
inivanoff1

1
Nếu bạn cũng muốn xóa [user] : TTY=unknown ; PWD=... ; USER=root ; COMMAND=...dòng khỏi nhật ký, bạn có thể thêm dòng này vào sudoers.d / file: Defaults:[user] !logfile, !syslog(thay thế [user]khi thích hợp)
thom_nic

@thom_nic Đường dẫn đến tập tin đó là gì?
not2qubit

Bất kỳ tệp nào bên dưới /etc/sudoers.d/- Tôi thích sử dụng tên của người dùng, nhóm hoặc ứng dụng mà điều này áp dụng. Xem sudo.ws/man/1.8.15/sudoers.man.html
thom_nic

@thom_nic Bạn có thể vui lòng gửi bài này dưới dạng câu trả lời mở rộng hơn một chút không? Tôi không thấy định dạng bạn đề xuất ở trên. Ngoài ra, tôi không nghĩ rằng có một :trong đó. Và là logfilesrõ ràng hoặc một cái gì đó nên được thay thế?
not2qubit

3

Dựa trên câu trả lời của Toby, tôi đã tìm ra cách cấu hình điều này theo một cách hơi khác trên Debian / Ubuntu. Đối với bối cảnh, xem:

Vì vậy, Debian / Ubuntu có pam-auth-updatelệnh này và khi bạn nhìn vào /etc/pam.d/sudonó trông như thế này:

#%PAM-1.0

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

/etc/pam.d/common-session-noninteractivetrông như thế này:

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

Vì vậy, chắc chắn, tôi có thể chỉnh sửa một trong các tệp trên nhưng rõ ràng có một số "sức mạnh cao hơn" đang hoạt động ở đây. Làm cách nào để các thay đổi của tôi chơi tốt với các gói khác có thể muốn thêm quy tắc pam? Trên hết, có vẻ như tôi không thể thêm một dòng /etc/pam.d/sudoở giữa hai @includecái như thế này ..

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

Sau khi đọc các liên kết ở trên cũng như các ví dụ khác (xem /usr/share/pam-configs/unix) tôi đã nghĩ ra điều này, trong /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

SessionSession-Typekiểm soát tập tin nào được chỉnh sửa và Priorityxác định thứ tự chúng đi vào. Sau khi thêm tệp đó và chạy pam-auth-update, /etc/pam.d/common-session-noninteractivetrông như thế này (ở dưới cùng :)

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

... đó là những gì chúng tôi muốn bởi vì pam_succeed_ifdòng của chúng tôi cần phải đến trước session required pam_unix.so. (Dòng đó xuất phát /use/share/pam-configs/unixvà có một Priority: 256kết thúc thứ hai.) Cũng lưu ý rằng tôi rời service = sudovị ngữ vì common-session-noninteractivecũng có thể được bao gồm trong các cấu hình khác bên cạnh sudo.

Trong trường hợp của tôi, tôi đã đóng gói mã của tôi như một trình cài đặt .deb vì vậy tôi thêm vào /usr/share/pam-configs/myapptập tin, và bổ sung pam-auth-update --packageđể tôi postinstprermcác kịch bản và tôi là tốt để đi!

Hãy cẩn thận ...

Nếu bạn đọc bài viết PAMConfigFrameworkSpec mà tôi đã liên kết ở trên , nó sẽ xác định một Session-Interactive-Onlytùy chọn, nhưng không có cách nào để chỉ định các quy tắc không tương tác . Thế /etc/pam.d/common-sessioncũng được cập nhật . Tôi không nghĩ có cách nào khác. Nếu bạn ổn với các phiên tương tác không được đăng nhập cho người dùng đó (đó là tài khoản dịch vụ, phải không?) Thì bạn đã sẵn sàng!

Phần thưởng: làm thế nào để loại bỏ đầu ra nhật ký sudo

Ngoài các session openened|closeddòng mà PAM phát ra, sudoghi nhật ký thông tin bổ sung về lệnh đang chạy. Nó trông như thế này:

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

Nếu bạn cũng muốn xóa cái đó, hãy mở liên kết này rồi tiếp tục bên dưới ...

Vì vậy, ... bạn có thể quen thuộc với /etc/sudoers.d/___thiết lập thông thường có thể làm một cái gì đó như thế này cho một tài khoản dịch vụ cần các siêu nhân riêng tư cho một số hành động:

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

mà có thể đi vào /etc/sudoers.d/10_myuser. Vâng, trong số những thứ khác bạn cũng có thể chỉ địnhDefaults . Lưu ý cụ thể cú pháp này'Defaults' ':' User_List

Bây giờ, hãy xem phần TÙY CHỌN SUDOERS . Các bit thú vị bao gồm log_input, log_outputnhưng (có lẽ) quan trọng hơn, sysloglogfile. Theo tôi, trong các phiên bản gần đây của Debian, rsyslog hoặc sudođăng nhập stdouthoặc stderrtheo mặc định. Vì vậy, đối với tôi, điều này đã được hiển thị trong nhật ký tạp chí cho dịch vụ của tôi, và không phải là /var/log/auth.lognơi mà nó sẽ không bị lẫn vào nhật ký ứng dụng của tôi. Để xóa nhật ký sudo, tôi đã thêm vào /etc/sudoers.d/10_myusernhư sau:

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

YMMV, nếu bạn cảm thấy việc vô hiệu hóa ghi nhật ký sẽ tạo ra sự cố với kiểm toán bảo mật, bạn cũng có thể cố gắng giải quyết vấn đề này thông qua các bộ lọc rsyslog.


Cách bạn triển khai công cụ "phiên mở / đóng" không hiệu quả với tôi. Có hai lý do: (1) Bạn không chỉ định sử dụng success=1, (bỏ qua mệnh đề tiếp theo) và (2) Vì cách bạn đã chỉ định service = sudo, mọi công việc CRON đang chạy đều dẫn đến requirement "service = sudo" not met by user "root". (Và có thể các tác dụng phụ khác.) Tuy nhiên, phần thưởng của bạn hoạt động rất tốt! Cảm ơn bạn.
not2qubit

Làm thế nào để bạn postinstprermkịch bản trông?
not2qubit

@ not2qubit re: success=1- Tôi không muốn bỏ qua pam_unixhoàn toàn. Tôi chỉ muốn dừng đăng nhập đầu ra mà [default=ignore]dường như chỉ đạt được tốt mà không bỏ qua pam_unix.
thom_nic

re: cronjobs và service = sudo: Có thể các công việc cron của bạn đang chạy như một người dùng không thành công, nhưng bạn không gọi sudonhư là một phần của công việc cron?
thom_nic

2

Sau khá nhiều thử nghiệm và nghiên cứu đáng sợ, tôi đã tìm ra giải pháp hiệu quả cho Debian Stretch (trên Raspberry). Chắc chắn có nhiều hơn một cách để thực hiện những gì OP yêu cầu. Nhưng tài liệu PAM là quá nhiều, vì vậy hầu hết mọi thứ thực sự là TL; DR.

  1. Bạn có thể thêm bộ lọc chuỗi tùy chỉnh cho rsyslog trong: /etc/rsyslog.d/anyname.confbằng cách sử dụng:
    :msg, contains, "session opened for user root by pi" stop
  2. Bạn có thể trực tiếp chỉnh sửa /etc/pam.d/sudo
  3. Bạn có thể thực hiện đúng cách bằng cách tạo tệp cấu hình PAM tùy chỉnh trong: /usr/share/pam-configs/
  4. Bạn có thể thực hiện một số bằng cách tạo tệp sudoers tùy chỉnh trong:/etc/sudoers.d/020_pi

Tôi sẽ chỉ cho bạn cách làm (2) và (4).

CẢNH BÁO

Không chỉnh sửa bất kỳ tập tin nào /etc/pam.d/mà không thay đổi quyền ghi thế giới của chúng trước tiên. Nếu bạn không và mắc lỗi, bạn có thể bị khóa khỏi bất kỳ việc sử dụng sudo / su nào trong tương lai ! Vì vậy, hãy chắc chắn rằng bạn đã kiểm tra các cài đặt mới trước khi thay đổi lại. (Mặc định là 644 )


Để thoát khỏi "phiên mở / đóng":

Chúng tôi muốn loại bỏ các /var/log/auth.logthư rác sau :

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

Làm cái này:

# 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

Điều quan trọng ở đây là success=1, có nghĩa là bỏ qua mệnh đề 1 tiếp theo (hoặc trong biệt ngữ PAM "nhảy qua mô-đun tiếp theo trong ngăn xếp"), nếu thành công.

Từ man pam.conf:

bỏ qua - khi được sử dụng với một chồng các mô-đun, trạng thái trả về của mô-đun sẽ không đóng góp vào mã trả về mà ứng dụng có được.

xong - tương đương với ok với tác dụng phụ là chấm dứt ngăn xếp mô-đun và PAM ngay lập tức trở lại ứng dụng.

N - tương đương với ok với hiệu ứng phụ của việc nhảy qua các mô-đun N tiếp theo trong ngăn xếp.

Tiếp theo, khởi động lại và để nó chạy một vài giờ (ví dụ để kiểm tra các công việc định kỳ) để kiểm tra xem cái này có hoạt động không. Sau đó, hãy đảm bảo kích hoạt lại các quyền của tệp, nếu không, bạn sẽ có một lỗ hổng bảo mật trong hệ thống của mình. ( sudo chmod 644 /etc/pam.d/sudo)


Để thoát khỏi các tin nhắn "TTY PWD" lặp đi lặp lại:

Chúng tôi cũng muốn loại bỏ các tin nhắn như thế này:

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

Trong trường hợp của tôi, điều này được tạo bởi một tập lệnh IDS đang chạy arp-scan cứ sau vài phút. Để loại bỏ nó khỏi hiển thị trong nhật ký, tạo tệp sau:

# 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

(Đây xxxlà tên máy của bạn và pilà tên người dùng.)


1
> Không chỉnh sửa bất kỳ tệp nào trong /etc/pam.d/ mà không thay đổi quyền ghi thế giới đầu tiên của họ .... Rất khuyến nghị chạy phiên cuối khác với quyền root, ví dụ: sudo su - Sau đó, bạn không phải đặt quyền nguy hiểm và quên rủi ro thay đổi nó trở lại
thom_nic

@thom_nic Bạn đã thử nghiệm điều này? Tôi đoán là nếu bạn vô tình chặn sử dụng sudo / su trong PAM, thì bất kể bạn làm gì, sẽ tạo ra lỗi, ngay cả trong vỏ gốc. Nếu không, PAM có thể không hoạt động như bình thường.
not2qubit

-2

Bạn sẽ nhận được:

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

với câu trả lời của bạn

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

hoạt động nhưng bạn vẫn sẽ nhận được:

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

trong nhật ký của bạn.


1
Vui lòng xác định: 1. tập tin bạn đang chỉnh sửa, 2. "bạn" là ai và giải pháp của nó.
not2qubit
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.