Sự khác biệt giữa các lệnh su và sudo trong Linux

Tác giả sysadmin, T.M.Hai 21, 2022, 04:59:03 CHIỀU

« Chủ đề trước - Chủ đề tiếp »

0 Thành viên và 1 Khách đang xem chủ đề.

Sự khác biệt giữa các lệnh su và sudo trong Linux


"Sự khác biệt giữa lệnh su và sudo là gì?" Là câu hỏi thường gặp đối với những người mới sử dụng hệ điều hành dựa trên *nix mà chúng tôi sẽ giải thích và trả lời tại đây.


Để thảo luận về sự khác biệt, trước tiên chúng ta hãy thiết lập mỗi lệnh thực sự làm gì với một số ví dụ.

1. Lệnh su

Lệnh su cho phép bạn xác định người dùng của mình và chạy các lệnh của bạn với tư cách là một số người dùng khác dưới ID người dùng của họ.

Khi bạn chạy su mà không có bất kỳ đối số nào, nó sẽ cố gắng mở shell gốc theo mặc định và do đó sẽ nhắc bạn nhập mật khẩu gốc để tiếp tục. Sau khi nhập mật khẩu gốc, bạn hiện là người dùng gốc và mọi thứ bạn chạy trong phiên này sẽ được chạy với quyền root.

Mã nguồn [Chọn]
[user1@centos7 ~]$ whoami
user1
[user1@centos7 ~]$ su
Password:
[root@centos7 user1]# whoami
root

Ngoài ra, bạn có thể chỉ định người dùng mà bạn muốn thay đổi, thường yêu cầu mật khẩu của họ trừ khi bạn là người chủ.

Mã nguồn [Chọn]
[root@centos7 ~]# su - user1
Last login: Tue Aug 30 11:30:32 AEST 2016 on pts/0
[user1@centos7 ~]$ whoami
user1
[user1@centos7 ~]$ su - user2
Password:
Last login: Tue Aug 30 11:29:59 AEST 2016 on pts/0

Như được hiển thị nếu user1 muốn chuyển sang user2, họ cần mật khẩu, tuy nhiên root có thể chuyển sang bất kỳ người dùng nào khác mà không cần cung cấp mật khẩu.

Mặc dù không bắt buộc phải chỉ định '-', nhưng khuyến nghị cho trình bao tương tác. Như được hiển thị bên dưới nếu chúng ta chuyển đổi người dùng mà không chỉ định '-' thì đường dẫn hoặc thư mục làm việc hiện tại của /root sẽ không bị thay đổi, điều này có thể gây ra sự cố khi user1 chạy các lệnh.

Mã nguồn [Chọn]
[root@centos7 ~]# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
[root@centos7 ~]# su user1
[user1@centos7 root]$ echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
[user1@centos7 root]$ exit
exit
[root@centos7 ~]# su - user1
Last login: Tue Aug 30 11:32:02 AEST 2016 on pts/0
[user1@centos7 ~]$ echo $PATH
/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/user1/.local/bin:/home/user1/bin

Về cơ bản, bạn hầu như luôn muốn sử dụng '-' khi sử dụng su.

Chúng tôi không chỉ phải nhập trình bao của người dùng mới, chúng tôi có thể tùy ý thực thi các lệnh với tư cách là người dùng đó bằng cờ -c.

Mã nguồn [Chọn]
[user1@centos7 ~]$ su -c whoami
Password:
root

Bây giờ chúng ta đã hiểu lệnh su, hãy xem sudo cung cấp những gì.

2. Lệnh sudo

Mặt khác, lệnh s uper ser do hoặc sudo cho phép bạn chạy một lệnh với quyền root từ người dùng hiện tại của mình. Theo mặc định, điều này sẽ yêu cầu bạn cung cấp lại mật khẩu của mình như một biện pháp bảo mật.

Tài khoản người dùng không phải root yêu cầu đặc quyền sudo để thực hiện việc này và điều này thường được thiết lập bằng cách thêm người dùng hoặc nhóm vào tệp /etc/sudoers hoặc bằng cách thêm người dùng vào nhóm bánh xe.

Mã nguồn [Chọn]
The Difference Between su and sudo Commands In Linux
Posted by Jarrod on April 26, 2017 Leave a comment (2) Go to comments

"What is the difference between the su and sudo commands?" Is a question commonly asked to those new to *nix based operating systems that we'll explain and answer here.

In order to discuss the differences, let's first establish what each command actually does with some examples.

The su Command

The su command allows you to swtich user and run your commands as some other user under their user ID.

When you run su without any arguments, it will try to open up a root shell by default and will therefore prompt you for the root password to proceed. After entering the root password, you are now the root user and anything you run during this session will be run as root.

[user1@centos7 ~]$ whoami
user1
[user1@centos7 ~]$ su
Password:
[root@centos7 user1]# whoami
root

Alternatively you can specify the user that you want to change to, which generally requires their password unless you are root.

[root@centos7 ~]# su - user1
Last login: Tue Aug 30 11:30:32 AEST 2016 on pts/0
[user1@centos7 ~]$ whoami
user1
[user1@centos7 ~]$ su - user2
Password:
Last login: Tue Aug 30 11:29:59 AEST 2016 on pts/0

As shown if user1 wants to switch to user2 they need the password, however root can switch to any other user without providing the password.

While it is not required that the '-' be specified, it is recommended for an interactive shell. As shown below if we switch user without specifying '-' the path or current working directory of /root are not changed, which may cause problems when user1 goes to run commands.

[root@centos7 ~]# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
[root@centos7 ~]# su user1
[user1@centos7 root]$ echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
[user1@centos7 root]$ exit
exit
[root@centos7 ~]# su - user1
Last login: Tue Aug 30 11:32:02 AEST 2016 on pts/0
[user1@centos7 ~]$ echo $PATH
/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/user1/.local/bin:/home/user1/bin

Essentially you almost always want to make use of the '-' when using su.

We don't just have to enter a shell of the new user, we can optionally execute commands as that user with the -c flag.

[user1@centos7 ~]$ su -c whoami
Password:
root

Now that we understand the su command, let's see what sudo has to offer.
The sudo Command

The super user do, or sudo command on the other hand instead allows you to run a command as root from your current user. By default this will require you to provide your password again as a security measure.

The non root user account requires sudo privileges to do this, and this is normally setup by either adding the user or group to the /etc/sudoers file, or by adding the user to the wheel group.

[root@centos7 ~]# usermod -aG wheel user1
[root@centos7 ~]# id user1
uid=1000(user1) gid=1000(user1) groups=1000(user1),10(wheel)
[root@centos7 ~]# su - user1
Last login: Tue Aug 30 11:42:46 AEST 2016 on pts/0
[user1@centos7 ~]$ sudo whoami

We trust you have received the usual lecture from the local System
Administrator. It usually boils down to these three things:

    #1) Respect the privacy of others.
    #2) Think before you type.
    #3) With great power comes great responsibility.

[sudo] password for user1:
root

Trong ví dụ này, người dùng root thêm user1 vào nhóm bánh xe, được xác định trong tệp cấu hình /etc/sudoers để cung cấp các đặc quyền của root thông qua lệnh sudo. Từ đó, chúng tôi chạy lệnh whoami với quyền root bằng sudo và sau khi cung cấp mật khẩu của người dùng1, chúng tôi được thông báo rằng chúng tôi đã root. Lưu ý rằng chúng tôi không bị rơi vào trình bao gốc sau này.

Sau khi nhập mật khẩu của người dùng lần đầu tiên cho sudo, lần sử dụng sudo tiếp theo không yêu cầu mật khẩu, như minh họa bên dưới. Ở đây chúng ta cũng thấy rằng user1 không có quyền tự liệt kê nội dung của /root, tuy nhiên nó hoạt động bình thường với sudo.

Mã nguồn [Chọn]
[user1@centos7 ~]$ ls -l /root
ls: cannot open directory /root: Permission denied
[user1@centos7 ~]$ sudo ls -l /root
total 3244
-rw-------. 1 root root     984 Aug 29 14:21 anaconda-ks.cfg

Chúng ta cũng có thể sử dụng sudo kết hợp với lệnh su để nhập shell gốc tương tác, thay vì nhập mọi lệnh bằng tiền tố sudo.

Mã nguồn [Chọn]
[user1@centos7 ~]$ sudo su -
Last login: Tue Aug 30 11:49:01 AEST 2016 on pts/0
[root@centos7 ~]# whoami
root

Tương tự, chúng ta có thể lấy một shell với cờ -i.

Mã nguồn [Chọn]
[user1@centos7 ~]$ sudo -i
[sudo] password for user1:
[root@centos7 ~]# whoami
root

Để xác định các lệnh cụ thể có thể được thực thi với quyền root, chúng tôi sửa đổi tệp /etc/sudoers. Ví dụ: chúng ta có thể thêm cấu hình bên dưới vào tệp /etc/sudoers để cho phép user1 thực hiện các lệnh systemctl, cho phép họ dừng và bắt đầu các dịch vụ bằng cách sử dụng sudo (trong số nhiều thứ khác, systemctl có thể làm được rất nhiều trong RHEL 7).

Mã nguồn [Chọn]
user1   ALL=(ALL) /bin/systemctl
Đây sẽ là tất cả những gì họ có thể làm với sudo, mọi nỗ lực khác sẽ bị từ chối.

Mã nguồn [Chọn]
[user1@centos7 ~]$ sudo systemctl restart httpd
[user1@centos7 ~]$ sudo ls /root
Sorry, user user1 is not allowed to execute '/bin/ls /root' as root on centos7.example.com.
[user1@centos7 ~]$ exit
logout
[root@centos7 ~]# su - user2
Last login: Tue Aug 30 12:42:20 AEST 2016 on pts/0
[user2@centos7 ~]$ sudo systemctl restart httpd
user2 is not in the sudoers file.  This incident will be reported.

Theo dự kiến, user1 có thể khởi động lại Apache, nhưng user2 thì không được phép. Chúng tôi cũng thấy rằng user1 không thể thực hiện các tác vụ khác yêu cầu root, chẳng hạn như liệt kê nội dung của thư mục /root.

3. Sự khác biệt giữa su và sudo

Với những lời giải thích rõ ràng cho mỗi lệnh, hy vọng bạn có thể thấy sự khác biệt chính giữa hai lệnh.

Chúng thực sự khá giống nhau ở một số khía cạnh, lệnh 'su' về cơ bản tương đương với 'sudo -i', trong khi lệnh 'sudo' về cơ bản tương đương với 'su -c'.

Một điểm khác biệt chính là ai lấy được mật khẩu gốc. Nếu người dùng muốn su để root thì họ yêu cầu mật khẩu của tài khoản root. Thay vào đó, nếu người dùng đang thực thi một lệnh với sudo, họ chỉ cần mật khẩu và đặc quyền sudo của riêng họ. Do đó, nếu bạn có nhiều người dùng yêu cầu quyền root trên hệ thống, việc cung cấp quyền truy cập sudo được coi là an toàn hơn vì chúng tôi có thể kiểm tra các lệnh đã được thực thi bởi người dùng cụ thể mà không chia sẻ mật khẩu của người dùng root với người khác.

Theo mặc định, người dùng không phải root có thể sử dụng đặc quyền sudo để thay đổi mật khẩu gốc, tuy nhiên, tệp /etc/sudoers có thể được sử dụng để chỉ cấp quyền truy cập root cho các lệnh cụ thể mà người dùng cần chạy với quyền root thay vì có thể chạy bất kỳ thứ gì như nguồn gốc. Với sudo, chúng tôi có thể xác định chính sách bảo mật, cho phép một nhóm người dùng chỉ thực hiện một tập hợp con cụ thể các lệnh được xác định rõ ràng với tư cách là người dùng root.

Chúng tôi đã đề cập đến những gì các lệnh su và sudo thường được sử dụng để làm gì, sau đó nêu ra sự khác biệt giữa hai lệnh này.

Mặc dù cả hai đều là các lệnh hữu ích để chạy các lệnh có quyền root, sudo thường được coi là tùy chọn tốt hơn vì chúng tôi không cần chia sẻ mật khẩu của người dùng root và chúng tôi có thể định cấu hình chính sách cụ thể để chỉ cho phép thực thi một tập hợp con các lệnh bắt buộc với quyền root trên cơ sở mỗi người dùng hoặc nhóm.

Hy vọng rằng hướng dẫn này đã chỉ ra rằng có thời gian và địa điểm cho cả hai lệnh, tùy thuộc vào những gì bạn đang cố gắng đạt được.