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 Ubuntu và CentOS .
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 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ể 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
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.
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:
. . .
#includedir /etc/sudoers.d
Nó 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
. . .
%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:
. . .
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 “alias command” và sử dụng alias đó trong luật cho GROUPTHREE
:
. . .
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:
. . .
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:
. . .
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:
. . .
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:
. . .
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
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 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
. . .
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
[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.
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