Site icon ZingServer

Cấu hình Squid Kerberos Active Directory: Cấu hình SSO loại bỏ pop-up xác thực

Cấu hình Squid Kerberos Active Directory Cấu hình SSO loại bỏ pop-up xác thực

Cấu hình Squid Kerberos Active Directory Cấu hình SSO loại bỏ pop-up xác thực

Ở bài viết trước, chúng ta đã thành công tích hợp Squid với Active Directory bằng helper basic_ldap_auth. Giải pháp này giúp quản lý người dùng tập trung thay vì dùng file htpasswd như trong hướng dẫn cài đặt Squid cơ bản.

Tuy nhiên, như chúng ta đã thấy, phương pháp LDAP đó vẫn còn một phiền toái lớn.

Đó chính là cửa sổ pop-up xác thực. Dù đã dùng tài khoản AD, người dùng vẫn phải nhập lại username/password mỗi khi mở trình duyệt. Điều này gây gián đoạn công việc và không phải là một trải nghiệm “liền mạch”.

Bài viết này là bước nâng cấp tối thượng. Chúng ta sẽ giải quyết triệt để vấn đề đó bằng cách cấu hình Squid Kerberos Active Directory.

Mục tiêu của chúng ta là đạt được Single Sign-On (SSO). Tức là, khi người dùng đã đăng nhập vào máy tính Windows (đã join domain), họ có thể truy cập proxy ngay lập tức. Sẽ không còn bất kỳ cửa sổ pop-up nào xuất hiện.

Đối với người dùng cuối, proxy sẽ trở nên hoàn toàn “minh bạch”. Đây là một kỹ thuật nâng cao, nhắm đến các quản trị viên hệ thống (SysAdmin) muốn xây dựng một hệ thống proxy chuyên nghiệp, an toàn và thân thiện nhất trong môi trường doanh nghiệp.

Tóm tắt nhanh (Key Points)

Nếu bạn là một SysAdmin bận rộn, đây là tóm tắt các bước chính:

  • Mục tiêu: Kích hoạt Single Sign-On (SSO) cho Squid.
  • Công nghệ: Sử dụng Kerberos (chính) và NTLM (dự phòng) thông qua cơ chế Negotiate.
  • Trên Active Directory:
    1. Tạo một tài khoản dịch vụ (Service Account) cho Squid (ví dụ: svc_squid).
    2. Tạo Service Principal Name (SPN): setspn -A HTTP/proxy.tenmien.com svc_squid.
    3. Xuất file Keytab bằng ktpass với cờ -crypto ALL.
  • Trên máy chủ Squid (Linux):
    1. Đảm bảo DNS (trỏ về DC) và NTP (đồng bộ thời gian) tuyệt đối chính xác.
    2. Cài đặt samba, winbind, krb5-utils.
    3. Cấu hình /etc/samba/smb.conf/etc/krb5.conf.
    4. Join máy chủ Squid vào domain AD: net ads join -U Administrator.
    5. Sao chép file squid.keytab vào /etc/squid/chmod 400.
  • Trên squid.conf:
    1. Định nghĩa helper negotiate_kerberos_auth (sử dụng file keytab).
    2. Định nghĩa helper ntlm_auth (sử dụng winbind).
    3. Khai báo auth_param negotiateauth_param ntlm.
    4. Tạo ACL proxy_auth REQUIRED và cho phép truy cập.
  • Trên Client: Cấu hình Firefox (nếu dùng) để thêm FQDN của proxy vào network.negotiate-auth.trusted-uris.

So sánh các giao thức: Basic, NTLM, và Kerberos

Trước khi bắt tay vào cấu hình, chúng ta cần hiểu rõ “vũ khí” mình sắp sử dụng. Tại sao Kerberos lại là “tiêu chuẩn vàng” cho SSO?

Trong hai bài viết trước, chúng ta đã tiếp xúc với xác thực Basic (dùng htpasswdbasic_ldap_auth). Điểm yếu chí mạng của nó là gửi thông tin (dù đã mã hóa Base64) gần như là “cleartext” và luôn đòi hỏi pop-up. Để hiểu rõ hơn về các loại proxy, bạn có thể xem bài so sánh SOCKS5 và HTTP Proxy.

Giờ đây, chúng ta tìm hiểu hai giao thức nâng cao hơn.

Kerberos (Hiện đại – Ưu tiên số 1)

NTLM (Cũ – Phương án dự phòng)

Chiến lược của chúng ta: Dùng “Negotiate” (Thương lượng)

Chúng ta sẽ không chọn “hoặc là Kerberos” hoặc là “NTLM”. Chúng ta sẽ cấu hình Squid sử dụng cơ chế Negotiate.

Negotiate là một “trình bao” (wrapper) thông minh. Nó cho phép trình duyệt và máy chủ Squid tự “thương lượng” để chọn ra phương thức tốt nhất mà cả hai cùng hỗ trợ.

Khi cấu hình Negotiate, luồng xử lý sẽ là:

  1. Squid ưu tiên yêu cầu xác thực bằng Kerberos trước tiên.
  2. Nếu máy client (ví dụ: máy Windows đã join domain) hỗ trợ, nó sẽ dùng Kerberos. Quá trình hoàn tất.
  3. Nếu máy client không hỗ trợ Kerberos (ví dụ: máy tính ngoài domain), Squid sẽ tự động chuyển (fallback) sang yêu cầu xác thực bằng NTLM.

Bằng cách này, chúng ta đạt được sự cân bằng hoàn hảo: Bảo mật tối đa (Kerberos) và tương thích tối đa (NTLM).

Phương thức Cơ chế hoạt động Bảo mật Trải nghiệm (SSO)
Basic (LDAP) Gửi User/Pass (Base64) Thấp (Cleartext) Không (Luôn pop-up)
NTLM Thử thách-Phản hồi Trung bình Có (SSO)
Kerberos Dựa trên “Vé” (Tickets) Cao nhất Có (SSO thực thụ)
Negotiate Ưu tiên Kerberos, dự phòng NTLM Cao nhất Có (Linh hoạt nhất)

Chuẩn bị “chiến trường”: Các yêu cầu bắt buộc (Prerequisites)

Cấu hình Kerberos nổi tiếng là “khó tính”. 90% các lỗi thất bại đều xuất phát từ việc bỏ qua hoặc làm sai các bước chuẩn bị cơ bản này. Hãy đảm bảo bạn kiểm tra kỹ từng mục dưới đây.

Phía Active Directory (DC)

Phía máy chủ Squid (Linux)

Đây là phần quan trọng nhất. Máy chủ Linux chạy Squid (Ubuntu/CentOS) bắt buộc phải đáp ứng các yêu cầu sau:

Phía máy trạm (Client)

Bước 1: Cấu hình trên Active Directory (Tạo SPN và Keytab)

Tại bước này, chúng ta cần làm việc trên máy chủ Domain Controller (DC) với quyền Domain Administrator.

Tạo tài khoản dịch vụ (Service Account)

Trước tiên, hãy tạo một tài khoản người dùng bình thường trong Active Directory.

  1. Mở Active Directory Users and Computers.
  2. Tạo một user mới, ví dụ:
    • User logon name: svc_squid
    • Password: Đặt một mật khẩu mạnh và phức tạp.
    • Password options: Chọn “Password never expires”.

Đăng ký Service Principal Name (SPN)

SPN là một định danh duy nhất liên kết một dịch vụ (proxy HTTP) với một tài khoản (svc_squid).

Mở Command Prompt (Admin) trên máy chủ DC và chạy lệnh sau:

setspn -A HTTP/proxy.tenmien.com svc_squid

Tạo file Keytab (Chiếc chìa khóa Kerberos)

File Keytab (Key Table) chứa “mật khẩu” Kerberos cho dịch vụ. Squid sẽ dùng file này để giải mã các “vé” (tickets) mà trình duyệt gửi đến.

Vẫn trong Command Prompt (Admin) trên DC, chạy lệnh ktpass:

ktpass -princ HTTP/proxy.tenmien.com@TENMIEN.COM -mapuser svc_squid \
-pass [MatKhauCua_svc_squid] -crypto ALL -ptype KRB5_NT_PRINCIPAL \
-out C:\temp\squid.keytab

Giải thích lệnh:

 

Ghi chú kỹ thuật: Tại sao dùng ktpass (với Service Account) mà không dùng net ads keytab?

Nhiều hướng dẫn đề xuất dùng net ads keytab create trực tiếp trên Linux. Tuy nhiên, phương pháp đó gắn keytab với tài khoản máy tính (computer account) của máy chủ Squid.

Vấn đề là khi chạy winbind (như chúng ta đang làm để hỗ trợ NTLM fallback), Samba có thể tự động thay đổi mật khẩu tài khoản máy tính định kỳ. Việc này sẽ làm hỏng (invalidate) file keytab của bạn, gây lỗi xác thực.

Bằng cách dùng ktpass để gắn SPN với một tài khoản dịch vụ (Service Account) có mật khẩu không hết hạn, chúng ta đảm bảo file keytab luôn hợp lệ và hệ thống chạy ổn định.

Di chuyển file Keytab

Bây giờ bạn đã có file squid.keytab. Hãy sao chép file này một cách an toàn (ví dụ: dùng WinSCP hoặc scp) từ máy chủ DC sang máy chủ Squid (Linux) và đặt nó vào thư mục /etc/squid/.

Ghi chú về công cụ thay thế: msktutil

Ngoài ktpassnet ads, Squid Wiki cũng đề cập đến một công cụ mạnh mẽ tên là msktutil. Công cụ này có thể chạy trên Linux, cho phép bạn tạo/quản lý tài khoản máy tính, SPN và keytab trực tiếp từ máy chủ Squid. Tuy nhiên, nó thường là gói cài đặt bên thứ ba, trong khi phương pháp ktpass + samba sử dụng các công cụ có sẵn.

Bước 2: Chuẩn bị máy chủ Squid (Đã join Domain)

Đây là bước then chốt. Toàn bộ cơ chế xác thực NTLM (fallback) và Kerberos (SSO) yêu cầu máy chủ Squid (Linux) phải là một thành viên của Active Directory.

Bài viết này giả định rằng VPS Linux của bạn đã được join vào Active Directory thành công.

Yêu cầu bắt buộc: Nếu bạn chưa thực hiện bước này, vui lòng dừng lại và làm theo hướng dẫn chi tiết tại bài viết mới của chúng tôi:

Cách join VPS Linux vào Active Directory (Ubuntu, CentOS)

Hãy đảm bảo bạn thực hiện đến khi các lệnh kiểm tra wbinfo -uwbinfo -g trả về kết quả thành công.

Sau khi đã join domain, công việc duy nhất còn lại trên máy chủ Linux (trước khi cấu hình squid.conf) là bảo mật file keytab mà bạn đã sao chép ở Bước 1.

Bảo mật file Keytab

File squid.keytab bạn đã sao chép vào /etc/squid/ chứa thông tin cực kỳ nhạy cảm. Chúng ta cần cấp quyền cho user squid (hoặc proxy) để đọc nó và cấm mọi user khác.

Trên Ubuntu (user là proxy):

sudo chown proxy:proxy /etc/squid/squid.keytab
sudo chmod 400 /etc/squid/squid.keytab

Trên CentOS (user là squid):

sudo chown squid:squid /etc/squid/squid.keytab
sudo chmod 400 /etc/squid/squid.keytab

Sau khi file keytab đã được bảo mật và máy chủ đã join domain, chúng ta đã sẵn sàng cho bước cuối cùng.

Bước 3: Cấu hình squid.conf – Trái tim của hệ thống

Chúng ta sẽ “lắp ráp” mọi thứ (AD, Keytab, Winbind) vào file cấu hình của Squid.

Tìm đường dẫn Helper

Trước khi chỉnh sửa, bạn phải biết đường dẫn chính xác đến các helper.

find / -name negotiate_kerberos_auth
find / -name ntlm_auth

Hãy ghi lại hai đường dẫn bạn tìm thấy (ví dụ: /usr/lib/squid/negotiate_kerberos_auth/usr/bin/ntlm_auth).

Chỉnh sửa file squid.conf

Mở file cấu hình chính của Squid:

sudo nano /etc/squid/squid.conf

Việc cần làm:

  1. Vô hiệu hóa cấu hình cũ: Tìm và xóa (hoặc thêm dấu #) toàn bộ các dòng auth_param basic program basic_ldap_auth... và các ACL liên quan đến ldap_users.
  2. Thêm cấu hình mới: Thêm toàn bộ khối cấu hình dưới đây vào gần đầu file.
# --- CAU HINH XAC THUC SSO (KERBEROS + NTLM) ---

# 1. Helper Kerberos (Uu tien so 1)
# (Thay dung duong dan helper va FQDN cua ban)
auth_param negotiate program /usr/lib/squid/negotiate_kerberos_auth -k /etc/squid/squid.keytab -s HTTP/proxy.tenmien.com@TENMIEN.COM
auth_param negotiate children 20 startup=5 idle=1
auth_param negotiate keep_alive on

# 2. Helper NTLM (Phuong an du phong)
# (Thay dung duong dan helper 'ntlm_auth' cua ban)
auth_param ntlm program /usr/bin/ntlm_auth --helper-protocol=squid-2.5-ntlmssp
auth_param ntlm children 20 startup=5 idle=1
auth_param ntlm keep_alive on

# 3. Thong diep Realm (Hien thi khi gap su co hoac client khong ho tro)
auth_param basic realm Vui long nhap tai khoan Cong ty (AD)
auth_param basic credentialsttl 2 hours

# --- KET THUC CAU HINH SSO ---

Giải thích:

Cập nhật Access Control Lists (ACLs)

Cuối cùng, chúng ta cần cập nhật ACL để sử dụng cơ chế xác thực mới này. Tìm đến khu vực http_access trong file squid.conf.

  1. Xóa ACL cũ: Xóa dòng acl ldap_users proxy_auth REQUIREDhttp_access allow ldap_users (nếu có).
  2. Thêm ACL mới: Thêm 2 dòng sau NGAY TRƯỚC dòng http_access deny all.
# --- Ap dung ACL cho xac thuc SSO ---

# Tao mot ACL ten 'sso_auth' yeu cau xac thuc
# (REQUIRED se tu dong dung bat ky co che nao co san: Negotiate, NTLM)
acl sso_auth proxy_auth REQUIRED

# Cho phep nhung ai da xac thuc thanh cong
http_access allow sso_auth

# --- Ket thuc ACL ---

# Dong nay PHAI LUON nam o cuoi cung
http_access deny all

Lưu file squid.conf và thoát.

Bước 4: Kiểm tra và gỡ lỗi (Troubleshooting)

Đây là bước quyết định. Việc gỡ lỗi Kerberos có thể phức tạp, vì vậy hãy kiểm tra từng bước một. Nếu bạn gặp các lỗi kết nối chung như “Connection Refused”, hãy tham khảo bài viết phân tích & sửa lỗi kết nối Proxy để chẩn đoán các vấn đề cơ bản về mạng/proxy trước.

Khởi động lại và kiểm tra cú pháp

Đầu tiên, hãy kiểm tra file squid.conf xem có lỗi cú pháp nào không.

sudo squid -k parse

Nếu lệnh này “im lặng” (không báo lỗi), hãy khởi động lại Squid:

sudo systemctl restart squid

Kiểm tra phía Client (Trải nghiệm người dùng)

Hãy đến một máy tính Windows đã gia nhập domain và đăng nhập bằng tài khoản AD của bạn.

1. Cấu hình trình duyệt (Chỉ cần cho Firefox):

2. Thử nghiệm:

Mở trình duyệt và truy cập một trang web bên ngoài.

Kiểm tra phía Server (Đọc Logs)

Nếu bạn truy cập web thành công, hãy kiểm tra access.log để chắc chắn:

sudo tail -f /var/log/squid/access.log

Bạn sẽ thấy tên người dùng (ví dụ: TENMIEN\username hoặc username@TENMIEN.COM) trong log, xác nhận SSO đã hoạt động.

Nếu có lỗi, hãy kiểm tra cache.log để xem thông báo chi tiết:

sudo tail -f /var/log/squid/cache.log

Các lỗi thường gặp và cách khắc phục

Nếu pop-up vẫn xuất hiện (Lỗi 407 Proxy Authentication Required), đây là checklist gỡ lỗi:

1. Lỗi: “Time skew too great” (trong cache.log)

2. Lỗi: “Keytab entry not found” (trong cache.log)

3. Lỗi: Pop-up vẫn hiện (NTLM Fallback thất bại)

4. Lỗi: SELinux (Chỉ trên CentOS/RHEL)

Lệnh gỡ lỗi chuyên sâu

Nâng cao: Phân quyền truy cập theo Nhóm (Group) Active Directory

Sau khi đã cấu hình SSO thành công, bạn có thể phân quyền chi tiết dựa trên nhóm AD.

Tìm Helper kiểm tra nhóm

find / -name ext_wbinfo_group_acl

Giả sử tìm thấy ở /usr/bin/ext_wbinfo_group_acl.

Cấu hình squid.conf

Mở lại squid.conf và thêm vào bên dưới khối auth_param:

# --- KHAI BAO HELPER KIEM TRA NHOM AD (QUA WINBIND) ---
external_acl_type AD_Group_Check %LOGIN /usr/bin/ext_wbinfo_group_acl

Sau đó, áp dụng các ACL này trong khu vực http_access (trước dòng http_access allow sso_auth):

# --- Dinh nghia ACL Nhom AD ---
acl IT_Admins external AD_Group_Check "IT-Admins"
acl Interns external AD_Group_Check "Interns"

# (Gia su ban da co acl 'blocked_sites' tu bai truoc)
acl blocked_sites dstdomain "/etc/squid/blocked_sites.txt"

# --- Ap dung quy tac ---
# 1. Chan nhom "Interns" truy cap cac trang blocked_sites
http_access deny Interns blocked_sites

# (Cac quy tac khac...)

# --- Cac quy tac cu van giu nguyen ---
acl sso_auth proxy_auth REQUIRED
http_access allow sso_auth

# Dong nay PHAI LUON nam o cuoi cung
http_access deny all

Khởi động lại Squid, và giờ đây bạn đã có hệ thống phân quyền theo nhóm AD.

Nâng cao: Tối ưu hiệu năng (Giảm tải CPU)

Kerberos sử dụng “replay cache” để ngăn chặn các cuộc tấn công phát lại (replay attacks). Tuy nhiên, trên các máy chủ proxy có lưu lượng truy cập cực lớn, việc kiểm tra cache này có thể gây tải CPU cao, tương tự như hiện tượng VPS Linux CPU 100%.

Nếu bạn ưu tiên hiệu năng hơn là mức độ bảo mật replay (vốn rủi ro thấp trong 5 phút), bạn có thể tắt nó đi.

Tạo (hoặc chỉnh sửa) file /etc/environment và thêm dòng sau:

KRB5RCACHETYPE=none

Hoặc, thêm vào script khởi động của Squid:

export KRB5RCACHETYPE=none

Bạn sẽ cần khởi động lại máy chủ (nếu sửa /etc/environment) hoặc khởi động lại dịch vụ Squid để áp dụng.

Kết luận

Chúc mừng! Bạn vừa hoàn thành một trong những cấu hình phức tạp nhưng giá trị nhất của Squid Proxy.

Bằng cách hoàn tất cấu hình Squid Kerberos Active Directory, bạn đã nâng cấp hệ thống của mình lên một giải pháp “hoàn hảo” cho doanh nghiệp:

Đây là thiết lập proxy chuyên nghiệp, an toàn và thân thiện nhất mà bạn có thể triển khai trong môi trường Windows.

Việc thiết lập một hệ thống mạnh mẽ như vậy đòi hỏi một nền tảng VPS ổn định, hiệu suất cao. Nếu bạn cần một máy chủ đáng tin cậy, hãy tham khảo các gói VPS nước ngoài và VPS Việt Nam chất lượng cao của chúng tôi.

Tài liệu tham khảo

Exit mobile version