HỌC BẰNG THỰC HÀNH
← Lộ trình học
01 · Linux Administration · CHECKPOINT

Checkpoint Module 01: trang trạng thái nội bộ

Tự thiết kế giải pháp theo yêu cầu, rồi kiểm tra từng tiêu chí.

Cốt lõi

Bối cảnh

Đội vận hành cần một trang trạng thái nội bộ đơn giản trên server lab. Bài này là challenge: chỉ có yêu cầu và tiêu chí nghiệm thu, không có lệnh mẫu. Bạn tự thiết kế giải pháp bằng những gì đã học ở Module 01. Hoàn thành checkpoint cùng ba bài Break/Fix là mốc "làm được" của Module 01.

Mục tiêu

  • Tự thiết kế và vận hành một dịch vụ nhỏ từ yêu cầu, không dựa vào lệnh mẫu.
  • Kết hợp user, quyền, systemd service, timer và firewall trong một hệ thống.
  • Chứng minh cấu hình còn đúng sau reboot.

Yêu cầu

  1. Tài khoản dịch vụ: dịch vụ chạy bằng system user kdc-status, không đăng nhập được.
  2. Nội dung: trang tĩnh nằm trong /srv/kdc-status, thư mục thuộc kdc-status, quyền 750. Trang phải chứa chuỗi KDC-STATUS.
  3. Dịch vụ web: kdc-status.service phục vụ thư mục trên ở port 9090, nghe trên mọi interface để máy khác truy cập được. Tự restart khi tiến trình lỗi, tự chạy khi boot.
  4. Firewall: firewalld cho phép 9090/tcp, giữ nguyên sau khi reload firewall và sau reboot. Không được mất SSH.
  5. Snapshot định kỳ: kdc-status-snapshot.timer chạy mỗi 10 phút, chạy bù khi máy tắt đúng giờ. Mỗi lần chạy ghi đè /var/lib/kdc-status/snapshot.txt gồm thời điểm chạy, trạng thái kdc-status.service và dung lượng còn trống của /. Thư mục /var/lib/kdc-status không cho người ngoài đọc.
  6. Bền vững: mọi thứ trên hoạt động sau một lần reboot.

Đọc các lệnh nghiệm thu

Các lệnh sau dùng để quan sát, giúp bạn tự đánh giá giải pháp; bạn vẫn tự viết lệnh tạo user, service, timer và firewall từ các bài trước.

Lệnh / thành phầnÝ nghĩa và cách đọc
getent passwd <user>Xem bản ghi tài khoản; trường cuối cần là shell nologin.
stat -c '%U %a' <thư-mục>-c chọn định dạng; %U in owner, %a in quyền dạng số. Kết quả mong đợi trong bài là kdc-status 750.
750Owner đọc/ghi/truy cập (7), group đọc/truy cập (5), other không có quyền (0).
curl -s <URL>Gửi request và in nội dung trang, ẩn progress/lỗi; thêm -S hoặc bỏ -s nếu cần thấy lỗi. Chạy trên laptop để kiểm tra truy cập qua mạng/firewall.
firewall-cmd --query-port=9090/tcpHỏi runtime có rule cho phép port/giao thức này không; thêm --permanent để hỏi cấu hình đã lưu. Rule được phép cần in yes.
systemctl list-timers <timer>Xem lịch timer, đặc biệt cột NEXT và lần chạy gần nhất.
systemctl rebootKhởi động lại VM; phiên SSH và agent đang chạy sẽ ngắt, cần đăng nhập và chạy lại agent/tunnel. Thường cần sudo.

Các <...> trong mẫu là giá trị cần thay, không gõ nguyên dấu ngoặc. Xem lại bài quyền, service, timer và firewall nếu cần nhớ cách cấu hình.

Tiêu chí nghiệm thu

#Kiểm chứng được bằng
1getent passwd kdc-status cho shell nologin
2stat -c '%U %a' /srv/kdc-status → kdc-status 750
3curl -s http://<ip-của-vm>:9090/ từ máy của bạn trả trang chứa KDC-STATUS
4firewall-cmd --query-port=9090/tcp và firewall-cmd --permanent --query-port=9090/tcp đều yes
5systemctl list-timers kdc-status-snapshot.timer có lần chạy kế tiếp; snapshot.txt cập nhật sau mỗi lần chạy
6Tất cả vẫn đúng sau systemctl reboot

Agent kiểm tra từ bên trong VM. Tiêu chí 3 từ máy của bạn chỉ để bạn tự xác nhận firewall hoạt động thật.

Ràng buộc

  • Không chạy dịch vụ web bằng root.
  • Không tắt firewalld, không tắt SELinux.
  • Không dùng cron cho snapshot.

Lưu ý môi trường

  • firewalld chưa chạy (thường gặp với cloud image): cài và bật nó. Trước khi bật, kiểm tra dịch vụ ssh có trong zone mặc định để không tự khóa mình.
  • VPS có IP công khai: trang này sẽ truy cập được từ Internet. Chỉ đặt nội dung không nhạy cảm. Dọn dẹp sau khi đạt.
  • Ubuntu: dùng firewalld thay cho ufw trong bài này (apt install firewalld, tắt ufw trước).

Gợi ý (chỉ mở khi bế tắc)

  • Mức 1, hướng nhìn: chia bài thành sáu yêu cầu độc lập; kiểm tra từng yêu cầu ngay sau khi làm, đừng đợi tới cuối.
  • Mức 2, công cụ: systemd-analyze verify <unit>, systemd-analyze calendar, firewall-cmd --list-all, ss -ltnp, journalctl -u <unit> -b.
  • Mức 3, một bước: firewall-cmd --add-port chỉ đổi runtime; xem --permanent và --runtime-to-permanent. Với snapshot, xem lại StateDirectory= ở bài timer.

Tự kiểm tra trước khi bấm Kiểm tra

Reboot VM, đăng nhập lại, bật lại tunnel và agent, rồi tự chạy lại toàn bộ bảng tiêu chí nghiệm thu. Sau đó chọn server và bấm Kiểm tra kết quả.

Dọn dẹp (sau khi đạt)

Gỡ port khỏi firewall (runtime và permanent), disable và xóa service, timer, user, các thư mục /srv/kdc-status và /var/lib/kdc-status, rồi daemon-reload. Tự viết các lệnh này, đó là một phần của bài.

Tài liệu chính thức