SSH Dựa trên Danh tính: Tại sao tôi cuối cùng đã đóng Cổng 22 và loại bỏ việc quản lý SSH Key

Security tutorial - IT technology blog
Security tutorial - IT technology blog

Chấm dứt cơn ác mộng quản lý SSH Key

Tôi từng dành cả sáng thứ Hai để đuổi theo các lập trình viên mới nhằm lấy public key của họ. Mỗi khi có người mới gia nhập đội ngũ, tôi phải phân phối các key đó một cách thủ công lên hàng chục máy chủ production và staging. Khi một cộng tác viên kết thúc dự án, tôi phải tỉ mỉ xóa quyền truy cập của họ khỏi mọi tệp authorized_keys. Đó là một công việc thủ công, dễ sai sót và cảm thấy hoàn toàn lạc lõng trong quy trình DevOps hiện đại.

Sáu tháng trước, tôi đã chuyển toàn bộ hạ tầng sang Tailscale SSH. Mục tiêu rất rõ ràng: loại bỏ các key cá nhân và ẩn Cổng 22 khỏi internet công cộng. Sau nửa năm vận hành thực tế, kết quả mang lại là một sự nhẹ nhõm lớn. Chúng tôi không còn lo lắng về các cuộc tấn công brute-force vào IP công cộng nữa. Đơn giản là không còn cổng SSH công cộng nào để hacker quét nữa.

Vượt qua những lỗ hổng của Cổng 22

SSH truyền thống dựa trên một địa chỉ IP có thể truy cập và một cặp khóa mật mã (cryptographic key pair). Mặc dù phương pháp này an toàn nếu bạn tuân thủ mọi quy tắc tốt nhất, nhưng nó có một khuyết điểm chết người: khả năng hiển thị. Nếu bạn kiểm tra /var/log/auth.log trên một VPS cloud tiêu chuẩn, bạn có thể sẽ thấy hơn 5.000 lần đăng nhập thất bại từ các mạng botnet toàn cầu mỗi ngày. Đó là rất nhiều nhiễu và rủi ro không cần thiết.

Tailscale SSH đảo ngược logic này. Thay vì xác minh một tệp (key), nó xác minh danh tính của bạn. Vì Tailscale được xây dựng trên WireGuard, nó tạo ra một mạng lưới riêng tư (private mesh network)—thường được gọi là “Tailnet”—giữa các thiết bị của bạn. Khi bạn cố gắng kết nối, Tailscale sẽ kiểm tra xem danh tính đã được xác thực của bạn từ các nhà cung cấp như Google, Microsoft hoặc Okta có quyền truy cập vào máy cụ thể đó hay không. Nếu danh tính khớp, kết nối sẽ được mã hóa và định tuyến qua một đường hầm bảo mật.

Đây mới là điểm mấu chốt: SSH daemon của máy chủ thậm chí không cần lắng nghe trên một giao diện công cộng. Bạn có thể cấu hình tường lửa (UFW, iptables, hoặc AWS Security Groups) để chặn toàn bộ lưu lượng truy cập đến trên Cổng 22. Miễn là dịch vụ Tailscale đang chạy, bạn có thể kết nối bảo mật từ bất cứ đâu.

Thiết lập môi trường

Bảo mật bắt đầu từ một nền tảng vững chắc. Ngay cả khi chúng ta đang rời xa SSH truyền thống, bạn vẫn cần một mật khẩu root hoặc sudo mạnh để thiết lập ban đầu hoặc truy cập cục bộ trong trường hợp khẩn cấp. Khi dựng máy chủ, tôi sử dụng trình tạo mật khẩu tại toolcraft.app/vi/tools/security/password-generator. Nó chạy hoàn toàn trong trình duyệt của bạn. Không có dữ liệu nào rời khỏi máy tính, khiến nó trở thành một cách đáng tin cậy để tạo các chuỗi có độ hỗn loạn cao (high-entropy) dài 32 ký tự.

Bước 1: Cài đặt Tailscale trên máy chủ

Đầu tiên, hãy cài đặt Tailscale agent trên máy mục tiêu. Đối với hầu hết các bản phân phối Linux, bạn có thể sử dụng script đơn giản này:

curl -fsSL https://tailscale.com/install.sh | sh

Bước 2: Xác thực và kích hoạt SSH

Tiếp theo, đưa node vào Tailnet của bạn. Chúng tôi sử dụng cờ --ssh để yêu cầu Tailscale xử lý lưu lượng SSH cho máy này.

sudo tailscale up --ssh

Sau khi chạy lệnh này, hãy truy cập URL được cung cấp để xác thực máy chủ trong trình duyệt của bạn. Máy chủ hiện đã là một phần của mạng riêng tư của bạn. Cờ --ssh hướng dẫn Tailscale daemon lắng nghe các kết nối trên giao diện Tailscale (thường là 100.x.y.z), giúp bỏ qua sshd tiêu chuẩn một cách hiệu quả.

Định nghĩa Danh sách Kiểm soát Truy cập (ACL)

Khi Tailscale SSH đã hoạt động, logic bảo mật sẽ chuyển từ các tệp cục bộ trên máy chủ sang Bảng điều khiển Quản trị (Admin Console) tập trung. Bạn quản lý mọi thứ thông qua ACL dựa trên JSON. Đây là nơi bạn định nghĩa chính xác ai có thể truy cập tài nguyên nào.

Trong thiết lập production của chúng tôi, tôi phân nhóm người dùng thành các danh mục như group:admingroup:dev. Đây là phiên bản rút gọn của cấu hình tôi sử dụng để quản lý quyền truy cập:

{
  "groups": {
    "group:admin": ["[email protected]"],
    "group:dev":   ["[email protected]", "[email protected]"]
  },

  "ssh": [
    {
      "action": "accept",
      "src":    ["group:admin"],
      "dst":    ["tag:production", "tag:staging"],
      "users":  ["root", "ubuntu", "admin"]
    },
    {
      "action": "check",
      "src":    ["group:dev"],
      "dst":    ["tag:staging"],
      "users":  ["ubuntu"],
      "checkPeriod": "12h"
    }
  ]
}

Tính năng "action": "check" là một yếu tố thay đổi cuộc chơi. Nó buộc người dùng phải thực hiện kiểm tra xác thực đa yếu tố (MFA) trong trình duyệt trước khi kết nối SSH được chấp nhận. Điều này mang lại mức độ bảo mật mà các SSH key tiêu chuẩn không thể sánh được nếu không có một lượng lớn cấu hình tùy chỉnh phức tạp.

Đóng “cửa trước”

Sau khi bạn đã xác nhận có thể kết nối qua Tailscale, đã đến lúc khóa Cổng 22. Nếu bạn đang dùng Ubuntu với UFW, hãy chạy các lệnh sau:

sudo ufw deny 22/tcp
sudo ufw reload

Nếu bạn sử dụng AWS hoặc DigitalOcean, hãy xóa quy tắc inbound cho Cổng 22 trong Security Groups của bạn. Máy chủ của bạn giờ đây đã trở nên vô hình trước những tiếng nhiễu nền liên tục từ các trình quét SSH trên internet.

Quy trình làm việc hàng ngày: Xác minh & Giám sát

Việc kết nối với máy chủ giờ đây trở nên liền mạch. Trên máy cục bộ, tôi không còn cần phải quản lý các tệp định danh (identity files) hay ghi nhớ địa chỉ IP. Tôi chỉ cần sử dụng hostname Tailscale của máy chủ:

tailscale ssh ubuntu@prod-db-01

Tôi không bao giờ bị hỏi mật khẩu hay passphrase của key. Vì tôi đã đăng nhập vào Tailscale trên laptop của mình, danh tính của tôi đã được chứng minh. Nếu tôi cố gắng kết nối từ một thiết bị chưa được xác thực, lớp mạng sẽ đơn giản là từ chối kết nối.

Kiểm tra tập trung (Auditing)

Bất ngờ lớn nhất trong vài tháng qua là chất lượng của các bản ghi log. Tailscale Admin Console cung cấp bản ghi thời gian thực của mọi kết nối SSH trong toàn bộ hệ thống. Nó hiển thị người dùng, máy mục tiêu và phương thức xác thực đã sử dụng.

Trên chính máy chủ, các lệnh tiêu chuẩn như who hoặc last vẫn hoạt động bình thường. Tailscale tích hợp với hồ sơ đăng nhập của hệ thống, vì vậy các script kiểm tra hiện có của bạn sẽ không bị hỏng. Đối với các môi trường yêu cầu bảo mật cao, Tailscale cũng cung cấp tính năng “Ghi lại phiên làm việc” (Session Recording). Tính năng này ghi lại mọi lệnh đã nhập và mọi phản hồi nhận được, truyền dữ liệu đến một storage bucket bảo mật để xem lại sau.

Độ tin cậy và kịch bản “Phá kính khẩn cấp”

Các đồng nghiệp thường hỏi điều gì sẽ xảy ra nếu Tailscale ngừng hoạt động. Nếu các máy chủ điều phối (coordination servers) không thể truy cập, các kết nối hiện tại vẫn được duy trì. Tailscale sử dụng kiến trúc phân tán, khiến việc mất kết nối hoàn toàn là rất khó xảy ra.

Tuy nhiên, tôi vẫn giữ một người dùng cục bộ “phá kính” (break-glass) cho các trường hợp khẩn cấp. Tôi sử dụng một mật khẩu có độ hỗn loạn cao, chỉ có thể truy cập thông qua bảng điều khiển web của nhà cung cấp cloud, chẳng hạn như AWS Systems Manager hoặc recovery console của DigitalOcean. Điều này đảm bảo chúng tôi không bao giờ bị khóa khỏi phần cứng của chính mình.

Chuyển sang Zero Trust

Việc chuyển sang SSH dựa trên danh tính đã thay đổi căn bản cách tiếp cận của tôi đối với bảo mật vành đai. Chúng tôi đã từ bỏ chiến lược “lâu đài và hào nước” (castle and moat) với việc xây dựng những bức tường dày xung quanh Cổng 22. Thay vào đó, chúng tôi sử dụng mô hình Zero Trust, nơi mọi kết nối đều được xác minh bằng danh tính, bất kể vị trí của người dùng.

Nếu bạn đã mệt mỏi với “vòng lặp” quản lý ~/.ssh/authorized_keys, hãy thử cách này. Chỉ mất khoảng 20 phút để thiết lập máy chủ đầu tiên của bạn. Một khi bạn trải nghiệm việc truy cập không cần key, bạn sẽ không bao giờ muốn quay lại quản lý thủ công nữa.

Share: