Giới hạn chịu đựng của sự mệt mỏi vì mật khẩu
Mọi thứ bắt đầu khá đơn giản với một server Plex và có lẽ là một ổ chia sẻ file cơ bản. Nhưng nếu bạn giống tôi, sở thích này sẽ nhanh chóng phát triển ngoài tầm kiểm soát. Chỉ trong vòng sáu tháng, server duy nhất của tôi đã phải gồng gánh hơn 15 container: Portainer để quản lý, Jellyfin cho truyền thông, Home Assistant để điều khiển đèn, một Wiki cá nhân và ba cơ sở dữ liệu phát triển khác nhau. Đột nhiên, tôi không còn là một người mày mò nghiệp dư nữa; tôi đã trở thành một quản trị viên hệ thống toàn thời gian, phải nhập lại hàng tá mật khẩu khác nhau 20 lần mỗi ngày.
Nguy hiểm thực sự không chỉ nằm ở sự phiền toái—đó còn là lỗ hổng bảo mật. Nhiều công cụ tự lưu trữ (self-hosted) có hệ thống đăng nhập rất thô sơ, và một số thậm chí thiếu hoàn toàn xác thực đa yếu tố (MFA). Việc công khai các dịch vụ này lên web giống như việc lắp một cánh cửa lưới cho một kho tiền vậy.
Bạn cần một ổ khóa kiên cố hơn. Đây là lúc Single Sign-On (SSO) và Identity Providers (IdP) thay đổi cuộc chơi. Thay vì đăng nhập riêng lẻ, bạn chỉ cần xác thực một lần tại một “trạm gác” trung tâm để quản lý quyền truy cập vào toàn bộ tài sản kỹ thuật số của mình. Chuyển sang một hệ thống tập trung là ranh giới rõ ràng giữa một sở thích lộn xộn và một hạ tầng gia đình chuyên nghiệp.
Chọn người gác cổng: Authentik vs. Authelia
Trong cộng đồng self-hosting, có hai cái tên nặng ký chiếm ưu thế. Việc chọn đúng công cụ phụ thuộc vào phần cứng của bạn và mức độ yêu thích của bạn đối với việc chỉnh sửa các file văn bản.
- Authelia: Hãy coi đây là lựa chọn tối giản. Nó cực kỳ nhẹ và chạy hoàn hảo trên các phần cứng cấu hình thấp như Raspberry Pi 4. Tuy nhiên, nó thiếu giao diện cấu hình chuyên dụng; bạn sẽ phải thực hiện hầu hết các thiết lập nặng nề bên trong các file YAML.
- Authentik: Đây là cỗ máy mạnh mẽ “tất cả trong một”. Nó sở hữu giao diện web tinh tế, cơ sở dữ liệu người dùng tích hợp sẵn và hỗ trợ gốc cho các giao thức hiện đại như OAuth2, OIDC và SAML. Hệ thống “Outpost” của nó giúp việc tích hợp với các reverse proxy trở nên vô cùng mượt mà.
Tôi thường khuyên dùng Authentik cho hầu hết các HomeLab hiện đại. Bảng điều khiển trực quan giúp việc lập bản đồ cách người dùng, nhóm và quyền hạn vận hành trở nên dễ dàng hơn nhiều. Trong hướng dẫn này, chúng ta sẽ triển khai Authentik bằng Docker Compose.
Quy trình “Bắt tay” diễn ra như thế nào
Quá trình này là một cuộc hội thoại ba bên nhanh chóng. Bạn cố gắng truy cập stats.yourdomain.com. Reverse proxy của bạn (Nginx Proxy Manager hoặc Traefik) chặn bạn lại và hỏi Authentik: “Người này có vé hợp lệ không?”. Nếu bạn chưa đăng nhập, bạn sẽ bị đẩy sang cổng Authentik. Sau khi bạn cung cấp thông tin đăng nhập và mã TOTP, Authentik sẽ trao cho bạn một “thẻ thông hành” kỹ thuật số và gửi bạn quay lại ứng dụng của mình.
Thực hành: Triển khai Authentik
Bạn sẽ cần sẵn sàng Docker và Docker Compose. Bạn cũng nên có một tên miền hoặc thiết lập DNS nội bộ (như Pi-hole hoặc AdGuard Home) trỏ đến IP nội bộ của server.
Bước 1: Chuẩn bị môi trường
Authentik là một hệ thống phức tạp. Nó yêu cầu server lõi, một background worker, cơ sở dữ liệu PostgreSQL và một instance Redis để lưu bộ nhớ đệm. Bắt đầu bằng cách tạo một không gian làm việc riêng:
mkdir ~/authentik && cd ~/authentik
Tiếp theo, hãy tạo các khóa bảo mật duy nhất của bạn. Đừng bỏ qua bước này—việc sử dụng các khóa mặc định là một hành động mời gọi rắc rối. Authentik cung cấp một cách nhanh chóng để điền vào file .env của bạn:
echo "PG_PASS=$(openssl rand -base64 36 | tr -d '\n')" >> .env
echo "AUTHENTIK_SECRET_KEY=$(openssl rand -base64 36 | tr -d '\n')" >> .env
Bước 2: Cấu hình Docker Compose
Tạo file docker-compose.yml của bạn. Cấu hình này đã được tinh chỉnh để tập trung vào các dịch vụ thiết yếu cần thiết để khởi chạy:
version: '3.4'
services:
postgresql:
image: docker.io/library/postgres:15-alpine
restart: unless-stopped
healthcheck:
test: ["CMD-SHELL", "pg_isready -d $${POSTGRES_DB} -U $${POSTGRES_USER}"]
start_period: 20s
interval: 30s
retry: 5
volumes:
- ./database:/var/lib/postgresql/data
environment:
POSTGRES_PASSWORD: ${PG_PASS}
POSTGRES_USER: ${PG_USER:-authentik}
POSTGRES_DB: ${POSTGRES_DB:-authentik}
env_file: [.env]
redis:
image: docker.io/library/redis:alpine
command: --save 60 1 --loglevel warning
restart: unless-stopped
healthcheck:
test: ["CMD-SHELL", "redis-cli ping | grep PONG"]
volumes:
- ./redis:/data
server:
image: ghcr.io/goauthentik/server:2024.8.3
restart: unless-stopped
command: server
environment:
AUTHENTIK_REDIS__HOST: redis
AUTHENTIK_POSTGRESQL__HOST: postgresql
AUTHENTIK_POSTGRESQL__USER: ${PG_USER:-authentik}
AUTHENTIK_POSTGRESQL__NAME: ${POSTGRES_DB:-authentik}
AUTHENTIK_POSTGRESQL__PASSWORD: ${PG_PASS}
volumes:
- ./media:/media
- ./custom-templates:/templates
env_file: [.env]
ports:
- "9000:9000"
- "9443:9443"
depends_on: [postgresql, redis]
worker:
image: ghcr.io/goauthentik/server:2024.8.3
restart: unless-stopped
command: worker
user: root
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- ./media:/media
- ./certs:/certs
env_file: [.env]
depends_on: [postgresql, redis]
Khởi động hệ thống bằng lệnh docker-compose up -d. Hãy để cơ sở dữ liệu có khoảng 60 giây để khởi tạo trước khi thử đăng nhập.
Bước 3: Cấu hình lần đầu
Truy cập vào http://<your-server-ip>:9000/if/flow/initial-setup/. URL chỉ dùng một lần này cho phép bạn tạo tài khoản admin. Khi đã vào bên trong bảng điều khiển, đừng để hàng tá mục menu làm bạn choáng ngợp. Ưu tiên hàng đầu của bạn là bảo mật.
Điều hướng đến Settings -> Flow and Stages -> Stages. Thiết lập TOTP Authenticator ngay lập tức. Việc liên kết Authentik với một ứng dụng như Ente Auth hoặc Bitwarden đảm bảo rằng ngay cả khi mật khẩu chính bị rò rỉ, kẻ xấu cũng không thể truy cập vào server của bạn.
Bước 4: Bảo mật một ứng dụng “không có login” bằng Forward Auth
Nhiều công cụ tuyệt vời như Homer hoặc Dashy không có bảo mật tích hợp. Chúng ta có thể sử dụng tính năng “Forward Auth” của Authentik để đóng vai trò như một bảo vệ cho các ứng dụng này.
- Tạo một Provider: Trong mục Applications -> Providers, tạo một “Proxy Provider”. Thiết lập URL nội bộ của ứng dụng và chọn “Forward Auth (Single Application)”.
- Tạo một Application: Trong mục Applications -> Applications, tạo một mục mới và liên kết nó với provider bạn vừa tạo.
- Cập nhật Proxy của bạn: Nếu bạn sử dụng Nginx Proxy Manager, hãy dán đoạn mã này vào tab “Advanced” trong cấu hình host của bạn:
# Chuyển hướng để xác thực
auth_request /outpost.goauthentik.io/auth/nginx;
error_page 401 = @goauthentik_proxy_relogin;
location /outpost.goauthentik.io/ {
proxy_pass http://<authentik-ip>:9000/outpost.goauthentik.io/;
proxy_set_header Host $host;
}
location @goauthentik_proxy_relogin {
return 302 $scheme://$host/outpost.goauthentik.io/start?rd=$request_uri;
}
Nâng cấp xa hơn
Khi bạn đã thành thạo các bước cơ bản, hãy tìm hiểu về OIDC (OpenID Connect). Các ứng dụng chuyên nghiệp như Nextcloud hoặc Portainer hỗ trợ OIDC gốc. Thay vì đặt một “bức tường” trước ứng dụng, OIDC cho phép ứng dụng giao tiếp trực tiếp với Authentik. Bạn sẽ có một nút “Đăng nhập bằng Authentik” xử lý mọi thứ một cách mượt mà.
Bạn cũng có thể trau chuốt Giao diện người dùng. Tải lên các icon SVG tùy chỉnh cho các dịch vụ của bạn và thiết lập hình nền tùy chỉnh cho cổng đăng nhập. Nó sẽ biến một tập hợp các container Docker ngẫu nhiên thành một đám mây cá nhân đồng nhất và có thương hiệu riêng.
Lời kết
Tập trung hóa việc xác thực là nâng cấp lớn nhất mà bạn có thể dành cho HomeLab của mình. Nó giúp bạn thoát khỏi cơn đau đầu hàng ngày về quản lý mật khẩu, đồng thời cung cấp các tính năng bảo mật cấp doanh nghiệp như chặn theo địa lý (Geo-blocking) và nhật ký kiểm tra (audit logs) chi tiết. Có thể mất một giờ để thiết lập, nhưng sự an tâm—khi biết rằng mọi ứng dụng của bạn đều nằm sau một bức tường MFA hiện đại—là hoàn toàn xứng đáng với công sức bỏ ra.

