Làm thế nào để luôn luôn thực thi mật khẩu sudo cho lệnh cụ thể?


12

Hôm trước tôi đang thực hiện một số nhiệm vụ bảo trì trên máy chủ web của mình. Tôi đã vội vàng và buồn ngủ, vì vậy tôi đã làm mọi thứ bằng cách sử dụng sudolệnh.

Và sau đó, tôi vô tình nhấn Ctrl+ V, gửi lệnh này đến máy chủ web của mình:

sudo rm -rf /*

Đối với những người thắc mắc lệnh trên làm gì: Điều này đã xóa toàn bộ máy chủ web của tôi

May mắn thay, tôi đã có bản sao lưu và thật đáng buồn, tôi đã phải mất thêm hai giờ để tỉnh táo để sửa lỗi tuyệt vời này. Nhưng kể từ đó, tôi đã tự hỏi:

Có cách nào để luôn thực thi mật khẩu sudo cho lệnh cụ thể không?

Nếu máy chủ hỏi tôi mật khẩu, tôi sẽ tự cứu mình khỏi nhiều rắc rối. Không, bởi vì tôi đã chạy khoảng 5 sudolệnh trước lỗi nghiêm trọng này.

Vì vậy, có cách nào để làm điều đó? Tôi chỉ cần mật khẩu với rmlệnh để luôn luôn được thi hành. Các lệnh khác tôi đang sử dụng thường nanohoặc cpcả hai đều (ở một mức độ nào đó) có thể hoàn nguyên.



2
@solsTiCe /*được mở rộng trước khi nó được chuyển đến lệnh rm. Vì vậy, lệnh không nhìn thấy một đối số duy nhất, nhưng một danh sách các đối số ( /bin /boot /cdrom /dev /etc /home...)
Dan

3
Một bài học quan trọng để tránh xa điều này là bạn không nên chạy mọi thứ với sudo trừ khi bạn thực sự cần. Tôi biết điều đó không trả lời những gì bạn đã hỏi ở đây, nhưng câu hỏi bao quát là làm thế nào (hy vọng) ngăn bạn khỏi xóa máy chủ của bạn một lần nữa và tránh sudo nên là biện pháp bảo vệ đầu tiên của bạn chống lại điều đó.
David Z


2
@ WinEunuuchs2Unix Đó hoàn toàn không phải là một câu hỏi trùng lặp, op ở đây không muốn rmlệnh có mật khẩu. Họ chỉ muốn sudonhắc cho mỗi lần lệnh rm được sử dụng. Giải pháp cho câu hỏi bạn liên kết sẽ trở nên hơi khó chịu khi lệnh đầu tiên của bạn là sudo rm. Vì nó sẽ yêu cầu bạn cho hai mật khẩu, một cho sudomột cho rm.
Dân

Câu trả lời:


17

Bạn có thể thiết lập timestamp_timeoutđể 0cho các lệnh đặc biệt trong /etc/sudoers. Tạo một tệp visudo -f /etc/sudoers.d/pduckcó nội dung sau:

Cmnd_Alias DANGEROUS = /bin/rm

Defaults!DANGEROUS timestamp_timeout=0

pduck ALL = (ALL:ALL) DANGEROUS

Bây giờ người dùng pduckluôn được yêu cầu nhập mật khẩu khi chạy sudo rm(bất kể tham số bổ sung nào được đưa ra) mặc dù người dùng là thành viên của sudonhóm và sudoghi nhớ mật khẩu của mình cho các lệnh khác.

Nhược điểm là bạn không thể dễ dàng thêm các tham số vào /bin/rmdòng trong tệp để hạn chế hơn nữa điều này. Vâng, bạn có thể, như:

Cmnd_Alias DANGEROUS = /bin/rm -f

nhưng sau đó bạn chỉ được nhắc chính xác sudo rm -fvà không (một lần nữa) sudo rm -rfchẳng hạn.


9

Một phương pháp sẽ là sử dụng safe-rm . Điều này sẽ CHỈ sử dụng "rm" và ngăn các phiên bản cụ thể của "rm" được chạy. Điều đó bao gồm loại bỏ hệ thống gốc của bạn nhưng cũng có thể được sử dụng để ngăn chặn việc xóa các thư mục liên quan đến hệ thống như "/ usr /" hoặc "/ var /". Từ liên kết:

Hồi sinh việc vô tình xóa các tập tin quan trọng

Safe-rm là một công cụ an toàn nhằm ngăn chặn việc vô tình xóa các tệp quan trọng bằng cách thay thế /bin/rmbằng một trình bao bọc, kiểm tra các đối số đã cho đối với danh sách đen các tệp và thư mục có thể định cấu hình không bao giờ bị xóa.

Người dùng cố gắng xóa một trong những tệp hoặc thư mục được bảo vệ này sẽ không thể làm như vậy và sẽ được hiển thị một thông báo cảnh báo thay thế:

$ rm -rf /usr   
Skipping /usr

(Đường dẫn được bảo vệ có thể được đặt cả ở cấp độ trang web và người dùng.)

Khôi phục các tệp quan trọng bạn đã xóa do nhầm lẫn có thể khá khó khăn. Hãy tự bảo vệ mình ngay hôm nay bằng cách cài đặt safe-rm và giảm khả năng bạn sẽ cần liên hệ với dịch vụ khôi phục dữ liệu!

nhập mô tả hình ảnh ở đây


Được nâng cấp cho safecow
Michael Fulton

3

sudocung cấp một tùy chọn -k, --reset-timestamp, xem man sudo:

Khi được sử dụng cùng với một lệnh hoặc một tùy chọn có thể yêu cầu mật khẩu, tùy chọn này sẽ khiến sudo bỏ qua thông tin đăng nhập được lưu trong bộ nhớ cache của người dùng. Do đó, sudo sẽ nhắc nhập mật khẩu (nếu chính sách bảo mật được yêu cầu) và sẽ không cập nhật thông tin đăng nhập được lưu trong bộ nhớ cache của người dùng.

Bạn có thể viết một trình bao bọc đơn giản để sudokiểm tra rm -rf /*và chạy

sudo -k rm -rf /*

thay vào đó, ví dụ như thế này:

sudo ()                                                                                                                                                 
{ 
    [[ "$*" == "rm -rf /*" ]] && opt="-k";
    /usr/bin/sudo $opt "$@"
}

Ví dụ sử dụng

Thử nghiệm với echo ađây.

$ sudo echo
[sudo] password for dessert: 

$ sudo echo

$ sudo echo a
[sudo] password for dessert: 
a
$ sudo echo a
[sudo] password for dessert: 
a

Nếu bạn muốn được hỏi mỗi khi bạn chạy rmnói chung, bạn có thể điều chỉnh chức năng trên như sau:

sudo () 
{ 
    [[ "$1" == "rm" ]] && opt="-k";
    /usr/bin/sudo $opt "$@"
}

Nếu bạn muốn kết hợp cả các lệnh gọi chung và các dòng lệnh cụ thể tôi khuyên bạn nên sử dụng case, ví dụ:

sudo () 
{ 
    case "$*" in 
        rm*)            opt="-k" ;;
        "mv /home"*)    opt="-k" ;;
        "ln -s /usr/bin/fish /bin/sh") opt="-k" && echo "Don't you dare!" ;;
        *)              opt="" ;;
    esac;
    /usr/bin/sudo $opt "$@"
}

Lưu ý rằng các phương pháp này sẽ không làm việc nếu bạn chạy sudovới các tùy chọn - giải pháp khả thi là [[ "$*" =~ " rm " ]]để kiểm tra chuỗi “rm” bao quanh bởi không gian hay *" rm "*)với caseđể đón bất kỳ dòng lệnh có chứa “rm”.


[[ "$1" == "rm" ]] && opt="-k";và làm thế nào về /bin/rm?
Rinzwind

@Rinzwind Tôi nghĩ rằng chức năng này dễ dàng thích ứng với các nhu cầu cụ thể, đặc biệt là casecách tiếp cận.
tráng miệng

1

Câu trả lời này không giải quyết được sudophần câu hỏi của bạn, nhưng mặt khác, nó giải quyết một cách để giảm thiểu nguy cơ của những rmlời mời vô tình cho bất kỳ người dùng nào .

Bạn có thể bí danh rmđể rm -I

  • yêu cầu xác nhận ngay khi nó sẽ xóa một thư mục hoặc nhiều hơn 3 tệp
  • miễn là bạn bỏ qua-f những gì ghi đè các -Itùy chọn trước đó .

--one-file-systemlà một biện pháp bảo vệ có thể khác chống lại việc xóa ngoài ý muốn mà tôi sử dụng trong rmbí danh của mình .

Thiết lập

Để tạo bí danh như vậy, sử dụng lệnh:

alias rm='rm -I --one-file-system'

Bạn có thể đặt nó vào ~/.bashrchoặc thậm chí /etc/bash.bashrc.

Sử dụng

$ sudo rm -r /etc/apt/sources.list.d /*
rm: remove all arguments?

Để xác nhận loại yeshoặc bản dịch của nó vào ngôn ngữ của bạn hoặc chữ cái đầu tiên của từ và nhấn Enter. Bất kỳ đầu vào nào khác bao gồm cả không hủy bỏ hoạt động.

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.