Tạo VM Linux dành riêng cho lab
Thực hiện trên server của bạn, rồi kiểm tra từng tiêu chí.
Vì sao cần học
Module 01 cấu hình user, disk, firewall, systemd và reboot máy. Các bài Break/Fix còn cố ý làm hỏng hệ thống. Không thể làm những việc đó trên laptop đang dùng hằng ngày hay trên server có dữ liệu thật. Bài này tạo một máy Linux chỉ dùng cho lab, có thể phá và dựng lại bất cứ lúc nào.
Mục tiêu
- Chọn môi trường phù hợp: VM trên laptop hoặc VPS dành riêng.
- Cài AlmaLinux hoặc Rocky Linux 10, truy cập bằng SSH.
- Gắn marker
/etc/kdc-labđể các script Break/Fix chỉ chạy trên máy lab. - Chạy agent với quyền đủ để kiểm tra trạng thái hệ thống.
Điều kiện tiên quyết
- Đã làm bài Chuẩn bị workspace thực hành: biết liên kết agent và bật kiểm tra từ xa.
- Laptop còn trống khoảng 4 GB RAM và 25 GB ổ đĩa, hoặc có VPS mới chưa chứa dữ liệu.
Mental model
Vì sao chọn RHEL-family. Module 01 bám theo RHCSA nên dùng AlmaLinux hoặc Rocky Linux 10, hai bản tương thích RHEL 10, miễn phí. Ubuntu LTS vẫn làm được phần lớn bài; khác biệt được ghi chú trong từng bài.
Vì sao cần VM. Container dùng chung kernel với máy host, không có systemd đầy đủ, không reboot được và không quản lý được disk thật. Các bài LVM, fstab, SELinux và "cấu hình còn sau reboot" cần một máy Linux hoàn chỉnh.
Marker là chốt an toàn. Mọi script Break/Fix trong khóa kiểm tra /etc/kdc-lab trước khi chạy. Đừng tạo marker trên máy chứa dữ liệu hoặc dịch vụ thật.
Thực hành (Guided Lab)
1. Chọn môi trường
Khuyến nghị chung: VirtualBox. Cùng một công cụ chạy trên Windows, macOS và Linux, nên hướng dẫn, ảnh chụp màn hình và cách hỗ trợ học viên giống nhau. Nếu bạn đã quen một công cụ khác, hãy dùng phương án thay thế.
| Bạn đang có | Khuyến nghị | Thay thế | ISO cần tải |
|---|---|---|---|
| Windows | VirtualBox | Hyper-V | AlmaLinux/Rocky 10 x86_64 |
| macOS chip Apple | VirtualBox (bản 7.1 trở lên) | UTM hoặc Lima (xem template bằng limactl create --list-templates) | AlmaLinux/Rocky 10 aarch64 |
| macOS Intel | VirtualBox | UTM hoặc Lima | AlmaLinux/Rocky 10 x86_64 |
| Linux | VirtualBox | KVM/libvirt (virt-install hoặc virt-manager) | Theo kiến trúc CPU của máy |
| Không muốn chạy VM trên máy | Một VPS mới chỉ dùng cho lab, image AlmaLinux/Rocky 10 |
Kiến trúc ISO phải khớp với CPU của máy: máy chip Apple dùng bản aarch64, máy Intel/AMD dùng bản x86_64.
Thiết lập VirtualBox
- Tạo VM: 2 vCPU, 2048 MB RAM, ổ hệ điều hành 20 GB, gắn ISO vừa tải.
- Thêm ổ phụ 2 GB (Settings → Storage → thêm hard disk mới vào controller). Trong VM, ổ này thường có tên
/dev/sdb; các bài Module 01 ghi/dev/vdb, hãy thay bằng tên trên máy bạn. - Mạng: giữ Adapter 1 là NAT để VM ra Internet, bật thêm Adapter 2 là Host-only Adapter để laptop SSH vào VM. Với NAT đơn thuần, laptop không tự kết nối tới VM được. Các bài SSH, scp, firewall và checkpoint đều cần kết nối này.
- Cài hệ điều hành, rồi tạo snapshot
cleanở bước 7.
Trên Windows đã bật Hyper-V hoặc WSL2, VirtualBox vẫn chạy nhưng thường chậm hơn vì phải chạy trên nền Hyper-V. Khi đó dùng Hyper-V là lựa chọn gọn hơn.
Dùng phương án thay thế
- Hyper-V: dùng Default Switch (vừa ra Internet vừa kết nối với máy host), thêm ổ phụ VHDX 2 GB. Tắt Secure Boot hoặc chọn template "Microsoft UEFI Certificate Authority" để boot được Linux.
- UTM / Lima: chế độ mạng Shared mặc định đã cho laptop kết nối tới VM; ổ phụ thường có tên
/dev/vdb. - KVM/libvirt: mạng
default(NAT có route từ host) cho phép SSH từ máy host; ổ phụ virtio có tên/dev/vdb.
Cấu hình cho mọi công cụ: 2 vCPU, 2 GB RAM, ổ hệ điều hành 20 GB và một ổ phụ 2 GB cho bài phân vùng và LVM. Với VPS, nhà cung cấp thường cho gắn thêm block volume.
RHEL/Rocky Linux 10 bản x86_64 yêu cầu CPU hỗ trợ x86-64-v3. Máy Intel đời cũ có thể không cài được; khi đó dùng bản AlmaLinux 10 x86_64_v2 hoặc AlmaLinux/Rocky 9.
Khi cài đặt, tạo một user quản trị có quyền sudo (thuộc group wheel). Không làm bài bằng tài khoản root.
2. Kết nối SSH từ máy của bạn
Trên VM, xem địa chỉ IP. Với VirtualBox, dùng địa chỉ của interface Host-only (thường thuộc dải 192.168.56.0/24), không phải 10.0.2.15 của NAT:
ip -brief address
Giải thích lệnh và tham số
ip address xem địa chỉ IP các interface; -brief rút gọn kết quả thành một dòng cho mỗi interface.
Từ máy của bạn:
ssh <user>@<ip-của-vm>
Cài thêm vài công cụ dùng xuyên suốt Module 01:
sudo dnf install -y python3 tar lsof
Giải thích lệnh và tham số
| Lệnh / thành phần | Ý nghĩa |
|---|---|
ip -brief address | Xem interface và địa chỉ IP; -brief rút gọn mỗi interface thành một dòng. Chạy trên VM. |
ssh <user>@<ip-của-vm> | Mở phiên terminal trên VM bằng tài khoản <user>. Thay hai phần <...> bằng giá trị thật và bỏ dấu <, >. Chạy từ laptop. |
sudo | Chạy lệnh đứng sau với quyền quản trị, thường là root. Mật khẩu yêu cầu là của tài khoản bạn đang dùng; khi gõ không hiện ký tự. |
dnf install | Cài package trên AlmaLinux/Rocky; -y tự trả lời đồng ý cho các bước xác nhận cài đặt. |
python3 tar lsof | Ba tên package cần cài, không phải tham số của Python. |
Kết quả ip -brief address có tên interface, trạng thái UP/DOWN, địa chỉ và prefix như /24. Chọn IP mà laptop kết nối được, không lấy 127.0.0.1 của VM.
3. Gắn marker lab
echo "KDC-LAB $(hostname) $(date -I)" | sudo tee /etc/kdc-lab
sudo chmod 644 /etc/kdc-lab
ls -l /etc/kdc-lab
Giải thích lệnh và tham số
| Thành phần | Ý nghĩa |
|---|---|
echo "KDC-LAB ..." | In dòng marker ra đầu ra chuẩn. |
$(hostname) | Chạy hostname lấy tên máy rồi chèn kết quả vào dòng marker. |
$(date -I) | date in ngày; -I chọn dạng ISO YYYY-MM-DD. |
| sudo tee /etc/kdc-lab | Dấu | đưa đầu ra lệnh trước vào tee; tee vừa in ra terminal vừa ghi file bằng quyền sudo. File đang có sẽ bị ghi đè. |
chmod 644 | Chủ file đọc/ghi (6), group và người khác chỉ đọc (4, 4). |
ls -l | Xem loại file, quyền và owner/group; marker cần có owner root và quyền bắt đầu bằng -rw-r--r--. |
Viết sudo echo ... > /etc/kdc-lab thường vẫn bị từ chối vì dấu > được shell hiện tại xử lý trước sudo. Dùng sudo tee như ví dụ để thao tác ghi file cũng có quyền quản trị.
4. Tải và liên kết agent trên VM
Agent được tải trực tiếp từ web khóa học vào home trên VM. VM phải truy cập được cả địa chỉ tải và API. Khi nền tảng chạy local trên laptop, từ laptop mở một SSH tunnel ngược để 127.0.0.1:3000 trên VM trỏ về laptop, và giữ phiên SSH này mở trong suốt buổi học:
ssh -R 3000:127.0.0.1:3000 <user>@<ip-của-vm>
Giải thích lệnh và tham số
ssh -R 3000:127.0.0.1:3000 mở tunnel ngược: cổng 3000 phía VM được chuyển về 127.0.0.1:3000 phía laptop. -R thuộc lệnh ssh; không phải quyền file. Chạy từ laptop, giữ phiên mở và dùng terminal trong phiên đó để liên kết agent trên VM.
Trong phiên SSH đó (lệnh chạy trên VM), tải agent rồi liên kết:
KDC_WEB_URL='http://127.0.0.1:3000'
curl -fL "$KDC_WEB_URL/downloads/kdc.py" -o ~/kdc.py
python3 ~/kdc.py --help
mkdir -p ~/kdc-labs
python3 ~/kdc.py connect --api "$KDC_WEB_URL/api" --name "kdc-lab-vm" --lab-root ~/kdc-labs
Giải thích lệnh và tham số
curl -fL tải file và báo lỗi HTTP, -o ~/kdc.py đặt đích ở home của user trên VM. --help xác nhận file tải chạy được. Ý nghĩa đầy đủ của các tùy chọn tải/liên kết có trong bài workspace.
Nhập hai mã trên trang Servers, bật Kiểm tra từ xa. Nếu học trên web có địa chỉ HTTPS công khai, bỏ qua tunnel: SSH vào VM bình thường và thay KDC_WEB_URL bằng địa chỉ web đó. Không dùng 127.0.0.1 để gọi laptop khi chưa có tunnel.
5. Cho agent quyền đọc trạng thái hệ thống
Các bài Module 01 cần đọc trạng thái mà user thường không xem được: thư mục home của user khác, firewall, file chỉ root đọc được. Trên VM lab, chạy agent bằng sudo và chỉ định file cấu hình của bạn:
sudo install -d -m 700 /etc/kdc-agent
sudo touch /etc/kdc-agent/root-only
sudo python3 ~/kdc.py --config ~/.config/kdc/device.json run
Giải thích lệnh và tham số
| Thành phần | Ý nghĩa |
|---|---|
install -d | Tạo thư mục; ở đây không phải cài package như dnf install. |
-m 700 của install | Đặt quyền khi tạo: root đọc, ghi, đi vào được; các tài khoản khác không truy cập được. |
touch /etc/kdc-agent/root-only | Tạo file rỗng nếu chưa có; nếu đã có thì cập nhật thời gian, không xóa nội dung. |
--config ~/.config/kdc/device.json | Cho agent đọc cấu hình đã liên kết của tài khoản hiện tại. Đây là tùy chọn chung nên đặt trước run/doctor. |
sudo python3 ... run | Chạy agent với quyền quản trị trên VM; ~ không có dấu nháy được shell user hiện tại mở rộng trước khi gọi sudo. |
Không bỏ --config: mặc định agent chạy bằng root sẽ tìm cấu hình trong home của root, khác với file đã lưu khi bạn liên kết bằng user thường. Lệnh connect và các tham số --api, --name, --lab-root đã được giải thích trong bài workspace.
Agent chỉ chạy các check cố định và chỉ đọc. Nó chỉ đọc các đường dẫn có tiền tố kdc như /etc/kdc*, /srv/kdc*, /mnt/kdc*, /opt/kdc*, /home/kdc-*, /var/lib/kdc*, /etc/systemd/system/kdc-*, /etc/ssh/sshd_config.d/ và /etc/fstab. File ~/kdc.py vừa tải chính là mã nguồn agent; mở bằng trình soạn thảo để đọc trước khi chạy bằng sudo.
6. Kiểm tra môi trường bằng kdc doctor
sudo python3 ~/kdc.py --config ~/.config/kdc/device.json doctor
Giải thích lệnh và tham số
--config ~/.config/kdc/device.json chọn file cấu hình đã liên kết của user hiện tại; đặt trước lệnh con doctor. doctor kiểm tra khả năng đọc môi trường, còn sudo cho phép kiểm tra các đường dẫn chỉ root truy cập.
doctor chỉ đọc thông tin trên máy này và không gửi gì đi: hệ điều hành, kiến trúc CPU, RAM, systemd, loại ảo hóa, marker, quyền, IP công khai và các công cụ mà Module 01 dùng. Dòng cuối phải là Máy này sẵn sàng cho Module 00–01. Nếu Ảo hóa báo docker hoặc wsl, bạn đang ở trong container; Module 01 cần VM thật.
7. Chụp snapshot sạch
Nếu dùng VM, tắt máy và tạo snapshot tên clean. Khi một bài Break/Fix làm rối hệ thống, bạn quay về snapshot này thay vì cài lại.
Tự kiểm tra (Verification)
cat /etc/kdc-lab
ls -l /etc/kdc-lab
sudo ls -l /etc/kdc-agent/root-only
systemctl is-active sshd
Giải thích lệnh và tham số
systemctl giao tiếp với systemd để xem và quản lý dịch vụ. is-active sshd hỏi dịch vụ SSH có đang chạy hay không; kết quả đạt là active. sudo ls -l dùng quyền quản trị để xem file nằm trong thư mục root-only; cat in nội dung marker.
Chọn server kdc-lab-vm và bấm Kiểm tra kết quả. Tiêu chí "Agent đọc được file chỉ root truy cập" báo "Không thể kiểm tra" nghĩa là agent chưa chạy bằng sudo.
Công cụ cho các module sau (chưa cần cài ngay)
| Nền tảng | Container (Module 05) | VM nhiều máy (Module 07, 14) |
|---|---|---|
| Windows | WSL2 + Docker Desktop hoặc Podman | VirtualBox (thay thế: Hyper-V) |
| macOS chip Apple | Docker Desktop, Colima hoặc Podman | VirtualBox (thay thế: UTM, Lima), image arm64 |
| macOS Intel | Docker Desktop, Colima hoặc Podman | VirtualBox (thay thế: UTM, Lima) |
| Linux | Docker hoặc Podman | VirtualBox (thay thế: KVM/libvirt) |
| VPS | Docker hoặc Podman trên chính VPS | Thêm 2–3 VPS |
Module 01 chỉ cần VM vừa tạo. Mọi image dùng trong khóa đều có bản amd64 và arm64.
Bảo mật và quy tắc an toàn
- Chỉ chạy lab trên máy dành riêng; không chạy trên máy có dữ liệu hoặc dịch vụ thật.
- VPS có IP công khai: làm bài SSH key và hardening ngay sau bài này, trước mọi bài mở port ra ngoài. Bật thêm firewall của nhà cung cấp nếu có.
- Không đặt secret thật trong lab. Nếu dùng cloud, đặt budget alert và xóa máy khi học xong.
Ghi chú Ubuntu
Dùng apt install -y python3 lsof thay cho dnf. Group quản trị là sudo thay vì wheel. Unit SSH tên ssh.service; sshd.service là alias của nó nên tiêu chí vẫn kiểm tra được.
Dọn dẹp
Khi học xong khóa, xóa VM hoặc hủy VPS, rồi thu hồi server trên trang Servers.