Khái quát về Giao thức SSH
SSH (Secure Shell) là giao thức mạng tiêu chuẩn được thiết kế để thiết lập phiên điều khiển từ xa an toàn thông qua kết nối mạng không tin cậy. Dịch vụ này thường lắng nghe trên cổng TCP 22. Về mặt thực thi, OpenSSH là bản cài đặt mặc định trên nhiều phân phối Linux (như CentOS/RHEL), trong khi Dropbear là một tùy chọn nhẹ nhàng thường được ưu tiên cho các hệ thống nhúng hoặc IoT.
Giao thức đã tiến hóa qua hai phiên bản chính:
- SSHv1: Sử dụng thuật toán CRC-32 cho MAC, dễ bị tấn công chèn dữ liệu (bit-flipping) và không còn được khuyến nghị trong môi trường sản xuất.
- SSHv2: Áp dụng trao đổi khóa Diffie-Hellman (DH), hỗ trợ hàm MAC an toàn do hai bên thỏa thuận, và sử dụng RSA hoặc DSA để xác thực danh tính. Đây là chuẩn hiện tại được áp dụng phổ biến.
Hệ sinh thái OpenSSH và Công cụ Khách hàng
Bộ phần mềm OpenSSH được phân chia theo kiến trúc Client-Server:
- Gói phần mềm:
openssh(thư viện cốt lõi),openssh-clients(công cụ máy khách),openssh-server(dịch vụ máy chủ). - Máy khách Linux: Cung cấp các tiện ích dòng lệnh như
ssh,scp,sftp. - Máy khách Windows: Thường sử dụng phần mềm GUI như PuTTY, Xshell, SecureCRT.
- Machine chủ (Server): Chạy tiến trình
sshdđể xử lý các yêu cầu kết nối từ xa.
Tệp cấu hình mặc định cho máy khách nằm ở /etc/ssh/ssh_config. Thông số StrictHostKeyChecking khi đặt thành no sẽ bỏ qua bước xác minh khóa máy chủ lần đầu, hữu ích cho các tập lệnh tự động hóa nhưng cần cân nhắc về rủi ro bảo mật.
Quản lý Phiên và Kỹ thuật Kết nối Nối tiếp (Jump Host)
Cú pháp cơ bản để thiết lập phiên làm việc từ xa:
ssh [tùy_chọn] [người_dùng@]địa_chỉ_máy_chủ [lệnh_thực_thi]
Một số tham số quan trọng thường dùng:
-p: Chỉ định cổng dịch vụ khác với 22.-b: Buộc giao diện mạng nguồn sử dụng cho kết nối ra ngoài.-C: Bật nén dữ liệu đường truyền, phù hợp với mạng tốc độ thấp.-X: Hỗ trợ chuyển tiếp giao diện đồ họa X11.-t: Ép phân bổ giả terminal (pseudo-TTY). Thông số này cực kỳ cần thiết khi triển khai kết nối xuyên nhiều tầng mạng. Ví dụ, để truy cập máy chủ đích qua hai trình trung gian, cấu trúc lệnh sẽ là:ssh -t node_gateway1 ssh -t node_gateway2 ssh target_server.
Về cơ chế tin cậy máy chủ: Khi thiết lập kết nối lần đầu, khóa công khai của máy chủ (thường là ssh_host_ecdsa_key.pub trên CentOS 7) sẽ được lưu trữ vào ~/.ssh/known_hosts trên máy khách. Các phiên sau đó sẽ tự động so sánh dấu vân tay khóa; nếu phát hiện thay đổi bất thường, kết nối sẽ bị từ chối ngay lập tức để ngăn chặn tấn công nghe lén giữa đường (MitM).
Tinh chỉnh Dịch vụ sshd và Chiến lược Bảo mật
Tệp cấu hình chính của daemon là /etc/ssh/sshd_config. Dưới đây là các tham số tối ưu hiệu năng và bảo mật:
# Giảm tải DNS và tăng tốc độ bắt tay phiên
GSSAPIAuthentication no
UseDNS no
# Kiểm soát phiên làm việc rỗng (đơn vị: giây)
ClientAliveInterval 300
ClientAliveCountMax 0
# Giới hạn thời gian chờ xác thực và tần suất thử
LoginGraceTime 2m
MaxAuthTries 6
# Cho phép tối đa 10 kết nối đồng thời, từ chối ngẫu nhiên 30% khi vượt ngưỡng, và khóa hoàn toàn khi > 100
MaxStartups 10:30:100
Khuyến nghị triển khai doanh nghiệp:
- Thay đổi cổng mặc định (
Port) để giảm thiểu rủi ro quét cổng tự động. - Áp dụng
AllowUsershoặcAllowGroupsđể thu hẹp phạm vi truy cập hợp lệ. - Ngăn chặn đăng nhập trực tiếp bằng tài khoản quyền cao nhất:
PermitRootLogin no. - Bắt buộc mật khẩu mạnh và cấm mật khẩu rỗng:
PermitEmptyPasswords no. - Giới hạn địa chỉ lắng nghe:
ListenAddressthay vì mở rộng trên tất cả giao diện mạng. - Giám sát chặt chẽ nhật ký hệ thống tại
/var/log/securevà tắt hoàn toàn hỗ trợ SSHv1.
Để tạo chuỗi ngẫu nhiên mạnh dùng làm mật khẩu hoặc seed khóa, có thể sử dụng các lệnh hệ thống sau:
# Sử dụng luồng entropy ngẫu nhiên kết hợp với bộ lọc ký tự
tr -dc 'A-Za-z0-9' < /dev/urandom | head -c 32
# Sử dụng thư viện mã hóa OpenSSL để sinh chuỗi Base64
openssl rand -base64 24
Hệ mật Khôi nguyên Khóa và Xác thực Người dùng
Trước khi truyền tải dữ liệu ứng dụng, hai đầu cuối phải thiết lập kênh an toàn thông qua quá trình trao đổi khóa bất đối xứng:
- Máy khách gửi yêu cầu bắt tay, máy chủ phản hồi bằng khóa công khai và bộ định danh phiên (Session ID).
- Máy khách tạo cặp khóa tạm thời, thực hiện phép XOR giữa khóa công khai cục bộ và Session ID để tạo giá trị trung gian, sau đó mã hóa khối này bằng khóa công khai của máy chủ.
- Dữ liệu mã hóa được gửi ngược về máy chủ. Máy chủ giải mã bằng khóa riêng tư, rồi thực hiện phép XOR với Session ID để khôi phục khóa công khai của máy khách.
- Hoàn tất giai đoạn này, cả hai bên sở hữu bộ ba: cặp khóa cục bộ và khóa công khai của đối phương. Toàn bộ lưu lượng sau đó sẽ được mã hóa đối xứng với khóa phiên an toàn.
Xác thực cuối cùng có thể dựa trên mật khẩu hoặc cặp khóa bất đối xứng. Cơ chế xác thực bằng khóa (SSH Key) loại bỏ việc truyền mật khẩu qua mạng, thay vào đó sử dụng chữ ký số để chứng minh danh tính một cách minh bạch.
Triển khai Đăng nhập Không Mật khẩu (Passwordless)
Quy trình vận hành xác thực khóa:
- Máy khách khởi tạo cặp khóa và đẩy khóa công khai lên tệp
~/.ssh/authorized_keyscủa máy chủ. - Khi kết nối lại, máy chủ tạo chuỗi thách thức ngẫu nhiên (challenge), mã hóa bằng khóa công khai của người dùng và gửi về máy khách.
- Máy khách dùng khóa riêng tư giải mã challenge, ký lại hoặc trả lời trực tiếp về máy chủ.
- Máy chủ so khớp challenge gốc. Nếu trùng khớp, phiên làm việc được cấp phép ngay lập tức.
Hướng dẫn thực thi trên nền tảng Linux:
# 1. Tạo cặp khóa RSA 4096-bit trên máy cục bộ (bỏ qua passphrase để tự động hóa)
ssh-keygen -t rsa -b 4096 -f ~/.ssh/ops_client_key -N ""
# 2. Triển khai khóa công khai đến tài khoản đích qua kết nối an toàn
ssh-copy-id -i ~/.ssh/ops_client_key.pub deploy_user@remote_host
Thiết lập tích hợp với Xshell (Windows):
- Sử dụng tính năng
User Key Generation Wizardtrong Xshell để xuất cặp khóa định dạng tương thích OpenSSH. - Chuyển file
.pubvào máy chủ Linux và ghép nội dung vào danh sách ủy quyền:
cat windows_client_key.pub | ssh deploy_user@remote_host 'cat >> ~/.ssh/authorized_keys'
Truy cập cấu hình Connection trong Xshell, chuyển sang tab Authentication, chọn phương thức Publickey và trỏ đến file khóa riêng tư (.ppk đã chuyển đổi hoặc file gốc) để hoàn tất kết nối bảo mật.