Cách tăng cường bảo mật cho OpenSSH Client trên Linux hiệu quả

Cách tăng cường bảo mật cho OpenSSH Client trên Linux hiệu quả

Máy chủ Linux thường được quản trị từ xa thông qua giao thức SSH, kết nối với máy chủ OpenSSH – phần mềm SSH mặc định trên các hệ điều hành như Ubuntu, Debian, CentOS, FreeBSD và nhiều hệ thống dựa trên Linux/BSD khác. Vì SSH là cổng truy cập chủ yếu vào máy chủ, nên rất nhiều nỗ lực đã được đầu tư để bảo vệ phía máy chủ.

Tuy nhiên, bảo mật không chỉ dừng lại ở phía máy chủ mà còn cần chú trọng đến bảo mật phía client – tức là OpenSSH client (lệnh ssh). Bạn có thể tìm hiểu thêm về mô hình SSH client-server trong hướng dẫn “SSH Essentials: Làm Việc Với Máy Chủ, Client và SSH Keys.”

Trong khi việc tăng cường bảo mật máy chủ nhằm mục tiêu làm khó kẻ tấn công truy cập vào hệ thống, thì bảo mật phía client lại cần tập trung vào việc bảo vệ kết nối SSH và client khỏi các mối đe dọa như:

● Tấn công “man-in-the-middle” từ các hacker trên mạng.
● Các máy chủ đã bị xâm nhập hoặc độc hại gửi gói dữ liệu không hợp lệ, chuỗi điều khiển nguy hiểm hoặc khối lượng dữ liệu quá lớn nhằm làm quá tải client.
● Sai sót do con người, ví dụ như nhập sai địa chỉ máy chủ hoặc thiết lập cấu hình không chính xác.

Trong bài hướng dẫn này, bạn sẽ học cách tăng cường bảo mật cho OpenSSH client trên Ubuntu 20.04, đảm bảo rằng mọi kết nối SSH được thực hiện một cách an toàn tối đa.

Yêu cầu

Để hoàn thành hướng dẫn này, bạn cần:

● Một thiết bị sử dụng làm SSH client, ví dụ:
  – Máy tính cá nhân của bạn
  – Một “jump host” hoặc “bastion host” SSH
  – Một máy chủ Ubuntu 20.04 được thiết lập theo hướng dẫn “Cài đặt máy chủ ban đầu với Ubuntu 20.04”, bao gồm tài khoản người dùng không phải root có quyền sudo
  – Một máy chủ SSH mà bạn muốn kết nối, ví dụ:
    – Máy chủ được liệt kê trên trang của DataOnline
    – (Các tham chiếu khác về SSH và tài liệu liên quan)

● Một máy chủ đám mây
● Một dịch vụ công cộng như GitHub hoặc GitLab
● Một thiết bị của bên thứ ba mà bạn được phép truy cập

Khi đã chuẩn bị xong, hãy đăng nhập vào thiết bị SSH client của bạn với tư cách người dùng không phải root để bắt đầu.

Bước 1 – Tăng cường cấu hình chung

Trong bước này, bạn sẽ thực hiện một số cấu hình tăng cường ban đầu để cải thiện bảo mật tổng thể của SSH client.

Cấu hình tăng cường phù hợp với client phụ thuộc rất nhiều vào mô hình đe dọa và ngưỡng rủi ro của bạn. Tuy nhiên, cấu hình dưới đây được xem là an toàn tổng quát phù hợp với hầu hết người dùng.

Nhiều cấu hình tăng cường cho OpenSSH client được thực hiện trong tệp cấu hình toàn cục của OpenSSH client, nằm ở /etc/ssh/ssh_config. Ngoài tệp này, một số cấu hình cũng có thể được thiết lập trong tệp cấu hình cục bộ của người dùng, tại ~/.ssh/config.

Trước khi tiếp tục, bạn nên sao lưu tệp cấu hình hiện có để có thể phục hồi nếu có sự cố xảy ra.

Tạo bản sao lưu của tệp cấu hình bằng các lệnh sau:

sudo cp /etc/ssh/ssh_config /etc/ssh/ssh_config.bak
cp ~/.ssh/config ~/.ssh/config.bak

Các lệnh trên sẽ lưu các bản sao lưu của các tệp ở vị trí mặc định, với phần mở rộng .bak được thêm vào.

Lưu ý: Tệp cấu hình SSH cục bộ (~/.ssh/config) có thể không tồn tại nếu bạn chưa từng sử dụng. Nếu vậy, bạn có thể bỏ qua.

Bây giờ, mở tệp cấu hình toàn cục bằng nano hoặc trình soạn thảo yêu thích của bạn để bắt đầu áp dụng các biện pháp tăng cường:

sudo nano /etc/ssh/ssh_config

Lưu ý: Tệp cấu hình OpenSSH client bao gồm rất nhiều tùy chọn mặc định. Tùy thuộc vào cấu hình hiện tại của bạn, một số tùy chọn tăng cường đã có thể được thiết lập.

Khi chỉnh sửa tệp, một số tùy chọn có thể bị comment (bắt đầu bằng dấu #). Để chỉnh sửa hoặc kích hoạt tùy chọn, hãy bỏ dấu # ở đầu dòng.

Trước tiên, nếu bạn không sử dụng X11 display forwarding, hãy vô hiệu hóa nó bằng cách đặt các tùy chọn sau:

Trong tệp /etc/ssh/ssh_config:

ForwardX11 no
ForwardX11Trusted no

X11 forwarding cho phép hiển thị các ứng dụng đồ họa từ xa qua kết nối SSH, nhưng hiếm khi được sử dụng. Việc vô hiệu hóa giúp ngăn chặn các máy chủ độc hại cố gắng chuyển tiếp phiên X11 tới client của bạn, điều này có thể dẫn đến việc vượt qua quyền truy cập hệ thống hoặc theo dõi phím bấm.

Tiếp theo, hãy cân nhắc vô hiệu hóa SSH tunneling. Vì SSH tunneling được sử dụng rộng rãi, bạn có thể để nó bật nếu cần thiết. Nếu không cần, bạn có thể vô hiệu hóa như sau:

Trong tệp /etc/ssh/ssh_config:

Tunnel no

Ngoài ra, nếu không cần, hãy vô hiệu hóa SSH agent forwarding để ngăn chặn các máy chủ yêu cầu sử dụng SSH agent cục bộ của bạn cho các kết nối SSH sau:

Trong tệp /etc/ssh/ssh_config:

ForwardAgent no

Hầu hết trường hợp, SSH client của bạn sẽ được cấu hình để sử dụng xác thực bằng mật khẩu hoặc public-key khi kết nối. Tuy nhiên, OpenSSH client cũng hỗ trợ các phương pháp xác thực khác, một số trong số đó được kích hoạt mặc định. Nếu không cần thiết, hãy vô hiệu hóa chúng để giảm bớt diện tích tấn công:

Trong tệp /etc/ssh/ssh_config:

GSSAPIAuthentication no
HostbasedAuthentication no

Nếu bạn muốn tìm hiểu thêm về các phương pháp xác thực bổ sung, bạn có thể tham khảo:

OpenSSH client cho phép bạn tự động gửi các biến môi trường tùy chỉnh khi kết nối, ví dụ như đặt ngôn ngữ hoặc cấu hình terminal. Nếu không cần, hãy vô hiệu hóa việc gửi các biến này bằng cách đảm bảo tùy chọn SendEnv bị comment hoặc bị xóa:

Trong tệp /etc/ssh/ssh_config:

# SendEnv

Cuối cùng, hãy đảm bảo rằng strict host key checking được bật, để cảnh báo khi host key/fingerprint của máy chủ từ xa thay đổi hoặc khi kết nối tới máy chủ mới lần đầu:

Trong tệp /etc/ssh/ssh_config:

StrictHostKeyChecking ask

Điều này sẽ ngăn bạn kết nối tới một máy chủ khi host key đã thay đổi, có thể do máy chủ được xây dựng lại hoặc đang gặp tấn công “person-in-the-middle.”

Khi bạn hoàn tất, nhấn ESC để thoát chế độ chèn, sau đó nhập :wq và nhấn ENTER để lưu và thoát tệp. Để tìm hiểu thêm về trình soạn thảo văn bản Vi và người kế nhiệm của nó, Vim, hãy xem hướng dẫn “Cài đặt và sử dụng trình soạn thảo văn bản Vim trên máy chủ đám mây.”

Bây giờ, hãy kiểm tra cú pháp của tệp cấu hình mới bằng cách chạy SSH ở chế độ test:

ssh -G .

Bạn có thể thay thế dấu chấm (.) bằng bất kỳ hostname nào để kiểm tra các tùy chọn trong các khối Match hoặc Host. Nếu tệp cấu hình hợp lệ, các tùy chọn áp dụng cho kết nối đó sẽ được in ra. Nếu có lỗi, output sẽ mô tả vấn đề.

Bạn không cần khởi động lại dịch vụ hệ thống nào để các cấu hình mới có hiệu lực, mặc dù các phiên SSH hiện tại sẽ cần được kết nối lại để sử dụng các thiết lập mới.

Trong bước này, bạn đã hoàn thành việc tăng cường cấu hình chung của OpenSSH client. Tiếp theo, bạn sẽ hạn chế các cipher có sẵn cho các kết nối SSH.

Bước 2 – Hạn chế các cipher có sẵn

OpenSSH hỗ trợ nhiều thuật toán mã hóa (cipher) để bảo mật dữ liệu trong kết nối. Trong bước này, bạn sẽ vô hiệu hóa các bộ cipher lỗi thời hoặc không còn được khuyến nghị sử dụng.

Bắt đầu bằng cách mở tệp cấu hình toàn cục bằng nano hoặc trình soạn thảo yêu thích:

sudo nano /etc/ssh/ssh_config

Đảm bảo rằng dòng cấu hình Ciphers hiện tại được comment (bằng cách thêm dấu # ở đầu dòng). Sau đó, thêm dòng sau vào đầu tệp:

Ciphers -arcfour*,-*cbc

Dòng này sẽ vô hiệu hóa các cipher Arcfour cũ, cũng như tất cả các cipher sử dụng chế độ Cipher Block Chaining (CBC), vốn không còn được khuyến nghị sử dụng.

Nếu bạn cần kết nối tới các hệ thống chỉ hỗ trợ các cipher lỗi thời này, bạn có thể bật lại chúng cho các host cụ thể bằng cách sử dụng khối Match. Ví dụ, để bật cipher 3des-cbc cho một host cũ, cấu hình sau có thể được sử dụng:

Match host legacy-server.your-domain
  Ciphers +3des-cbc

Lưu và thoát tệp (nếu sử dụng nano, nhấn CTRL+O, ENTER để lưu, sau đó CTRL+X để thoát).

Cuối cùng, kiểm tra cấu hình SSH client:

ssh -G .

Nếu bạn đã thêm khối Match để bật các cipher lỗi thời cho một host cụ thể, bạn có thể kiểm tra bằng cách chỉ định địa chỉ host đó:

ssh -G legacy-server.your-domain

Bạn đã bảo vệ các cipher có sẵn cho SSH client. Tiếp theo, bạn sẽ xem xét và bảo vệ quyền truy cập các tệp cấu hình và private key.

Bước 3 – Bảo vệ quyền truy cập tệp cấu hình và private key

Trong bước này, bạn sẽ khóa quyền truy cập cho các tệp cấu hình của SSH client và khóa riêng tư để ngăn chặn các thay đổi vô tình hoặc độc hại, cũng như tránh rò rỉ khóa riêng tư. Điều này đặc biệt hữu ích khi sử dụng thiết bị client dùng chung giữa nhiều người dùng.

Mặc định trên một cài đặt Ubuntu mới, các tệp cấu hình OpenSSH client được thiết lập sao cho mỗi người dùng chỉ có thể chỉnh sửa tệp cấu hình cục bộ của họ (~/.ssh/config), trong khi quyền sudo hoặc quyền quản trị là cần thiết để chỉnh sửa cấu hình toàn hệ thống (/etc/ssh/ssh_config).

Tuy nhiên, trong một số trường hợp, đặc biệt trên các hệ thống đã tồn tại trong thời gian dài, các quyền truy cập tệp cấu hình này có thể đã bị thay đổi hoặc điều chỉnh ngoài ý muốn. Vì vậy, tốt nhất là đặt lại chúng để đảm bảo rằng cấu hình vẫn an toàn.

Bạn có thể bắt đầu bằng cách kiểm tra giá trị quyền truy cập hiện tại của tệp cấu hình OpenSSH client toàn hệ thống bằng lệnh stat, lệnh này giúp hiển thị trạng thái của tệp và/hoặc các đối tượng trong hệ thống tệp:

stat -c "%a %A %U:%G" /etc/ssh/ssh_config

Bạn sử dụng đối số -c để chỉ định một định dạng đầu ra tùy chỉnh.

Lưu ý: Trên một số hệ điều hành như macOS, bạn cần sử dụng tùy chọn -f thay vì -c để chỉ định định dạng tùy chỉnh.

Trong trường hợp này, các tùy chọn %A %a %U:%G sẽ hiển thị quyền của tệp ở dạng số bát phân và định dạng có thể đọc được, cũng như hiển thị người dùng/nhóm sở hữu tệp.

Kết quả đầu ra sẽ trông như sau:

Đầu ra:

644 -rw-r--r-- root:root

Trong trường hợp này, quyền truy cập đã đúng, root sở hữu hoàn toàn tệp và chỉ root mới có quyền ghi/chỉnh sửa nó.

Lưu ý: Nếu bạn muốn ôn lại kiến thức về quyền trong Linux trước khi tiếp tục, bạn có thể tham khảo bài viết Giới thiệu về quyền trong Linux.

Tuy nhiên, nếu đầu ra của bạn khác, bạn nên đặt lại quyền về mặc định bằng các lệnh sau:

sudo chown root:root /etc/ssh/ssh_config
sudo chmod 644 /etc/ssh/ssh_config

Nếu bạn chạy lại lệnh stat ở bước trước, bạn sẽ nhận được giá trị chính xác cho tệp cấu hình toàn hệ thống.

Kiểm tra quyền cấu hình SSH client cục bộ

Bạn có thể thực hiện các kiểm tra tương tự đối với tệp cấu hình SSH client cục bộ (nếu có):

stat -c "%a %A %U:%G" ~/.ssh/config

Lệnh này sẽ trả về:

644 -rw--r--r-- user:user

Nếu quyền truy cập của tệp này khác, bạn có thể đặt lại bằng các lệnh sau:

chown user:user ~/.ssh/config
chmod 644 ~/.ssh/config

Kiểm tra quyền cho khóa riêng SSH

Tiếp theo, bạn nên kiểm tra quyền cho từng khóa riêng SSH trong thư mục ~/.ssh/, vì các tệp này chỉ nên được truy cập bởi chính bạn, không phải người dùng khác trên hệ thống.

Chạy lệnh sau để kiểm tra quyền truy cập cho khóa riêng:

stat -c "%a %A %U:%G" ~/.ssh/id_rsa

Kết quả đầu ra sẽ giống như sau:

600 -rw------- user:user

Việc bảo mật quyền cho khóa riêng là cực kỳ quan trọng. Nếu không, người dùng khác trên thiết bị của bạn có thể đánh cắp khóa và truy cập vào các máy chủ từ xa.

Nếu quyền truy cập chưa được thiết lập đúng, hãy đặt lại bằng các lệnh sau:

chown user:user ~/.ssh/id_rsa
chmod 600 ~/.ssh/id_rsa

Trong bước này, bạn đã kiểm tra và khóa quyền truy cập cho các tệp cấu hình SSH client và khóa riêng. Tiếp theo, bạn sẽ giới hạn danh sách máy chủ mà client có thể kết nối.

Bước 4: Hạn chế kết nối SSH ra ngoài bằng danh sách cho phép

Trong bước cuối cùng này, bạn sẽ thiết lập một danh sách cho phép (allowlist) để giới hạn các máy chủ mà SSH client của bạn có thể kết nối. Điều này đặc biệt hữu ích cho các hệ thống dùng chung hoặc các máy chủ SSH trung gian (jump hosts).

Cấu hình này giúp giảm thiểu lỗi của con người, chẳng hạn như nhập sai địa chỉ máy chủ. Tuy nhiên, người dùng vẫn có thể bỏ qua hạn chế này bằng cách chỉnh sửa tệp cấu hình cục bộ, do đó đây không phải là một biện pháp bảo mật chống lại người dùng độc hại.

Nếu bạn muốn chặn kết nối ra ngoài ở cấp mạng, cách đúng là sử dụng tường lửa, chẳng hạn như UFW (Uncomplicated Firewall).

Nếu bạn chỉ muốn thêm một lớp bảo vệ bổ sung, bạn có thể áp dụng biện pháp này.

Cấu hình danh sách máy chủ cho phép

Danh sách này hoạt động bằng cách sử dụng quy tắc ký tự đại diện trong tệp cấu hình SSH client để chuyển hướng tất cả các kết nối ra ngoài trừ những máy chủ được cho phép.

Mở tệp cấu hình SSH client (tạo nếu chưa tồn tại):

nano ~/.ssh/config

Thêm nội dung sau vào cuối tệp, thay thế bằng danh sách IP và tên máy chủ của bạn:
~/.ssh/config

Match host !203.0.113.1,!192.0.2.1,!server1.your-domain,!github.com,*
  Hostname localhost

Giải thích:

  • Dấu ! trước IP hoặc tên máy chủ cho biết ngoại lệ, nghĩa là các máy chủ này được phép kết nối.
  • Dấu * ở cuối dòng Match host đảm bảo rằng mọi máy chủ không có trong danh sách sẽ bị chuyển hướng đến localhost.
  • Nếu bạn có một máy chủ SSH chạy trên chính máy của mình, hãy thay đổi Hostname localhost thành một giá trị khác để tránh nhầm lẫn, ví dụ: null hoặc disallowed-server.

Sau khi chỉnh sửa, lưu và thoát (nhấn CTRL + X, chọn Y, rồi nhấn ENTER).

Kiểm tra cấu hình

Thử kết nối đến một máy chủ không được phép:

ssh disallowed.your-domain

Kết quả:

Cannot connect to localhost: connection refused
ssh github.com

Kết luận

Trong bài viết này, bạn đã đi sâu vào cách cấu hình OpenSSH client và triển khai các biện pháp bảo mật thiết yếu để đảm bảo an toàn cho kết nối SSH. Qua đó, hệ thống Ubuntu của bạn không chỉ được bảo vệ khỏi các mối đe dọa từ mạng mà còn giữ cho tệp cấu hình SSH luôn ổn định, không bị thay đổi ngoài ý muốn. Việc này đặc biệt quan trọng để ngăn chặn rò rỉ khóa riêng SSH, bảo vệ thông tin đăng nhập và dữ liệu nhạy cảm khỏi nguy cơ bị xâm nhập. Nhờ những cải tiến bảo mật này, SSH client trên Ubuntu của bạn đã được tăng cường đáng kể, góp phần duy trì môi trường hoạt động an toàn và tin cậy cho các kết nối từ xa.

Để lại một bình luận

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *