SSH ProxyJump và Bastion Host: Hướng dẫn thực tế để truy cập Linux bảo mật

Linux tutorial - IT technology blog
Linux tutorial - IT technology blog

Truy cập SSH hiện đại: Vượt xa khỏi Port Forwarding cồng kềnh

Việc để lộ mọi máy chủ cơ sở dữ liệu hoặc ứng dụng ra internet công cộng là một rủi ro bảo mật khổng lồ. Trong một mạng lưới an toàn, các nút (node) nhạy cảm của bạn nằm trong các mạng con riêng tư (private subnet) không có địa chỉ IP công cộng. Nhưng khi một lỗi production xảy ra lúc 2 giờ sáng, bạn vẫn cần cách để truy cập các bản log đó. Trong hơn một thập kỷ, câu trả lời tiêu chuẩn là port forwarding cục bộ. Bạn sẽ phải ánh xạ thủ công một cổng cục bộ tới một cổng từ xa, thường dẫn đến các lỗi ‘Address already in use’ gây khó chịu. Nó vẫn hoạt động, nhưng là một cơn ác mộng về quản lý.

OpenSSH 7.3 đã thay đổi cuộc chơi với ProxyJump (tham số -J). Tính năng này thay thế ProxyCommand dài dòng cũ bằng một cách hợp lý hơn để điều hướng lưu lượng qua một máy chủ trung gian gọi là ‘Bastion Host’. Trong khi việc tạo tunnel truyền thống giống như việc tự tay xây một cây cầu tạm thời, ProxyJump hoạt động như một chuyến bay thẳng được dẫn đường bằng GPS. Bạn xác định đích đến, và SSH sẽ tự động xử lý các kết nối trung gian.

Sự đánh đổi: Tại sao nên sử dụng Bastion Host?

Sử dụng Bastion Host — đôi khi được gọi là Jump Box — là một mô hình bảo mật tiêu chuẩn. Tuy nhiên, điều quan trọng là phải cân nhắc giữa lợi ích và chi phí vận hành trước khi thay đổi kiến trúc của bạn.

Ưu điểm

  • Thu hẹp bề mặt tấn công: Thay vì quản lý tường lửa cho 50 máy chủ khác nhau, bạn chỉ cần gia cố một cổng vào duy nhất. Điều này cho phép bạn tập trung các công cụ nghiêm ngặt như Fail2ban hoặc CrowdSec vào một điểm truy cập duy nhất.
  • Điểm kiểm tra duy nhất: Việc bắt buộc mọi lưu lượng đi qua một cổng tạo ra một bản log thống nhất về việc ai đã truy cập cái gì. Nó giúp việc kiểm toán tuân thủ nhanh hơn đáng kể.
  • Tiết kiệm chi phí: Địa chỉ IPv4 công cộng ngày càng đắt đỏ. Bằng cách sử dụng Bastion, bạn chỉ trả tiền cho một IP công cộng trong khi phần còn lại của hệ thống vẫn sử dụng các địa chỉ riêng tư miễn phí.

Nhược điểm

  • Rủi ro nghẽn cổ chai: Nếu Bastion Host gặp sự cố, toàn bộ mạng nội bộ của bạn sẽ không thể truy cập được. Bạn phải đảm bảo máy chủ này ổn định hoặc có cơ chế dự phòng.
  • Độ trễ tăng thêm: Mỗi gói tin phải đi qua một bước nhảy (hop) bổ sung. Trong thử nghiệm của tôi, điều này thường thêm khoảng 15ms đến 30ms độ trễ, mức này không đáng kể đối với các tác vụ dòng lệnh nhưng có thể làm chậm các tiến trình sao lưu cơ sở dữ liệu lớn.

Thiết lập Production đã qua kiểm chứng

Một Bastion Host nên là một máy chủ ‘tối giản’. Tôi thích sử dụng Alpine Linux hoặc một bản image Ubuntu 24.04 đã được lược bỏ. Tránh cài đặt trình biên dịch, máy chủ web hoặc bất kỳ tệp thực thi không cần thiết nào. Mục tiêu là không để lại gì cho kẻ tấn công khai thác nếu chúng chiếm được quyền điều khiển dòng lệnh.

Trong một dự án gần đây với 20 nút riêng tư, việc chuyển từ tunnel cố định sang ProxyJump đã cắt giảm thời gian thực thi tập lệnh triển khai của chúng tôi gần 35%. Chúng tôi không còn phải đợi nhiều tiến trình chạy ngầm khởi tạo. Chi phí kết nối thấp hơn đáng kể và logic cũng dễ bảo trì hơn cho đội ngũ.

Tôi luôn vô hiệu hóa đăng nhập bằng mật khẩu trên gateway. Chỉ sử dụng khóa SSH, hoặc tốt hơn nữa là các khóa bảo mật phần cứng như YubiKey. Ngoài ra, hãy cân nhắc chuyển dịch vụ SSH từ cổng 22 sang một cổng không tiêu chuẩn như 2222. Thay đổi đơn giản này có thể giảm nhiễu trong log từ 5.000 lần thử của bot tự động mỗi giờ xuống gần như bằng không.

Từng bước: Cấu hình ProxyJump

Hãy xem xét một kịch bản thực tế. Chúng ta có ba máy:

  1. Máy của bạn: Laptop cá nhân.
  2. Bastion Host: IP công cộng 203.0.113.10 (User: jumpuser).
  3. Máy chủ Database: IP riêng tư 10.0.0.50 (User: dbadmin).

1. Lệnh nhanh trên một dòng

Cần kết nối nhanh mà không muốn chỉnh sửa tệp? Hãy sử dụng tham số -J. Đây là cách trực tiếp nhất để nhảy vào một mạng riêng tư.

ssh -J [email protected] [email protected]

Lệnh này mã hóa lưu lượng của bạn từ đầu đến cuối. Bastion chỉ đóng vai trò như một trạm chuyển tiếp. Không giống như phương pháp ‘Agent Forwarding’ cũ, các khóa riêng tư của bạn không bao giờ chạm vào bộ nhớ của Bastion, điều này bảo vệ bạn nếu gateway bị xâm nhập.

2. Phương pháp chuyên nghiệp: SSH Config

Việc lặp lại các địa chỉ IP dài rất tẻ nhạt. Thay vào đó, hãy định nghĩa hạ tầng của bạn trong ~/.ssh/config để sử dụng các bí danh (alias) đơn giản.

# Mở cấu hình của bạn
nano ~/.ssh/config

Thêm các khối sau để tự động hóa việc nhảy bước:

# Gateway đầu vào
Host bastion
    HostName 203.0.113.10
    User jumpuser
    IdentityFile ~/.ssh/id_ed25519_gateway

# Cơ sở dữ liệu riêng tư
Host db-prod
    HostName 10.0.0.50
    User dbadmin
    ProxyJump bastion

Bây giờ, việc truy cập vào database chỉ là một lệnh ngắn gọn:

ssh db-prod

3. Xử lý nhiều bước nhảy

Nếu kiến trúc của bạn yêu cầu nhảy qua một gateway bên ngoài rồi mới đến một VPC của phòng ban cụ thể, bạn có thể chuỗi nhiều máy chủ bằng dấu phẩy.

ssh -J user1@gate1,user2@gate2 target-user@internal-node

Gia cố cửa chính

Vì Bastion là điểm truy cập chính, bạn phải khóa chặt nó. Cập nhật /etc/ssh/sshd_config trên Bastion với các thiết lập sau:

# Tắt thử nghiệm mật khẩu
PasswordAuthentication no

# Vô hiệu hóa chuyển tiếp GUI
X11Forwarding no

# Chỉ cho phép người dùng admin cụ thể của bạn
AllowUsers jumpuser

# Ngắt kết nối các phiên rảnh sau 5 phút
ClientAliveInterval 300
ClientAliveCountMax 0

Luôn chạy sshd -t để kiểm tra lỗi cú pháp trước khi khởi động lại dịch vụ. Tôi đã từng tự nhốt mình khỏi các trung tâm dữ liệu từ xa không chỉ một lần vì bỏ qua bước xác thực năm giây đó. ProxyJump không chỉ là một tính năng tiện lợi; nó là một công cụ nền tảng để quản lý các môi trường Linux hiện đại và an toàn.

Share: