Làm việc từ xa an toàn đòi hỏi xác thực đúng máy, đúng người và đúng phạm vi dữ liệu. SSH không chỉ là cửa sổ terminal; nó còn là nền tảng cho tunnel, copy và automation.
Bài viết xây lab hai máy, tạo key, kiểm tra host key, cấu hình client, truyền file với scp/rsync và xử lý kết nối gián đoạn.
Mục lục
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 SSH client profile, quy trình cấp key và job rsync có checksum, log, resume. 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.





Bộ dữ liệu hoặc workload thực hành là đồng bộ thư mục sales batch từ máy nguồn sang server xử lý. 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. Mô hình client server
Cần phân biệt key của người dùng và host key của server. Trong bối cảnh Data Engineer quản trị server ETL qua mạng và chuyển batch file an toàn, 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. Ghi endpoint, user, fingerprint và owner vào inventory. 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.
ssh -V
ssh-keyscan -t ed25519 server.example 2>/dev/null | ssh-keygen -lf -
Kết quả cần thấy. Fingerprint được đối chiếu qua kênh tin cậy. 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. Không tự động accept host key mới trong production. Với truy cập server từ xa, 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. Tạo key pair
Key ed25519 nhỏ, mạnh và phù hợp đa số trường hợp. Trong bối cảnh Data Engineer quản trị server ETL qua mạng và chuyển batch file an toàn, 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 key riêng cho lab có passphrase và comment. 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.
ssh-keygen -t ed25519 -a 100 -f ~/.ssh/id_ed25519_data_lab -C "data-lab"
Kết quả cần thấy. Private key mode 600, public key có comment đú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. Key có owner, expiry và không dùng chung giữa người với service. Với truy cập server từ xa, 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. Cấp public key
Server chỉ cần public key, private key không rời client. Trong bối cảnh Data Engineer quản trị server ETL qua mạng và chuyển batch file an toàn, 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. Cài key và kiểm tra authorized_keys permission. 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.
ssh-copy-id -i ~/.ssh/id_ed25519_data_lab.pub user@server
ssh user@server "stat -c "%a %n" ~/.ssh ~/.ssh/authorized_keys"
Kết quả cần thấy. Directory 700 và authorized_keys 600. 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 automation và ghi audit thay vì gửi key qua chat. Với truy cập server từ xa, 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. SSH config
Alias giảm lỗi khi endpoint và key phức tạp. Trong bối cảnh Data Engineer quản trị server ETL qua mạng và chuyển batch file an toàn, 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 Host entry có User, IdentityFile và IdentitiesOnly. 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.
ssh -G data-lab | grep -E "hostname|user|identityfile|port"
Kết quả cần thấy. Effective config trỏ đúng server và key. 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. Quản lý config bằng template, không ghi secret. Với truy cập server từ xa, 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. Kết nối verbose
Verbose log cho biết lỗi DNS, network hay authentication. Trong bối cảnh Data Engineer quản trị server ETL qua mạng và chuyển batch file an toàn, 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 -vvv khi lab thất bại nhưng che thông tin nhạy cảm trước khi chia 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/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.
ssh -vvv -o ConnectTimeout=10 data-lab true 2> logs/ssh-debug.log
tail -30 logs/ssh-debug.log
Kết quả cần thấy. Kết nối trả code 0 hoặc log chỉ ra giai đoạn thất bại. 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. Không bật debug rộng lâu dài vì log có metadata nhạy cảm. Với truy cập server từ xa, 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. SCP cho file nhỏ
scp phù hợp copy đơn giản nhưng ít tính năng đồng bộ. Trong bối cảnh Data Engineer quản trị server ETL qua mạng và chuyển batch file an toàn, 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. Copy file mẫu tới temp path rồi checksum hai đầ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/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.
scp data/raw/sales.csv data-lab:/tmp/sales.csv
sha256sum data/raw/sales.csv
ssh data-lab sha256sum /tmp/sales.csv
Kết quả cần thấy. Hai checksum giống nhau. 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. Upload temp rồi rename; tránh consumer đọc file đang copy. Với truy cập server từ xa, 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. Rsync idempotent
Rsync chỉ truyền phần thay đổi và hỗ trợ resume. Trong bối cảnh Data Engineer quản trị server ETL qua mạng và chuyển batch file an toàn, 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. Dry-run trước, sau đó đồng bộ archive mode với progress. 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.
rsync -avhn --delete-delay data/raw/ data-lab:/srv/data/incoming/
rsync -avh --partial data/raw/ data-lab:/srv/data/incoming/
Kết quả cần thấy. Lần chạy thứ hai không truyền lại file không đổi. 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. --delete cần review dry-run và bảo vệ scope bằng trailing slash đúng. Với truy cập server từ xa, 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. SSH tunnel
Tunnel chuyển port qua kênh mã hóa nhưng không thay authorization ứng dụng. Trong bối cảnh Data Engineer quản trị server ETL qua mạng và chuyển batch file an toàn, 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. Mở local forward tới PostgreSQL nội bộ 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/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.
ssh -N -L 15432:127.0.0.1:5432 data-lab
Kết quả cần thấy. Local port 15432 listen và kết nối đi qua SSH. 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. Giới hạn AllowTcpForwarding và audit tunnel theo policy. Với truy cập server từ xa, 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. Kết nối gián đoạn
Batch dài cần cơ chế chạy tách khỏi session. Trong bối cảnh Data Engineer quản trị server ETL qua mạng và chuyển batch file an toàn, 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 tmux hoặc systemd-run thay vì giữ terminal mở. 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.
tmux new -s data-job
systemd-run --user --unit=data-job --collect sleep 60
Kết quả cần thấy. Job tồn tại độc lập và có log/trạng thái. 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. Workload production do scheduler quản lý, không phụ thuộc terminal cá nhân. Với truy cập server từ xa, 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. Hardening và kiểm thử
Tắt password sai thời điểm có thể khóa quyền truy cập. Trong bối cảnh Data Engineer quản trị server ETL qua mạng và chuyển batch file an toàn, 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. Đọc sshd effective config, mở session thứ hai rồi mới reload. 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.
sshd -T | grep -E "permitrootlogin|passwordauthentication|pubkeyauthentication|maxauthtries"
Kết quả cần thấy. Public key hoạt động trước khi hạn chế password. 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. Có console cứu hộ, change plan, rollback và rate limit. Với truy cập server từ xa, 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 đăng nhập bằng key, host identity được xác minh, rsync chạy lại không copy thừa và checksum khớp. 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ý
Lỗi gồm bỏ qua host key warning, copy private key lên server, mở port ra toàn Internet, tắt password trước khi test key, dùng scp cho dữ liệu lớn không resume và để key permission quá rộng. 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
Dùng bastion hoặc VPN, allowlist mạng, short-lived certificate khi có thể, central audit và key rotation. Tài khoản automation tách khỏi người dùng và bị giới hạn command hoặc directory.
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
- 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.
- 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.
- Chuyển ba thao tác thủ công thành script có
set -euo pipefailvà kiểm tra đầu vào. - 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ả.
- Đá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
SSH an toàn dựa trên chuỗi tin cậy từ client key, server host key, network policy đến audit. Truyền file production cần idempotency và kiểm chứng toàn vẹn.
TechData.AI - Leading the Future.
Tham khảo các khoá học theo link: https://techdata.ai/techdata-ai-course/
Hoàng Minh.
