Cài Đặt Và Cấu Hình SSH Server Trên Linux
Giới Thiệu
SSH (Secure Shell Protocol) là một giao thức mạng mật mã cho phép hai máy tính giao tiếp an toàn qua một mạng không an toàn. Nó cung cấp một kênh bảo mật để truy cập từ xa vào máy chủ, thực hiện các lệnh, và truyền tải file một cách mã hóa. SSH là công cụ không thể thiếu đối với bất kỳ quản trị viên hệ thường hoặc nhà phát triển nào làm việc với máy chủ Linux.
Tầm quan trọng và Use Cases:
- Quản trị máy chủ từ xa: Thực thi lệnh, quản lý dịch vụ, cấu hình hệ thống mà không cần truy cập vật lý.
- Truyền file an toàn: Sử dụng SCP (Secure Copy Protocol) hoặc SFTP (SSH File Transfer Protocol) để sao chép file giữa các máy chủ một cách bảo mật.
- Tunneling và Port Forwarding: Tạo các kênh bảo mật để truyền tải dữ liệu từ các ứng dụng khác qua SSH, ví dụ như truy cập cơ sở dữ liệu nội bộ từ xa.
- Hệ thống kiểm soát phiên bản (VCS): Nhiều hệ thống VCS như Git sử dụng SSH để xác thực và truyền tải dữ liệu.
Metadata:
- Thời gian thực hiện: 15-30 phút
- Độ khó: Trung bình
- Yêu cầu: Quyền truy cập
sudotrên máy chủ Linux, kết nối internet ổn định.
Yêu Cầu Hệ Thống
Để cài đặt và cấu hình SSH Server, bạn sẽ cần một máy chủ chạy hệ điều hành Linux. Hầu hết các bản phân phối Linux hiện đại đều hỗ trợ OpenSSH Server.
- Hệ điều hành: Bất kỳ phiên bản Linux phổ biến nào (Ubuntu, Debian, CentOS, RHEL, Fedora, v.v.).
- Cấu hình tối thiểu:
- CPU: 1 core
- RAM: 512MB
- Dung lượng đĩa: 1GB (để cài đặt OS và SSH)
- Kết nối mạng.
- Cấu hình khuyến nghị:
- Đối với máy chủ sản xuất, cấu hình phần cứng sẽ phụ thuộc vào tải công việc tổng thể của máy chủ, nhưng bản thân SSH Server có yêu cầu tài nguyên rất thấp.
- Đảm bảo máy chủ có địa chỉ IP tĩnh hoặc có thể truy cập được từ mạng bên ngoài (nếu cần truy cập từ internet).
Các Bước Thực Hiện Chi Tiết
Chúng ta sẽ đi qua từng bước để cài đặt và cấu hình SSH Server (OpenSSH) trên máy chủ Linux. Các lệnh ví dụ sẽ được cung cấp cho cả hệ thống dựa trên Debian/Ubuntu và CentOS/RHEL.
1. Cập Nhật Hệ Thống
Luôn là một thực hành tốt khi cập nhật gói phần mềm của hệ thống trước khi cài đặt các dịch vụ mới. Điều này đảm bảo bạn có các bản vá bảo mật mới nhất và tránh các vấn đề tương thích.
# Đối với hệ thống Debian/Ubuntu
sudo apt update # Cập nhật danh sách gói phần mềm
sudo apt upgrade -y # Nâng cấp các gói đã cài đặt lên phiên bản mới nhất
# Đối với hệ thống CentOS/RHEL/Fedora
sudo yum update -y # Cập nhật các gói đã cài đặt lên phiên bản mới nhất (CentOS 7 trở xuống)
# HOẶC
sudo dnf update -y # Cập nhật các gói đã cài đặt lên phiên bản mới nhất (CentOS 8+, Fedora)
2. Cài Đặt OpenSSH Server
OpenSSH Server là triển khai phổ biến nhất của giao thức SSH.
🔒 Bước 1: Cài đặt gói OpenSSH Server
# Đối với hệ thống Debian/Ubuntu
sudo apt install openssh-server -y
# Đối với hệ thống CentOS/RHEL/Fedora
sudo yum install openssh-server -y
# HOẶC
sudo dnf install openssh-server -y
Sau khi cài đặt, dịch vụ SSH thường sẽ tự động khởi động.
3. Kiểm Tra Trạng Thái Dịch Vụ SSH
Sau khi cài đặt, hãy kiểm tra xem dịch vụ SSH đã chạy đúng cách chưa.
⚙️ Bước 2: Kiểm tra trạng thái dịch vụ SSH
sudo systemctl status ssh
Bạn sẽ thấy output tương tự như sau, cho thấy dịch vụ đang active (running):
● ssh.service - OpenBSD Secure Shell server
Loaded: loaded (/lib/systemd/system/ssh.service; enabled; vendor preset: enabled)
Active: active (running) since Mon 2023-10-26 10:00:00 UTC; 10min ago
Docs: man:sshd(8)
man:sshd_config(5)
Main PID: 1234 (sshd)
Tasks: 1 (limit: 1137)
Memory: 3.5M
CGroup: /system.slice/ssh.service
└─1234 /usr/sbin/sshd -D
Nếu dịch vụ không chạy, bạn có thể khởi động nó bằng lệnh:
sudo systemctl start ssh
sudo systemctl enable ssh # Đảm bảo dịch vụ khởi động cùng hệ thống
4. Cấu Hình Cơ Bản SSH Server
File cấu hình chính của SSH Server là /etc/ssh/sshd_config. Đây là nơi bạn có thể tùy chỉnh các thiết lập bảo mật và hành vi của SSH.
⚠️ Quan trọng: Luôn sao lưu file cấu hình gốc trước khi thực hiện bất kỳ thay đổi nào.
⚙️ Bước 3: Sao lưu file cấu hình gốc
sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak
⚙️ Bước 4: Chỉnh sửa file cấu hình sshd_config
Mở file bằng trình soạn thảo văn bản yêu thích của bạn (ví dụ: nano hoặc vim):
sudo nano /etc/ssh/sshd_config
Dưới đây là một số cấu hình quan trọng mà bạn nên xem xét thay đổi để tăng cường bảo mật:
-
Port: Thay đổi cổng mặc định từ 22 sang một số cổng khác (ví dụ: 2222, 22000). Điều này giúp giảm thiểu các cuộc tấn công quét cổng tự động.-#Port 22
+Port 2222💡 Mẹo: Chọn một cổng lớn hơn 1024 và nhỏ hơn 65535 để tránh xung đột với các dịch vụ đã biết.
-
PermitRootLogin: Vô hiệu hóa quyền đăng nhập trực tiếp bằng tài khoảnroot. Điều này ngăn chặn kẻ tấn công cố gắng đoán mật khẩu của tài khoảnrootcó đặc quyền cao nhất. Thay vào đó, bạn nên đăng nhập bằng tài khoản người dùng thông thường và sử dụngsudokhi cần quyền root.-#PermitRootLogin prohibit-password
+PermitRootLogin no💡 Lưu ý: Trên một số phiên bản Linux, giá trị mặc định có thể là
prohibit-passwordhoặcwithout-password, vẫn cho phép đăng nhập root với SSH key. Để bảo mật tối đa, hãy đặt thànhno. -
PasswordAuthentication: Vô hiệu hóa xác thực bằng mật khẩu và chỉ cho phép xác thực bằng SSH key. Đây là một biện pháp bảo mật rất mạnh mẽ.-#PasswordAuthentication yes
+PasswordAuthentication no⚠️ Cảnh báo: Đảm bảo bạn đã thiết lập SSH key-based authentication thành công và có thể ưăng nhập bằng key trước khi vô hiệu hóa xác thực bằng mật khẩu. Nếu không, bạn có thể bị khóa khỏi máy chủ của mình.
-
PubkeyAuthentication: Đảm bảo xác thực bằng khóa công khai (public key) được bật.-#PubkeyAuthentication yes
+PubkeyAuthentication yes(Thường đã được bật theo mặc định)
-
AllowUsers/DenyUsers: Kiểm soát người dùng nào được phép hoặc không được phép đăng nhập qua SSH.+# Chỉ cho phép user1 và user2 đăng nhập
+AllowUsers user1 user2💡 Mẹo: Sử dụng
AllowUsersđể chỉ định rõ ràng những người dùng được phép truy cập, thay vìDenyUsers(cách tiếp cận whitelist an toàn hơn). -
LoginGraceTime: Thời gian tối đa (tính bằng giây) mà người dùng có để đăng nhập sau khi kết nối.-#LoginGraceTime 2m
+LoginGraceTime 60 -
MaxAuthTries: Số lần thử xác thực tối đa cho mỗi kết nối.-#MaxAuthTries 6
+MaxAuthTries 3 -
ClientAliveIntervalvàClientAliveCountMax: Giúp giữ kết nối SSH không bị ngắt quãng bởi firewall hoặc timeout.-#ClientAliveInterval 0
+# Gửi gói tin giữ kết nối mỗi 60 giây
+ClientAliveInterval 60
-#ClientAliveCountMax 3
+# Ngắt kết nối sau 3 lần không nhận được phản hồi
+ClientAliveCountMax 3 -
Banner: Hiển thị một thông báo chào mừng hoặc cảnh báo bảo mật trước khi người dùng đăng nhập.# Tạo file banner
sudo nano /etc/ssh/ssh_banner.txtNội dung file
ssh_banner.txt:***************************************************
* WARNING: Unauthorized access is prohibited! *
* This system is for authorized users only. *
* All activities are monitored and recorded. *
***************************************************Sau đó, thêm dòng này vào
sshd_config:-#Banner none
+Banner /etc/ssh/ssh_banner.txt
Sau khi thực hiện các thay đổi, lưu file cấu hình và thoát trình soạn thảo.
5. Tạo SSH Key Pair (Trên máy Client)
Xác thực bằng SSH key an toàn hơn nhiều so với xác thực bằng mật khẩu. Nó liên quan đến việc tạo một cặp khóa (key pair) – một khóa riêng tư (private key) và một khóa công khai (public key). Khóa công khai được đặt trên máy chủ, và khóa riêng tư được giữ an toàn trên máy khách của bạn.
🌐 Bước 5: Tạo SSH key pair trên máy Client
Thực hiện lệnh này trên máy tính mà bạn sẽ dùng để kết nối đến server:
ssh-keygen -t rsa -b 4096 -C "[email protected]"
-t rsa: Chỉ định loại thuật toán khóa (RSA).-b 4096: Chỉ định độ dài bit của khóa (4096 bit là mức bảo mật tốt).-C "[email protected]": Thêm một bình luận để dễ nhận biết khóa này thuộc về ai.
Khi được hỏi, bạn có thể nhập một passphrase để bảo vệ khóa riêng tư của mình. Điều này là khuyến nghị để tăng cường bảo mật.
Generating public/private rsa key pair.
Enter file in which to save the key (/home/youruser/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/youruser/.ssh/id_rsa
Your public key has been saved in /home/youruser/.ssh/id_rsa.pub
The key fingerprint is:
SHA256:....................................... [email protected]
The key's randomart image is:
+---[RSA 4096]----+
| .+o. |
| .oo. |
| . o |
| . . |
| . S. |
| . . B.= |
| . o + O + |
| + O B = . |
| . E * = |
+----[SHA256]-----+
Thao tác này sẽ tạo ra hai file trong thư mục ~/.ssh/ trên máy client của bạn:
id_rsa: Khóa riêng tư (private key) - KHÔNG BAO GIỜ CHIA SẺ FILE NÀY!id_rsa.pub: Khóa công khai (public key) - File này sẽ được sao chép lên máy chủ.
6. Sao Chép Public Key Lên Server
Để cho phép máy khách của bạn đăng nhập vào máy chủ bằng SSH key, bạn cần sao chép khóa công khai (id_rsa.pub) từ máy khách lên máy chủ.
🌐 Bước 6: Sao chép Public Key lên Server
Cách dễ nhất là sử dụng lệnh ssh-copy-id:
ssh-copy-id your_username@your_server_ip
- Thay thế
your_usernamebằng tên người dùng trên máy chủ của bạn. - Thay thế
your_server_ipbằng địa chỉ IP hoặc hostname của máy chủ.
Lệnh này sẽ hỏi mật khẩu của your_username trên server (lần cuối cùng bạn cần dùng mật khẩu nếu bạn đã tắt PasswordAuthentication). Sau đó, nó sẽ tự động thêm khóa công khai của bạn vào file ~/.ssh/authorized_keys trên server và thiết lập các quyền cần thiết.
Nếu ssh-copy-id không có sẵn hoặc bạn muốn làm thủ công:
cat ~/.ssh/id_rsa.pub | ssh your_username@your_server_ip "mkdir -p ~/.ssh && chmod 700 ~/.ssh && cat >> ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys"
Lệnh này sẽ:
-
Đọc nội dung của
id_rsa.pub. -
Kết nối SSH đến server (sẽ hỏi mật khẩu).
-
Trên server:
- Tạo thư mục
.sshnếu nó chưa tồn tại (mkdir -p ~/.ssh). - Thiết lập quyền
700cho thư mục.ssh(chmod 700 ~/.ssh). - Nối khóa công khai vào file
authorized_keys(cat >> ~/.ssh/authorized_keys). - Thiết lập quyền
600cho fileauthorized_keys(chmod 600 ~/.ssh/authorized_keys).
⚠️ Quan trọng: Các quyền của thư mục
~/.sshphải là700và của file~/.ssh/authorized_keysphải là600để SSH key-based authentication hoạt động. - Tạo thư mục
7. Kiểm Tra Kết Nối SSH Bằng Key
Sau khi sao chép khóa công khai, hãy thử kết nối lại từ máy khách của bạn.
✅ Bước 7: Kiểm tra kết nối SSH
ssh your_username@your_server_ip -p 2222 # Sử dụng cổng tùy chỉnh nếu đã thay đổi
Nếu mọi thứ được cấu hình đúng, bạn sẽ được đăng nhập vào máy chủ mà không cần nhập mật khẩu (hoặc chỉ cần nhập passphrase nếu bạn đã đặt cho khóa riêng tư của mình).
8. Cấu Hình Firewall
Firewall là một thành phần quan trọng để bảo vệ máy chủ của bạn. Bạn cần cho phép lưu lượng truy cập SSH qua firewall.
⚙️ Bước 8: Cấu hình Firewall
-
Đối với UFW (Uncomplicated Firewall) trên Ubuntu/Debian:
sudo ufw allow 2222/tcp # Thay 2222 bằng cổng SSH bạn đã cấu hình
sudo ufw enable # Bật UFW nếu chưa bật
sudo ufw status verbose # Kiểm tra trạng thái UFW -
Đối với firewalld trên CentOS/RHEL/Fedora:
# Thêm dịch vụ SSH với cổng mặc định (nếu bạn không đổi cổng)
# sudo firewall-cmd --permanent --add-service=ssh
# Hoặc thêm cổng tùy chỉnh của bạn
sudo firewall-cmd --permanent --add-port=2222/tcp # Thay 2222 bằng cổng SSH bạn đã cấu hình
sudo firewall-cmd --reload # Tải lại cấu hình firewall để áp dụng thay đổi
sudo firewall-cmd --list-all # Kiểm tra trạng thái firewalld
9. Khởi Động Lại Dịch Vụ SSH
Sau khi thực hiện mọi thay đổi trong file sshd_config, bạn cần khởi động lại dịch vụ SSH để các thay đổi có hiệu lực.
✅ Bước 9: Khởi động lại dịch vụ SSH
sudo systemctl restart ssh
Sau khi khởi động lại, hãy thử kết nối lại từ máy khách của bạn để đảm bảo mọi thứ vẫn hoạt động như mong đợi.
Troubleshooting hoặc Các Vấn Đề Thường Gặp
-
Permission denied (publickey, password).- Nguyên nhân: Thường xảy ra khi xác thực bằng SSH key không thành công hoặc mật khẩu không đúng (nếu
PasswordAuthenticationvẫn bật). - Giải pháp:
- Kiểm tra quyền của file
~/.ssh/authorized_keystrên server (phải là600) và thư mục~/.ssh(phải là700). - Đảm bảo khóa công khai của bạn (
id_rsa.pub) đã được thêm đúng vàoauthorized_keystrên server. - Kiểm tra xem
PubkeyAuthentication yescó được bật trongsshd_configkhông. - Nếu bạn đã vô hiệu hóa
PasswordAuthentication, hãy đảm bảo bạn đang sử dụng khóa SSH hợp lệ. - Kiểm tra
AllowUserstrongsshd_config.
- Kiểm tra quyền của file
- Nguyên nhân: Thường xảy ra khi xác thực bằng SSH key không thành công hoặc mật khẩu không đúng (nếu
-
Connection refused- Nguyên nhân: Dịch vụ SSH không chạy, firewall chặn cổng SSH, hoặc bạn đang cố gắng kết nối đến một cổng sai.
- Giải pháp:
- Kiểm tra trạng thái dịch vụ SSH trên server:
sudo systemctl status ssh. - Kiểm tra cấu hình firewall trên server để đảm bảo cổng SSH của bạn được phép.
- Đảm bảo bạn đang kết nối đến đúng cổng SSH đã cấu hình (
ssh -p <your_port> user@ip).
- Kiểm tra trạng thái dịch vụ SSH trên server:
-
No route to host- Nguyên nhân: Thường là lỗi mạng cơ bản, máy chủ không thể truy cập được từ máy khách.
- Giải pháp:
- Kiểm tra kết nối mạng giữa máy khách và máy chủ (ping địa chỉ IP của server).
- Đảm bảo địa chỉ IP của server là chính xác.
- Kiểm tra cài đặt mạng trên server.
-
Sử dụng chế độ verbose để gỡ lỗi:
- Nếu bạn gặp sự cố khi kết nối, hãy sử dụng tùy chọn
-vvvvới lệnhsshđể xem thông tin gỡ lỗi chi tiết:ssh -vvv your_username@your_server_ip -p 2222 - Đọc log của SSH server trên máy chủ:
- Debian/Ubuntu:
sudo journalctl -u ssh.servicehoặcsudo tail -f /var/log/auth.log - CentOS/RHEL:
sudo journalctl -u sshd.servicehoặcsudo tail -f /var/log/secure
- Debian/Ubuntu:
- Nếu bạn gặp sự cố khi kết nối, hãy sử dụng tùy chọn
Kết Luận
Việc cài đặt và cấu hình SSH Server là một bước cơ bản nhưng vô cùng quan trọng trong việc quản lý và bảo mật máy chủ Linux. Bằng cách làm theo các bước trong hướng dẫn này, bạn đã thiết lập một kênh giao tiếp an toàn và thực hiện các biện pháp bảo mật cơ bản để bảo vệ máy chủ của mình khỏi các mối đe dọa phổ biến.
Best Practices (Thực hành tốt nhất):
- Sử dụng SSH Key-based Authentication: Luôn ưu tiên xác thực bằng khóa SSH thay vì mật khẩu.
- Vô hiệu hóa đăng nhập Root: Không cho phép tài khoản
rootđăng nhập trực tiếp qua SSH. - Thay đổi cổng SSH mặc định: Di chuyển cổng SSH từ 22 sang một cổng khác để giảm thiểu các cuộc tấn công tự động.
- Giới hạn người dùng/nhóm: Chỉ cho phép những người dùng hoặc nhóm cụ thể truy cập SSH.
- Bảo vệ khóa riêng tư bằng Passphrase: Luôn đặt passphrase cho khóa riêng tư của bạn.
- Cấu hình Firewall: Chỉ mở cổng SSH cần thiết và chặn tất cả các cổng khác.
- Cập nhật hệ thống thường xuyên: Giữ cho hệ điều hành và gói OpenSSH Server luôn được cập nhật để nhận các bản vá bảo mật mới nhất.
- Sử dụng Fail2ban: Cân nhắc cài đặt Fail2ban để tự động chặn các địa chỉ IP có hành vi đăng nhập đáng ngờ.
- Kiểm tra logs thường xuyên: Theo dõi logs của SSH để phát hiện sớm các hoạt động bất thường.
Tài liệu tham khảo:
- OpenSSH Official Website
man sshd_config(Trên máy chủ Linux của bạn)man ssh_config(Trên máy khách Linux của bạn)- Debian SSH Handbook
- CentOS/RHEL Documentation on OpenSSH