Tìm hiểu user root trong linux

Bài viết này là cái note nhỏ để tìm hiểu sự khác biệt giữa lệnh “su – user” và “su user” trên Linux hay nói cách khác là cách sử dụng lệnh “su option “” và “sukhông có option ““. Cụ thể là :

# su - 
# su 

 
Mình không giải thích cách xài lệnh “su” nhé, hẹn dịp nói trong 1 bài viết khác. Còn bạn muốn 1 cái định nghĩa đơn giản thì nó như thế này :

Chương trình lệnh “su” giúp chúng ta chạy 1 shell mới bằng cách chuyển đổi session shell mới sang user ID và group ID khác. Nói tóm gọi là đăng nhập sang 1 user khác ngay trên terminal đang chạy.

 
Ok giờ mình nói đến sự khác biệt nào.

– Khi bạn sử dụng lệnh “su+” để chuyển đổi session user khác thì đồng nghĩa với việc yêu cầu hệ thống Linux hãy tạo 1 session hoàn toàn mới và thay đổi toàn bộ các biến môi trường của user hiện tại sang user khác, hay còn gọi là load toàn bộ biến môi trường của user mà mình muốn chuyển session qua y hệt như bạn mở 1 session SSH hay local đăng nhập vào user đó. Bạn coi qua ví dụ 1 để hiểu thêm.
– Ví dụ ở đây ta xét biến môi trường $PATH là dễ hình dung nhất.

Ví dụ 1:

[ ~]$ whoami
cuongqc
[ ~]$ pwd
/home/cuongqc/
[ ~]$ echo $PATH
/home/cuongqc/perl5/bin:/home/cuongqc/perl5/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/easy/bin:/root/bin:/root/.local/bin:/root/bin:/bin:/usr/local/easy/bin:/usr/local/easy/bin

 
– Thực hiện chuyển đổi sang user root với “su –“. Nếu bạn không để tên username sau lệnh su thì mặc định Linux hiểu là bạn đang muốn chuyển session sang user root.

[ ~]$ sudo su -
[ ~]# whoami
root
[ ~]# pwd
/root/
[ ~]# echo $PATH
/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/easy/bin:/root/bin:/root/.local/bin:/root/bin:/bin

 
– Bạn sẽ thấy là biến môi trường $PATH có sự khác nhau rõ rệt của 2 user.
 

2. “su

– Thế nhưng nếu bạn sử dụng lệnh “su” mà không có dấu” thì session chuyển đổi sang user khác sẽ không được áp hay được thiết lập các biến môi trường được quy định của user đó, trong trường hợp này là vẫn giữ thông tin biến môi trường của user cũ. Bạn coi qua ví dụ 2:
– Ta vẫn ở thư mục và session của user “cuongqc” và xét biến môi trường $PATH như cũ.

Ví dụ 2:

[ ~]$ whoami
cuongqc 
[ ~]$ echo $PATH
/usr/bin:/usr/sbin:/usr/local/bin:/bin:/usr/bin:/home/cuongqc/bin
[ ~]$ pwd
/home/cuongqc

 
– Thực hiện chuyển đổi sang user root với “su “.

[ ~]$ sudo su
[ ~]# whoami
root
[ ~]# pwd
/root/
[ ~]# echo $PATH
/home/cuongqc/perl5/bin:/home/cuongqc/perl5/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/easy/bin:/root/bin:/root/.local/bin:/root/bin:/bin:/usr/local/easy/bin

 
Hy vọng với 2 cái ví dụ ở trên thì bạn đã hiểu rõ hơn về sự khác biệt này.

Giới thiệu

Chắc bạn đã biết trong một phần mềm quản lý nhân viên, mỗi nhóm người hay một một người sẽ có một quyền hạn nhất định. Ví dụ như quản lý sẽ có quyền chia công việc, quản lý nhân viên của mình, còn giám đốc thì có thể thay đổi, thêm hoặc bớt các bộ phân trong công ty. Việc phân chia như vậy sẽ giúp cho việc quản lý dễ dàng và bảo mật hơn.

Điều đấy cũng sẽ đúng trong phân quyền trên Linux. Vì Linux là một bản sao được phát triển từ UNIX nên nó có khả năng chạy đa người dùng và ta có thể sử dụng việc phân quyền để đặt ra các giới hạn nhất định cho mỗi người. Trong bài này chúng ta sẽ đi qua một số khái niệm cũng như cách xem về phân quyền trên Linux nhé.

User

Đầu tiên, User (hay còn gọi là người dùng) là tài khoản dùng để đăng nhập vào hệ thống. Mỗi User sẽ chứa một mã UID (Unique identification number) hay mã xác định danh tính duy nhất, từ đó hệ thống có thể phân biệt được các người dùng với nhau.

Tất cả các thông tin về các User trong hệ thống được lưu tại địa chỉ /etc/passwd còn mật khẩu thì sẽ được hash (mã băm - mã hoá một chiều) và lưu tại /etc/shadow

Dựa vào quyền hạn truy cập thì User được chia theo 2 loại chính:

  1. Superuser/root/administrator : Loại User có quyền hạn cao nhất. Có khả năng truy cập vào mọi file có trong hệ thống.
  2. Normal user: Là loại User thường, bị giới hạn một số quyền (Ta có thể tuỳ chọn các quyền mà user này có thể làm).

Superuser

Theo như ở trên thì bạn đã biết Superuser (hay còn được gọi là root) là một User hệ thống. Ta sử dụng Superuser khi muốn sử dụng các đặc quyền mà chỉ Superuser làm được còn User thường thì không.

Thông tin: UID của Superuser/ root/ administrator trong các hệ điều hành tương tự Unix sẽ là 0 bất kể nó có tên gì.

Các đặc quyền mà Superuser có thể làm:

  • Đặc quyền thay đổi read/write/exectue
  • Tạo, tải file hay phần mềm
  • Sửa đổi files và cài đặt
  • Xoá thông tin User và data

Chú ý: Bạn phải cẩn trọng khi sử dụng Superuser vì lúc này bạn có thể thay đổi ở cấp cao nhất. Nếu bạn không biết mình đang làm gì thì không nên sử dụng.

Để đăng nhập với Superuser (root user) có 2 cách:

Cách 1. su [command]: Cho phép bạn tạm thời chuyển sang Superuser.

Lệnh này sẽ cho phép bạn đăng nhập vào Superuser. Điều đó cũng đồng nghĩa với việc tất cả các lệnh bạn nhập vào đều chạy bằng quyền cao nhất - root. Sau khi hoàn thành các câu lệnh, bạn sẽ phải đăng xuất bằng lệnh logout. Đó cũng chính là lý do su ít được sử dụng. Hãy thử tưởng tượng vào một ngày tồi tệ, bạn quên đăng xuất và vô tình thực hiện câu lệnh xoá file hệ thống. Kết cục, hệ điều hành không thể boot và data quan trọng bị xoá. Rất tệ đúng không nào. Thế nên, mình sẽ giới thiệu bạn cách thứ 2 mang tính "an toàn" hơn.

Cách 2. sudo [command]: Cho phép bạn thực thi câu lệnh dưới quyền Superuser. (Khuyên dùng)

Khác với su thì sudo không yêu cầu đăng nhập mà thay vào đó, cứ mỗi lần bạn muốn thực thi một câu lệnh bằng đặc quyền của root thì bạn phải để tiền tố sudo trước đó. Điều này giúp bạn kiểm soát được mình đang xài user nào và tránh các hậu quả đáng tiếc.

Dưới đây là 2 ví dụ tải package bằng sudosu:

Sử dụng sudo để tải package python3-pip:

Đầu tiên xem mình là user nào bằng whoami (tuỳ vào mỗi người thì Normal User sẽ có một tên khác nhau tuỳ vào bạn đặt gì vào lúc tạo).

Kết quả

Sử dụng sudo cài package:

Kết quả

Bạn chỉ cần nhập mật khẩu của User hiện tại (normalUser) là câu lệnh sẽ được thực thi.

Sử dụng su để tải package pip:

Đầu tiên xem mình là user nào bằng whoami.

Kết quả

Chuyển sang Superuser bằng su:

Kết quả

Lúc này bạn cần nhập mật khẩu của root (Đối với một số hệ điều hành, Superuser sẽ bị khoá). Sau khi nhập xong bạn sẽ thấy Terminal của bạn sẽ chuyển tiền tố $ sang # (đây cũng là một dấu hiệu nhận biết mình đang ở user thường hay root).

Kết quả

Bây giờ ta sẽ tải package, nhưng lần này sẽ không cần tiền tố sudo nữa.

Sau khi tải xong, hay nhớ đăng xuất nhé.

Linux Group

Trong Linux, Group (nhóm) là một tập hợp các user. Trong Linux, theo mặc định thì Normal User thường được xếp vào Default Group. Mục đính chính của Group là phân quyền của một hay nhiều tài nguyên cho các thành viên trong Group. Ta có thể thêm, bớt thành viên trong Group để phù hợp với mục đích. Có 2 loại group chính:

  1. Primary/ Login group (Nhóm chính/ Nhóm đăng nhập): Là nhóm được gán cho files được tạo bởi User. Thông thường, tên của nhóm chính giống với tên của người dùng. Người dùng bắt buộc phải nằm trong một nhóm chính nào đó.
  2. Secondary/ Supplementary group (Nhóm phụ/ nhóm bổ sung): Được sử dụng để cung cấp các đặc quyền nhất định cho một nhóm người dùng. Các User có thể là thành viên của không hoặc nhiều nhóm phụ.

Nhóm của người dùng chính được lưu trữ trong tệp /etc/passwd và các nhóm bổ sung (nếu có) sẽ được liệt kê trong tệp /etc/group.

Ví dụ: Bạn có một file helloworld.txt và 5 User (A, B, C, D, E). Bạn muốn phân quyền cho A, B, C được đọc nội dung, còn B, C, D được thay đổi nội dung. Lúc này phương pháp Group sẽ vô cùng hiệu quả. Ta sẽ cho A, B, C vào nhóm 1 còn B, C, D vào nhóm 2 sau đó thực hiện phân quyền. Nếu tương lai bạn muốn E cũng có khả năng đọc nội dung thì bạn chỉ cần thêm E vào nhóm 1 là xong. Rất tiện lợi và hiệu quả!

Read, write, execute trong phân quyền file

Trong linux, tất cả các file, tài nguyên đều có 3 loại quyền chính:

  • READ (Đọc): Quyền đọc cho phép bạn mở file và xem nội dung của nó. Trong trường hợp thư mục thì bạn có thể xem các thành phần con trong nó.
  • WRITE (Viết): Quyền viết hay ghi cho phép bạn thay đổi nội dung của file. Trong trường hợp thư mục thì bạn có thể thay đổi vị trí, xoá, thêm các thành phần con trong nó
  • EXECUTE (Thực thi): Quyền thực thi cho phép bạn chạy file.

Tìm hiểu user root trong linux

Lưu ý rằng, bạn có quyền viết thư mục nhưng không có nghĩa là bạn có thể thay đổi các nội dung file con của nó và ngược lại. Ví dụ bạn có quyền viết một file /abc/bbc/helloworld.txt nhưng chỉ có quyền đọc thư mục /abc/bbc/, lúc đó bạn chỉ có thể thay đổi nội dung file helloworld.txt nhưng không thể thay đổi vị trí, xoá hay đổi tên của nó được.

Xem phân quyền của một file

Xem thông tin phân quyền của một file hay thư mục bạn có thể sử dụng lệnh ls. Để biết thêm các thông số khác thì thêm -l ở phía sau, lúc này thông tin sẽ thể hiện dưới dạng long format như sau:

Ta sẽ thu được kết quả theo định dạng sau:

Kết quả

Tìm hiểu user root trong linux
Trong đó:

  • Permission: Các quyền của file.
  • Owner: Chủ sở hữu của file.
  • Group: Nhóm mà chủ sở hữu thuộc vào.
  • Date created: Ngày tạo file

Ở trong Permission sẽ là chi tiết các quyền của các loại user khác nhau:

Tìm hiểu user root trong linux

  • File Type (loại têp): Có ba loại là Tệp thông thường (-)/ Thư mục (d)/ Liên kết (i).
  • User: Quyền đối với người dùng (chủ sở hữu)
  • Group: Quyền đối với nhóm của chủ sở hữu
  • Other: Quyền đối với những người dùng khác

Ở ví dụ trên ta có thể thấy UserGroup có quyền read, write còn Other chỉ có quyền read.

Để hiểu thêm thì chúng ta cùng xem thêm một vài ví dụ:

  • - rw- --- --- : File thường, User read, write.
  • - rwx r-x r-x : File thường, User read,write, execute, Group read, execute, Other read,execute.
  • d rw- r-x --- : Thư mục, User read, write, Group read, execute.
  • i rwx r-- r-- : Link, User read,write, execute, Group read, Other read.

Các mode (chế độ) chỉnh sửa phân quyền

Để thay đổi phân quyền của một file hay một thư mục ta có thể sử dụng lệnh chmod. Dựa vào cách trình bày thì ta có thể chia thành 2 chế độ

  1. Symbolic Mode: Sử dụng ký tự để phân puyền.
  2. Numeric Mode: Sử dụng mã bát phân để phân quyền

2 mode này hoạt động khác nhau nhưng đều sử dụng chung một syntax:

SYMBOLIC MODE

Đây là một mode rất được ưa thích cho người mới sử dụng vì cách trình bày rất dễ học. Symbolic sử dụng các ký tự để quy ước loại user.:

  • User (u)
  • Group (g)
  • Other (o)
  • All (a)

Và các quyền hạn:

  • Read (r)
  • Write (w)
  • Execute (x)

Ngoài ra ta còn có thêm các signs (biểu thị toán học) + - = để phục vụ cho mục đích tinh chỉnh theo ý muốn từng loại quyền với từng loại user khác nhau:

  • (+): Thêm quyền lên đầu các quyền hiện có.
  • (-): Xoá quyền khỏi các quyền hiện có.
  • (=): Ghi đè lên các quyền hiện có

Bây giờ ta sẽ đi qua các ví dụ để hiểu hơn cách Symbolic mode hoạt động nhé:

Ví dụ 1: u+w,o-r

Đầu tiên sẽ là User kí hiệu là (u) thêm quyền write (+w), sau đó Other kí hiệu là (o) bị xoá quyền read (-r).

Ví dụ 2: a=rwx

All User(a) được ghi đè (=) quyền read(r), write(w), execute(x).

Tìm hiểu user root trong linux

Thực hành: Để thực hiện thay đổi các quyền trên Linux bằng chế độ Symbolic thì ta sử sụng cú pháp sau:

Ví dụ bạn muốn thay đổi quyền file helloworld.txt như ví dụ 1 (u+w,o-r : User thêm write, Other xoá read.):

Kết quả

NUMERIC MODE

Tiếp theo ta sẽ được tiếp xúc với một chế độ nâng cao hơn là Numeric mode. Vì sử dụng 3 chữ số bát phân thay vì ký tự như Symbolic nên chế độ này khá khó cho người mới. Tuy nhiên đây là cách khá nhanh khi chỉ sử dụng 3 chữ số để phân quyền trong khi đó Symbolic phải ghi đầy đủ ra. Nếu không có nhu cầu thêm hay xoá quyền thì mình khuyến khích các bạn sử dụng chế độ này, tuy khó nhưng sử dụng nhiều bạn sẽ quen mà thôi.

Đây là bảng thể hiện các phân quyền trên Linux trong chế độ Numeric:

Tìm hiểu user root trong linux

Hoặc đơn giản hơn bạn có thể nhớ như sau:

  • Read (r) = 4
  • Write (w)=2
  • Execute (x)=1

Ta thử nhé Read + Wite = 6, Read + Write + Execute = 4 + 2 + 1=7,... kết quả thu được sẽ giống như trên bảng đúng không nào.

Tìm hiểu user root trong linux
Việc phân quyền trên Linux cho các loại user sẽ được thể hiện dưới dạng 3 chữ số XXX thứ tự là User, Group, Other. Bây giờ mình sẽ cho các bạn một số ví dụ:

Ví dụ 1: Owner read, write, execute, group read

  • User: Read + write + execute = 4 + 2 + 1 = 7
  • Group: Read = 4
  • Other: =0
  • Ta thu được: 740

Ví dụ 2: Owner read, write, group read, execute, other read

  • User: Read + write = 4 + 2 = 6
  • Group: Read + execute = 4 + 1 = 5
  • Other: Read = 4
  • Ta thu được: 654

Thực hành: Để thực hiện thay đổi các quyền bằng chế độ Numeric thì ta sử sụng syntax sau:

Bây giờ giả sử bạn muốn thay đổi quyền file helloworld.txt như Ví dụ 1 (Owner read, write, execute, group read), bạn nhập như sau:

Kết quả

Special Permission

Ngoài 3 permission cơ bản là read, write, execute thì file/ thư mực còn có thêm 3 Special Permission (Quyền đặc biệt) khác đó là: SUID, SGID và sticky bits

SUID (Set user id):

  • Sử dụng trên các file (thường là các file thực thi - executable files) .
  • Cung cấp các đặc quyền của Owner cho User hiện tại khi thực thi file.
  • Kí hiệu của SUID là s theo Symbolic và số 4 theo Numeric.

Tìm hiểu user root trong linux

Ví dụ: Một file có chủ sở hữu là root và được set SUID bit, lúc này nếu một user khác thực thi file này thì nó luôn được chạy với đặc quyền root. Cụ thể dưới đây là file passwd sở hữu bởi root, khi thực thi lệnh ls -l, bạn có thể dễ dàng thấy kí tự s , dấu hiệu của SUID.

Kết quả

Có 2 cách để gán SUID vào file:

  • Sybolic mode: chmod u+s [file name]
  • Numeric mode: chmod 4555 [file name] ( thêm 4 vào trước permissons)

Nếu file chưa có quyền thực thi (executing file as program), SUID sẽ là chữ S (S in hoa). Để thay đổi S thành s (s in thường) bạn phải cấp quyền thực thi cho file bằng lệnh dưới đây: chmod u+x [file name].

SGID (Set group id):

  • Theo như tên gọi thì quyền này giống như SUID chỉ khác nó cung cấp các đặc quyền của Group Owner.

  • Kí hiệu của SUID là s theo Symbolic và số 2 theo Numeric.

Tìm hiểu user root trong linux
Ví dụ: Một file có nhóm chủ sở hữu là STAFF và được set SGID bit, lúc này nếu một user khác thực thi file này thì nó luôn được chạy với đặc quyền của group STAFF.

Có 2 cách để gán SGID vào file:

  • Sybolic mode: chmod g+s [file name]
  • Numeric mode: chmod 2555 [file name] ( thêm 2 vào trước permissons)

Sticky bit:

  • Chỉ cho phép Ownerroot thay đổi tên, xoá file/ thư mục.
  • Sticky bit thường được sử dụng trong các file/ thư mục chia sẽ.
  • Kí hiệu của Sticky bit là t theo Symbolic và số 1 theo Numeric.

Tìm hiểu user root trong linux
Ví dụ 1: Thông thường trong hệ thống có một thư mục /tmp.

Kết quả

Theo như output phía trên, bạn sẽ thấy kí hiệu t của Stickybit ở cuối cùng của phần other. Tiếp theo, ở cột 3 chính là Owner của thư mục là root. Điều đó có nghĩa bạn chỉ có thể đổi tên, xoá file khi và chỉ khi bạn đang trong trạng thái Superuser.

Ví dụ 2: Một file test.txt sỡ hữu bởi ubuntu và chia sẽ cho user normal_user. Sau khi set Sticky bit ta được:

Kết quả

Bây giờ normal_user cố gắng xoá file sẽ bị chặn lại (Permission denied). Mặc dù other có toàn bộ quyền write.

Kết quả

Có 2 cách để gán Sticky bit vào file:

  • Sybolic mode: chmod o+t [file name]
  • Numeric mode: chmod 1555 [file name] ( thêm 1 vào trước permissons)

Thông tin: Để xoá special permission bạn thay đổi dấu + thành dấu -

Tổng kết

Phân quyền trên Linux là một kiến thức căn bản mà ai làm việc trên Linux cũng nên biết. Qua bài này mình mong các bạn sẽ hiểu thêm các quyền của file/thư mục cũng như biết cách 2 chế độ Numeric và Symboric hoạt động. Sử dụng User root khá đơn giản và mạnh mẽ tuy nhiên nó cũng tiềm tàng nhiều nguy cơ nên các bạn hãy lưu ý nhé. Hẹn các bạn vào các bài sau.