Re-learning Linux - Permission
Linux
77
permission
1
White

Nguyễn Hồng Phúc viết ngày 23/05/2015

Mở đầu

Có lẽ hầu hết những người sử dụng Linux đều biết quyền hạn của 1 file hay folder được đại diện bởi r (read), w (write), x (execute) như hình dưới đây:
alt text

Và ta có thể biểu diễn 9 kí tự cuối trong hình trên bằng số theo luật

  • Read = 4
  • Write = 2
  • Execute = 1
  • No Permission = 0

Vậy như hình trên, giá trị số sẽ là: 744 (r + w + x = 7, r = 4, r = 4)

Chúng ta cùng thử kiểm tra quyền của file /usr/bin/passwd :

ls -l /usr/bin/passwd

Và đây là kết quả:

-rwsr-xr-x. 1 root root 27832 Jun 10  2014 /usr/bin/passwd

Điều tôi chú ý là phần permission của file rws. 's' là gì?

Xét thêm một lệnh nữa:

ls -l -d /tmp # option -d là để hiển thị thông tin quyền hạn của một thư mục

Kết quả

drwxrwxrwt. 8 root root 4096 Apr 15 04:44 /tmp

Cũng trong phần permission của thư mục tmp, 't' là gì

Vậy 2 kí tự 's' và 't' là gì?

SUID

Ta cùng quay lại với kết quả của đoạn lệnh ls -l /usr/bin/passwd
Kết quả là -rwsr-xr-x. 1 root root 27832 Jun 10 2014 /usr/bin/passwd

Với passwd là lệnh để thay đổi password của người dùng hiện tại. Khi thực thi lệnh passwd sẽ cố gắng để thay đổi nội dung của 2 file dưới đây:

  • /etc/passwd: File chứa thông tin về username, user id, password đã mã hoá hay chưa...
  • /etc/shadow: File chứa thông tin về password của người dùng và thời gian hiệu lực của password

Như vậy, rõ ràng để chạy được lệnh passwd, user thực thi phải chạy passwd dưới quyền của super user bằng cách thêm sudo vào trước.

foo là một người dùng trên linux. Ta dễ dàng tạo người dùng foo bằng lệnh useradd foo. foo có quyền hạn rất hạn chế. Dĩ nhiên foo cũng không có quyền ghi vào file /etc/passwd hay /etc/shadow. Tuy nhiên, foo có thể chạy được lệnh passwd để thay đổi password của chính mình mà không cần thiết phải thêm sudo vào phía trước. Điều này thực hiện được là nhờ SUID, được thể hiện bởi chữ 's' ở phần quyền hạn của owner.

SUID = Set owner User ID up on execution. Người thực thi file sẽ được mượn quyền hạn của người sở hữu tại thời điểm thực thi.

Có hai cách để thực hiện SUID cho file

  • Theo kí hiệu (Symbolic way) chmod u+s file1
  • Theo chữ số (Numberic way) chmod 4750 file1

Tuy nhiên, sau khi chạy lệnh trên, đôi khi bạn sẽ thấy xuất hiện kí tự 'S' chứ không phải 's' như hình dưới đây.

-rwSrw-r--. 

Lý do là do bạn chưa cấp quyền thực thi file1 cho người sở hữu. Thêm đoạn lệnh dưới đây, ta sẽ thấy kí tự 'S' thành 's'

sudo chmod u+x file1

*Utils:

  • Xóa SUID cho file đã set chmod u-s file1
  • Tìm tất cả các file có SUID find / -perm +4000

SGID

SGID = Set Group ID up on execution. Nhóm thực thi file sẽ được mượn quyền hạn của nhóm sở hữu tại thời điểm thực thi.

SGID hoàn toàn giống với SUID, chỉ khác cái là ta set quyền thực thi cho một nhóm. Tương tự như SUID, ta có thể thực hiện SGID theo hai cách như dưới đây:

  • Theo kí hiệu (Symbolic way) chmod g+s file1
  • Theo chữ số (Numberic way) chmod 2750 file1

Xóa SGID

chmod g-s file1

Sticky Bit

Linux là một môi trường đa người dùng đồng thời, vì vậy bên cạnh việc giới hạn quyền nhằm đảm bảo tính an toàn cho hệ thống, Linux cần phải có cơ chế để chia sẻ tài nguyên giữa các người dùng với nhau. Sticky Bit được sinh ra như một công cụ giúp giải quyết vấn đề chia sẻ file hay folder giữa các người dùng.

Quay lại ví dụ với folder tmp. Khi thực thi đoạn lệnh ls -l -d /tmp, ta được kết quả drwxrwxrwt. 8 root root 4096 Apr 15 04:44 /tmp. Kí tự 't' trong phẩn permission drwxrwxrw*t* chính là Stickybit.

Sticky bit được áp dụng cho folder. Nội dung trong folder (file, thư mục con) chỉ được xóa (hoặc đổi tên) bởi người tạo ra chúng hoặc root user.

Có hai cách để thực hiện set Sticky bit cho file

  • Theo kí hiệu (Symbolic way) chmod o+t /opt/dump/
  • Theo chữ số (Numberic way) chmod 1750 /opt/dump/

Remove sticky bit cho folder

chmod o-t /opt/dump/

Tổng kết

Linux là một môi trường đa người dùng đồng thời, vì vậy, việc giới hạn quyền và chia sẻ tài nguyên là một việc hết sức cần thiết nhằm đảm bảo tính an toàn nhưng vẫn linh hoạt của hệ thống. SUID, SGID, Sticky bit sẽ giúp đảm bảo những điều nêu trên một cách rõ ràng và chặt chẽ hơn:

  • SUID = Set owner User ID up on execution - Đại diện bởi 4000
  • SGID = Set owner Group ID up on execution - Đại diện bởi 2000
  • Sticky Bit - Đại diện bởi 1000

Hi vọng bài viết này giúp ích cho những bạn muốn tìm hiểu thêm về permission trong Linux.

Bình luận


White
{{ comment.user.name }}
Bỏ hay Hay
{{comment.like_count}}
Male avatar
{{ comment_error }}
Hủy
   

Hiển thị thử

Chỉnh sửa

White

Nguyễn Hồng Phúc

9 bài viết.
38 người follow
Kipalog
{{userFollowed ? 'Following' : 'Follow'}}
Cùng một tác giả
White
36 8
Một số vấn đề Theo cá nhân tôi, Javascript có lẽ là một trong những ngôn ngữ dễ học, dễ viết nhất. Một web developer mới bắt đầu có lẽ chỉ cần từ ...
Nguyễn Hồng Phúc viết gần 3 năm trước
36 8
White
16 3
Mở đầu Ở (Link), tôi đã tổng kết lại một số nguyên tắc của câu lệnh điều kiện if, phép so sánh == và ===. Chúng ta hãy cùng bắt đầu phần 2 với điề...
Nguyễn Hồng Phúc viết gần 3 năm trước
16 3
White
15 1
Có vẻ là quá thường nhưng để bắt đầu làm gì đó “to tát” thì hay bắt đầu những việc đơn giản trước. Tôi viết bài này để chia sẻ tới những người mới ...
Nguyễn Hồng Phúc viết gần 3 năm trước
15 1
{{like_count}}

kipalog

{{ comment_count }}

bình luận

{{liked ? "Đã kipalog" : "Kipalog"}}


White
{{userFollowed ? 'Following' : 'Follow'}}
9 bài viết.
38 người follow

 Đầu mục bài viết

Vẫn còn nữa! x

Kipalog vẫn còn rất nhiều bài viết hay và chủ đề thú vị chờ bạn khám phá!