Làm cách nào để tạo một tệp KHÔNG thể sửa đổi?


35

Trong khi đăng nhập, tôi có thể làm như sau:

mkdir foo
touch foo/bar
chmod 400 foo/bar 
chmod 500 foo

Sau đó, tôi có thể mở vim (không phải root), chỉnh sửa bar, buộc ghi w!và tập tin được sửa đổi.

Làm thế nào tôi có thể làm cho hệ điều hành không cho phép bất kỳ sửa đổi tập tin?

CẬP NHẬT 02/03/2017

  1. chmod 500 foolà một cá trích đỏ: quyền ghi trên thư mục không liên quan gì đến khả năng sửa đổi nội dung của tệp - chỉ có khả năng tạo và xóa tệp.

  2. chmod 400 foo/bartrong thực tế ngăn không cho nội dung của tập tin bị thay đổi. Nhưng , điều đó không ngăn quyền của tệp bị thay đổi - chủ sở hữu tệp luôn có thể thay đổi quyền của tệp (giả sử họ có thể truy cập tệp tức là thực thi quyền trên tất cả các thư mục tổ tiên). Trên thực tế, strace (1) tiết lộ rằng đây là điều mà vim (7.4.576 Debian Jessie) đang làm - vim gọi chmod (2) để tạm thời thêm quyền ghi cho chủ sở hữu tệp, sửa đổi tệp và sau đó gọi chmod ( 2) một lần nữa để loại bỏ quyền viết. Đó là lý do tại sao sử dụng chattr +icác tác phẩm - chỉ root mới có thể gọi chattr -i. Về mặt lý thuyết, vim (hoặc bất kỳ chương trình nào) có thể làm điều tương tự với chattr giống như với chmod trên một tệp không thay đổi nếu chạy dưới quyền root.


3
Tôi tin rằng dưới mui xe, vimthực sự là thay đổi các quyền và sau đó đưa nó trở lại.
jordanm

Bạn không chạy như root?
Alvin Wong

Alvin, tôi làm điều này như một người dùng không root. Tôi đã chỉnh sửa bài để làm rõ.
dùng2141130

Câu trả lời:


49

Bạn có thể đặt thuộc tính "bất biến" với hầu hết các hệ thống tệp trong Linux.

chattr +i foo/bar

Để xóa thuộc tính bất biến, bạn sử dụng -thay vì +:

chattr -i foo/bar

Để xem các thuộc tính hiện tại cho một tệp, bạn có thể sử dụng lsattr:

lsattr foo/bar

Trang chủ chattr (1) cung cấp mô tả về tất cả các thuộc tính có sẵn. Dưới đây là mô tả cho i:

   A  file with the `i' attribute cannot be modified: it cannot be deleted
   or renamed, no link can be created to this file  and  no  data  can  be
   written  to  the  file.  Only the superuser or a process possessing the
   CAP_LINUX_IMMUTABLE capability can set or clear this attribute.

3
Trên Linux, mà lá cờ bất biến có sẵn trên nhiều hệ thống tập tin không chỉ ext2 / 3/4 (ít nhất btrfs, hfsplus, JFS, nilfs2, xfs, ocfs2, ubifs, gfs2, ReiserFS AFAICT từ một cái nhìn nhanh chóng thông qua các mã)
Stéphane Chazelas

@StephaneChazelas Tôi thấy chattrlệnh là một phần của e2fsprogsgói trên hệ thống của tôi. Đó là lý do tại sao tôi đưa ra tuyên bố đó. Tôi đã cập nhật câu trả lời dựa trên bình luận của bạn.
jordanm

Nó không làm việc cho symlink :-( Giải pháp này sẽ là tuyệt vời, bởi vì tôi muốn tránh rằng liên kết tượng trưng có thể được. Vô tình sửa đổi bởi bất kỳ người dùng bao gồm gốc.
natenho

Bất biến là một cờ inode đúng, không phải là xattr? cờ ioctl được chính xác?
ytpillai

1

Bạn có thể:

  1. Thay đổi chủ sở hữu tệp thành roothoặc một người dùng giả mới được tạo
  2. Giữ đúng nhóm.
  3. Sử dụng chmod 440để cho phép đọc theo nhóm (đó là bạn).

Nếu người dùng chính xác không phải là người duy nhất trong nhóm này, bạn nên tạo một nhóm mới và chỉ thêm anh ta vào nhóm đó và sử dụng nhóm này cho nhóm đó. Tuy nhiên, bạn không phải là chủ sở hữu của tệp, do đó bạn vikhông thể thay đổi chủ sở hữu tệp.


3
Nếu bạn có thể ghi vào thư mục mẹ, thì vim có thể xóa tệp và tạo một tệp mới (và đó là những gì nó làm khi bạn làm :w!). vim không đi xa đến mức thay đổi quyền của thư mục tạm thời. Vì vậy, giữ cho thư mục không thể ghi nên được an toàn.
Stéphane Chazelas

0

Để làm cho toàn bộ cây thư mục chỉ đọc:

cd <directory>
find ./ -print0 | sudo xargs -I {} -0 chattr +i {}

Để làm cho nó có thể đọc lại, thay đổi +ithành -i.

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.