Thứ ba, 07/07/2020 | 00:00 GMT+7

Cấu hình sudoers file trên Ubuntu và Centos

Phân quyền là một trong những mô hình bảo mật cơ bản được thực hiện trong các hệ điều hành giống như Linux và Unix. Regular user (user-thường) hoạt động với các quyền hạn chế để giảm phạm vi ảnh hưởng. Một user đặc biệt, được gọi là root , có các quyền của superuser (user-siêu-cấp) . Đây là account quản trị không có giới hạn quyền.  Trong bài viết này, ta sẽ thảo luận về cách lấy các quyền root một cách chính xác và an toàn, đặc biệt tập trung vào chỉnh sửa file /etc/sudoers .

Ta sẽ hoàn thành các bước này trên server Ubuntu 20.04, nhưng hầu hết các bản phân phối Linux hiện đại như Debian và CentOS sẽ hoạt động theo cách tương tự.

Giả định bạn đã hoàn thành cài đặt server ban đầu được thảo luận ở đây. Đăng nhập vào server với quyền là regular user (user-thường), không phải root và tiếp tục bên dưới.

Lưu ý: Hướng dẫn này đi sâu về việc leo thang quyền và file sudoers . Nếu bạn chỉ muốn thêm quyền sudo cho user, hãy xem Hướng dẫn bắt đầu nhanh User mới hỗ trợ Sudo cho UbuntuCentOS .

Làm thế nào để có quyền root

Có ba cách cơ bản để có được quyền root.

Đăng nhập với quyền root

Phương pháp đơn giản là đăng nhập trực tiếp vào server với quyền là user root .

Nếu bạn đang đăng nhập vào một máy local, hãy nhập root làm tên user tại dấu nhắc đăng nhập và nhập password root khi được yêu cầu.

Nếu bạn đang đăng nhập qua SSH, hãy chỉ định user root trước địa chỉ IP hoặc domain trong chuỗi kết nối SSH của bạn:

  • ssh root@server_domain_or_ip

Nếu bạn chưa cài đặt SSH key (khóa-SSH) cho user root , hãy nhập password root khi được yêu cầu.

Sử dụng su để trở thành Root

Cách tiếp theo để đạt được các quyền của superuser cho phép bạn trở thành user root bất kỳ lúc nào bạn cần.

Ta có thể làm điều này bằng cách gọi lệnh su , viết tắt của “substitute user”. Để có được quyền root , hãy nhập:

  • su

Bạn cần nhập password của user root , sau đó, bạn sẽ được đưa vào phiên shell root .

Khi bạn đã ở quyền root, có thể quay lại shell user thường bằng lệnh:

  • exit

Sử dụng sudo để thực thi lệnh dưới dạng root

Cách cuối cùng để có được quyền root mà ta sẽ thảo luận là sử dụng sudo .

Lệnh sudo cho phép bạn thực hiện các lệnh một lần với quyền root mà không cần tạo ra một shell mới. Nó thực thi như thế này:

  • sudo command_to_execute

Không giống như su , sudo sẽ yêu cầu password của user hiện tại , không phải password root .

Do các tác động bảo mật của nó, quyền truy cập sudo không được cấp cho user theo mặc định và phải được cài đặt trước khi nó hoạt động chính xác. Hãy xem Hướng dẫn bắt đầu nhanh User hỗ trợ Sudo mới dành cho UbuntuCentOS để tìm hiểu cách cài đặt user hỗ trợ sudo .

Trong phần sau, ta sẽ thảo luận chi tiết hơn về cách sửa đổi cấu hình sudo .

Visudo là gì?

Lệnh sudo được cấu hình thông qua một file nằm tại /etc/sudoers .

Cảnh báo: Không bao giờ chỉnh sửa file này bằng editor thông thường! Luôn sử dụng lệnh visudo để thay thế!

Vì cú pháp không đúng trong file /etc/sudoers có thể làm hỏng hệ thống, điều quan trọng là phải sử dụng lệnh visudo để chỉnh sửa file.

Lệnh visudo mở một editor như bình thường, nhưng nó xác thực cú pháp của file khi lưu. Điều này ngăn lỗi cấu hình chặn hoạt động sudo.

Theo truyền thống, visudo mở file /etc/sudoers bằng editor vi . Tuy nhiên, Ubuntu đã cấu hình visudo để sử dụng editor nano .

Nếu bạn muốn thay đổi nó trở lại vi , hãy sử dụng lệnh sau:

  • sudo update-alternatives --config editor
Output
There are 4 choices for the alternative editor (providing /usr/bin/editor).

  Selection    Path                Priority   Status
------------------------------------------------------------
* 0            /bin/nano            40        auto mode
  1            /bin/ed             -100       manual mode
  2            /bin/nano            40        manual mode
  3            /usr/bin/vim.basic   30        manual mode
  4            /usr/bin/vim.tiny    10        manual mode

Press <enter> to keep the current choice[*], or type selection number:

Chọn số tương ứng với lựa chọn bạn muốn thực hiện.

Trên CentOS, bạn có thể thay đổi giá trị này bằng cách thêm dòng sau vào ~/.bashrc của bạn:

  • export EDITOR=`which name_of_editor`

Áp dụng các thay đổi với lệnh:

  • . ~/.bashrc

Sau khi bạn đã cấu hình visudo , hãy thực hiện lệnh để truy cập file /etc/sudoers :

  • sudo visudo

Cách sửa đổi file Sudoers

Bạn sẽ thấy file /etc/sudoers trong editor đã chọn của bạn.

Tôi đã copy paste file từ Ubuntu 18.04, với các comment đã xóa. File CentOS /etc/sudoers có nhiều dòng khác, một số dòng trong đó ta sẽ không thảo luận trong hướng dẫn này.

/ etc / sudoers
Defaults        env_reset
Defaults        mail_badpass
Defaults        secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin"

root    ALL=(ALL:ALL) ALL

%admin ALL=(ALL) ALL
%sudo   ALL=(ALL:ALL) ALL

#includedir /etc/sudoers.d

Ta hãy nhìn vào những gì những dòng này làm.

Dòng mặc định

Dòng đầu tiên, “env_reset mặc định”, đặt lại môi trường terminal để loại bỏ bất kỳ biến user nào. Đây là một biện pháp an toàn được sử dụng để loại bỏ các biến môi trường có thể gây hại ra khỏi phiên sudo .

Dòng thứ hai, Defaults mail_badpass , yêu cầu hệ thống gửi thông báo qua email về các lần thử password sudo không hợp lệ tới user mailto cấu hình. Theo mặc định, đây là account root .

Dòng thứ ba, bắt đầu bằng “Defaults secure_path =…”, chỉ định PATH (các vị trí trong hệ thống file mà hệ điều hành sẽ tìm kiếm các ứng dụng) sẽ được sử dụng cho các hoạt động sudo . Điều này ngăn việc sử dụng các đường dẫn user có thể có hại.

User Privilege Lines

Dòng thứ tư, quy định các quyền sudo của user root , khác với các dòng trước đó. Hãy xem ý nghĩa của các trường khác nhau:

  • root ALL=(ALL:ALL) ALL
    Trường đầu tiên cho biết tên user mà luật sẽ áp dụng cho ( root ).

  • root ALL =(ALL:ALL) ALL
    "ALL" đầu tiên cho biết rằng luật này áp dụng cho tất cả các server.

  • root ALL=( ALL :ALL) ALL
    ALL” này cho biết user root có thể chạy các lệnh với quyền là tất cả user.

  • root ALL=(ALL: ALL ) ALL
    ALL” này cho biết user root có thể chạy các lệnh với quyền là tất cả các group.

  • root ALL=(ALL:ALL) ALL
    ALL” cuối cùng cho biết các rule (luật) này áp dụng cho tất cả các lệnh.

Điều này nghĩa là user root có thể chạy bất kỳ lệnh nào bằng sudo , miễn là họ cung cấp password của bạn.

Group Privilege Lines

Hai dòng tiếp theo tương tự như các dòng quyền user, nhưng chúng chỉ định luật sudo cho các group.

Tên bắt đầu bằng % cho biết tên group.

Ở đây, ta thấy group admin có thể thực thi bất kỳ lệnh nào với quyền là mọi user trên bất kỳ server nào. Tương tự, group sudo có các quyền giống nhau, nhưng cũng có thể thực thi như bất kỳ group nào.

Included /etc/sudoers.d Line

Dòng cuối cùng thoạt nhìn có thể giống như một comment:

/ etc / sudoers
. . .

#includedir /etc/sudoers.d

bắt đầu với một # , như một comment. Tuy nhiên, dòng này thực sự cho biết các file trong folder /etc/sudoers.d cũng sẽ có nguồn gốc và được áp dụng.

Các file trong folder đó tuân theo các rule (luật) tương tự như file /etc/sudoers . Các file nào không kết thúc bằng ~ và không có dấu . trong đó sẽ được đọc và nối vào cấu hình sudo .

Điều này chủ yếu nghĩa là để các ứng dụng thay đổi các quyền sudo khi cài đặt. Đặt tất cả các rule (luật) được liên kết trong một file duy nhất trong folder /etc/sudoers.d có thể giúp bạn dễ dàng xem quyền nào được liên kết với account nào và đảo ngược thông tin đăng nhập một cách dễ dàng mà không cần phải cố gắng thao tác trực tiếp file /etc/sudoers .

Cũng như với chính file /etc/sudoers , bạn nên luôn chỉnh sửa các file trong folder /etc/sudoers.d bằng visudo . Cú pháp để chỉnh sửa các file này sẽ là:

  • sudo visudo -f /etc/sudoers.d/file_to_edit

Cách cung cấp quyền Sudo cho user

Thao tác phổ biến nhất mà user muốn thực hiện khi quản lý quyền sudo là cấp quyền truy cập sudo chung cho user mới. Điều này rất hữu ích nếu bạn muốn cấp cho một account toàn quyền truy cập quản trị vào hệ thống.

Cách dễ nhất để thực hiện, như hệ thống Ubuntu trong hướng dẫn này, là thêm user vào group đó.

Ví dụ: trên Ubuntu 20.04, group sudo có đầy đủ quyền admin. Ta có thể cấp cho user những quyền tương tự này bằng cách thêm user vào group như sau:

  • sudo usermod -aG sudo username

Lệnh gpasswd cũng được dùng:

  • sudo gpasswd -a username sudo

Cả hai cho cùng một kết quả.

Trên CentOS, đây thường là group wheel thay vì group sudo :

  • sudo usermod -aG wheel username

Hoặc, sử dụng gpasswd :

  • sudo gpasswd -a username wheel

Trên CentOS, nếu việc thêm user vào group không hoạt động ngay lập tức, bạn có thể phải chỉnh sửa file /etc/sudoers để bỏ ghi chú tên group:

  • sudo visudo
/ etc / sudoers
. . .
%wheel ALL=(ALL) ALL
. . .

Cách cài đặt custom rules

Bây giờ ta đã làm quen với cú pháp chung của file, hãy tạo một số luật mới.

Cách tạo alias (bí-danh)

File sudoers có thể được sắp xếp dễ dàng hơn bằng cách group mọi thứ với nhiều loại “alias (bí-danh)”.

Ví dụ: ta có thể tạo ba group user khác nhau với quyền thành viên chồng chéo:

/ etc / sudoers
. . .
User_Alias      GROUPONE = abby, brent, carl
User_Alias      GROUPTWO = brent, doris, eric, 
User_Alias      GROUPTHREE = doris, felicia, grant
. . .

Tên group phải bắt đầu bằng chữ in hoa. Sau đó, ta có thể cho phép các thành viên của GROUPTWO cập nhật database apt bằng cách tạo một luật như sau:

/ etc / sudoers
. . .
GROUPTWO    ALL = /usr/bin/apt-get update
. . .

Nếu ta không chỉ định user / group để chạy, như ở trên, sudo mặc định là user root .

Ta có thể cho phép các thành viên của GROUPTHREE tắt và khởi động lại máy bằng cách tạo “alias command” và sử dụng alias đó trong luật cho GROUPTHREE

/ etc / sudoers
. . .
Cmnd_Alias      POWER = /sbin/shutdown, /sbin/halt, /sbin/reboot, /sbin/restart
GROUPTHREE  ALL = POWER
. . .

Ta tạo một alias command lệnh gọi là POWER chứa các lệnh tắt và khởi động lại máy. Sau đó, ta cho phép các thành viên của GROUPTHREE thực hiện các lệnh này.

Ta cũng có thể tạo alias “Run as”, có thể thay thế một phần của luật chỉ định user thực thi lệnh dưới dạng:

/ etc / sudoers
. . .
Runas_Alias     WEB = www-data, apache
GROUPONE    ALL = (WEB) ALL
. . .

Điều này sẽ cho phép bất kỳ ai là thành viên của GROUPONE thực hiện các lệnh với quyền là user www-data hoặc user apache .

Chỉ cần lưu ý các rule (luật) sau này sẽ ghi đè các rule trước đó khi có xung đột giữa hai bên.

Cách khóa các rule (luật)

Ví dụ Lệnh updatedb có thể là vô hại trên hệ thống một user. Nếu ta muốn cho phép user thực thi nó với quyền root mà không cần phải nhập password, ta có thể tạo một luật như sau:

/ etc / sudoers
. . .
GROUPONE    ALL = NOPASSWD: /usr/bin/updatedb
. . .

NOPASSWD là một "tag" nghĩa là không có password sẽ được yêu cầu. Nó có một gọi là PASSWD đi kèm mặc định 

Ví dụ, ta có thể có một dòng như thế này:

/ etc / sudoers
. . .
GROUPTWO    ALL = NOPASSWD: /usr/bin/updatedb, PASSWD: /bin/kill
. . .

Một tag khác là NOEXEC , được dùng để ngăn chặn thực thi lệnh.

Ví dụ để cấm lệnh less, ta dùng một dòng như sau:

/ etc / sudoers
. . .
username  ALL = NOEXEC: /usr/bin/less
. . .

Thông tin linh tinh

Có một số thông tin khác có thể hữu ích với sudo .

Nếu bạn đã chỉ định user hoặc group "run as" trong file cấu hình, bạn có thể thực thi các lệnh với quyền là những user đó bằng cách sử dụng cờ -u-g , tương ứng:

  • sudo -u run_as_user command
  • sudo -g run_as_group command

Để thuận tiện, theo mặc định, sudo sẽ lưu chi tiết xác thực của bạn trong một khoảng thời gian nhất định trong một terminal. Điều này nghĩa là bạn sẽ không phải nhập lại password của bạn cho đến khi timerout. 

Vì mục đích bảo mật, nếu bạn muốn xóa bộ hẹn giờ này khi chạy xong các lệnh quản trị, bạn có thể chạy:

  • sudo -k

Mặt khác, nếu bạn muốn "sử dụng" sudo để không bị nhắc sau này hoặc để gia hạn timerout sudo , bạn luôn có thể nhập:

  • sudo -v

Bạn cần nhập password của bạn, password này sẽ được lưu vào bộ nhớ đệm để sử dụng sudo sau này cho đến khi hết timerout sudo .

Nếu bạn chỉ đơn giản là tự hỏi loại quyền nào được xác định cho tên user, có thể chạy lệnh:

  • sudo -l

Điều này sẽ liệt kê tất cả các rule (luật) trong file /etc/sudoers áp dụng cho user.

Có nhiều lần khi bạn thực hiện một lệnh và nó sẽ bị lỗi vì bạn quên mở đầu bằng sudo . Để tránh phải nhập lại lệnh, bạn có thể tận dụng chức năng bash nghĩa là "lặp lại lệnh cuối cùng":

  • sudo !!

Dấu chấm than kép sẽ lặp lại lệnh cuối cùng. Ta đã đặt trước nó với sudo để nhanh chóng thay đổi lệnh không có quyền thành lệnh có quyền.

Để thư giãn, ta có thể thêm dòng sau vào file /etc/sudoers bằng visudo :

  • sudo visudo
/ etc / sudoers
. . .
Defaults    insults
. . .

Điều này sẽ khiến sudo trả lại một câu ngớ ngẩn khi user nhập sai password cho sudo . Ta có thể sử dụng sudo -k để xóa password đã lưu trong bộ nhớ cache sudo trước đó để dùng thử:

  • sudo -k
  • sudo ls
Output
[sudo] password for demo:    # enter an incorrect password here to see the results
Your mind just hasn't been the same since the electro-shock, has it?
[sudo] password for demo: 
My mind is going. I can feel it.

Kết luận

Đến đây bạn sẽ có hiểu biết cơ bản về cách đọc và sửa đổi file sudoers cũng như nắm được các phương pháp khác nhau mà bạn có thể sử dụng để có được quyền root .

Lưu ý, quyền của superuser không được cấp cho regular user (user-thường). Điều cần thiết là ta phải hiểu tác dụng các  lệnh thực thi với quyền root


Tags:

Các tin trước

Tạo sudo cho user mới trên Ubuntu 20.04 [Quickstart] 2020-06-22
Cài đặt và sử dụng Docker trên Ubuntu 20.04 2020-06-09
Cài đặt Node.js trên Ubuntu 20.04 2020-05-08
Cài đặt và cấu hình VNC trên Ubuntu 18.04 2020-05-07
Cài đặt Java với Apt trên Ubuntu 20.04 2020-05-07
Cài đặt Java bằng apt trên Ubuntu 18.04 2020-05-07
Cài đặt Nginx trên Ubuntu 18.04 2020-05-06
Cài đặt và bảo mật phpMyAdmin trên Ubuntu 20.04 2020-05-04
Cài đặt và bảo mật Redis trên Ubuntu 18.04 2020-04-30
Bảo mật apache với let-s-encrypt trên Ubuntu 20.04 2020-04-29