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
và /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
Sessionvà Session-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 postinstvà prermcá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-sessionlà cũ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, syslogvà logfile. 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.
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ó ...