Làm cách nào tôi có thể thiết lập mật khẩu cho lệnh 'rm'?


29

Bạn bè của tôi tiếp tục xóa các tập tin của tôi bằng cách sử dụng thiết bị đầu cuối. Vì vậy, hãy giúp tôi bằng cách giải thích làm thế nào để tạo mật khẩu cho rmlệnh.


50
Bạn sẽ muốn mật khẩu bảo vệ tài khoản người dùng để những "người bạn" đó không truy cập vào tài khoản đó ngay từ đầu.
Andrea Lazzarotto

14
Bạn thực sự nên cố gắng học cách hệ thống hoạt động và sử dụng chức năng của nó.
AlexP

13
Có khả năng là bạn bè của bạn đang cố gắng "dạy cho bạn một bài học" bằng cách bắt vít xung quanh với máy tính của bạn khi bạn để nó không được bảo vệ. Học bài học đó bằng cách bảo vệ tài khoản của bạn và không cho phép truy cập của khách hoặc cung cấp quyền truy cập của khách với các quyền giảm.
Ken Williams

4
Xin hãy nhớ về unlinklệnh. Cũng về mvlệnh, bởi vì bạn có thể ghi đè tập tin một cách hiệu quả với nó. Ngoài ra ...
Kos

17
Với những người bạn như thế thì ai cần kẻ thù?
kasperd

Câu trả lời:


46

Không có cách nào dễ dàng để thiết lập mật khẩu như vậy trên rmchính lệnh đó, không phải không có nhiều vụ hack mã mà có thể sẽ phá vỡ mọi thứ như apt-getcài đặt gói và xóa tệp và khiến bạn phải nhập mật khẩu hàng nghìn lần hoặc có khả năng phá vỡ truy cập vào lệnh cho những người sẽ cần nó (như bạn, để xóa các tệp của riêng bạn). Bạn có thể sắp xếp việc này bằng cách có nhiều tài khoản người dùng và nhiều bộ quyền truy cập và hạn chế quyền truy cập vào các phần dữ liệu khác nhau, chẳng hạn như thư mục chính của bạn để họ không thể truy cập được.

(Tùy chọn khác là tài khoản người dùng cá nhân cho từng người dùng và sau đó là Danh sách điều khiển truy cập, như được nêu chi tiết trong câu trả lời khác được đăng bởi Videonauth )

Đây là vấn đề cốt lõi - bạn đang để bạn bè sử dụng hệ thống của mình. Điều này có rất nhiều ý nghĩa bảo mật - khái niệm "bất kỳ ai có quyền truy cập vật lý vào hộp sẽ có thể kiểm soát hệ thống và thực hiện bất kỳ tác vụ nào" là Thần chú bảo mật CNTT, đó là lý do tại sao bạn không 'chia sẻ' quyền truy cập hệ thống vật lý ngoại trừ với nhân viên được ủy quyền đáng tin cậy.


Cách duy nhất thực sự lành mạnh để làm điều này là không cho bạn bè của bạn truy cập vào máy tính của bạn và cung cấp cho họ một hệ thống "Khách" chuyên dụng mà họ có thể sử dụng, mà bạn không thực sự quan tâm đến các tệp trên đó. Đây là cách 'an toàn nhất' để giữ an toàn cho các tệp của bạn.


Tất nhiên, nếu đó không phải là một tùy chọn, thì tùy chọn thực sự an toàn duy nhất của bạn là định cấu hình nhiều tài khoản người dùng, một tài khoản cho mỗi người dùng, với các thư mục nhà khác nhau và không cho phép họ truy cập vào thư mục nhà riêng của bạn hoặc truy cập vào bất kỳ nhà riêng nào của người dùng khác thư mục. Và sau đó giữ mọi thứ bạn không muốn họ chạm vào thư mục nhà của bạn và không cấp cho họ sudoquyền truy cập, rootmật khẩu hoặc chia sẻ mật khẩu của bạn với họ.

Đây là cách bạn làm điều này:

Giả sử tên tôi là "Foo" và tôi muốn người dùng "Bar", một người bạn, sử dụng hệ thống của tôi nhưng không truy cập vào tệp của tôi. Bước đầu tiên là từ chối truy cập vào bất cứ ai trừ tôi vào thư mục nhà của tôi. Điều này là để cho phép người dùng khác không xóa các tệp của bạn, nhưng cũng để ngăn người dùng khác rình mò trong thư mục nhà của bạn và xem loại nội dung nào bạn có trong thư mục chính của mình:

chmod 750 /home/Foo

Bước thứ hai là tạo tài khoản người dùng cho "Thanh" (KHÔNG gõ những gì trong ngoặc đơn bên dưới, chỉ nhằm mục đích thông tin). Bằng cách này, chúng tôi có thể đảm bảo anh ta có quyền truy cập riêng của mình:

sudo adduser --create-home --user-group --shell /bin/bash Bar
sudo passwd Bar
(set a temporary password - you will not see characters as you type though)

Bước thứ ba là sau đó cũng hạn chế thư mục chính của họ để không ai có thể truy cập vào tệp của họ. Đây chỉ là làm cho mọi thứ bằng nhau.

sudo chmod 750 /home/Bar

Rửa tay, rửa sạch chúng, sau đó lặp lại các bước này cho nhiều người dùng bạn có trên hệ thống. Họ sẽ không thể truy cập các tệp của bạn và vì bạn sẽ không cấp cho họ quyền quản trị viên, họ không thể xóa các tệp của bạn mà không cố sudolàm như vậy - vì bạn không cho phép điều này, nên họ không thể chạm vào công cụ của bạn. Và họ sẽ không thể xem các tập tin của bạn, mà không trở thành siêu người dùng, điều đó sẽ không xảy ra ở đây.


LUÔN LUÔN NHỚ ĐIỀU NÀY: Bằng cách cho ai đó truy cập vật lý vào máy hoặc truy cập nói chung, bạn sẽ đặt các tệp và dữ liệu của mình vào rủi ro. Đây là một thực tế được chấp nhận rộng rãi trong thế giới Bảo mật CNTT và một điều vẫn tiếp tục đúng. Cho phép bạn bè của bạn truy cập vào máy tính của bạn sẽ luôn khiến dữ liệu của bạn gặp rủi ro, do đó, hãy cung cấp cho họ hệ thống của riêng họ để giải quyết vấn đề hoặc chỉ không cho họ quyền truy cập vàomáy của bạn .


Chỉ cần một lưu ý về mã hóa đĩa

Mặc dù mã hóa đĩa hoạt động tốt để bảo vệ dữ liệu của bạn khỏi bên thứ ba, nhưng vẫn có những hạn chế.

  1. Nếu hệ thống được bật, đĩa đã được giải mã, do đó bạn có nguy cơ.
  2. Một số hệ thống có cách tiếp cận mã hóa đĩa bị hỏng . Ví dụ: một số hệ thống Acer sử dụng mật khẩu của bạn để chỉ ủy quyền mã hóa / giải mã và sử dụng mật khẩu được mã hóa cứng hoặc sử dụng mã hóa yếu dễ bị bẻ khóa.
  3. Luôn có các phương pháp để xâm nhập vào 'phím' hoặc cố gắng trích xuất chúng khỏi bộ nhớ ngay sau khi hệ thống bị tắt nhưng trước khi dữ liệu RAM bị 'biến mất' hoặc bị hỏng. (Tôi sẽ không đi sâu vào những điều này, nhưng những rủi ro này vẫn tồn tại).
  4. Truy cập vật lý vào máy, cho dù hệ thống có được mã hóa hay không, sẽ luôn khiến dữ liệu của bạn gặp rủi ro. Không cấp quyền truy cập vật lý (hoặc truy cập mạng từ xa) cho những người bạn không muốn có khả năng cung cấp quyền truy cập đầy đủ vào hệ thống của bạn.

Mặc dù Mã hóa đĩa không giải quyết được các vấn đề này, nhưng nó gây thêm đau đầu cho một tác nhân đe dọa. Ai đó là một kẻ xấu có thể từ bỏ nếu nó được mã hóa, hoặc họ có thể tra tấn bạn (xếp hàng truyện tranh XKCD Security bắt buộc ).

Do đó, nếu hệ thống của bạn được mã hóa, nhưng bạn cho phép người dùng khác sử dụng nó, họ có mật khẩu để giải mã hoặc bạn đang để máy tính xách tay của bạn được giải mã để họ có thể SSH vào hoặc có quyền truy cập vật lý. Trong cả hai trường hợp, điều đó thật tệ.

Điều đó nói rằng, nếu hệ thống của bạn không được mã hóa, thì phần này không liên quan đến bạn.


Máy tính xách tay của tôi có một ổ cứng được mã hóa. Là cho phép người khác truy cập vẫn là một rủi ro?
Tim

2
@Tim Có, nếu hệ thống được bật và giải mã. Và ngay cả khi tắt, vẫn có thể với công nghệ, thời gian và sự cống hiến phù hợp để tìm các khóa giải mã có khả năng vẫn được lưu trữ trong RAM. Mã hóa ổ đĩa không được bảo vệ 100% - có nhiều cách khác, đó là câu hỏi "Kẻ xấu có sẵn sàng thực sự bỏ nhiều thời gian và công sức vào đó không". Và đánh giá theo câu hỏi của OP, hệ thống của họ được bật và không được mã hóa (đầy đủ hoặc một phần) nên rủi ro xóa là có.
Thomas Ward

3
@Tim Để thêm vào câu trả lời của Thomas, một số máy tính xách tay đã thực hiện mã hóa ổ đĩa bị hỏng (nếu bạn đang dựa vào FDE phần cứng). AFAIR Máy tính xách tay Acer không thực sự sử dụng mật khẩu của bạn để mã hóa, họ chỉ sử dụng nó để ủy quyền mã hóa / giải mã bằng mật khẩu được mã hóa cứng.
gronostaj

Dữ liệu luôn có nguy cơ nếu người không tin cậy có quyền truy cập vào hệ thống, được mã hóa hay không
Sergiy Kolodyazhnyy

1
@LightnessRacesinOrbit apt-getchạydpkg , chạy các kịch bản thường sử dụng rm. Trên hộp Xenial của tôi, cd /var/lib/dpkg/info; grep -P '\brm\b' *instxuất ra 344 dòng , trong đó 333 trông giống như sử dụng thực sự của rmlệnh - chỉ trong các tập lệnh cài đặt . grep -P '\brm\b' *rmthậm chí còn hiển thị nhiều hơn trong các tập lệnh loại bỏ (để xóa tập tin cấu hình, không phải tập tin gói).
Eliah Kagan

19

Điều này có thể không thực sự là về rmlệ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 rmlệ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 rmchí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:

  1. 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ệ.

  2. 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 rmlệ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 rmkhô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à , 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 filefile

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 rmkị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 rmmột bí danh shell thực sự chạy rm -i. Truyền -icờ để rmkhiế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_aliaseshoặc .bashrctệp của bạn . Xem câu hỏi nàymộ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/rmhoặ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 rmnà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 -ilà 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 rmsẽ 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 -ilà 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ụ: sudocho 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. passwdchỉ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/usr/bin/passwdcó thể làm điều đó bởi vì chúng có tập bit setuid , như được hiển thị bởi cột sxuấ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/rmkhông có s: quyền của nó là -rwxr-xr-x, trong khi /usr/bin/passwd/usr/bin/so-rwsr-xr-xthay vào đó. Điều này làm cho nó sao cho, bất kể ai chạy passwdhay 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á) sudopasswdan 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/rmkhô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 sudopasswdkiể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; rmkhô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ó rmtrong 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.txttrong 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")'( pythonthay vì python3trong 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 rmlệ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 để rmkhông ngăn chặn nó.


2
Để sử dụng thực tế, tôi thích tùy chọn rmcủa GNU -I. Nó chỉ nhắc xóa 4 hoặc nhiều tệp hoặc xóa đệ quy. Vì vậy, bạn không có thói quen luôn sử dụng -f, \rmđể tránh mở rộng bí danh hoặc gõ ymà không đọc. Nhưng nó vẫn sẽ cứu bạn khỏi những lỗi chính tả mà bạn nhấn return trước khi bạn có ý định hoặc toàn cầu của bạn khớp với nhiều tệp.
Peter Cordes

2
Một cách thú vị khác để hủy liên kết tệp : mv foo.txt /tmp/.gone, sau đó khởi động lại, loại bỏ các tmpfs đang sao lưu /tmp. Hoặc chỉ sử dụng mvđể đổi tên nhiều tệp thành cùng một tên, vì vậy chỉ còn lại tệp cuối cùng. Hoặc chỉ ẩn các tệp bằng cách đổi tên chúng với tên tối nghĩa. Như phần đầu tiên của câu trả lời này chỉ ra, nếu bạn đang cố gắng chống lại ác ý thay vì bất tài, bạn chỉ cần khóa mọi người khỏi tài khoản của mình.
Peter Cordes

16

Bạn có thể thay đổi các quyền trên /bin/rmlệnh thông qua dòng sau đây sẽ ngăn nó được thực thi mà không cần truy cập sudo:

sudo chmod 750 /bin/rm

Điều này đặc biệt ngăn họ sử dụng rmlệnh được cung cấp bởi hệ thống. Bạn nên lưu ý rằng điều đó không ngăn họ xóa các tệp theo những cách khác.

Để ngăn họ sử dụng rmdirlệnh, đây là cách phổ biến để xóa các thư mục, bạn có thể đặt quyền theo cách tương tự trên đường dẫn thực thi của nó:

sudo chmod 750 /bin/rmdir

Nhắc nhở rằng bạn cũng chỉ có thể sử dụng các lệnh này với quyền sudo.

Để thay đổi lại nếu bạn không thích nó hoặc các vấn đề khác xảy ra, hãy sử dụng 755chochmod


Như @muru đã chỉ ra ở trên là một giải pháp rất thô sơ và thậm chí có thể phá vỡ các dịch vụ hệ thống không chạy trên tài khoản root . Do đó, tôi thêm vào đây một tùy chọn khác sử dụng ACL (danh sách kiểm soát truy cập) để làm tương tự và có thể an toàn hơn nhiều (cũng tốt để đọc và bạn có thể bỏ qua phần bật vì ACL thường được cài đặt trên các hệ thống Ubuntu hiện nay):

Vì vậy, để làm tương tự như trên chỉ dành cho người dùng bạn muốn chặn sẽ là

sudo setfacl -m u:<user-name>:- /bin/rm /bin/rmdir

Chỉ cần thay thế <user-name>bằng tên người dùng thực tế bạn muốn ngăn chặn sử dụng các tệp.

Như với chmod, sử dụng setfacl -mđể ngăn người dùng cụ thể chạy rmvà chỉ rmdiráp dụng cho các lệnh do hệ thống cung cấp. Nó không ngăn họ xóa các tệp và thư mục của bạn trong Nautilus hoặc bằng cách sử dụng các lệnh đầu cuối khác.

Giải trình:

  • các -mlá cờ có nghĩa là để sửa đổi các tập tin ACL.
  • phần đầu tiên của sự thay đổi, ulà viết tắt của người dùng. Nó có thể có các giá trị sau ucho người dùng, gcho nhóm và ocho tất cả những người khác
  • phần giữa <user-name>có thể ẩn tên người dùng hoặc tên nhóm thực tế theo những gì bạn muốn thay đổi. Để thiết lập thay đổi tổng thể, bạn để trống.
  • phần thứ ba chứa loại quyền bạn muốn đặt. Ở đây trong ví dụ chúng tôi muốn đặt không có quyền nào cả, vì vậy chúng tôi -cũng có thể chứa các chữ cái sau đây rcho quyền đọc, wcho quyền ghi và xthực thi.

4
Sẽ tốt hơn nếu sử dụng ACL hơn là xóa quyền thực thi cho người khác - bất kỳ dịch vụ hệ thống nào không chạy dưới quyền root đều bị vô hiệu hóa.
muru

2
sudo setfacl -m u:<username>:- /bin/rm /bin/rmdir, IIRC. Bạn có thể kiểm tra ACL vớigetfacl /bin/rm /bin/rmdir
muru

2
Nhược điểm duy nhất của ACL như thế này là xấu xa / khó khăn để duy trì lâu dài. Và không thể duy trì nếu không có người dùng cá nhân trên hệ thống cho mỗi người sử dụng hệ thống. Mặt khác, đó là một ý tưởng tốt.
Thomas Ward

4
@DavidFoerster Có. Có một số cách hiệu quả không giới hạn để xóa các tập tin mà không có rm. Giải pháp mà Videonauth đưa ra ở đây là một cách khả thi để giúp người dùng dễ bị tai nạn ngừng xóa nội dung, nhưng nó không cung cấp bất kỳ bảo mật thực tế nào (có thể không sao, nếu bạn bè của OP không cố tình phá vỡ mong muốn của OP) . Videonauth: Tôi khuyên bạn nên chỉnh sửa bài đăng này để nó làm rõ một cách rõ ràng rằng nó không thực sự ngăn mọi người xóa các tập tin vì họ không cần rmlệnh để làm như vậy. (Tôi không kiềm chế việc tự chỉnh sửa nó, trong trường hợp bạn không muốn nói điều đó.)
Eliah Kagan

1
Đừng quên rằng Perl, Python và tất cả các trình biên dịch trên hệ thống cũng cho phép những người dùng khác xóa các tệp. Ngăn chặn mọi người xóa các tập tin đòi hỏi nhiều hơn là chỉ thay đổi các quyền trên rmlệnh.
Jonathan Leffler

8

Đây là một câu trả lời rất đơn giản và sẽ ngăn ai đó tình cờ sử dụng lệnh rm mà không đưa ra mật khẩu. Nó không phải là một giải pháp an toàn và bạn nên đưa ra một số gợi ý thay thế trong các câu trả lời khác.

Tuy nhiên, bạn có thể sử dụng bí danh để thay đổi cách hoạt động của lệnh rm. Thử:

alias rm="sudo -l >/dev/null && rm"

Điều này làm là khi ai đó nhập lệnh rm, nó chạy lệnh sudo -l. Lệnh này buộc người dùng nhập mật khẩu của họ. Nếu họ hiểu đúng, nó liệt kê các đặc quyền của họ (chúng tôi loại bỏ đầu ra này) và thoát với trạng thái 0, nếu họ hiểu sai, nó tồn tại với một lỗi.

Sau đó, chúng tôi thực hiện theo lệnh sudo bằng "&&", lệnh này sẽ thoát lệnh sau - trong trường hợp này là "rm" chỉ khi lệnh trước đó thoát với trạng thái 0 - tức là họ đã lấy đúng mật khẩu.

Để làm điều này vĩnh viễn, bao gồm lệnh bí danh trong ~/.bashrc.

Lưu ý điều này rất dễ bị đánh bại (ví dụ, họ có thể chỉ cần gõ /bin/rm.


5

Đôi khi đó không phải là bạn của chúng ta, chúng ta là kẻ thù tồi tệ nhất của chính chúng ta

Tôi đã viết một tập lệnh để bảo vệ mật khẩu rmnhư OP yêu cầu nhưng cũng đưa vào các chỉnh sửa để ngăn bạn vô tình xóa:

  • /
  • /nhà
  • / thùng

Chỉnh sửa: Mar 5 2017 - Thay đổi phương thức kiểm tra nếu chạy trong terminal.


Tạo kịch bản

Sử dụng gksu gedit /usr/local/bin/rmvà sao chép trong các dòng này:

#!/bin/bash

tty -s;
if [ "0" == "$?" ]; then Terminal="Y"; else Terminal="N"; fi

if [ $Terminal == "Y" ] ; then
    # Running from terminal don't allow delete of / or /toplevel directory even if sudo
    for i in ${@:1}
    do
        # Skip options -i -r -v -d 
        if [[ ${i:0:1} != "-" ]] ; then
            # if parameter doesn't begin with '-' it's file or directory, so get real path.
            fullname=$(realpath "$i" 2>&1) # No error messages if file doens't exist
            # We must have at least two `/` in the full path
            levels=$(echo "$fullname" | tr -cd '/' | wc -c)
            if (( $levels == 1 )); then # Test for 1, will be zero when file doesn't exist.
                echo "Attempting to remove top level directory '$fullname'"
                echo "Use 'sudo /bin/rm $@' instead."
                exit 1 # error
            fi
        fi
    done
fi


if [[ $(id -u) != 0 ]]; then # Only non-root processes enter password (ie "sudo rm ..." is ok)
  if [ $Terminal == "Y" ] ; then
  # Only running from a terminal needs password (ie not cron)

    # log rm usage to /var/log/syslog
    PARENT_COMMAND="$(ps -o comm= $PPID)"   
    logger "$PARENT_COMMAND"" - rm command was used on file: ""$fullname"

    # Get password
    Password=$(zenity --password --title="Password for rm")
    encryptPassword=$(echo -n "$Password" | md5sum)

echo "md5sum: $encryptPassword" # Comment out after viewing one time and updating line below.

    if [[ "$encryptPassword" != "d2c30dc65e59558c852ea30b7338abbe  -" ]]; then
        echo "Invalid password!"
        exit 1
    fi
  fi # non-terminals can't enter password.
fi # root doesn't need to enter password.

# Call REAL rm command with parameters passed to this wrapper sript
/bin/rm "$@"

exit 0

Thay đổi mật khẩu "WE2U" thành bất cứ điều gì bạn thích và lưu tệp.

Đánh dấu mới rm tập lệnh là có thể thực thi được

Gắn cờ rmtập lệnh mới dưới dạng thực thi bằng cách sử dụng:

sudo chmod +x /usr/local/bin/rm

Làm thế nào nó hoạt động

mật khẩu rm

Trừ khi mật khẩu là WE2U , lần đầu tiên bạn chạy tập lệnh, bạn sẽ nhận được "mật khẩu không hợp lệ" và khóa mã hóa cho mật khẩu bạn đã nhập được hiển thị. Sao chép và dán khóa mã hóa này từ thiết bị đầu cuối vào tập lệnh. Sau đó nhận xét dòng có tiếng vang hiển thị khóa mã hóa trên thiết bị đầu cuối.

Bởi vì đường dẫn /usr/local/bincao hơn trong danh sách so với /binlệnh của chúng tôi rmđược gọi. Sau khi nhận được mật khẩu hợp lệ, nó gọi /bin/rmđể thực hiện loại bỏ thực sự.

Như Thomas Ward đã chỉ ra trong một câu trả lời khác, nếu bạn muốn làm một sudo apt-get install ...bạn có thể được yêu cầu nhập mật khẩu hàng ngàn lần. Kịch bản kiểm tra nếu sudođược sử dụng và không yêu cầu mật khẩu. Hơn nữa, nếu rmđược gọi từ trong ứng dụng GUI, không cần mật khẩu.

Tập lệnh gọi loggerđể ghi lại mỗi lần rmđược gọi thủ công bằng cách sử dụng thiết bị đầu cuối. Sử dụng lệnh được ghi lại /var/log/syslog.


1
Bạn có thể che dấu mật khẩu bằng cách đơn giản bao gồm một phiên bản băm của nó trong tập lệnh, và sau đó bất cứ khi nào người dùng nhập mật khẩu, nó có thể băm mật khẩu và kiểm tra mật khẩu với mã băm cứng.
Khởi

@InitializeSahib băm hỗ trợ mật khẩu (mã hóa) đã được thêm vào tập lệnh.
WinEunuuchs2Unix

3

Một cách khác là tạo các bản sao lưu của bất kỳ tệp quan trọng nào trong một thư mục mà người dùng không phải root không có quyền truy cập. Bạn có thể sử dụng rsynchoặc unisontự động đồng bộ hóa chúng, chỉ cần đảm bảo ít nhất một thư mục trong đường dẫn đến đích sao lưu được sở hữu bởi root và chế độ 700. Điều này sẽ dẫn đến việc có hai bản sao của tất cả các tệp. Sẽ an toàn hơn nếu chỉ tạo một người dùng khách cho họ sử dụng, ngoại trừ bạn cần nhớ luôn luôn khóa hoặc đăng xuất trước khi đưa cho họ máy tính hoặc để nó không giám sát.


3
Bạn có thể muốn chỉ ra làm thế nào để tránh việc xóa được tuyên truyền? Và lý tưởng là một cách để tắt và bật để khi người dùng đang làm một cái gì đó yêu cầu xóa là vĩnh viễn, nó là vĩnh viễn.
Ostergaard

@ajostergaard Suy nghĩ của tôi là bất cứ khi nào anh ta lấy lại được máy tính của mình từ bạn bè, anh ta sẽ tự kiểm tra xem không có gì bị thiếu và khôi phục lại bất cứ thứ gì. Nhưng công cụ ưa thích của riêng tôi là unison được sử dụng trong chế độ tương tác gui, giúp dễ dàng nhìn thấy (và đảo ngược) xóa.
Random832

2

Không phải là câu trả lời trực tiếp cho câu hỏi bạn đang tìm nhưng:

Nếu bạn bè của bạn đang xóa các tệp của bạn bằng cách sử dụng rmlệnh thì bạn bè của bạn sẽ không đủ năng lực, bị giật hoặc họ là những kẻ lừa đảo BOFH đang cố gắng dạy bạn không để các phiên của bạn đăng nhập và không được giám sát. Trong mọi trường hợp, giải pháp đều giống nhau: không để phiên của bạn đăng nhập và không giám sát .

Điều này có lợi thế là không cần phải nhớ để thực hiện các thay đổi đặc biệt cho hệ thống bất cứ khi nào bạn nâng cấp hoặc có được một hệ thống mới, đồng thời ngăn chặn các tập lệnh và những thứ khác mà bạn sử dụng dựa trên các lệnh hành xử như mong đợi từ thất bại theo những cách không thể đoán trước.

Nó cũng có lợi thế là ngăn "bạn bè" chuyển sang bước tiếp theo. Bạn cũng sẽ muốn "bảo vệ mật khẩu" mvlệnh nếu họ quyết định chuyển các tệp của bạn sang / dev / null khi họ phát hiện ra rằng việc xóa đơn giản không làm những gì họ muốn? Khi bạn tham gia một trò chơi như thế này, nước cờ chiến thắng duy nhất là không chơi.


1

Tôi có một khả năng tương tự mà tôi đã lên kế hoạch. Trên máy chủ tệp, nếu bộ lưu trữ chính của ảnh có thể ghi mà ai đó trong gia đình (ít kỹ thuật hoặc vô tình) có thể xóa một cái gì đó, vô tình kéo vào gui để di chuyển thư mục hoặc ghi đè lên bản gốc bằng phiên bản đã chỉnh sửa thay vì đổi tên .

Tôi nhận ra rằng tôi có thể bảo vệ chống lại điều đó mà không làm cho các quyền không thể chấp nhận được đối với mọi người khác. ZFS thực hiện các ảnh chụp nhanh định kỳ để bất kỳ xóa ngẫu nhiên hoặc ghi đè có thể bị đảo ngược. (Không giống như bản sao lưu, ảnh chụp nhanh nhẹ và sao chép khi ghi để nó không nhân lên mức sử dụng bộ nhớ của bạn.)

ZFS có nguồn gốc từ FreeBSD. Linux có btrfs cũng có ảnh chụp nhanh.


0

Một cách giải quyết rất ngớ ngẩn cho một vấn đề rất ngớ ngẩn.

Nếu bạn không muốn chmod rm, rmdirhoặc mv(cho mv filename /dev/null) hoặc sử dụng ACL, bạn có thể tạo một người dùng giả với một ai mật khẩu, nhưng bạn biết và bí danh mỗi lệnh để sudo [user], và sau đó làm bí danh cho mỗi lệnh mà bạn bè của bạn không biết . Bằng cách này, khi bạn bè của bạn nhập rm, hệ thống sẽ nhắc họ nhập mật khẩu (nhưng đoán sai mật khẩu sẽ ghi lại lần thử thất bại) và bạn vẫn có thể nhập rmaliashoặc bất cứ điều gì bạn chọn để thực sự xóa các tệp.

Hoặc bạn chỉ có thể tạo một tài khoản khách không có quyền truy cập vào thư mục chính của bạn.


Có vẻ như bạn đang đi đúng hướng. Câu trả lời của bạn có thể được cải thiện bằng cách xây dựng cách thiết lập bí danh sudo [user]dummy user
WinEunuuchs2Unix

0

Nếu bạn muốn rm bảo vệ mật khẩu, một giải pháp sẽ là tạo một trình bao bọc cho rm yêu cầu quyền root và yêu cầu nhập mật khẩu nếu không. (LƯU Ý: Trình bao bọc này có thể biến mất khi gói coreutils được cập nhật hoặc cài đặt lại.) Ngoài ra, xin lưu ý điều này chỉ bảo mật rm, vẫn còn nhiều, nhiều cách khác để xóa tệp.


Mở một thiết bị đầu cuối và trở thành root. Sau đó chạy sudo mv /bin/rm /bin/rmoldđể di chuyển rm đến nơi khác.

Bây giờ chạy sudo nano /bin/rm để tạo một trình bao bọc.

Trong Nano, nhập như sau:

#!/bin/bash
/bin/rmold "$@"
exit "$?"

Sau đó giữ CTRLvà nhấn Xđể thoát. Nhấn Ykhi bạn được nhắc, sau đó nhấn ENTERđể lưu tệp.

Cuối cùng, chúng ta cần cung cấp cho điều này các quyền thích hợp:

sudo chmod a+x /bin/rm

Và ở đó bạn đi.


1
Trừ khi bạn có một lý do rất chính đáng, các biến script phải luôn được trích dẫn: $@=> "$@". Ở đây, những gì bạn đang đề xuất là một phiên bản rất nguy hiểm của bản gốc và an toàn rm: nếu có một tệp có tên foo -i -r *( -iđược thêm vào để bảo vệ người dùng vô tội) thì sao?
xhienne

Ngoài việc "trích dẫn $@như @xhienne nói, tôi khuyên bạn nên cảnh báo rõ ràng với độc giả rằng điều này không cung cấp bảo mật nào cả vì có nhiều cách để xóa một tệp. Một là gọi rmold, nhưng có vô số cách khác, như được thảo luận trong các câu trả lời và nhận xét khác về chúng. (Ngay cả khi đó, điều này sẽ có vấn đề rmsẽ cảm thấy như nó xóa các tệp như người dùng hiện tại - nó được gọi mà không có sudo, và rmchạy bình thường như người gọi - nhưng thực hiện như là root! Nếu gần đây sudohọ đã thắng, họ đã thắng ' Chúng tôi nhận thấy họ có thể đang xóa các tệp hệ thống ngay cả khi họ biết về sự thay đổi.)
Eliah Kagan
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.