Máy tính Chmod
Máy tính tương tác cho phép tệp Linux/Unix.
chmod 000 filename
Quyền phổ biến
Cách sử dụng
- Tích các ô để xác định quyền đọc, ghi và thực thi cho Chủ sở hữu, Nhóm và Khác.
- Hoặc nhập trực tiếp một giá trị số 3 chữ số (vd: 755).
- Ký hiệu biểu tượng và lệnh
chmodđược cập nhật theo thời gian thực. - Nhấp Sao chép lệnh để sao chép lệnh chmod đầy đủ.
Tham khảo quyền
| Số | Quyền | Biểu tượng |
|---|---|---|
| 0 | Không có quyền | --- |
| 1 | Chỉ thực thi | --x |
| 2 | Chỉ ghi | -w- |
| 3 | Ghi + thực thi | -wx |
| 4 | Chỉ đọc | r-- |
| 5 | Đọc + thực thi | r-x |
| 6 | Đọc + ghi | rw- |
| 7 | Đọc + ghi + thực thi | rwx |
Câu hỏi thường gặp
chmod 755 nghĩa là gì?
755 nghĩa là chủ sở hữu có thể đọc, ghi và thực thi (7), trong khi nhóm và những người khác có thể đọc và thực thi nhưng không thể ghi (5). Đây là quyền phổ biến nhất cho thư mục và tập lệnh.
Sự khác biệt giữa 644 và 755 là gì?
644 (rw-r--r--) cho phép chủ sở hữu đọc/ghi và mọi người chỉ đọc · điển hình cho tệp. 755 (rwxr-xr-x) thêm quyền thực thi · điển hình cho thư mục và tập lệnh.
Nó có hoạt động cho thư mục không?
Có. Quyền số hoạt động theo cùng một cách. Đối với thư mục, «thực thi» có nghĩa là có thể vào thư mục và truy cập nội dung của nó.
Mô hình phân quyền Unix với 9 bit
Mọi tệp và thư mục trên hệ thống giống Unix đều mang một «chế độ», một số nguyên nhỏ ghi lại ai có thể làm gì. Mô hình về cơ bản không thay đổi kể từ Sixth Edition Unix (tháng 5 năm 1975), với các mục thủ công chmod sớm nhất xuất hiện trong Version 1 Unix (tháng 11 năm 1971). Nó mã hóa chín bit phân quyền được sắp xếp thành ba bộ ba gồm đọc / ghi / thực thi, một bộ ba cho chủ sở hữu tệp, một cho nhóm và một cho tất cả mọi người:
Owner Group Others
r w x r w x r w x
4 2 1 4 2 1 4 2 1
Mỗi nhóm ba bit tương ứng chính xác một chữ số octal vì ba bit mã hóa 2³ = 8 giá trị phân biệt (0-7). Các trọng số 4, 2, 1 là 2², 2¹, 2⁰. Cộng bất kỳ tổ hợp nào của đọc (4) + ghi (2) + thực thi (1) tạo ra tám chữ số khả thi cho mỗi lớp mà không có xung đột, đó là toàn bộ ánh xạ octal-sang-ký-hiệu. chmod 755 do đó có nghĩa là rwx (4+2+1=7) cho chủ sở hữu, r-x (4+1=5) cho nhóm, và r-x cho tất cả mọi người.
Chuỗi 10 ký tự bạn thấy trong ls -l là cùng dữ liệu cộng thêm một cột phụ ở đầu cho loại tệp: - cho tệp thông thường, d cho thư mục, l cho symlink, c cho thiết bị ký tự, b cho thiết bị khối, p cho named pipe, s cho socket. Chín ký tự còn lại là các bộ ba phân quyền.
Ký hiệu symbolic: chmod u+x file
Chế độ octal ghi đè tất cả chín bit cùng lúc. Chế độ symbolic không phá hủy, chúng chỉ thay đổi các bit bạn chỉ định. Cú pháp là who + op + perm:
- who:
ungười dùng/chủ sở hữu,gnhóm,okhác,atất cả (= ugo). - op:
+thêm,-xóa,=đặt chính xác (và xóa những bit còn lại). - perm:
r,w,x, cộng với các chữ cái đặc biệtX(thực thi chỉ khi mục tiêu là thư mục hoặc đã có thực thi trên ít nhất một lớp),s(setuid / setgid),t(sticky / xóa-hạn-chế). Bạn cũng có thể sao chép từ lớp khác vớiu,g,o: ví dụ,g=uđặt nhóm phân quyền giống với chủ sở hữu.
Các ví dụ hữu ích:
chmod u+x script.sh: thêm quyền thực thi cho chủ sở hữu.chmod g-w shared.log: xóa quyền ghi cho nhóm.chmod a=rw note.txt: đặt mọi người là đọc/ghi, xóa thực thi cho tất cả.chmod o= secret.key: xóa tất cả bit cho «others».chmod -R u+rwX,go+rX /var/www: cấp quyền đệ quy cho chủ sở hữu truy cập đầy đủ và người khác quyền đọc; chữ hoaXchỉ thêm thực thi trên các thư mục hoặc tệp đã có thực thi trên một số lớp, tránh vô tình làm cho mọi tệp văn bản có thể thực thi.
Chế độ số rõ ràng và idempotent (chmod 755 luôn có nghĩa là chín bit giống nhau). Chế độ symbolic chính xác (chmod g+w chỉ thay đổi một bit). Các script production thường ưu tiên chế độ số để rõ ràng trong nhật ký kiểm toán; các quản trị viên gõ lệnh trực tiếp thường ưu tiên symbolic cho các điều chỉnh nhỏ.
Các Chế Độ Thông Dụng và Mục Đích
| Chế độ | Ký hiệu | Mục đích thường dùng |
|---|---|---|
| 755 | rwxr-xr-x | Tệp thực thi công khai và thư mục tiêu chuẩn, /usr/bin/*, web docroot, Git working tree |
| 644 | rw-r--r-- | Tệp thông thường tiêu chuẩn, cấu hình, mã nguồn, tài liệu |
| 700 | rwx------ | Thư mục riêng tư, ~/.ssh, tài liệu cá nhân không ai khác nên thấy |
| 600 | rw------- | Tệp riêng tư, ~/.ssh/id_rsa, ~/.gnupg/*, tệp mật khẩu |
| 444 | r--r--r-- | Chỉ đọc cho mọi người, dữ liệu tham chiếu cố định, chỉ mục Cargo registry |
| 750 | rwxr-x--- | Chủ sở hữu đầy đủ, nhóm đọc/duyệt qua, người khác không có gì, thư mục dịch vụ dùng chung theo nhóm |
| 777 | rwxrwxrwx | Hầu như luôn luôn sai. Xem bên dưới. |
Tại sao chmod 777 hầu như luôn luôn sai
Đặt tệp thành 777 khiến nó có thể đọc, ghi và thực thi bởi mọi người. Bất kỳ người dùng nào trên máy (bao gồm tài khoản dịch vụ không có đặc quyền và bất kỳ tiến trình nào bị xâm phạm) đều có thể đọc nội dung tệp, sửa đổi và chạy nó. Lời khuyên tutorial chuẩn «chỉ cần chmod 777 cho đến khi hoạt động» là một antipattern bảo mật đã gây ra vô số vi phạm thực sự: tệp cấu hình có thể ghi bởi mọi người bị giả mạo, thư mục web có thể ghi bởi mọi người trở thành vector phá hoại, tệp nhật ký có thể ghi bởi mọi người cho phép làm giả nhật ký, thư mục có thể thực thi bởi mọi người cho phép thực thi mã tùy ý.
Nếu lỗi phân quyền đang chặn bạn, cách sửa đúng hầu như luôn là thay đổi chủ sở hữu tệp (với chown) hoặc nhóm của nó (với chgrp) để người dùng cần truy cập thực sự sở hữu hoặc đồng sở hữu tệp, không phải xóa kiểm soát truy cập cho mọi người.
Các Bit Đặc Biệt: setuid, setgid, sticky
Một chữ số octal thứ tư được thêm vào đầu chế độ mở khóa ba bit đặc biệt, tất cả đều là di tích của thiết kế Unix gốc:
- 4xxx, setuid (set user ID). Khi được đặt trên tệp thực thi, chương trình chạy với đặc quyền của chủ sở hữu thay vì người gọi. Ví dụ kinh điển là
passwd: mọi người dùng đều có thể chạy nó, nhưng chỉ vì nó là setuid-root nó mới có thể ghi vào/etc/shadow. Setuid là bề mặt tấn công bảo mật lớn, Linux hiện đại ngày càng thay thế nó bằng file capabilities (các bit phân quyền chi tiết hơn quasetcap), và nhiều distro đang dần loại bỏ các bit setuid. - 2xxx, setgid (set group ID). Trên tệp thực thi, chạy với nhóm của tệp; trên thư mục, các tệp được tạo bên trong kế thừa nhóm của thư mục thay vì nhóm chính của người tạo, hữu ích cho các thư mục dự án dùng chung.
- 1xxx) sticky bit. Trên thư mục, chỉ chủ sở hữu tệp (hoặc root) mới có thể xóa hoặc đổi tên tệp bên trong, bất kể quyền ghi trên bản thân thư mục đó. Mục đích chuẩn là
/tmp: có thể ghi bởi mọi người để bất kỳ người dùng nào cũng có thể tạo tệp, nhưng sticky bit ngăn người dùng xóa tệp của nhau.
Hiển thị ls -l thay ký tự thực thi thành s, S, t hoặc T khi các bit này được đặt (chữ hoa có nghĩa là bit được đặt nhưng bit thực thi cơ bản không được đặt).
umask: nghịch đảo của chmod
chmod đặt phân quyền trên các tệp hiện có. umask xác định phân quyền mặc định trên các tệp bạn tạo, bằng cách hoạt động như mặt nạ trừ. Phép tính: một tệp thông thường mới sẽ là 666 (rw-rw-rw-), một thư mục mới là 777, trừ bất cứ thứ gì được đặt trong umask. Các giá trị thông dụng:
- umask 022 (mặc định trên hầu hết các distro Linux), bỏ ghi từ nhóm và người khác. Tệp mới kết thúc ở 644, thư mục mới ở 755.
- umask 002 (mặc định trong một số môi trường phát triển dùng chung), chỉ bỏ ghi từ người khác. Tệp mới ở 664, thư mục ở 775. Hữu ích khi một nhóm phát triển muốn đọc và chỉnh sửa tệp của nhau.
- umask 077 (phổ biến trên các máy chủ riêng tư và thiết lập có ý thức về bảo mật), bỏ tất cả phân quyền cho nhóm và người khác. Tệp mới ở 600, thư mục ở 700.
Gõ umask không có đối số hiển thị giá trị hiện tại. Đặt nó trong shell init (~/.bashrc, ~/.zshrc) hoặc trong /etc/login.defs áp dụng cho toàn bộ phiên.
Tệp so với Thư mục, Ý nghĩa Khác nhau của x
Các bit r/w/x giống nhau có ý nghĩa tinh tế khác nhau trên thư mục so với tệp:
- Đọc trên thư mục: liệt kê nội dung của nó. Không có quyền đọc, bạn vẫn có thể truy cập tên tệp đã biết bên trong thư mục nếu bạn có thực thi, nhưng
lssẽ không hoạt động. - Ghi trên thư mục: tạo, xóa hoặc đổi tên các mục bên trong. Lưu ý: điều này độc lập với quyền ghi trên bản thân các tệp đó. Ghi trên thư mục cộng sticky bit (1xxx) là thứ cho phép các thư mục dùng chung nhiều người dùng được kiểm soát như
/tmp. - Thực thi trên thư mục: duyệt qua nó (vào bằng
cd, truy cập các mục được đặt tên bên trong). Thư mục không có thực thi thực tế là ngõ cụt. Nhiều vấn đề «permission denied» tinh tế xuất phát từ sự phân biệt này: bạn có đọc trên thư mục sâu nhưng không có thực thi trên một trong các thư mục cha, vì vậy bạn không thể tiếp cận nó.
chmod đệ quy và mẫu find
chmod -R 755 /var/www áp dụng cùng một chế độ cho mọi tệp và thư mục trong cây, điều này hầu như luôn sai vì tệp và thư mục muốn các chế độ khác nhau (ví dụ: 644 cho tệp, 755 cho thư mục). Thành ngữ đúng sử dụng find:
find /var/www -type f -exec chmod 644 {} +
find /var/www -type d -exec chmod 755 {} +
Hoặc, tương đương, sử dụng chmod của GNU với chữ hoa X: chmod -R u=rwX,go=rX /var/www cấp thực thi chỉ trên thư mục và trên các tệp đã có thực thi ở đâu đó, chính xác là kết quả bạn thường muốn.
Symlink, ACL và cách Linux mở rộng mô hình
Hai cải tiến đáng biết:
- Symlink có chế độ riêng (luôn là 777) nhưng bị bỏ qua.
chmodtheo liên kết và sửa đổi đích theo mặc định. Sử dụngchmod -htrên BSD hoặcchmod --no-dereferencetrên GNU để thao tác trên bản thân liên kết, dù hiếm khi có lý do để làm vậy. - POSIX ACL (
setfacl,getfacl) mở rộng mô hình cơ bản với các mục theo từng người dùng và từng nhóm. Một tệp có thể cấp quyền ghi cho một người dùng cụ thể mà không cần chạm vào các bit chế độ chuẩn.ls -lhiển thị dấu+phía sau trên các tệp có ACL. macOS, hầu hết các hệ thống tệp Linux và các BSD đều hỗ trợ chúng; chúng là tùy chọn và nhiều sysadmin thích giữ nguyên chế độ cổ điển đơn giản hơn. - Windows NTFS ACL còn phong phú hơn, các mục theo từng người dùng / từng nhóm với bit allow / deny rõ ràng và kế thừa có thể thừa kế. Mô hình
chmodkhông chuyển đổi trực tiếp. Cygwin và WSL mô phỏng nó không hoàn hảo trên NTFS.
Thêm câu hỏi
Tại sao SSH key của tôi bị từ chối với «permissions are too open»?
Vì client OpenSSH từ chối sử dụng khóa riêng tư có thể đọc bởi nhóm hoặc mọi người, với giả định rằng bất cứ thứ gì người khác có thể đọc không nên là thông tin xác thực. Cách sửa là chmod 600 ~/.ssh/id_rsa (và chmod 700 ~/.ssh trên bản thân thư mục). Logic tương tự cho ~/.gnupg/ và hầu hết các kho thông tin xác thực khác.
Sự khác biệt giữa chmod và chown là gì?
chmod thay đổi các bit chế độ, những gì owner/group/others có thể làm. chown thay đổi ai là chủ sở hữu. Thường bạn cần cả hai: một tệp mà «người dùng sai không thể đọc» thường không cần mở quyền; nó cần được sở hữu bởi người dùng cần truy cập. Hãy thử chown myuser:mygroup file trước.
Tôi có nên dùng 666 cho tệp nhật ký không?
Hầu như không bao giờ. Tệp nhật ký có thể ghi bởi mọi người cho phép bất kỳ tiến trình nào (bao gồm dịch vụ bị xâm phạm chạy với người dùng ít đặc quyền) giả mạo các mục nhật ký hoặc xóa nhật ký. Mẫu chuẩn là làm cho thư mục nhật ký có thể ghi bởi một nhóm nhật ký cụ thể (adm trên Debian, wheel trên BSD, v.v.) và thêm các dịch vụ liên quan vào nhóm đó, hoặc sử dụng logrotate + một logging daemon (rsyslog, systemd-journald) xử lý quyền sở hữu tệp cho bạn.
Máy tính này có tính đến các bit đặc biệt không?
Không, nó bao gồm chín bit phân quyền cơ bản (chế độ 3 chữ số tiêu chuẩn). Với setuid (4xxx), setgid (2xxx) hoặc sticky (1xxx) bạn cần thêm chữ số đầu thủ công. Đại đa số công việc chmod hàng ngày sử dụng chế độ 3 chữ số và không bao giờ đụng đến các bit đặc biệt.
Có gì được gửi lên máy chủ không?
Không. Việc chuyển đổi toggle ↔ octal ↔ symbolic là số học thuần túy, được tính toán trong trình duyệt của bạn. Trang hoạt động ngoại tuyến sau khi đã tải.