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

Cách chỉnh sửa tệp Sudoers

Phân tách 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 hoạt động với các quyền hạn chế để giảm phạm vi ảnh hưởng của họ tới môi trường của họ chứ không phải hệ điều hành rộng hơn.

Một user đặc biệt, được gọi là root , có các quyền của user siêu cấp . Đây là account quản trị không có giới hạn đối với user bình thường. User có thể thực hiện các lệnh với siêu user hoặc gốc quyền trong một số cách khác nhau.

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ự.

Hướng dẫn này 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 của bạn với quyền là regular user , 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ề nâng cấp 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 hỗ trợ Sudo mới cho UbuntuCentOS của ta .

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

Có ba cách cơ bản để có được quyền root , các cách này khác nhau về mức độ phức tạp của chúng.

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

Phương pháp đơn giản và dễ hiểu nhất để có được quyền root là đăng nhập trực tiếp vào server của bạn với quyền là user root .

Nếu bạn đang đăng nhập vào máy local (hoặc sử dụng tính năng console ngoài băng tần trên server ảo), hãy nhập root làm tên user của bạn 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 gốc 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 cho user root , hãy nhập password root khi được yêu cầu .

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

Đăng nhập trực tiếp bằng quyền root thường không được khuyến khích, vì rất dễ bắt đầu sử dụng hệ thống cho các việc phi quản trị, điều này rất nguy hiểm.

Cách tiếp theo để đạt được các quyền của user siêu cấp cho phép bạn trở thành user gốc bất kỳ lúc nào, khi 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 “ user thay thế”. Để có được quyền root , hãy nhập:

  • su

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

Khi bạn đã hoàn thành các việc yêu cầu quyền root , hãy quay lại shell bình thường của bạn 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 sinh ra một shell mới. Nó được 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 gốc .

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 của ta 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ể khiến bạn bị hỏng hệ thống, nơi không thể có được các quyền nâng cao, đ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 các hoạt động sudo , đây có thể là cách duy nhất của bạn để có được quyền root .

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`

Nguồn file để áp dụng các thay đổi :

  • . ~/.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 mà bạn đã chọn.

Tôi đã copy paste file từ Ubuntu 18.04, với các comment đã bị xóa. Tệp CentOS /etc/sudoers có nhiều dòng khác, một số dòng trong số đó 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 

Hãy xem những dòng này làm gì.

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 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 thư 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 gốc .

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ể gây hại.

Dòng quyền của user

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
    “TẤT CẢ” đầ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
    “TẤT CẢ” này cho biết user root có thể chạy lệnh với quyền là tất cả user .

  • root ALL=(ALL: ALL ) ALL
    “TẤT CẢ” 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
    “TẤT CẢ” cuối cùng cho biết các 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ủa ta 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 .

Dòng quyền group

Hai dòng tiếp theo tương tự như các dòng quyền của user , nhưng chúng chỉ định các 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 quản trị có thể thực hiện 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.

Dòng /etc/sudoers.d được bao gồm

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 # , mà thường chỉ ra 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 root và được áp dụng.

Các file trong folder đó tuân theo các 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 dành cho các ứng dụng thay đổi các quyền sudo khi cài đặt. Đặt tất cả các 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 phải luôn chỉnh sửa 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 việc này trên một hệ thống được cài đặt với group quản trị mục đích chung, như hệ thống Ubuntu trong hướng dẫn này, thực sự là thêm user được đề cập vào group đó.

Ví dụ: trên Ubuntu 20.04, group sudo có đầy đủ các quyền administrator . Ta có thể cấp cho user những quyền tương tự này bằng cách thêm họ 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 sẽ đạt được cùng một điều.

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 luật tùy chỉnh

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

Tệp sudoers có thể được sắp xếp dễ dàng hơn bằng cách group các thứ với nhiều loại “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 “bí danh lệnh” và sử dụng alias đó trong một 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 lệnh có tên là POWER chứa các lệnh tắt nguồn 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 hiện 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 ghi nhớ rằng các luật sau này sẽ overrides các luật trước đó khi có xung đột giữa hai bên.

Cách khóa các luật

Có một số cách mà bạn có thể kiểm soát nhiều hơn cách sudo phản ứng với cuộc gọi.

Các updatedb lệnh liên quan đến việc mlocate gói là tương đối vô hại trên một hệ thống đơn 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 "thẻ" nghĩa là không có password sẽ được yêu cầu. Nó có một lệnh đồng hành được gọi là PASSWD , đây là hành vi mặc định. Một thẻ có liên quan đến phần còn lại của luật trừ khi bị thẻ "sinh đôi" của nó đè lên sau đó xuống dòng.

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 thẻ hữu ích khác là NOEXEC , được dùng để ngăn chặn một số hành vi nguy hiểm trong một số chương trình nhất định.

Ví dụ: một số chương trình, chẳng hạn như less , có thể tạo ra các lệnh khác bằng lệnh lệnh này từ bên trong giao diện của chúng:

!command_to_run 

Về cơ bản, lệnh này thực thi bất kỳ lệnh nào mà user cung cấp cho nó với các quyền tương tự mà lệnh less đang chạy dưới đó, có thể khá nguy hiểm.

Để hạn chế điều này, ta có thể sử 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 khi giao dịch với sudo .

Nếu bạn đã chỉ định user hoặc group "chạy dưới dạng" 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 hết giờ.

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 hợp đồng thuê sudo , bạn luôn có thể nhập:

  • sudo -v

Bạn sẽ được yêu cầu 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 khung thời gian 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ủa bạn , có thể chạy lệnh:

  • sudo -l

Điều này sẽ liệt kê tất cả các luật trong file /etc/sudoers áp dụng cho user của bạn. Điều này cung cấp cho bạn một ý tưởng tốt về những gì bạn sẽ hoặc sẽ không được phép làm với sudo với quyền là mọi user .

Có rất 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 quyền thành lệnh quyền .

Để giải trí, bạn 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 sự xúc phạm 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 user siêu cấp không được cấp cho user thường xuyên vì một lý do. Điều cần thiết là bạn phải hiểu những gì mỗi lệnh mà bạn thực thi với quyền root . Đừng coi nhẹ trách nhiệm. Tìm hiểu cách tốt nhất để sử dụng các công cụ này cho trường hợp sử dụng của bạn và khóa mọi chức năng không cần thiết.


Tags:

Các tin liên quan