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 Ubuntu và CentOS 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 Ubuntu và CentOS để 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 
OutputThere 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.
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 :
. . .  #includedir /etc/sudoers.d Nó 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 
. . . %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:
. . . 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:
. . . 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 :
. . . 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:
. . . 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:
. . . 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:
. . . 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:
. . . 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 và -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 
. . . 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.
Các tin liên quan
 

