Bắt đầu nhanh: Triển khai Authentik trong 5 phút
Việc quản lý thông tin đăng nhập phân mảnh trên hàng chục dashboard nội bộ, môi trường staging và portal khách hàng dễ dẫn đến tình trạng tràn lan mật khẩu (password sprawl). Nó cũng làm tiêu tốn nhiều giờ làm việc của đội ngũ kỹ thuật mỗi khi có nhân sự rời công ty. Authentik giải quyết triệt để vấn đề này bằng cách đóng vai trò là một Identity Provider (IdP) duy nhất, hỗ trợ OpenID Connect (OIDC), SAML 2.0, forward proxy authentication và tích hợp sẵn LDAP outpost.
Đối với một nhóm tối đa 500 người dùng hoạt động thường xuyên, một máy chủ VPS cấu hình khiêm tốn với 2 vCPU và 4 GB RAM hoàn toàn có thể vận hành mượt mà toàn bộ hệ thống Authentik. Dưới đây là các bước để cài đặt và chạy Authentik trên Ubuntu hoặc Debian bằng Docker Compose.
1. Chuẩn bị thư mục & biến môi trường
mkdir -p /opt/authentik && cd /opt/authentik
# Tạo khóa bí mật và thông tin xác thực cơ sở dữ liệu
PG_PASS=$(openssl rand -base64 36 | tr -d '\n')
AUTH_SECRET=$(openssl rand -base64 60 | tr -d '\n')
cat <<EOF > .env
PG_PASS=${PG_PASS}
AUTHENTIK_SECRET_KEY=${AUTH_SECRET}
AUTHENTIK_ERROR_REPORTING__ENABLED=false
AUTHENTIK_PORT_HTTP=9000
AUTHENTIK_PORT_HTTPS=9443
EOF
Hãy tránh sử dụng các công cụ tạo chuỗi dòng lệnh cơ bản hoặc các trang web online không đáng tin cậy cho thông tin đăng nhập database root và service token của quản trị viên. Đối với các secret nhạy cảm trên production, tôi thường sử dụng công cụ tạo mật khẩu tại toolcraft.app/vi/tools/security/password-generator. Công cụ này chạy hoàn toàn phía client trong trình duyệt của bạn và không gửi bất kỳ chuỗi ký tự nào qua mạng. Nhờ đó, việc tạo các secret 64 ký tự có độ phức tạp cao vừa nhanh chóng vừa an toàn tuyệt đối.
2. Định nghĩa file Compose
# docker-compose.yml
services:
postgresql:
image: docker.io/library/postgres:16-alpine
restart: unless-stopped
healthcheck:
test: ["CMD-SHELL", "pg_isready -d $${POSTGRES_DB} -U $${POSTGRES_USER}"]
start_period: 20s
interval: 30s
retries: 5
timeout: 5s
volumes:
- database:/var/lib/postgresql/data
environment:
POSTGRES_PASSWORD: ${PG_PASS}
POSTGRES_USER: authentik
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"]
start_period: 20s
interval: 30s
retries: 5
timeout: 3s
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: authentik
AUTHENTIK_POSTGRESQL__NAME: authentik
AUTHENTIK_POSTGRESQL__PASSWORD: ${PG_PASS}
volumes:
- ./media:/media
- ./custom-templates:/templates
env_file:
- .env
ports:
- "${AUTHENTIK_PORT_HTTP}:9000"
- "${AUTHENTIK_PORT_HTTPS}:9443"
depends_on:
postgresql:
condition: service_healthy
redis:
condition: service_healthy
worker:
image: ghcr.io/goauthentik/server:2024.8.3
restart: unless-stopped
command: worker
environment:
AUTHENTIK_REDIS__HOST: redis
AUTHENTIK_POSTGRESQL__HOST: postgresql
AUTHENTIK_POSTGRESQL__USER: authentik
AUTHENTIK_POSTGRESQL__NAME: authentik
AUTHENTIK_POSTGRESQL__PASSWORD: ${PG_PASS}
volumes:
- ./media:/media
- ./custom-templates:/templates
- /var/run/docker.sock:/var/run/docker.sock
env_file:
- .env
depends_on:
postgresql:
condition: service_healthy
redis:
condition: service_healthy
volumes:
database:
driver: local
redis:
driver: local
3. Khởi chạy & Thiết lập ban đầu
docker compose pull
docker compose up -d
Mở trình duyệt và truy cập vào http://<your-server-ip>:9000/if/flow/initial-setup/. Trình hướng dẫn thiết lập này sẽ yêu cầu bạn cấu hình tài khoản quản trị viên chính (akadmin) và đặt mật khẩu khôi phục tổng (master recovery password).
Kiến trúc, Luồng hoạt động (Flows) và Cơ chế cốt lõi
Vấn đề: Xác thực bị phân mảnh
Các đội ngũ kỹ thuật thường xuyên phải vận hành một môi trường kết hợp phức tạp. Những công cụ hiện đại như Grafana và Nextcloud chạy song song bên cạnh các tiện ích self-hosted cũ. Khi mỗi công cụ tự duy trì một cơ sở dữ liệu người dùng cục bộ riêng, việc đồng bộ tài khoản sẽ gặp trục trặc. Nhân viên nghỉ việc nhưng quyền truy cập vào các dashboard nội bộ của họ thường vẫn tồn tại trong nhiều tuần mà không ai hay biết.
Nút thắt cốt lõi
Mỗi công cụ lại yêu cầu một giao thức xác thực khác nhau. Các ứng dụng đám mây hiện đại sử dụng JSON Web Tokens qua OIDC. Bộ phần mềm doanh nghiệp lại đòi hỏi SAML 2.0 assertion. Trong khi đó, các thiết bị lưu trữ mạng hoặc thiết bị VPN đời cũ chỉ hỗ trợ LDAP bind trực tiếp. Authentik đóng vai trò như một lớp chuyển dịch linh hoạt kết nối cả ba chuẩn giao thức này.
Pipeline xử lý của Authentik
Authentik xử lý mọi yêu cầu đăng nhập thông qua ba khái niệm module hóa:
- Stages: Các bước hành động đơn lẻ, chẳng hạn như yêu cầu nhập mật khẩu, hiển thị lời nhắc WebAuthn hoặc gửi mã xác thực qua email.
- Flows: Một chuỗi các stage được sắp xếp theo thứ tự để thực thi trong quá trình xác thực, đăng ký hoặc khôi phục tài khoản.
- Bindings & Policies: Các quy tắc xác định xem một stage hoặc ứng dụng có thể được truy cập hay không. Bạn có thể áp dụng quy tắc dựa trên thành viên nhóm (group membership), dải mạng IP hoặc vị trí địa lý GeoIP.
flowchart LR
User[Trình duyệt Client] -->|1. Yêu cầu xác thực| App[Dịch vụ / Ứng dụng]
App -->|2. Chuyển hướng / Xác thực OIDC| Authentik[Authentik IdP]
subgraph Pipeline [Authentik Pipeline Engine]
Authentik --> Flow[Authentication Flow]
Flow --> MFA[MFA Stage Policy]
MFA --> ClaimMapper[Scope / Claim Mapping]
end
ClaimMapper -->|3. Cấp phát JWT / Token| App
App -->|4. Phiên đã xác thực| User
Tích hợp OIDC, Bắt buộc MFA và Outpost
1. Kết nối ứng dụng (Grafana qua OIDC)
Trước tiên, hãy tạo một OAuth2/OIDC Provider trong Giao diện quản trị Authentik tại mục Applications > Providers > Create:
- Name: Grafana OIDC
- Authorization Flow: default-provider-authorization-implicit-consent
- Client Type: Confidential
- Redirect URI:
https://grafana.example.com/login/generic_oauth
Tiếp theo, cấu hình thông tin xác thực bên trong file grafana.ini của bạn:
[auth.generic_oauth]
enabled = true
name = Authentik
client_id = YOUR_AUTHENTIK_CLIENT_ID
client_secret = YOUR_AUTHENTIK_CLIENT_SECRET
scopes = openid email profile
auth_url = https://auth.example.com/application/o/authorize/
token_url = https://auth.example.com/application/o/token/
api_url = https://auth.example.com/application/o/userinfo/
role_attribute_path = contains(groups[*], 'Grafana Admins') && 'Admin' || 'Editor'
2. Bắt buộc kích hoạt MFA động thông qua Flow Policy
Bạn có thể bắt buộc sử dụng khóa bảo mật phần cứng (FIDO2/WebAuthn) hoặc ứng dụng TOTP cho các vai trò người dùng nhạy cảm mà không làm gián đoạn trải nghiệm của người dùng thông thường:
- Truy cập Flows and Stages > Flows > default-authentication-flow.
- Chọn Authenticator Validation Stage của bạn.
- Gắn một execution policy bằng biểu thức Python sau:
# Policy Python trong Authentik
# Bắt buộc MFA nếu người dùng thuộc nhóm 'Infrastructure-Ops' hoặc kết nối từ bên ngoài dải mạng văn phòng 10.0.0.0/8
user_groups = [group.name for group in request.user.ak_groups.all()]
is_admin_group = "Infrastructure-Ops" in user_groups
is_external_ip = not request.http_request.META.get("REMOTE_ADDR", "").startswith("10.0.")
return is_admin_group or is_external_ip
3. Kết nối các hệ thống cũ qua LDAP Outpost
Các phần cứng mạng cũ và ứng dụng legacy thường thiếu hỗ trợ giao thức OAuth hiện đại. Authentik LDAP Outpost sẽ giúp thu hẹp khoảng cách này. Nó truy vấn API lõi của Authentik ở chế độ nền trong khi vẫn lắng nghe trên các cổng LDAP tiêu chuẩn cho các client cũ.
# Triển khai container LDAP outpost độc lập
docker run -d \
--name authentik-ldap-outpost \
--restart unless-stopped \
-p 389:3389 -p 636:6636 \
-e AUTHENTIK_HOST=https://auth.example.com \
-e AUTHENTIK_TOKEN=your_outpost_service_token \
-e AUTHENTIK_INSECURE=false \
ghcr.io/goauthentik/ldap:2024.8.3
Xử lý sự cố & Tối ưu hóa cho môi trường Production
- Reverse Proxy Headers: Nếu bạn sử dụng Nginx, Traefik hoặc Caddy, hãy chuyển tiếp
X-Forwarded-Proto $schemevàX-Forwarded-For $proxy_add_x_forwarded_for. Thiếu các header này sẽ gây ra lỗi vòng lặp chuyển hướng (redirect loop) và lỗi invalid OAuth state. - Lệch thời gian hệ thống (Clock Drift): Đảm bảo đồng bộ hóa đồng hồ của máy chủ bằng
chronyhoặcsystemd-timesyncd. Độ lệch thời gian dù chỉ 15 giây cũng có thể khiến xác thực TOTP thất bại và làm token JWT hết hạn sớm hơn dự kiến. - Sao lưu cơ sở dữ liệu tự động: Authentik lưu trữ toàn bộ định nghĩa luồng và token trong Postgres. Hãy sao lưu database của bạn mỗi 24 giờ bằng một tác vụ cron đơn giản:
# Tạo bản sao lưu snapshot cơ sở dữ liệu production
docker compose exec -T postgresql pg_dump -U authentik authentik | gzip > /opt/backups/authentik_$(date +%F_%T).sql.gz

