zalo-icon
facebook-icon
phone-icon
User, Group và Permission trong Linux | Linux Security Fundamentals
Hướng dẫn User, Group và Permission trong Linux, thiết kế quyền tối thiểu, ACL, umask, sudo và kiểm thử truy cập cho Data Pipeline.

Phần lớn sự cố permission không nên được sửa bằng chmod 777. Cách đúng là hiểu chủ sở hữu, group, mode, ACL, umask và quyền của tiến trình.

Bài viết xây mô hình quyền cho một data pipeline có vùng raw chỉ đọc, vùng staging được ghi bởi service và báo cáo được chia sẻ với BI.

Sản phẩm người đọc sẽ hoàn thành

Sau bài viết, người học hoàn thành một permission matrix, nhóm người dùng, service account và bộ kiểm thử truy cập cho pipeline. Project được tổ chức thành các thư mục src, config, logs, tests và evidence. README ghi rõ phiên bản Ubuntu, kiến trúc máy, user thực thi, cách chạy, cách kiểm thử và cách khôi phục.

Sudo an toàn và kiểm thử quyền truy cập
Umask setgid và ACL
Quyền thư mục và ownership
Quyền read write execute trong Linux
User UID và Group trong Linux

Bộ dữ liệu hoặc workload thực hành là thư mục /srv/data-lab với raw, staging, reports và secrets. Trước khi bắt đầu, tạo snapshot hoặc bản sao dữ liệu, xác nhận còn đủ dung lượng và mở một terminal thứ hai để cứu hộ nếu phiên làm việc chính gặp lỗi. Những nguyên tắc này giúp bài tập gần với cách vận hành Linux trong doanh nghiệp.

Môi trường và quy ước an toàn

mkdir -p ~/linux-lab/{src,config,logs,tests,evidence}
cd ~/linux-lab
printf "started_at=%s\n" "$(date -Is)" | tee evidence/session.txt
uname -a | tee -a evidence/session.txt
cat /etc/os-release | tee -a evidence/session.txt

Bài thực hành dùng Ubuntu Server LTS trên máy ảo tối thiểu 2 vCPU, 4 GB RAM và 20 GB ổ đĩa. Không chạy trực tiếp trên máy production. Những lệnh có khả năng xóa dữ liệu, sửa quyền hoặc khởi động lại service phải được thử trên thư mục lab trước, đồng thời ghi lại trạng thái trước và sau.

1. User identity và UID

Kernel quyết định quyền bằng UID GID, không dựa trên tên hiển thị. Trong bối cảnh server dùng chung cho nhóm Data Engineering, BI và vận hành, bước này không chỉ nhằm ghi nhớ câu lệnh mà còn giúp hiểu trạng thái của hệ thống trước khi thay đổi. Mọi thao tác đều cần có đầu vào, kết quả mong đợi và cách quay lại trạng thái an toàn nếu xảy ra lỗi.

Thực hành. Xem identity, passwd database và mapping số. Chạy lệnh bằng tài khoản không có quyền root, quan sát mã thoát với echo $?, rồi lưu kết quả vào thư mục evidence/1. Không sao chép lệnh có sudo trước khi hiểu chính xác file, service hoặc quyền sẽ bị thay đổi.

id
getent passwd "$USER"
id -u; id -g

Kết quả cần thấy. UID GID và group phụ được xác định rõ. Nếu đầu ra khác dự kiến, cần đọc thông báo lỗi từ trái sang phải, xác nhận đường dẫn tuyệt đối, quyền truy cập, biến môi trường và trạng thái tiến trình. Đây là thói quen quan trọng khi làm việc với server thật, nơi một lệnh chạy thành công chưa chắc tạo ra kết quả nghiệp vụ đúng.

Góc nhìn production. UID giữa host và container hoặc NFS cần được quản lý nhất quán. Với quyền Linux, tiêu chí hoàn thành gồm khả năng chạy lại, log đủ để điều tra, quyền tối thiểu, cấu hình có phiên bản và bằng chứng kiểm thử. Một thao tác thủ công chỉ được chấp nhận khi có lý do, người phê duyệt và kế hoạch tự động hóa sau đó.

2. Group theo vai trò

Group giảm cấp quyền trực tiếp cho từng người. Trong bối cảnh server dùng chung cho nhóm Data Engineering, BI và vận hành, bước này không chỉ nhằm ghi nhớ câu lệnh mà còn giúp hiểu trạng thái của hệ thống trước khi thay đổi. Mọi thao tác đều cần có đầu vào, kết quả mong đợi và cách quay lại trạng thái an toàn nếu xảy ra lỗi.

Thực hành. Thiết kế data-engineers, bi-readers và service group trong lab. Chạy lệnh bằng tài khoản không có quyền root, quan sát mã thoát với echo $?, rồi lưu kết quả vào thư mục evidence/2. Không sao chép lệnh có sudo trước khi hiểu chính xác file, service hoặc quyền sẽ bị thay đổi.

getent group | tail
groups
getent group sudo

Kết quả cần thấy. Matrix ánh xạ vai trò với group, không dùng shared account. Nếu đầu ra khác dự kiến, cần đọc thông báo lỗi từ trái sang phải, xác nhận đường dẫn tuyệt đối, quyền truy cập, biến môi trường và trạng thái tiến trình. Đây là thói quen quan trọng khi làm việc với server thật, nơi một lệnh chạy thành công chưa chắc tạo ra kết quả nghiệp vụ đúng.

Góc nhìn production. Provision qua identity system và có approval, expiry, audit. Với quyền Linux, tiêu chí hoàn thành gồm khả năng chạy lại, log đủ để điều tra, quyền tối thiểu, cấu hình có phiên bản và bằng chứng kiểm thử. Một thao tác thủ công chỉ được chấp nhận khi có lý do, người phê duyệt và kế hoạch tự động hóa sau đó.

3. Mode rwx

Quyền owner group other áp dụng khác cho file và directory. Trong bối cảnh server dùng chung cho nhóm Data Engineering, BI và vận hành, bước này không chỉ nhằm ghi nhớ câu lệnh mà còn giúp hiểu trạng thái của hệ thống trước khi thay đổi. Mọi thao tác đều cần có đầu vào, kết quả mong đợi và cách quay lại trạng thái an toàn nếu xảy ra lỗi.

Thực hành. Tạo file lab, đọc stat và chuyển mode ký hiệu. Chạy lệnh bằng tài khoản không có quyền root, quan sát mã thoát với echo $?, rồi lưu kết quả vào thư mục evidence/3. Không sao chép lệnh có sudo trước khi hiểu chính xác file, service hoặc quyền sẽ bị thay đổi.

touch evidence/demo.txt
chmod 0640 evidence/demo.txt
stat -c "%A %a %U:%G %n" evidence/demo.txt

Kết quả cần thấy. Mode là 640: owner đọc ghi, group đọc, other không quyền. Nếu đầu ra khác dự kiến, cần đọc thông báo lỗi từ trái sang phải, xác nhận đường dẫn tuyệt đối, quyền truy cập, biến môi trường và trạng thái tiến trình. Đây là thói quen quan trọng khi làm việc với server thật, nơi một lệnh chạy thành công chưa chắc tạo ra kết quả nghiệp vụ đúng.

Góc nhìn production. Quyền mặc định được tạo bởi umask hoặc install, không sửa hậu kỳ hàng loạt. Với quyền Linux, tiêu chí hoàn thành gồm khả năng chạy lại, log đủ để điều tra, quyền tối thiểu, cấu hình có phiên bản và bằng chứng kiểm thử. Một thao tác thủ công chỉ được chấp nhận khi có lý do, người phê duyệt và kế hoạch tự động hóa sau đó.

4. Quyền trên directory

Execute trên directory cho phép traverse, không đồng nghĩa chạy file. Trong bối cảnh server dùng chung cho nhóm Data Engineering, BI và vận hành, bước này không chỉ nhằm ghi nhớ câu lệnh mà còn giúp hiểu trạng thái của hệ thống trước khi thay đổi. Mọi thao tác đều cần có đầu vào, kết quả mong đợi và cách quay lại trạng thái an toàn nếu xảy ra lỗi.

Thực hành. Tạo directory 750 và kiểm tra truy cập theo từng thành phần đường dẫn. Chạy lệnh bằng tài khoản không có quyền root, quan sát mã thoát với echo $?, rồi lưu kết quả vào thư mục evidence/4. Không sao chép lệnh có sudo trước khi hiểu chính xác file, service hoặc quyền sẽ bị thay đổi.

install -d -m 0750 evidence/private
namei -l evidence/private
stat -c "%A %n" evidence/private

Kết quả cần thấy. Mỗi directory cha cho phép traverse đúng đối tượng. Nếu đầu ra khác dự kiến, cần đọc thông báo lỗi từ trái sang phải, xác nhận đường dẫn tuyệt đối, quyền truy cập, biến môi trường và trạng thái tiến trình. Đây là thói quen quan trọng khi làm việc với server thật, nơi một lệnh chạy thành công chưa chắc tạo ra kết quả nghiệp vụ đúng.

Góc nhìn production. Thiếu x ở một thư mục cha gây Permission denied dù file có read. Với quyền Linux, tiêu chí hoàn thành gồm khả năng chạy lại, log đủ để điều tra, quyền tối thiểu, cấu hình có phiên bản và bằng chứng kiểm thử. Một thao tác thủ công chỉ được chấp nhận khi có lý do, người phê duyệt và kế hoạch tự động hóa sau đó.

5. Ownership chown chgrp

Owner sai làm service không ghi được hoặc người dùng sửa file hệ thống. Trong bối cảnh server dùng chung cho nhóm Data Engineering, BI và vận hành, bước này không chỉ nhằm ghi nhớ câu lệnh mà còn giúp hiểu trạng thái của hệ thống trước khi thay đổi. Mọi thao tác đều cần có đầu vào, kết quả mong đợi và cách quay lại trạng thái an toàn nếu xảy ra lỗi.

Thực hành. Dùng chgrp cho vùng chia sẻ và kiểm tra trước khi đệ quy. Chạy lệnh bằng tài khoản không có quyền root, quan sát mã thoát với echo $?, rồi lưu kết quả vào thư mục evidence/5. Không sao chép lệnh có sudo trước khi hiểu chính xác file, service hoặc quyền sẽ bị thay đổi.

chgrp "$(id -gn)" evidence/private
find evidence/private -maxdepth 1 -printf "%u:%g %m %p\n"

Kết quả cần thấy. Group thay đổi đúng phạm vi mà owner không đổi ngoài ý muốn. Nếu đầu ra khác dự kiến, cần đọc thông báo lỗi từ trái sang phải, xác nhận đường dẫn tuyệt đối, quyền truy cập, biến môi trường và trạng thái tiến trình. Đây là thói quen quan trọng khi làm việc với server thật, nơi một lệnh chạy thành công chưa chắc tạo ra kết quả nghiệp vụ đúng.

Góc nhìn production. Trước chown -R phải tạo manifest và loại symlink hoặc mount ngoài phạm vi. Với quyền Linux, tiêu chí hoàn thành gồm khả năng chạy lại, log đủ để điều tra, quyền tối thiểu, cấu hình có phiên bản và bằng chứng kiểm thử. Một thao tác thủ công chỉ được chấp nhận khi có lý do, người phê duyệt và kế hoạch tự động hóa sau đó.

6. Umask

Umask quyết định quyền bị loại khỏi file mới. Trong bối cảnh server dùng chung cho nhóm Data Engineering, BI và vận hành, bước này không chỉ nhằm ghi nhớ câu lệnh mà còn giúp hiểu trạng thái của hệ thống trước khi thay đổi. Mọi thao tác đều cần có đầu vào, kết quả mong đợi và cách quay lại trạng thái an toàn nếu xảy ra lỗi.

Thực hành. So sánh file tạo với umask 022 và 027 trong subshell. Chạy lệnh bằng tài khoản không có quyền root, quan sát mã thoát với echo $?, rồi lưu kết quả vào thư mục evidence/6. Không sao chép lệnh có sudo trước khi hiểu chính xác file, service hoặc quyền sẽ bị thay đổi.

(umask 022; touch evidence/u022)
(umask 027; touch evidence/u027)
stat -c "%a %n" evidence/u0*

Kết quả cần thấy. u022 thường 644, u027 thường 640. Nếu đầu ra khác dự kiến, cần đọc thông báo lỗi từ trái sang phải, xác nhận đường dẫn tuyệt đối, quyền truy cập, biến môi trường và trạng thái tiến trình. Đây là thói quen quan trọng khi làm việc với server thật, nơi một lệnh chạy thành công chưa chắc tạo ra kết quả nghiệp vụ đúng.

Góc nhìn production. Đặt UMask trong systemd unit để output service không mở quá rộng. Với quyền Linux, tiêu chí hoàn thành gồm khả năng chạy lại, log đủ để điều tra, quyền tối thiểu, cấu hình có phiên bản và bằng chứng kiểm thử. Một thao tác thủ công chỉ được chấp nhận khi có lý do, người phê duyệt và kế hoạch tự động hóa sau đó.

7. Setgid directory

Setgid giúp file mới kế thừa group của thư mục chia sẻ. Trong bối cảnh server dùng chung cho nhóm Data Engineering, BI và vận hành, bước này không chỉ nhằm ghi nhớ câu lệnh mà còn giúp hiểu trạng thái của hệ thống trước khi thay đổi. Mọi thao tác đều cần có đầu vào, kết quả mong đợi và cách quay lại trạng thái an toàn nếu xảy ra lỗi.

Thực hành. Tạo shared directory, bật setgid và xác minh group file mới. Chạy lệnh bằng tài khoản không có quyền root, quan sát mã thoát với echo $?, rồi lưu kết quả vào thư mục evidence/7. Không sao chép lệnh có sudo trước khi hiểu chính xác file, service hoặc quyền sẽ bị thay đổi.

mkdir -p evidence/shared
chmod 2770 evidence/shared
touch evidence/shared/test
stat -c "%A %G %n" evidence/shared evidence/shared/test

Kết quả cần thấy. Directory có s và file kế thừa group. Nếu đầu ra khác dự kiến, cần đọc thông báo lỗi từ trái sang phải, xác nhận đường dẫn tuyệt đối, quyền truy cập, biến môi trường và trạng thái tiến trình. Đây là thói quen quan trọng khi làm việc với server thật, nơi một lệnh chạy thành công chưa chắc tạo ra kết quả nghiệp vụ đúng.

Góc nhìn production. Kết hợp umask 007 cho vùng cộng tác kín. Với quyền Linux, tiêu chí hoàn thành gồm khả năng chạy lại, log đủ để điều tra, quyền tối thiểu, cấu hình có phiên bản và bằng chứng kiểm thử. Một thao tác thủ công chỉ được chấp nhận khi có lý do, người phê duyệt và kế hoạch tự động hóa sau đó.

8. ACL

ACL hỗ trợ ngoại lệ nhưng làm policy khó nhìn nếu lạm dụng. Trong bối cảnh server dùng chung cho nhóm Data Engineering, BI và vận hành, bước này không chỉ nhằm ghi nhớ câu lệnh mà còn giúp hiểu trạng thái của hệ thống trước khi thay đổi. Mọi thao tác đều cần có đầu vào, kết quả mong đợi và cách quay lại trạng thái an toàn nếu xảy ra lỗi.

Thực hành. Xem getfacl và cấp read tạm cho user hiện tại trên file lab. Chạy lệnh bằng tài khoản không có quyền root, quan sát mã thoát với echo $?, rồi lưu kết quả vào thư mục evidence/8. Không sao chép lệnh có sudo trước khi hiểu chính xác file, service hoặc quyền sẽ bị thay đổi.

setfacl -m u:"$USER":r evidence/demo.txt
getfacl evidence/demo.txt

Kết quả cần thấy. ACL hiển thị user entry và effective permission. Nếu đầu ra khác dự kiến, cần đọc thông báo lỗi từ trái sang phải, xác nhận đường dẫn tuyệt đối, quyền truy cập, biến môi trường và trạng thái tiến trình. Đây là thói quen quan trọng khi làm việc với server thật, nơi một lệnh chạy thành công chưa chắc tạo ra kết quả nghiệp vụ đúng.

Góc nhìn production. ACL ngoại lệ phải có owner, expiry và kiểm tra tự động. Với quyền Linux, tiêu chí hoàn thành gồm khả năng chạy lại, log đủ để điều tra, quyền tối thiểu, cấu hình có phiên bản và bằng chứng kiểm thử. Một thao tác thủ công chỉ được chấp nhận khi có lý do, người phê duyệt và kế hoạch tự động hóa sau đó.

9. Sudo an toàn

Sudo nâng quyền cho lệnh cụ thể và phải được audit. Trong bối cảnh server dùng chung cho nhóm Data Engineering, BI và vận hành, bước này không chỉ nhằm ghi nhớ câu lệnh mà còn giúp hiểu trạng thái của hệ thống trước khi thay đổi. Mọi thao tác đều cần có đầu vào, kết quả mong đợi và cách quay lại trạng thái an toàn nếu xảy ra lỗi.

Thực hành. Liệt kê quyền sudo, xem log và tránh sudo shell dài. Chạy lệnh bằng tài khoản không có quyền root, quan sát mã thoát với echo $?, rồi lưu kết quả vào thư mục evidence/9. Không sao chép lệnh có sudo trước khi hiểu chính xác file, service hoặc quyền sẽ bị thay đổi.

sudo -l
journalctl _COMM=sudo --since today --no-pager | tail -20

Kết quả cần thấy. Biết chính xác user được chạy lệnh nào và sự kiện có audit. Nếu đầu ra khác dự kiến, cần đọc thông báo lỗi từ trái sang phải, xác nhận đường dẫn tuyệt đối, quyền truy cập, biến môi trường và trạng thái tiến trình. Đây là thói quen quan trọng khi làm việc với server thật, nơi một lệnh chạy thành công chưa chắc tạo ra kết quả nghiệp vụ đúng.

Góc nhìn production. Dùng sudoers.d, visudo, command allowlist; không chia sẻ mật khẩu. Với quyền Linux, tiêu chí hoàn thành gồm khả năng chạy lại, log đủ để điều tra, quyền tối thiểu, cấu hình có phiên bản và bằng chứng kiểm thử. Một thao tác thủ công chỉ được chấp nhận khi có lý do, người phê duyệt và kế hoạch tự động hóa sau đó.

10. Kiểm thử quyền âm

Test thành công chưa đủ, truy cập bị cấm phải thất bại. Trong bối cảnh server dùng chung cho nhóm Data Engineering, BI và vận hành, bước này không chỉ nhằm ghi nhớ câu lệnh mà còn giúp hiểu trạng thái của hệ thống trước khi thay đổi. Mọi thao tác đều cần có đầu vào, kết quả mong đợi và cách quay lại trạng thái an toàn nếu xảy ra lỗi.

Thực hành. Dùng test và runuser trong lab để kiểm tra hành vi không được phép. Chạy lệnh bằng tài khoản không có quyền root, quan sát mã thoát với echo $?, rồi lưu kết quả vào thư mục evidence/10. Không sao chép lệnh có sudo trước khi hiểu chính xác file, service hoặc quyền sẽ bị thay đổi.

test -r evidence/demo.txt
test ! -w evidence/demo.txt || echo "owner can write"
find evidence -perm -0002 -print

Kết quả cần thấy. Không có file world-writable ngoài mục đích đã ghi nhận. Nếu đầu ra khác dự kiến, cần đọc thông báo lỗi từ trái sang phải, xác nhận đường dẫn tuyệt đối, quyền truy cập, biến môi trường và trạng thái tiến trình. Đây là thói quen quan trọng khi làm việc với server thật, nơi một lệnh chạy thành công chưa chắc tạo ra kết quả nghiệp vụ đúng.

Góc nhìn production. Security test chạy trong CI hoặc compliance scan và phát hiện drift. Với quyền Linux, tiêu chí hoàn thành gồm khả năng chạy lại, log đủ để điều tra, quyền tối thiểu, cấu hình có phiên bản và bằng chứng kiểm thử. Một thao tác thủ công chỉ được chấp nhận khi có lý do, người phê duyệt và kế hoạch tự động hóa sau đó.

Kiểm thử cuối bài

Kiểm thử gồm bốn lớp. Lớp chức năng xác nhận mỗi vai trò chỉ đọc hoặc ghi đúng vùng, secret không bị lộ và test truy cập trái phép thất bại. Lớp dữ liệu đối chiếu số file, kích thước, checksum hoặc số bản ghi trước và sau. Lớp vận hành kiểm tra retry, log, thời gian chạy và mức sử dụng tài nguyên. Lớp bảo mật xác nhận service không chạy bằng root nếu không cần thiết và file nhạy cảm không mở quyền cho group hoặc other.

set -euo pipefail
test -d ~/linux-lab/logs
test -s ~/linux-lab/evidence/session.txt
find ~/linux-lab -type f -perm -0002 -print | tee evidence/world_writable.txt
df -h | tee evidence/disk_after.txt
free -h | tee evidence/memory_after.txt

Một bài lab chỉ đạt khi lệnh có thể chạy lại mà không tạo trạng thái hỏng, lỗi trả mã thoát khác 0, log có timestamp và người khác làm theo README có thể tái tạo kết quả. Nếu kiểm thử chỉ dựa trên việc “màn hình không báo lỗi”, sản phẩm chưa đủ tiêu chuẩn production.

Những lỗi thường gặp và cách xử lý

Các lỗi phổ biến là chmod 777, chạy service bằng root, chown đệ quy không kiểm tra, nhầm quyền thư mục với file, quên umask và ACL tạo quyền ngoài mode hiển thị. Cách xử lý có hệ thống là tái hiện lỗi bằng đầu vào nhỏ, thu thập trạng thái bằng lệnh chỉ đọc, xác định lớp gây lỗi rồi mới thay đổi. Không sửa nhiều cấu hình cùng lúc vì sẽ mất khả năng xác định thay đổi nào thực sự giải quyết vấn đề.

Khi cần trợ giúp, cung cấp phiên bản hệ điều hành, câu lệnh đầy đủ đã che dữ liệu nhạy cảm, output, mã thoát, quyền của file liên quan và log trong đúng khoảng thời gian xảy ra lỗi. Mô tả tốt giúp rút ngắn thời gian điều tra và tránh các lời khuyên nguy hiểm như mở quyền 777 hoặc tắt firewall.

Đưa kỹ năng vào môi trường production

Quyền truy cập phải xuất phát từ vai trò nghiệp vụ, được cấp qua group, review định kỳ và thu hồi khi thay đổi nhân sự. Secret nằm trong secret manager hoặc file giới hạn, không commit Git.

Trước mỗi thay đổi, cần có ticket, phạm vi ảnh hưởng, cửa sổ triển khai, backup, tiêu chí thành công, tiêu chí rollback và người chịu trách nhiệm. Sau thay đổi, lưu evidence, cập nhật runbook và theo dõi ít nhất một chu kỳ workload. Linux ổn định không đến từ một câu lệnh thần kỳ mà từ quy trình có thể kiểm chứng.

Bài tập mở rộng

  1. Viết một script chỉ đọc để thu thập trạng thái liên quan đến chủ đề và xuất báo cáo có timestamp.
  2. Tạo một lỗi có kiểm soát trong máy ảo, ghi triệu chứng, giả thuyết, bằng chứng và cách khôi phục.
  3. Chuyển ba thao tác thủ công thành script có set -euo pipefail và kiểm tra đầu vào.
  4. Viết runbook một trang để người khác thực hiện mà không cần hỏi lại tác giả.
  5. Đánh giá thay đổi cần thiết nếu workload tăng gấp 100 lần.

Tài liệu tham khảo

  • Ubuntu Server Documentation.
  • GNU Coreutils và Bash Reference Manual.
  • Linux man-pages project.
  • systemd và OpenSSH documentation, sử dụng theo nội dung từng bài.

Kết luận

Permission hiệu quả là thiết kế quyền tối thiểu có thể giải thích và kiểm thử, không phải liên tục mở rộng quyền cho đến khi ứng dụng chạy.

TechData.AI - Leading the Future.
Tham khảo các khoá học theo link: https://techdata.ai/techdata-ai-course/
Hoàng Minh.

Scroll to Top