Điều này có thể không thực sự là về rm
lệnh, vì có nhiều cách dễ dàng để xóa các tệp mà không cần sử dụng nó . Nếu vấn đề là bạn bè của bạn vô tình sử dụng sai rm
lệnh, thì các giải pháp hạn chế sử dụng lệnh đó một cách cụ thể hoặc khiến nó hoạt động theo cách khác có thể giúp ích. Ngược lại, nếu vấn đề là bạn bè của bạn đang cố tình xử lý dữ liệu của bạn theo cách bạn không muốn, thì bạn cần thực hiện các biện pháp bảo mật thực tế và không có giải pháp nào tập trung vào rm
chính lệnh (hoặc bất kỳ nhóm lệnh rời rạc nào) sẽ giữ cho bạn an toàn.
Bạn có cần kiểm soát truy cập, hoặc chỉ ngăn ngừa những sai lầm trung thực?
Giả sử bạn bè của bạn biết bạn không muốn họ xóa các tệp của bạn, có hai khả năng:
Họ có thể làm điều đó trên mục đích. Trong trường hợp này, bạn bè của bạn đang cố tình xóa các tệp của bạn và thậm chí bạn không thể tin tưởng họ để cố gắng tuân theo mong muốn của bạn về cách họ xử lý dữ liệu của bạn khi họ sử dụng máy tính của bạn. Giải pháp duy nhất cho vấn đề này là sử dụng một biện pháp bảo mật hiệu quả thực tế , như Thomas Ward đã giải thích chi tiết . Thường thì biện pháp tốt nhất như vậy là ngăn không cho họ sử dụng máy tính của bạn. Nhưng làm cho họ sử dụng tài khoản người dùng của riêng họ có thể cung cấp một số bảo vệ.
Họ có thể làm điều đó do nhầm lẫn. Trong trường hợp này, bạn bè của bạn rất dễ bị tai nạn và họ tiếp tục chạyrm
các lệnh họ muốn họ đã không làm. Họ muốn đối xử với bạn và dữ liệu của bạn một cách tôn trọng, nhưng thực tế lại rất tệ trong thực tế vì họ cứ chạy sai lệnh, xóa tệp sai ... hoặc đại loại như thế. Mặc dù thật tuyệt khi tin rằng đây là những gì đang xảy ra, tôi cảnh báo bạn không nên cho rằng những người tiếp tục xóa dữ liệu của bạn sau khi bạn bảo họ dừng hoạt động mà không có ý chí xấu.
Hơn nữa, ngay cả khi ý định của họ là tốt, việc cung cấp cho họ các tài khoản người dùng riêng biệt vẫn là cách dễ dàng nhất để ngăn họ xóa các tệp của bạn, ngoài việc không cho phép họ sử dụng máy tính của bạn.
Nếu tình huống thực sự là # 2 - bạn bè của bạn không cố xóa các tệp của bạn mà chỉ cần trợ giúp không vô tình xóa chúng và cách duy nhất họ vô tình xóa chúng là thông qua việc sử dụng sai một số lượng nhỏ các lệnh (như rm
) rằng họ gặp rắc rối đặc biệt khi sử dụng một cách chính xác - thì các kỹ thuật trong câu trả lời của Videonauth có thể được sử dụng. Nhưng bạn phải hiểu rằng họ không phải là biện pháp an ninh, bởi vì các rm
lệnh chỉ là một trong nhiều cách dễ dàng để xóa các tập tin . Xem bên dưới để biết chi tiết.
Tôi khuyên bạn nên tự hỏi: "Về cơ bản, tình huống của tôi có giống như tôi, hơn là những người khác sử dụng máy tính của tôi, là người sử dụng rm
không đúng cách?"
Nếu câu trả lời là không , thì đây là vấn đề bảo mật thông tin và bạn cần ngăn bạn bè sử dụng tài khoản người dùng của mình. Nếu câu trả lời là có , thì bạn có thể sử dụng các phương pháp tương tự mà bạn sử dụng nếu bạn là người lạm dụng rm
:
- Giáo dục. Bạn bè của bạn cần biết họ đang làm gì và làm thế nào để tránh điều đó.
- Giao diện thay đổi. Không lấy đi khả năng thực sự để xóa các tệp (yêu cầu các tài khoản người dùng riêng biệt), bạn có thể vô tình xóa các tệp bằng cách làm cho nó tự chạy , mà không cần thực hiện thêm bất kỳ hành động nào, sẽ không xóa ngay lập tức . Câu trả lời của Videonauth đưa ra một cách tiếp cận này. Trong câu trả lời này, tôi trình bày khác.
rm file
file
Nhưng ngay cả khi bạn bè của bạn không cố làm gì sai, bạn vẫn nên xem xét việc họ sử dụng tài khoản người dùng riêng của họ . Điều này vẫn sẽ giải quyết vấn đề - các biện pháp bảo mật tương tự bảo vệ dữ liệu khỏi sự phá hủy có chủ ý cũng sẽ bảo vệ nó khỏi sự phá hủy không chủ ý. Ngay cả khi không có mục đích xấu, nếu ai đó tiếp tục làm điều gì đó mà bạn không muốn họ làm, thì bạn không thể tin tưởng họ sẽ không làm điều đó.
Làm cho rm
kịp thời trước khi xóa có thể giúp ngăn ngừa một số sai lầm.
Để giúp mọi người tránh vô tình xóa các tệp với rm
, bạn có thể tạo rm
một bí danh shell thực sự chạy rm -i
. Truyền -i
cờ để rm
khiến nó nhắc người dùng trước khi xóa từng tệp (xem man rm
).
Bạn có thể làm điều này (cho tài khoản người dùng của bạn) bằng cách thêm alias rm='rm -i'
vào tệp .bash_aliases
hoặc .bashrc
tệp của bạn . Xem câu hỏi này và một trong những chi tiết. Điều này sẽ có hiệu lực cho vỏ bash mới mở của bạn.
Điều này không cung cấp bảo mật thực tế và cũng không thể ngăn chặn được các lỗi, bởi vì:
- Họ có thể chọn đi trước với việc xóa, khi được nhắc.
- Họ có thể bỏ qua bí danh theo nhiều cách, bao gồm bằng cách chạy
/bin/rm
hoặc không định nghĩa nó ( unalias rm
).
- Có nhiều tình huống mở rộng bí danh không xảy ra , và trong những tình huống
rm
này sẽ không được chạy cùng -i
.
- Họ vẫn có thể xóa các tệp bằng cách sử dụng bất kỳ kỹ thuật nào để thực hiện mà không yêu cầu
rm
(như trường hợp của phương pháp của Videonauth - xem bên dưới).
- Họ vẫn có thể làm hỏng dữ liệu mà không xóa bất kỳ tệp nào, chẳng hạn như ghi đè lên chúng hoặc thay đổi nội dung của chúng (như trường hợp của phương pháp của Videonauth).
Nhưng nếu bạn không cần bảo mật thực tế (xem bên trên), thì đây có thể là cách để đi. Khi so sánh với phương pháp ngăn bạn bè của bạn sử dụng lệnh do hệ thống cung cấp rm
:
Aliasing rm
để rm -i
là kém hiệu quả trong việc ngăn ngừa sai lầm - cho đến khi họ chuyển sang sử dụng một số kỹ thuật khác để tìm các file. Vào thời điểm đó, việc ngăn không cho họ sử dụng rm
sẽ hoàn toàn không hiệu quả, ngay cả khi họ không cố làm gì sai, vì có lẽ họ sẽ sử dụng unlink
(hoặc bất kỳ lệnh nào trong số vô số các lệnh khác để xóa tệp) với sự thiếu suy nghĩ như nhau.
Mặt khác, vì việc mở rộng bí danh chỉ xảy ra trong một số trường hợp - đại khái là việc sử dụng vỏ tương tác thông thường - bạn bè của bạn có thể nghĩ rằng họ sẽ được nhắc khi họ không thực sự được nhắc (vì lệnh được đưa vào một tập lệnh, ví dụ, hoặc được ban hành từ một trình bao khác). Cách của Videonauth không có vấn đề này, đó là một lợi thế khách quan của phương pháp đó alias rm='rm -i'
.
Khi một tập lệnh chạy, trừ khi nó được viết có chủ ý để sử dụng các bí danh, các bí danh của bạn không được mở rộng trong nó. Điều này có nghĩa rằng răng cưa rm
để rm -i
là rất khó có thể phá vỡ bất cứ điều gì. Đây là một lợi thế khách quan của alias rm='rm -i'
.
rm
không thể làm bất cứ điều gì chương trình hoàn toàn bình thường khác không thể làm.
Thực sự không có gì đặc biệt rm
. Đây là một cách thuận tiện và tự ghi lại để xóa các tệp, vì vậy hạn chế quyền truy cập vào nó có nguy cơ phá vỡ nhiều tập lệnh dựa vào nó. Nhưng đó là cách duy nhất để xóa các tập tin - đó chỉ là một chương trình thông thường.
Một vài lệnh thực hiện một số tác vụ mà người dùng hạn chế (không phải root ) không thể thực hiện mà không chạy chúng. Ví dụ: sudo
cho phép bạn chạy các chương trình với tư cách người dùng khác, sau khi kiểm tra để đảm bảo bạn được phép làm như vậy. passwd
chỉnh sửa cơ sở dữ liệu nơi mật khẩu của người dùng được lưu trữ, nhưng chỉ cho phép bạn thay đổi mật khẩu của riêng mình (trừ khi bạn root, trong trường hợp đó bạn có thể thay đổi mật khẩu của bất kỳ ai).
/usr/bin/sudo
và /usr/bin/passwd
có thể làm điều đó bởi vì chúng có tập bit setuid , như được hiển thị bởi cột s
xuất hiện ở cột ngoài cùng bên trái khi bạn chạy ls -l
:
ek@Io:~$ type -a sudo passwd rm
sudo is /usr/bin/sudo
passwd is /usr/bin/passwd
rm is /bin/rm
ek@Io:~$ ls -l /usr/bin/sudo /usr/bin/passwd /bin/rm
-rwxr-xr-x 1 root root 60272 Feb 18 2016 /bin/rm
-rwsr-xr-x 1 root root 54256 Mar 29 2016 /usr/bin/passwd
-rwsr-xr-x 1 root root 136808 Aug 17 09:20 /usr/bin/sudo
Lưu ý rằng /bin/rm
không có s
: quyền của nó là -rwxr-xr-x
, trong khi /usr/bin/passwd
và /usr/bin/so
có -rwsr-xr-x
thay vào đó. Điều này làm cho nó sao cho, bất kể ai chạy passwd
hay sudo
, nó thực sự chạy như người dùng root, vì root là chủ sở hữu của tệp thực thi. (Ngoài ra còn có một bit setgid, khi được đặt sẽ khiến các tệp thực thi chạy với danh tính nhóm của chủ sở hữu nhóm của chúng chứ không phải của người gọi.)
Ngoại trừ mọi lỗ hổng bảo mật chưa được phát hiện (hoặc đã được phát hiện nhưng chưa được vá) sudo
và passwd
an toàn vì các tiện ích đó được viết rất cẩn thận nên chúng chỉ có thể thực hiện những điều mà người gọi phải được phép làm.
/bin/rm
không hoạt động theo cách này. Nó không phải là setuid bởi vì nó không cần phải như vậy. Quyền thư mục (và đôi khi quyền tệp ) kiểm soát những tệp mà người dùng có thể xóa và họ không cần phải trở thành root để làm điều đó. Để hoàn toàn rõ ràng, xin đừng bao giờ thiết lập bit setuidrm
. Ý nghĩa bảo mật sẽ là thảm họa, kể từ đó, bất kể ai chạy rm
, nó như thể root đã chạy nó! (Các tiện ích thích sudo
và passwd
kiểm tra xem ai thực sự chạy chúng và kiểm tra xem có thứ gì được cho phép trước khi thực hiện không; rm
không có thứ đó.)
Việc kiểm tra xem bit setuid (hoặc setgid) có được thiết lập trên một tệp thực thi hay không sẽ cho bạn biết nếu hạn chế ai có thể chạy thì nó có cơ hội cải thiện bảo mật hay không. Các tệp thực thi không setuid (hoặc setgid) không có bất kỳ trạng thái đặc biệt nào và bất kỳ ai cũng có thể chỉ cần sao chép chúng và chạy bản sao, mang bản sao của chúng từ một máy khác, viết một tập lệnh hoặc chương trình làm điều tương tự hoặc sử dụng một chương trình khác để làm điều đó.
Xóa tập tin mà không cần rm
Cách rõ ràng để xóa một tệp mà không có rm
trong Ubuntu là điều hướng đến vị trí của nó trong trình duyệt tệp đồ họa (Nautilus, nếu bạn đang sử dụng Unity hoặc Gnome Shell) và xóa tệp. Ngoài ra còn có rất nhiều lệnh có thể được sử dụng để xóa tệp khỏi thiết bị đầu cuối mà không cần sử dụng rm
.
Ví dụ: để xóa một tệp được gọi foo.txt
trong thư mục hiện tại, các lệnh sau, hoạt động vượt trội trên Ubuntu và không yêu cầu quyền truy cập rm
, sẽ đạt được điều đó. (Để chắc chắn, tôi đã thử nghiệm chúng trên hệ thống tối thiểu 16.04 được cài đặt chỉ với các tiện ích hệ thống tiêu chuẩn, sau khi xóa /bin/rm
.)
unlink foo.txt
busybox rm foo.txt
perl -e 'unlink("foo.txt")'
python3 -c 'import os; os.remove("foo.txt")'
( python
thay vì python3
trong các bản phát hành cũ hơn)
Danh sách đó, tất nhiên, không nơi nào gần hoàn thành. Không có danh sách đầy đủ các lệnh như vậy là có thể. Ngăn chặn xóa tệp là một trong những điều riêng biệt tài khoản người dùng và quyền và tệp thư mục tồn tại để đạt được. Họ làm việc rất tốt để ngăn chặn nó. Ngược lại, thay đổi rm
lệnh (để làm cho nó yêu cầu mật khẩu hoặc theo bất kỳ cách nào khác) hoặc hạn chế quyền truy cập để rm
không ngăn chặn nó.