Rõ ràng, sudo
sẽ là lựa chọn đầu tiên cho tôi trong trường hợp như vậy. Các xuất hiện điểm lớn là hầu hết các quản trị viên (thực tế) không thực sự sử dụng /etc/sudoers
đến mức độ có thể tối đa của nó ( User_Alias
, Runas_Alias
, Host_Alias
, Cmnd_Alias
).
Hầu hết các quản trị viên cuối cùng chỉ sử dụng một số quy tắc hiện có và thêm người dùng hoặc tệ hơn là chỉ cần thêm người dùng vào sudo
nhóm mà quy tắc thường tồn tại trên các thiết lập Ubuntu ( %sudo
...). Điều này, tất nhiên, cung cấp cho người dùng tương ứng trị vì miễn phí và toàn bộ sức mạnh của tài khoản superuser.
Đưa ra nhận xét của bạn:
vì vậy tôi đã thêm chúng vào /etc/sudoers
Tôi nghĩ bạn cũng không sử dụng nó đến mức có thể.
Trong một kịch bản như của bạn, tôi thực sự sẽ kịch bản một vài hành động mà Bob sẽ bị hạn chế. Thực tế đây là những gì tôi đã làm trên một máy chủ mà tôi duy trì, để cho phép hai người dùng cụ thể khởi động lại một khách KVM cụ thể trên máy chủ. Các tập lệnh sẽ chứa một hashbang có đường dẫn tuyệt đối đến trình thông dịch (ví dụ #!/bin/dash
thay vì #!/usr/bin/env bash
) và có thể chạy với trình bao được sử dụng ở nơi khác cho các tác vụ đặc quyền ( /bin/dash
hoặc /bin/sh
). Đó chỉ là những biện pháp phòng ngừa. Ngoài ra, tôi sẽ đảm bảo mã hóa tất cả các đường dẫn tuyệt đối đến nhị phân và sử dụng càng ít càng tốt. Ví dụ: khi sử dụng bash
/ dash
tôi thích builtin
s hơn command
s (xem man bash
). Bạn có thể làm cho điều này có thể duy trì bằng cách chỉ định một biến là đường dẫn tuyệt đối và tham chiếu đến chương trình dựa trên biến đó ($VIRSH
thay vì /usr/bin/virsh
). Nếu bạn có thể, hãy kiểm tra mã của bất kỳ tập lệnh bên ngoài nào trước khi gọi chúng. Đặc biệt nếu bạn cần gọi họ trong một bối cảnh đặc quyền. Trong trường hợp của tôi, tôi cũng giới hạn người dùng vào một thư mục gốc cụ thể và một hệ thống con SSH cụ thể vì họ chỉ kết nối với máy thông qua sshd
và xác thực khóa chung. Rõ ràng là bạn không cần điều đó.
Hãy chắc chắn để chown root: <the-script>; chmod u=rw,a=,a+rx <the-script>
ngăn chặn bất cứ ai nhưng root
thích hợp để mày mò với nó. Cũng phải cẩn thận với setuid
và setgid
bit nhị phân kích hoạt trên mục tiêu ( find
có thể được sử dụng để phát hiện ra chúng). Hãy giả sử cho thời điểm mà kịch bản của bạn cư trú /usr/sbin/priv-action
.
Bây giờ chỉnh sửa của bạn /etc/sudoers
. noexec
có thể được sử dụng để ngăn chặn các nhị phân khác ngoài những thứ được cho phép rõ ràng là tốt. Thực tế có rất nhiều cài đặt bổ sung, không chỉ những cài đặt mà tôi đang mô tả ở đây. Vì vậy, hãy chắc chắn để tham khảo ý kiến man sudoers
.
Bây giờ tôi thích đặt tên người dùng ( User_Alias
) trong sudoers
tệp của mình , nhưng bạn cũng có thể sử dụng một Group_Alias
( man sudoers
) hoặc một nhóm hệ thống thực tế (ví dụ %sudo
):
# The list is comma-separated: bob,alice,...
User_Alias LIMITED_ADMINS=bob
và sau đó thêm một bí danh lệnh để cho phép thực thi tập lệnh cụ thể đó:
# The list is comma-separated: /usr/sbin/priv-action,/bin/bash,...
Cmnd_Alias PRIV_ACTION=/usr/sbin/priv-action
Cuối cùng nhưng không kém phần quan trọng là dòng ma thuật cho phép bob
(hay đúng hơn là người dùng được liệt kê bên dưới LIMITED_ADMINS
) thực thi các lệnh đặc quyền thông qua tập lệnh:
LIMITED_ADMINS ALL=(root) PRIV_ACTION
Không giống như các định nghĩa bí danh trước đó, dòng yêu cầu một lời giải thích. Vì vậy, trước tiên hãy đi sâu vào các phần trên dòng "Thông số người dùng". Ở đây man sudoers
giúp:
Cấu trúc cơ bản của một đặc tả người dùng là who where = (as_whom) what
.
Dòng ví dụ (được tìm thấy trên hầu hết các thiết lập Ubuntu):
root ALL=(ALL) ALL
Điều này nói rằng một người dùng có tên root
(sử dụng #0
để buộc nó vào UID 0
), trên tất cả các máy chủ, có thể chạy trong bất kỳ bối cảnh người dùng nào nhưng sẽ được yêu cầu nhập mật khẩu (giả sử hành vi mặc định). Thêm NOPASSWD
thẻ trước cuối cùng ALL
sau đó cũng sẽ cho phép root
thực hiện tương tự mà không cần yêu cầu mật khẩu (như vậy root ALL=(ALL) NOPASSWD:ALL
:). ALL
là một bí danh ký tự đại diện cho các loại bí danh khác nhau.
Nhưng trở lại với Bob:
LIMITED_ADMINS ALL=(root) PRIV_ACTION
sẽ cho phép bob
và các thành viên được liệt kê khác của User_Alias LIMITED_ADMINS
chạy (trên tất cả các máy chủ, đó là những gì ALL
dành cho) như người dùng root
(nhóm ngụ ý, nhưng có thể được đưa ra, xem man sudoers
) các lệnh được đưa ra trong Cmnd_Alias PRIV_ACTION
. Nó trở nên tốt hơn. Vẫn giả sử bạn viết tập lệnh này, bạn có thể cho phép các tham số khác nhau, do đó tránh viết nhiều tập lệnh. /etc/sudoers
sẵn sàng lấy các ký tự đại diện giống như vỏ sò để hạn chế khả năng tranh luận được phép thông qua.
Tôi luôn thấy rằng các quản trị viên không sử dụng sudoers
cách sử dụng nó, đó là lý do tại sao tôi đánh giá cao "Hack" tương ứng từ hai cuốn sách "Linux Server Hacks" và "Linux Server Hacks Volume Two", điều đó đã giúp tôi bắt đầu sử dụng tinh vi hơn của cơ sở tuyệt vời này.
Bạn có thể đưa ra tất cả các loại phức tạp - có thể không chính xác giúp khía cạnh bảo mật - giải pháp cho trường hợp cụ thể của bạn, nhưng một khi bạn nói được từ vựng cơ bản của /etc/sudoers
bạn có thể thực hiện những chiến công kỳ diệu :)
Lưu ý: hãy nhớ rằng bạn cũng có thể tạo một tệp mới bên dưới /etc/sudoers.d/
nếu bạn cảm thấy quá nghiêng. Điều này giả sử bạn /etc/sudoers
chứa dòng:
#includedir /etc/sudoers.d