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-update
lệnh này và khi bạn nhìn vào /etc/pam.d/sudo
nó 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-noninteractive
trô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 @include
cá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
Session
và Session-Type
kiểm soát tập tin nào được chỉnh sửa và Priority
xá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-noninteractive
trô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_if
dò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/unix
và có một Priority: 256
kết thúc thứ hai.) Cũng lưu ý rằng tôi rời service = sudo
vị ngữ vì common-session-noninteractive
cũ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/myapp
tập tin, và bổ sung pam-auth-update --package
để tôi postinst
và prerm
cá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-Only
tù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-session
là 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|closed
dòng mà PAM phát ra, sudo
ghi 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_output
nhưng (có lẽ) quan trọng hơn, syslog
và logfile
. Theo tôi, trong các phiên bản gần đây của Debian, rsyslog hoặc sudo
đăng nhập stdout
hoặc stderr
theo 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.log
nơ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_myuser
như 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 root
và 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ó ...