Hướng dẫn cài đặt SSH server với các tính năng bảo mật cần thiết.
SSH là giao thức tuyệt vời cho việc quản trị từ xa vì nó bảo mật (Đường truyền được mã hóa hai chiều), hỗ trợ đăng nhập bằng khóa công khai (Public Key Authentication), truyền tải file an toàn với giao thức Secure FTP (SFTP) và Tunneling (Forward các port từ Server về Client và ngược lại) – Tất cả chỉ qua một port duy nhất (mặc định là port 22).
Mục lục
Cài đặt SSH server
Cài đặt gói openssh-server
để hỗ trợ truy cập từ xa qua giao thức SSH (Secure Shell).
$ sudo apt-get install openssh-server
Vài thiết lập bảo mật SSH server
$ sudo vi /etc/ssh/sshd_config
Đổi cổng SSH mặc định
Đổi cổng SSH mặc định từ 22 thành một cổng bất kỳ ví dụ 2022.
Port 2022
Không cho tài khoản root
đăng nhập.
PermitRootLogin no
Cho phép user hoặc group đăng nhập
Cho phép các user và group được phép truy cập server bằng SSH với AllowUsers
và AllowGroups
. Nếu có nhiều User hoặc Group thì đặt cách nhau bằng dấu cách.
AllowUsers user01 user02 user03 AllowGroups group01 group02
Nếu đăng nhập bằng user ngoài các user chỉ định trong AllowUsers
và không nằm trong các group chỉ định trong AllowGroups
thì sẽ nhận được thông báo:
Permission denied, please try again.
Chặn truy cập user hoặc group
Chặn các user và group không cho phép truy cập server bằng SSH với DenyUsers
và DenyGroups
. Nếu có nhiều User hoặc Group thì đặt cách nhau bằng dấu cách.
DenyUsers user04 user05 DenyGroups group03 group04
Nếu đăng nhập bằng user được chỉ định trong DenyUsers
hoặc user nằm trong các group chỉ định bởi DenyGroups
thì sẽ nhận được thông báo:
Permission denied, please try again.
Nếu một user có mặt nhiều hơn trong một Directive trên thì thứ tự ưu tiên như sau
DenyUsers > Allow Users > DenyGroups > AllowGroups
Yêu cầu độ phức tạp của mật khẩu với cracklib
Cài đặt module PAM cracklib.
$ sudo apt-get install libpam-cracklib
Xác minh 2 bước (TFA) với Google Authenticator khi đăng nhập bằng SSH
Cài đặt gói hỗ trợ Google Authenticator.
$ sudo apt-get install libpam-google-authenticator
Cấu hình tích hợp xác minh 2 bước vào chức năng đăng nhập tài khoản Linux (Linux PAM).
$ sudo vi /etc/pam.d/sshd
Thêm vào dòng sau:
auth required pam_google_authenticator.so nullok
Sửa file cấu hình SSH server
$ sudo vi /etc/ssh/sshd_config
Cho phép sử dụng Authenticator đã cấu hình trong pam
.
ChallengeResponseAuthentication yes
Khởi động lại SSH server
$ sudo systemctl restart ssh
Thiết lập xác minh 2 bước với user đang đăng nhập:
$ google-authenticator
Lựa chọn time based authentication tokens là đơn giản nhất.
Do you want authentication tokens to be time-based (y/n) y Warning: pasting the following URL into your browser exposes the OTP secret to Google: https://www.google.com/chart?chs=<> << ------ Here right in your Terminal is a Large QR Code ---------- >> << ------ Also here is your secret key and backup codes ------ >> Do you want me to update your "/home/user/.google_authenticator" file? (y/n) y Do you want to disallow multiple uses of the same authentication token? This restricts you to one login about every 30s, but it increases your chances to notice or even prevent man-in-the-middle attacks (y/n) y By default, a new token is generated every 30 seconds by the mobile app. In order to compensate for possible time-skew between the client and the server, we allow an extra token before and after the current time. This allows for a time skew of up to 30 seconds between authentication server and client. If you experience problems with poor time synchronization, you can increase the window from its default size of 3 permitted codes (one previous code, the current code, the next code) to 17 permitted codes (the 8 previous codes, the current code, and the 8 next codes). This will permit for a time skew of up to 4 minutes between client and server. Do you want to do so? (y/n) y If the computer that you are logging into isn't hardened against brute-force login attempts, you can enable rate-limiting for the authentication module. By default, this limits attackers to no more than 3 login attempts every 30s. Do you want to enable rate-limiting? (y/n) y
Dùng app Google Authenticator trên smart phone Android / iOS để quét mã QR code hoặc nhập mã xác thực.
Giữ kết nối khi không có hoạt động
Cấu hình phía client
Client sẽ liên tục gửi gói tin no-op (no-op null packet) lên server để giữ kết nối (keep alive) khi không có hoạt động gì phía client. Như cài đặt dưới đây, khi không có hoạt động, client sẽ gửi gói tin no-op sau mỗi 60 giây và tối đa 10 lần nếu không có phản hồi từ server.
${HOME}/.ssh/config
Host * ServerAliveInterval 60 ServerAliveCountMax 10
Cấu hình phía server (tùy chọn)
Một cách khác là server chủ động giữ kết nối với client. Tương tự như trên nhưng Server lại là bên chủ động gửi gói tin no-op đến client để giữ kết nối. Như cài đặt dưới đây, khi không có hoạt động, server sẽ gửi gói tin no-op sau mỗi 60 giây và tối đa 10 lần nếu không có phản hồi từ client.
/etc/ssh/sshd_config
ClientAliveInterval 60 ClientAliveCountMax 10