Hướng dẫn cài đặt và cấu hình FreeIPA trên Fedora Server: Quản lý định danh và xác thực tập trung

Fedora tutorial - IT technology blog
Fedora tutorial - IT technology blog

Bài toán thực tế: Khi bạn có nhiều server nhưng chỉ một mớ chaos

Đã từng phải SSH vào từng máy chủ để thêm user mới chưa? Hay xử lý tình huống nhân viên nghỉ việc mà account của họ vẫn còn tồn tại rải rác trên 15 server khác nhau? Đây là vấn đề cực kỳ phổ biến ở các team nhỏ khi hạ tầng bắt đầu lớn lên nhanh.

Mình gặp đúng tình huống này khi công ty mở rộng từ 3 lên 12 server chỉ trong 6 tháng. Quản lý user thủ công bằng /etc/passwd và SSH keys copy-paste kiểu đó là công thức để có security incident đầu tiên.

FreeIPA sinh ra để giải quyết đúng bài toán này — một stack Identity Management mã nguồn mở, tích hợp sẵn LDAP, Kerberos, DNS và Certificate Authority trong một package duy nhất. Red Hat dùng nó làm nền tảng cho IdM trong RHEL, còn Fedora là nơi nó được phát triển và test tính năng mới nhất.

FreeIPA giải quyết được gì?

Trước khi đi vào cài đặt, nên biết FreeIPA làm được gì — và quan trọng hơn, không làm được gì:

  • Centralized user management: Tạo/xóa user một chỗ, hiệu lực ngay trên tất cả máy đã join domain
  • Single Sign-On (SSO): Login một lần, dùng được nhiều service thông qua Kerberos tickets
  • Host-based access control (HBAC): Quy định user nào được SSH vào server nào
  • Sudo policies tập trung: Phân quyền sudo không cần chỉnh /etc/sudoers từng máy
  • DNS tích hợp: Quản lý DNS internal cho domain của bạn
  • Certificate management: CA nội bộ, cấp và thu hồi cert tự động

FreeIPA không phải là lựa chọn tốt cho môi trường hybrid cloud phức tạp — lúc đó xem xét Keycloak hoặc FreeIPA + AD Trust. Và không thay thế được IdP công cộng như Okta nếu bạn cần OAuth2/OIDC cho web app.

Cài đặt FreeIPA Server

Yêu cầu hệ thống

FreeIPA khá ngốn tài nguyên do chạy nhiều service cùng lúc. Tối thiểu cần:

  • RAM: 2GB (khuyến nghị 4GB cho production)
  • CPU: 2 core
  • Disk: 20GB+ (LDAP database tăng dần theo số lượng object)
  • Hostname phải resolvable — đây là điểm hay bị bỏ qua nhất

Chuẩn bị hostname và DNS

FreeIPA cực kỳ nhạy cảm với hostname và DNS. Bỏ qua bước này thì cài hoài không xong:

# Đặt hostname dạng FQDN
hostnamectl set-hostname ipa.lab.internal

# Kiểm tra hostname resolve được
hostname -f
# Output phải là: ipa.lab.internal

# Thêm vào /etc/hosts nếu chưa có DNS server
echo "192.168.1.100 ipa.lab.internal ipa" >> /etc/hosts

# Verify
ping -c 1 ipa.lab.internal

Cài đặt packages

# Update hệ thống trước
dnf update -y

# Cài FreeIPA server với DNS support
dnf install -y freeipa-server freeipa-server-dns

# Mở firewall cho các service cần thiết
firewall-cmd --permanent --add-service={freeipa-ldap,freeipa-ldaps,freeipa-replication,dns,kerberos,kpasswd,http,https,ntp}
firewall-cmd --reload

Chạy installer

Bước quan trọng nhất. FreeIPA có interactive installer khá thông minh — nó tự validate hostname, kiểm tra DNS forward/reverse, rồi hỏi từng thông số trước khi bắt đầu cài:

ipa-server-install \
  --domain=lab.internal \
  --realm=LAB.INTERNAL \
  --ds-password=YourDirectoryPassword \
  --admin-password=YourAdminPassword \
  --setup-dns \
  --forwarder=8.8.8.8 \
  --forwarder=1.1.1.1 \
  --auto-reverse \
  --unattended

Quá trình này mất khoảng 5-10 phút. Nó sẽ cài đặt và cấu hình: Directory Server (389-ds), Kerberos KDC, Apache httpd, DNS (BIND), NTP, và Certificate Authority (Dogtag).

Mình hay dùng --unattended để tránh bị hỏi từng câu một. Lần đầu thử nên bỏ flag đó để xem hệ thống hỏi gì — giúp hiểu hơn các thành phần được cấu hình.

Cấu hình sau cài đặt

Lấy Kerberos ticket và bắt đầu quản lý

# Lấy ticket cho admin
kinit admin
# Nhập password admin đã đặt ở bước install

# Kiểm tra ticket
klist

# Truy cập web UI
# https://ipa.lab.internal/ipa/ui/

Web UI của FreeIPA khá trực quan. Thực tế CLI nhanh hơn nhiều khi cần làm việc hàng loạt hoặc script hóa quy trình onboarding.

Tạo user và group

# Tạo user mới
ipa user-add trungnguyen \
  --first=Trung \
  --last=Nguyen \
  [email protected] \
  --shell=/bin/bash

# Đặt password
ipa passwd trungnguyen

# Tạo group cho devops team
ipa group-add devops --desc="DevOps Engineers"

# Thêm user vào group
ipa group-add-member devops --users=trungnguyen

Cấu hình Host-Based Access Control (HBAC)

HBAC là tính năng mình thích nhất của FreeIPA. Thay vì leo vào từng server để chỉnh quyền, bạn định nghĩa rule một lần ở trung tâm, hiệu lực ngay trên tất cả máy đã enroll:

# Trước tiên, tắt rule "allow_all" mặc định (quá rộng)
ipa hbacrule-disable allow_all

# Tạo rule: chỉ devops được SSH vào production servers
ipa hbacrule-add allow_devops_prod \
  --desc="Allow devops team to access production servers"

# Thêm service SSH vào rule
ipa hbacrule-add-service allow_devops_prod --hbacsvcs=sshd

# Thêm group devops vào rule
ipa hbacrule-add-user allow_devops_prod --groups=devops

# Thêm host vào rule (sau khi đã enroll host)
ipa hbacrule-add-host allow_devops_prod --hosts=prod-web-01.lab.internal

Sudo policies tập trung

# Tạo sudo rule cho devops — cho phép chạy lệnh systemctl
ipa sudorule-add devops_systemctl_rule

# Thêm command được phép
ipa sudocmd-add /usr/bin/systemctl
ipa sudorule-add-allow-command devops_systemctl_rule \
  --sudocmds=/usr/bin/systemctl

# Áp dụng cho group devops
ipa sudorule-add-user devops_systemctl_rule --groups=devops

# Áp dụng cho tất cả hosts
ipa sudorule-add-host devops_systemctl_rule --hosts=ALL

Enroll client vào FreeIPA domain

Để các server khác dùng được centralized auth, cần cài FreeIPA client lên chúng:

# Trên máy client (cũng là Fedora/RHEL)
dnf install -y freeipa-client

# Enroll vào domain
ipa-client-install \
  --domain=lab.internal \
  --server=ipa.lab.internal \
  --realm=LAB.INTERNAL \
  --principal=admin \
  --password=YourAdminPassword \
  --mkhomedir \
  --unattended

# Sau khi enroll xong, kiểm tra user từ IPA có resolve được không
id trungnguyen
# Output: uid=1234567890(trungnguyen) gid=1234567890(trungnguyen) groups=...

Kiểm tra và Monitoring

Kiểm tra các service đang chạy

# Xem tổng quan status tất cả FreeIPA services
ipactl status

# Output mẫu:
# Directory Service: RUNNING
# krb5kdc Service: RUNNING
# kadmin Service: RUNNING
# named Service: RUNNING
# httpd Service: RUNNING
# ipa-custodia Service: RUNNING
# pki-tomcatd Service: RUNNING
# ipa-otpd Service: RUNNING

Test xác thực end-to-end

# Test HBAC rule trước khi áp dụng thật
ipa hbactest \
  --user=trungnguyen \
  --host=prod-web-01.lab.internal \
  --service=sshd
# Sẽ cho biết rule nào match và kết quả Allow/Deny

# Test Kerberos authentication
kinit trungnguyen
klist

# Test LDAP query
ldapsearch -x -H ldap://ipa.lab.internal \
  -b "dc=lab,dc=internal" \
  -D "uid=admin,cn=users,cn=accounts,dc=lab,dc=internal" \
  -W "(uid=trungnguyen)"

Log và monitoring

# Xem log của Directory Server
journalctl -u dirsrv@LAB-INTERNAL -f

# Log Kerberos KDC
journalctl -u krb5kdc -f

# Log Apache (web UI + API)
journalctl -u httpd -f

# Kiểm tra replication (nếu có replica)
ipa-replica-manage list
ipa-replica-manage status

Backup và recovery

Bài học xương máu sau lần crash server IPA mà không có backup: set up cronjob chạy backup hàng đêm ngay từ đầu, đừng đợi đến khi có sự cố.

# Full backup (files + data, thường ~500MB-1GB)
ipa-backup --gpg --gpg-keyring=/root/ipa-backup-key

# Xem các backup hiện có
ls -lh /var/lib/ipa/backup/

# Restore khi cần
ipa-restore /var/lib/ipa/backup/ipa-full-2026-04-28-00-00-00

Một vài lưu ý thực tế

Sau một thời gian chạy FreeIPA trên production, có vài điểm cần ghim lại:

  • Kerberos ticket expiry: Mặc định ticket hết hạn sau 24 giờ. Với các job chạy dài cần xem lại policy hoặc dùng keytab
  • Time sync là bắt buộc: Kerberos không chấp nhận lệch thời gian quá 5 phút. Đảm bảo tất cả máy sync NTP về IPA server
  • Replica cho high availability: IPA server chết là toàn bộ authentication tê liệt. Production cần ít nhất 2 replica
  • SELinux và FreeIPA: FreeIPA chạy tốt với SELinux enforcing — một trong số ít ứng dụng enterprise được thiết kế đúng với SELinux từ đầu

Mình dùng Fedora làm máy development chính đã 2 năm và khá hài lòng với tốc độ cập nhật package. FreeIPA trên Fedora thường đi trước RHEL vài tháng. Dùng nó để lab tính năng mới trước khi đưa lên production RHEL là một workflow khá hợp lý.

Share: