Tự host

Bảo mật homelab Kubernetes với TLS wildcard và không mở cổng

Hướng dẫn sử dụng k3s, Traefik và cert-manager cùng các thử thách DNS-01 để cấp phát chứng chỉ wildcard đáng tin cậy mà không cần phơi bày các dịch vụ nội bộ ra internet.

Hình minh họa một kệ server bảo mật với biểu tượng ổ khóa và khiên đại diện cho các cổng đóng và bảo mật TLS.
Ảnh minh họa tạo riêng cho bài viết

Bài được dịch tự động từ bản gốc tiếng Anh.

Những người tự host (self-hosters) vận hành cụm Kubernetes thường gặp thế tiến thoái lưỡng nan giữa bảo mật và sự tiện lợi khi cấu hình HTTPS. Một hướng dẫn kỹ thuật mới minh họa cách sử dụng k3s, Traefik và cert-manager để cấp phát chứng chỉ wildcard đáng tin cậy thông qua các thử thách DNS-01, loại bỏ nhu cầu mở các cổng vào từ internet công cộng.

Chuyện gì đã xảy ra

Bài viết trình bày một phương pháp bảo mật các ứng dụng web nội bộ trong môi trường homelab mà không phụ thuộc vào chứng chỉ tự ký hoặc phơi bày mạng ra các máy quét bên ngoài. Bằng cách tận dụng giao thức thử thách DNS-01, quản trị viên có thể chứng minh quyền sở hữu domain cho các cơ quan cấp chứng chỉ như Let's Encrypt thông qua các lệnh gọi API tới nhà cung cấp DNS của họ. Cách tiếp cận này cho phép mọi ứng dụng được định tuyến qua cụm nhận chứng chỉ HTTPS hợp lệ, được trình duyệt tin cậy một cách tự động.

Quy trình bắt đầu bằng việc xác minh bộ điều khiển ingress Traefik mặc định được cài đặt bởi k3s. Thay vì chỉnh sửa trực tiếp các manifest được tạo sẵn, hướng dẫn khuyến nghị sử dụng tài nguyên HelmChartConfig để thay đổi các thiết lập của Traefik, chẳng hạn như ép buộc chuyển hướng từ HTTP sang HTTPS. Bài viết cũng lưu ý rằng nên tránh các hướng dẫn cũ đề xuất cài đặt ingress-nginx, vì dự án đó đã bị ngừng hỗ trợ vào tháng 11 năm 2025, với việc bảo trì kết thúc vào tháng 3 năm 2026. Người dùng k3s được khuyên nên di chuyển bất kỳ cấu hình hiện có nào sang lớp Traefik gốc.

Tiếp theo, hướng dẫn chi tiết về việc cài đặt cert-manager, một công cụ tự động hóa quy trình quản lý và cấp phát chứng chỉ TLS. Sau khi cài đặt, quản trị viên cấu hình một ClusterIssuer tương tác với nhà cung cấp DNS của họ, chẳng hạn như Cloudflare, bằng cách sử dụng các token API phạm vi hẹp (scoped API tokens) thay vì khóa toàn cục. Bước cuối cùng liên quan đến việc yêu cầu một chứng chỉ wildcard duy nhất cho domain nội bộ, sau đó Traefik sẽ phục vụ nó làm mặc định cho tất cả các kết nối TLS không khớp, đơn giản hóa cấu hình cho từng ứng dụng riêng lẻ.

Chi tiết chính

  • Không cần mở cổng: Thử thách DNS-01 xác thực quyền sở hữu domain thông qua bản ghi DNS, vì vậy không cần lưu lượng truy cập vào từ internet để cấp phát chứng chỉ.
  • Hiệu quả của Wildcard: Một chứng chỉ duy nhất cho *.home.example.com bao phủ tất cả các ứng dụng nội bộ, giảm bớt khối lượng quản lý và hạn chế việc phơi bày trên các nhật ký minh bạch chứng chỉ (Certificate Transparency logs) công khai.
  • Cấu hình Traefik: Các thiết lập phải được áp dụng thông qua HelmChartConfig trong namespace kube-system, sử dụng service.spec.type thay vì khóa service.type đã bị ngừng hỗ trợ.
  • Thực hành bảo mật tốt nhất: Sử dụng các token API phạm vi hẹp cho nhà cung cấp DNS và lưu trữ bí mật (secrets) trong namespace cert-manager, không phải trong các namespace ứng dụng.
  • Thử nghiệm trước: Luôn kiểm tra cấu hình issuer với các máy chủ staging của Let's Encrypt để tránh chạm giới hạn tần suất (rate limits) trước khi chuyển sang môi trường production.
  • Phân giải nội bộ: Tên máy chủ nội bộ chỉ phân giải thông qua các ghi đè DNS LAN, đảm bảo các dịch vụ vẫn không thể truy cập từ bên ngoài mạng cục bộ ngay cả khi domain là công khai.

Bối cảnh

Việc thiết lập HTTPS truyền thống cho các phòng thí nghiệm tại nhà (home labs) thường liên quan đến hai con đường đầy vấn đề. Một là sử dụng chứng chỉ tự ký, gây ra cảnh báo trình duyệt và làm hỏng các trình quản lý mật khẩu, khiến người dùng quen với việc bỏ qua các cảnh báo bảo mật. Hai là mở cổng 80 để cho phép các thử thách HTTP-01, điều này phơi bày mạng nội bộ ra các cuộc tấn công tiềm tàng. Thử thách DNS-01 giải quyết vấn đề này bằng cách cho phép cơ quan cấp chứng chỉ xác minh quyền kiểm soát domain bằng cách kiểm tra một bản ghi TXT cụ thể trong vùng DNS, một quá trình diễn hoàn toàn ngoài băng tần (out-of-band) so với máy chủ web.

Trong Kubernetes, một bộ điều khiển ingress đóng vai trò là điểm vào cho lưu lượng truy cập bên ngoài, định tuyến các yêu cầu đến các dịch vụ phù hợp. Traefik, đi kèm với k3s, xử lý việc định tuyến và chấm dứt TLS này. Bằng cách thiết lập một kho lưu trữ TLS mặc định trong Traefik, quản trị viên có thể đảm bảo rằng bất kỳ yêu cầu nào khớp với domain nội bộ đều nhận được chứng chỉ wildcard chính xác mà không cần chỉ định tham chiếu secret trong từng tài nguyên Ingress riêng lẻ. Điều này tách biệt việc quản lý chứng chỉ khỏi việc triển khai ứng dụng.

Tại sao điều này quan trọng

Đối với các nhóm và cá nhân quản lý cơ sở hạ tầng tự host, việc duy trì niềm tin vào các công cụ nội bộ là rất quan trọng. Cảnh báo trình duyệt làm xói mòn sự tự tin của người dùng và tạo ra các điểm mù bảo mật nơi các cuộc tấn công lừa đảo (phishing) có thể thành công vì người dùng đã quen với việc bỏ qua lỗi chứng chỉ. Tự động hóa việc cấp phát chứng chỉ hợp lệ đảm bảo rằng các bảng điều khiển nội bộ, môi trường phát triển và công cụ quản trị hoạt động chính xác giống như các hệ thống production, nuôi dưỡng thói quen vệ sinh bảo mật tốt hơn.

Hơn nữa, giảm bề mặt tấn công là mối quan tâm hàng đầu đối với bất kỳ trưởng nhóm IT nào. Bằng cách tránh chuyển tiếp cổng (port forwards) cho việc xác thực chứng chỉ, homelab vẫn vô hình đối với các máy quét diện rộng trên internet. Thiết lập này phù hợp với các nguyên tắc zero-trust, nơi quyền truy cập được cấp thông qua VPN thay vì các quy tắc tường lửa mở. Nó cũng đơn giản hóa các hoạt động; thêm một dịch vụ mới chỉ yêu cầu định nghĩa Ingress tiêu chuẩn, với TLS được xử lý toàn cục bởi chứng chỉ wildcard.

Việc ngừng hỗ trợ ingress-nginx cũng nhấn mạnh tầm quan trọng của việc cập nhật kịp thời những thay đổi trong hệ sinh thái. Dựa vào các thành phần gốc, được hỗ trợ như Traefik trong k3s giúp giảm nợ kỹ thuật và đảm bảo các bản cập nhật bảo mật liên tục. Cách tiếp cận này cung cấp một nền tảng vững chắc, dễ bảo trì cho các dịch vụ nội bộ, có khả năng mở rộng khi nhiều ứng dụng được thêm vào cụm.

Bạn có thể làm gì

  • Xác minh phiên bản Traefik của k3s và cập nhật cấu hình bằng cách sử dụng HelmChartConfig để ép buộc chuyển hướng HTTPS.
  • Cài đặt cert-manager với CRDs được bật và cấu hình một ClusterIssuer cho nhà cung cấp DNS của bạn bằng cách sử dụng các token API phạm vi hẹp.
  • Yêu cầu một chứng chỉ wildcard cho domain nội bộ của bạn bằng cách sử dụng issuer staging trước tiên để xác thực quy trình thử thách DNS.
  • Cấu hình một TLSStore của Traefik để đặt chứng chỉ wildcard làm mặc định cho tất cả các kết nối TLS đến.
  • Đảm bảo DNS nội bộ phân giải domain riêng tư của bạn tới IP LoadBalancer của Traefik, giữ cho các dịch vụ không thể truy cập từ internet công cộng.
  • Thay thế bất kỳ cấu hình ingress-nginx còn lại nào bằng các tài nguyên Ingress tương thích với Traefik, xóa các chú thích (annotations) đã bị ngừng hỗ trợ.

Tin khác

Tất cả tin