Cài đặt SSH server trên Debian Linux

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).

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 AllowUsersAllowGroups. 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 DenyUsersDenyGroups . 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