Trong bài viết trước về cách setup Proxy Server trên VPS, chúng ta đã tìm hiểu cách cài đặt Squid và cấu hình xác thực cơ bản bằng file htpasswd. Phương pháp đó hoạt động tốt cho nhu cầu cá nhân hoặc nhóm nhỏ.
Tuy nhiên, trong môi trường doanh nghiệp, việc quản lý file htpasswd bộc lộ nhiều điểm yếu chí mạng. Nó không an toàn (mật khẩu truyền dạng cleartext) và việc thêm/xóa người dùng rất thủ công, không đồng bộ với hệ thống quản lý nhân viên.
Đây là lúc giải pháp tích hợp Squid với Active Directory (AD) phát huy sức mạnh. Thay vì quản lý một file text riêng lẻ, bạn cho phép người dùng đăng nhập proxy bằng chính tài khoản Windows (tài khoản công ty) của họ.
Bài viết này sẽ hướng dẫn bạn từng bước cấu hình Squid Proxy sử dụng xác thực LDAP (giao thức mà Active Directory sử dụng) một cách an toàn và tập trung.
Tóm tắt nhanh (TL;DR)
- Cài đặt helper
squid-ldap(Ubuntu) hoặcsquid_ldap(CentOS).- Tạo một tài khoản dịch vụ (Bind DN) chỉ có quyền đọc trong Active Directory.
- Cấu hình
auth_param basic program basic_ldap_auth...trongsquid.confvới Base DN, Bind DN, và filtersAMAccountName=%s.- Tạo file mật khẩu an toàn (
ldap_pass) cho tài khoản dịch vụ và cấp quyền sở hữu cho userproxy(hoặcsquid).- Thêm ACL
proxy_auth REQUIREDvàhttp_access allow ldap_userstrước dòngdeny all.
Tại sao tích hợp Squid với Active Directory là cần thiết?
Việc chuyển từ htpasswd sang AD/LDAP không chỉ là một nâng cấp, mà là một yêu cầu bắt buộc đối với các tổ chức muốn quản trị hệ thống một cách chuyên nghiệp và an toàn.
So sánh nhanh các phương thức xác thực Squid
Squid hỗ trợ nhiều cơ chế xác thực. Dưới đây là bảng so sánh 3 phương thức phổ biến nhất khi làm việc với Active Directory:
| Phương thức | Helper | Ưu điểm | Nhược điểm |
| LDAP Basic (Bài này) | basic_ldap_auth |
Dễ cấu hình, tương thích rộng rãi. | Yêu cầu người dùng nhập User/Pass. |
| NTLM | ntlm_auth |
An toàn hơn Basic, tương thích tốt với Windows. | Cấu hình phức tạp hơn, cần Samba/Winbind. |
| Kerberos | negotiate_kerberos_auth |
Bảo mật nhất, hỗ trợ Single Sign-On (SSO). | Rất phức tạp, yêu cầu join domain, keytab… |
Bài viết này tập trung vào LDAP Basic. Đây là phương pháp cân bằng hoàn hảo giữa tính bảo mật, khả năng quản lý tập trung và sự đơn giản trong quá trình cài đặt.
(Để loại bỏ pop-up, xem hướng dẫn Cấu hình Squid Kerberos Active Directory.)
Lợi ích vượt trội của xác thực tập trung
- Quản lý tập trung: Bạn không cần tạo/xóa/đổi mật khẩu proxy. Chỉ cần vô hiệu hóa tài khoản AD của nhân viên khi họ nghỉ việc, họ sẽ tự động mất quyền truy cập proxy.
- Tăng cường bảo mật: Tận dụng toàn bộ chính sách mật khẩu của AD (độ phức tạp, hết hạn định kỳ…) mà không cần cấu hình thêm.
- Khả năng kiểm toán (Auditing): Mọi log truy cập web trong Squid giờ đây được gắn với một danh tính người dùng thật (ví dụ:
nv.ketoan.A) thay vì một tài khoản chung. - Tuân thủ (Compliance): Giúp doanh nghiệp tuân thủ các quy định bảo mật như GDPR hoặc HIPAA bằng cách kiểm soát và ghi lại chính xác ai đã truy cập những gì.
Mô hình hoạt động: Squid “nói chuyện” với Active Directory
Để hiểu cách cấu hình, bạn cần biết Squid giao tiếp với AD như thế nào.
Squid không tự mình kết nối với Active Directory. Giống như cách nó dùng basic_ncsa_auth để đọc file htpasswd, nó sẽ ủy thác nhiệm vụ này cho một “helper” (trình trợ giúp) chuyên biệt tên là basic_ldap_auth.
Luồng hoạt động diễn ra như sau:
- Người dùng (Trình duyệt) gửi yêu cầu truy cập web, kèm theo Username và Mật khẩu (đã nhập ở cửa sổ pop-up) đến Squid.
- Squid nhận thông tin và chuyển nó cho helper
basic_ldap_auth. - Helper sử dụng giao thức LDAP (Lightweight Directory Access Protocol) để kết nối đến máy chủ Active Directory Domain Controller (DC).
- Helper “hỏi” máy chủ DC: “Tài khoản [Username] với mật khẩu [Password] này có hợp lệ không?”
- Active Directory xác thực thông tin và trả lời “OK” (Hợp lệ) hoặc “ERR” (Không hợp lệ) cho helper.
- Squid nhận kết quả từ helper và quyết định cho phép (Allow) hoặc từ chối (Deny) yêu cầu của người dùng.
Hướng dẫn chi tiết: Cấu hình tích hợp Squid với Active Directory
Chúng tôi giả định bạn đã cài đặt Squid. Giờ chúng ta sẽ tiến hành cấu hình phần xác thực LDAP.
Bước 1: Điều kiện tiên quyết
Trước khi mở file squid.conf, bạn cần thu thập 3 thông tin quan trọng từ hệ thống Active Directory của mình. Để đảm bảo an toàn tối đa, bạn cũng nên bảo mật VPS Linux với UFW, Fail2Ban và Hardening SSH trước khi tiếp tục.
- Địa chỉ Domain Controller (DC): IP hoặc tên máy chủ DC. Ví dụ:
192.168.1.10hoặcdc01.mycompany.com. - Base DN (Distinguished Name): Đây là “địa chỉ” gốc trong cây thư mục AD nơi chứa người dùng của bạn.
- Ví dụ: Nếu domain của bạn là
mycompany.com, Base DN thường làDC=mycompany,DC=com. - Nếu user nằm trong một OU (Tổ chức) cụ thể, nó có thể là:
OU=Users,DC=mycompany,DC=com.
- Ví dụ: Nếu domain của bạn là
- Tài khoản dịch vụ (Bind DN):
- Cực kỳ quan trọng: Không dùng tài khoản Administrator. Bạn nên tạo một tài khoản user bình thường trong AD (ví dụ:
squid-service) với mật khẩu không bao giờ hết hạn và chỉ có quyền đọc thông tin LDAP. - Bạn cần biết DN đầy đủ (Bind DN) của tài khoản này. Ví dụ:
CN=squid-service,OU=ServiceAccounts,DC=mycompany,DC=com. - Ghi lại mật khẩu của tài khoản
squid-servicenày.
- Cực kỳ quan trọng: Không dùng tài khoản Administrator. Bạn nên tạo một tài khoản user bình thường trong AD (ví dụ:
Bước 2: Cài đặt Squid LDAP Helper
Trên VPS chạy Squid, bạn cần cài đặt gói trợ giúp LDAP.
Trên Ubuntu/Debian:
sudo apt-get update
sudo apt-get install squid-ldap -y
Trên CentOS/RHEL:
sudo yum install squid_ldap -y
Bước 3: Cấu hình file squid.conf
Đây là lúc chúng ta thay thế cấu hình htpasswd cũ.
Mở file cấu hình Squid:
sudo nano /etc/squid/squid.conf
Tìm và xóa hoặc vô hiệu hóa (thêm dấu #) các dòng auth_param basic program /usr/lib/squid/basic_ncsa_auth... và auth_param basic realm... cũ.
Sau đó, thêm đoạn cấu hình mới sau đây (thường đặt ở gần đầu file):
# --- CAU HINH XAC THUC LDAP / ACTIVE DIRECTORY ---
# 1. Khai bao file chua mat khau cua tai khoan service
# (An toan hon la viet mat khau truc tiep)
acl ldap_service_password password_file "/etc/squid/ldap_pass"
# 2. Khai bao chuong trinh helper 'basic_ldap_auth'
auth_param basic program /usr/lib/squid/basic_ldap_auth \
-v 3 \
-R \
-b "DC=mycompany,DC=com" \
-D "CN=squid-service,OU=ServiceAccounts,DC=mycompany,DC=com" \
-w %p \
-f "sAMAccountName=%s" \
-h dc01.mycompany.com \
-Z
# 3. Thiet lap bo sung
auth_param basic children 5 startup=5 idle=1
auth_param basic realm Vui long nhap tai khoan Cong ty (AD)
auth_param basic credentialsttl 2 hours
Lưu ý: Tìm đường dẫn Helper chính xác
Đường dẫn
/usr/lib/squid/basic_ldap_authtrong ví dụ có thể không đúng trên máy chủ của bạn. Nó thay đổi tùy theo HĐH (Ubuntu/CentOS), phiên bản Squid (3, 4, 5) và cách cài đặt.Hãy chạy lệnh sau để tự tìm đường dẫn đúng trên hệ thống của bạn:
find / -name basic_ldap_authHoặc dùng lệnh
rpm -ql squid | grep basic_ldap_auth(CentOS) /dpkg -L squid | grep basic_ldap_auth(Ubuntu).Hãy sao chép và dán đường dẫn chính xác bạn tìm được vào file
squid.conf.
Giải thích chi tiết các tham số:
/usr/lib/squid/basic_ldap_auth: Đường dẫn đến helper (Xem lưu ý ở trên).-v 3: Sử dụng giao thức LDAP phiên bản 3.-R: (Quan trọng khi dùng AD). Cờ này yêu cầu helper không tự động theo dõi “LDAP referrals”. Active Directory thường sử dụng referrals, và việc tắt chúng đi (với cờ-R) giúp kết nối ổn định và chính xác hơn.-b "DC=...": Base DN (thay bằng thông tin của bạn). Nơi Squid bắt đầu tìm kiếm user.-D "CN=...": Bind DN (thay bằng thông tin của bạn). Tài khoản dịch vụ mà Squid dùng để đăng nhập AD.-w %p: Chỉ thị Squid đọc mật khẩu từ file đã khai báo ở trên (ldap_service_password).%plà biến chứa mật khẩu.-f "sAMAccountName=%s": Bộ lọc (filter).sAMAccountNamelà tên đăng nhập Windows (ví dụ:nv.ketoan.A).%slà biến chứa username mà người dùng gõ vào.-h dc01.mycompany.com: Hostname hoặc IP của máy chủ Domain Controller.-Z: (Mã hóa). Cờ này yêu cầu helper thử (Try) sử dụng StartTLS để mã hóa kết nối với AD. Nếu bạn chắc chắn máy chủ AD của mình hỗ trợ và muốn bắt buộc (Force) mã hóa, bạn có thể dùng cờ-ZZ.
Bước 4: Tạo file mật khẩu an toàn (LDAP Password File)
Chúng ta cần tạo file /etc/squid/ldap_pass đã khai báo ở trên. File này chứa mật khẩu của tài khoản dịch vụ squid-service.
- Tạo file và nhập mật khẩu:
# Cách 1: Dùng nano sudo nano /etc/squid/ldap_pass # (Gõ mật khẩu của tài khoản 'squid-service' vào và lưu lại) # Cách 2: Dùng htpasswd (tạo file mã hóa) sudo htpasswd -c -d /etc/squid/ldap_pass squid-service # (Bạn sẽ được yêu cầu nhập mật khẩu 2 lần) - Cấp quyền bảo mật (BẮT BUỘC): File này chứa mật khẩu kết nối AD, nó phải được bảo mật. Chúng ta cần cấp quyền cho user
proxy(trên Ubuntu) hoặcsquid(trên CentOS) để đọc nó.
Trên Ubuntu:sudo chown proxy: /etc/squid/ldap_pass sudo chmod 640 /etc/squid/ldap_passTrên CentOS:
sudo chown squid: /etc/squid/ldap_pass sudo chmod 640 /etc/squid/ldap_pass
Bước 5: Cập nhật Access Control Lists (ACLs)
Phần này tương tự như bài viết gốc, nhưng chúng ta sẽ dùng tên ACL mới cho rõ ràng.
Tìm đến khu vực http_access trong squid.conf. Xóa các dòng acl authenticated... và http_access allow authenticated... cũ (nếu có).
Thêm các dòng ACL mới này NGAY TRƯỚC dòng http_access deny all:
# --- Xac thuc ACL cho LDAP ---
# Tao mot ACL ten la 'ldap_users' yeu cau xac thuc
acl ldap_users proxy_auth REQUIRED
# Cho phep nhung ai thuoc ACL 'ldap_users' (da xac thuc thanh cong)
http_access allow ldap_users
# --- Ket thuc ACL ---
# Dong nay PHAI LUON nam o cuoi cung
http_access deny all
Bước 6: Khởi động và kiểm tra
Bây giờ, hãy kiểm tra file cấu hình và khởi động lại Squid.
- Kiểm tra lỗi cú pháp (lệnh phải im lặng, không báo lỗi):
sudo squid -k parse - Khởi động lại dịch vụ Squid:
sudo systemctl restart squid - Kiểm tra log để xem lỗi (nếu có):
sudo tail -f /var/log/squid/cache.logNếu bạn thấy lỗi liên quan đến “LDAP” hoặc “helper startup failed”, hãy kiểm tra lại đường dẫn helper, Bind DN, và file mật khẩu.
- Thử nghiệm trên trình duyệt: Mở trình duyệt và cấu hình proxy trỏ đến VPS của bạn. Một cửa sổ pop-up sẽ hiện ra. Hãy thử đăng nhập bằng tài khoản Active Directory của bạn. Nếu bạn truy cập web thành công, bạn đã hoàn tất!
Nâng cao: Phân quyền truy cập theo Nhóm (Group) Active Directory
Đây chính là sức mạnh thật sự của việc tích hợp AD. Bạn có thể cho phép hoặc cấm truy cập web dựa trên việc người dùng thuộc nhóm nào trong AD (ví dụ: nhóm “IT”, “Ketoan”, “Interns”).
Chúng ta sẽ sử dụng một helper khác: ext_ldap_group_acl.
Bước 1: Khai báo External ACL Helper (kiểm tra nhóm)
Mở lại file sudo nano /etc/squid/squid.conf và thêm đoạn mã sau (ngay bên dưới khối auth_param):
# --- KHAI BAO HELPER KIEM TRA NHOM AD ---
# (Day la mot dong rat dai, can than khi copy va xuong dong)
external_acl_type AD_Group_Check %LOGIN /usr/lib/squid/ext_ldap_group_acl \
-v 3 -R \
-b "DC=mycompany,DC=com" \
-D "CN=squid-service,OU=ServiceAccounts,DC=mycompany,DC=com" \
-w %p \
-f "(&(sAMAccountName=%u)(memberOf=CN=%g,OU=Groups,DC=mycompany,DC=com))" \
-h dc01.mycompany.com \
-Z
# Yeu cau Squid su dung file mat khau da khai bao o tren
acl ldap_service_password password_file "/etc/squid/ldap_pass"
external_acl_cache_password_file /etc/squid/ldap_pass
Giải thích bộ lọc -f phức tạp:
%ulà username (ví dụ:nv.ketoan.A) được truyền từ người dùng đã xác thực.%glà tên nhóm (ví dụ: “IT-Admins”) được truyền từ ACL mà chúng ta sẽ định nghĩa.memberOf=CN=%g,OU=Groups...: Chỉ thị này tìm xem user có phải là thành viên của nhóm (%g) nằm trong OUGroupshay không.- Lưu ý: Bạn phải thay đổi
OU=Groups,DC=mycompany,DC=comcho đúng với vị trí chứa các Nhóm (Group) trong AD của bạn.
Bước 2: Tạo và áp dụng ACL dựa trên Nhóm
Bây giờ, chúng ta có thể tạo các ACL “động” rất mạnh mẽ.
Trong squid.conf, tìm đến khu vực http_access (ngay trước http_access allow ldap_users).
Ví dụ: Chỉ cho phép nhóm “IT-Admins” truy cập SSH (port 22) và chặn nhóm “Interns”.
# Dinh nghia cac port (co the ban da co)
acl SSL_ports port 443
acl SSH_port port 22
acl CONNECT method CONNECT
# --- Dinh nghia ACL Nhom AD ---
# Goi helper 'AD_Group_Check' de kiem tra 2 nhom
acl IT_Admins external AD_Group_Check "IT-Admins"
acl Interns external AD_Group_Check "Interns"
# --- Ap dung quy tac ---
# Luu y: Thu tu rat quan trong, quy tac 'chan' phai o tren
# Chan nhom "Interns" truy cap moi thu
http_access deny Interns
# Cho phep nhom "IT-Admins" truy cap port 22 (SSH)
http_access allow CONNECT SSH_port IT_Admins
# Chan tat ca nhung nguoi khac (ke ca user da xac thuc) truy cap port 22
http_access deny CONNECT SSH_port
# --- Cac quy tac cu van giu nguyen ---
acl ldap_users proxy_auth REQUIRED
http_access allow ldap_users
http_access deny all
Sau khi lưu file, hãy kiểm tra cú pháp (sudo squid -k parse) và khởi động lại Squid. Hệ thống giờ đây đã phân quyền truy cập chi tiết theo nhóm AD.
Xử lý sự cố thường gặp (Troubleshooting)
Cấu hình LDAP có thể khó khăn. Nếu bạn gặp các lỗi chung như “Connection Refused” hoặc “Timeout”, 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.
Dưới đây là các cách gỡ lỗi hiệu quả nhất.
Kiểm tra Helper thủ công (Cách tốt nhất)
Chạy lệnh basic_ldap_auth trực tiếp trên terminal và gõ username password để xem nó trả lời “OK” hay “ERR”.
# Copy toan bo lenh helper tu file squid.conf cua ban
# Thay '-w %p' bang '-w "MatKhauCuaServiceAccount"' (mat khau that)
/usr/lib/squid/basic_ldap_auth \
-v 3 -R -b "DC=mycompany,DC=com" \
-D "CN=squid-service,OU=ServiceAccounts,DC=mycompany,DC=com" \
-w "MatKhauCuaServiceAccount" \
-f "sAMAccountName=%s" -h dc01.mycompany.com -Z
Sau khi chạy lệnh, terminal sẽ đứng yên chờ bạn nhập. Hãy gõ: ten_user_AD mat_khau_AD (rồi nhấn Enter)
- Nếu nó trả về
OK, helper của bạn cấu hình đúng. Vấn đề nằm ở filesquid.conf(sai ACL) hoặc file mật khẩu-w %p. - Nếu nó trả về
ERR, hãy kiểm tra lại Bind DN, Base DN, mật khẩu, filter…
Kiểm tra bằng ldapsearch
Dùng ldapsearch để kiểm tra kết nối LDAP độc lập với Squid, bao gồm cả StartTLS.
# Cai dat (Ubuntu)
sudo apt-get install ldap-utils
# Lenh kiem tra (thay the cac gia tri)
ldapsearch -x -H ldap://dc01.mycompany.com \
-Z \
-D "CN=squid-service,OU=ServiceAccounts,DC=mycompany,DC=com" \
-w "MatKhauCuaServiceAccount" \
-b "DC=mycompany,DC=com" \
"(sAMAccountName=ten_user_ban_muon_tim)"
- Nếu lệnh này trả về thông tin user, kết nối LDAP (bao gồm cả StartTLS) của bạn đã thông.
Kiểm tra bằng curl
Từ một máy client, dùng curl để kiểm tra toàn bộ luồng xác thực của Squid:
curl -v -x http://[IP_VPS_Squid]:[PORT] \
-U "ten_user_AD:mat_khau_AD" http://example.com
- Nếu thành công, bạn sẽ thấy mã HTML của
example.com. Nếu thất bại, hãy đọc kỹ log-v(verbose).
Lỗi phổ biến trên CentOS (SELinux)
SELinux mặc định cấm Squid (vốn là dịch vụ web) thực hiện các kết nối mạng LDAP ra bên ngoài.
- Triệu chứng: Helper chạy thủ công thì
OK, nhưng Squid log báo lỗi “permission denied”. - Giải pháp: Cho phép Squid sử dụng LDAP:
# Kiem tra trang thai getsebool -a | grep squid # Bat co (flag) cho phep Squid dung LDAP (vinh vien) sudo setsebool -P squid_use_ldap 1
Lỗi “Certificate Verify Failed” (Khi dùng -Z hoặc -ZZ)
- Triệu chứng: Lệnh
ldapsearch -Zhoặc log của Squid báo lỗi “certificate verify failed” hoặc “unable to get issuer certificate”. - Nguyên nhân: Máy chủ Active Directory đang dùng một chứng chỉ SSL (cho LDAPS) được ký bởi một CA nội bộ (Internal CA) của công ty. Máy chủ Linux chạy Squid không tin tưởng CA này.
- Giải pháp: Bạn phải “dạy” máy chủ Linux tin tưởng CA nội bộ đó.
- Xin file CA certificate (ví dụ:
corp_ca.crt) từ quản trị viên AD. - Copy file đó vào máy chủ Squid.
- Thực hiện lệnh (tùy HĐH) để cập nhật kho lưu trữ CA:
Trên CentOS/RHEL:sudo cp corp_ca.crt /etc/pki/ca-trust/source/anchors/ sudo update-ca-trustTrên Ubuntu/Debian:
sudo cp corp_ca.crt /usr/local/share/ca-certificates/ sudo update-ca-certificates - Khởi động lại Squid.
- Xin file CA certificate (ví dụ:
Ghi chú nâng cao (Phía Server AD): Hướng dẫn trên giúp bạn import CA đã có. Nếu bạn là quản trị viên AD và chưa có CA nội bộ (hoặc chưa bật LDAPS an toàn), lỗi này là không thể tránh khỏi.
Để tìm hiểu cách cài đặt và phát hành một CA nội bộ để bật LDAPS (Port 636) từ đầu trên Windows Server, hãy xem hướng dẫn: Cấu hình LDAPS (Port 636) trên Windows Server bằng AD CS.
Kết luận
Chúc mừng! Bạn vừa hoàn thành việc nâng cấp hệ thống Squid Proxy của mình từ xác thực htpasswd đơn lẻ lên cơ chế xác thực doanh nghiệp, tích hợp Squid với Active Directory.
Giải pháp này không chỉ tăng cường bảo mật bằng cách loại bỏ mật khẩu cleartext và mã hóa giao tiếp LDAP, mà còn đơn giản hóa toàn bộ quy trình quản lý người dùng. Với khảb năng phân quyền chi tiết theo Nhóm AD, bạn đã có trong tay một cổng kết nối Internet mạnh mẽ, an toàn và dễ dàng kiểm toán.
Bước tiếp theo: Đảm bảo tính sẵn sàng cao (HA)
Cấu hình trong bài viết này tạo ra một máy chủ proxy mạnh mẽ, nhưng nó vẫn là một “Điểm lỗi duy nhất” (Single Point of Failure). Nếu máy chủ VPS này gặp sự cố, toàn bộ hệ thống sẽ ngừng hoạt động.
Để xây dựng một hệ thống proxy cấp doanh nghiệp thực thụ, bước tiếp theo là thiết lập cụm HA (High Availability). Mời bạn đọc bài viết: Squid Proxy HA: Hướng dẫn cấu hình Keepalived (Tự động Failover).
Để chạy một proxy xác thực LDAP hiệu suất cao, bạn cần một VPS ổn định với kết nối mạng nhanh. Hãy tham khảo các gói VPS Linux tốc độ cao của chúng tôi hoặc xem qua Checklist 11+ bước quan trọng cần làm ngay sau khi cài đặt Ubuntu 24.04 để tối ưu hóa máy chủ của bạn.
Tài liệu tham khảo
- Configuring a Squid Server to authenticate off LDAP | Squid Web Cache wiki
- Configure Squid for Group-Based access controls | Squid Web Cache wiki
- Chapter 24. LDAP authentication | Automation controller administration guide | Red Hat Ansible Automation Platform | 2.4 | Red Hat Documentation
- ldapsearch(1) – Linux manual page




