Series Jenkins Docker Hub #5: Trạm cuối – Bảo mật Enterprise với LDAP/AD & RBAC qua JCasC
Chào anh em! Rất vui vì anh em đã đi cùng tôi đến chặng đường cuối cùng của chuỗi series chuyên sâu về Jenkins Docker Hub.
Ở Bài 4, chúng ta đã đạt đến cảnh giới "Mọi thứ đều là Code" (Configuration as Code). Chỉ với một lệnh docker-compose up, hệ thống đã tự động cài đặt plugin và lên cấu hình cơ bản.
Tuy nhiên, khi làm việc trong một tổ chức lớn (ví dụ như đơn vị vận hành hệ thống thu phí tự động AFC cho các tuyến Metro), số lượng nhân sự có thể lên tới hàng chục, hàng trăm người: từ team Backend, Frontend, QA cho đến ban quản trị dự án. Nếu anh em vẫn dùng Database nội bộ của Jenkins để tạo từng tài khoản, rồi gán quyền bằng tay... thì thật sự là một cơn ác mộng quản trị.
Đặc biệt, khi một nhân sự nghỉ việc, nếu DevOps quên xóa tài khoản Jenkins của người đó, hậu quả bảo mật sẽ vô cùng khôn lường.
Hôm nay, chúng ta sẽ giải quyết triệt để bài toán này bằng cách kết nối Jenkins với hệ thống quản lý danh tính tập trung của công ty (LDAP/Active Directory) và tự động hóa việc phân quyền bằng RBAC (Role-Based Access Control) thông qua JCasC.
1. Tư duy Bảo mật cấp Doanh nghiệp (Enterprise)
Thay vì để Jenkins tự quản lý user, chúng ta sẽ áp dụng 2 nguyên tắc vàng trong bảo mật doanh nghiệp:
- Xác thực tập trung (Security Realm): Sử dụng chung một kho dữ liệu nhân sự (LDAP hoặc Microsoft Active Directory). Khi một Dev mở Jenkins, họ đăng nhập bằng chính tài khoản email/mật khẩu công ty. Jenkins sẽ chạy ra hỏi hệ thống LDAP: "Tài khoản này có đúng không?". Đổi mật khẩu hay vô hiệu hóa tài khoản chỉ cần làm một nơi, Jenkins sẽ tự động tuân theo.
- Phân quyền theo Vai trò (Authorization Strategy): Không cấp quyền trực tiếp cho cá nhân. Chúng ta sẽ định nghĩa các "Vai trò" (Roles) như Dev, QA, Admin. Sau đó, map các nhóm (Groups) từ LDAP vào các Vai trò này.
2. Chuẩn bị Vũ khí (Plugins)
Để làm được điều này, chúng ta cần bổ sung 2 plugin quan trọng vào file plugins.txt mà ta đã tạo ở Bài 4:
# Bổ sung vào file plugins.txt
ldap:latest
role-strategy:latest
Khi chạy docker build, Jenkins sẽ tự động tải các công cụ này về để chuẩn bị cho quá trình kết nối.
3. Khai báo LDAP & RBAC trong file jenkins.yaml
Đây là phần "ăn tiền" nhất. Chúng ta sẽ viết code YAML để ra lệnh cho Jenkins cách kết nối với máy chủ LDAP của công ty, đồng thời định nghĩa luôn hệ thống phân quyền rành mạch.
Anh em mở file jenkins.yaml ra và cấu hình như sau:
# File: jenkins.yaml
jenkins:
systemMessage: "Trung tâm CI/CD Hệ thống AFC - Đăng nhập bằng tài khoản công ty."
# --- PHẦN 1: KẾT NỐI LDAP (SECURITY REALM) ---
securityRealm:
ldap:
configurations:
- server: "ldap://ldap.congtycuaban.com:389" # Địa chỉ máy chủ LDAP
rootDN: "dc=congtycuaban,dc=com" # Nơi bắt đầu tìm kiếm
userSearchBase: "ou=Users"
userSearch: "uid={0}" # Cách tìm username
groupSearchBase: "ou=Groups"
managerDN: "cn=admin,dc=congtycuaban,dc=com" # Tài khoản có quyền đọc LDAP
managerPasswordSecret: "mat_khau_ldap_cua_admin"
# --- PHẦN 2: PHÂN QUYỀN RBAC (AUTHORIZATION STRATEGY) ---
authorizationStrategy:
roleBased:
roles:
global:
# Vai trò Quản trị viên: Toàn quyền
- name: "admin"
permissions:
- "Overall/Administer"
# Vai trò Chỉ đọc: Dành cho mọi user để vào được giao diện
- name: "readOnly"
permissions:
- "Overall/Read"
items:
# Vai trò Dev Backend: Chỉ nhìn thấy và được Build các Job có tiền tố 'backend-'
- name: "backend-developer"
pattern: "backend-.*"
permissions:
- "Job/Build"
- "Job/Read"
- "Job/Workspace"
# Vai trò QA: Được đọc mọi Job để lấy log, nhưng không được Build
- name: "qa-tester"
pattern: ".*"
permissions:
- "Job/Read"
# --- PHẦN 3: GÁN NHÓM LDAP VÀO VAI TRÒ (ROLE ASSIGNMENT) ---
roleAssignments:
global:
- role: "admin"
users:
- "CN=DevOps_Team,OU=Groups,DC=congtycuaban,DC=com" # Nhóm DevOps trên LDAP
- role: "readOnly"
users:
- "authenticated" # Bất kỳ ai đăng nhập thành công đều có quyền Read chung
items:
- role: "backend-developer"
users:
- "CN=Backend_Team,OU=Groups,DC=congtycuaban,DC=com" # Nhóm Backend trên LDAP
- role: "qa-tester"
users:
- "CN=QA_Team,OU=Groups,DC=congtycuaban,DC=com"
4. Phân tích tư duy Kiến trúc (Dành cho Kỹ sư)
Hãy nhìn vào đoạn mã YAML phía trên, anh em sẽ thấy sự uyển chuyển của JCasC:
- Regex Pattern Matching: Ở phần items, anh em thấy chỗ pattern: "backend-.*". Đây là một thủ thuật (trick) cực hay. Quy định của công ty là mọi project Backend khi tạo Job trên Jenkins đều phải bắt đầu bằng chữ backend- (ví dụ: backend-afc-service). Nhờ cái Regex này, anh em Backend chỉ nhìn thấy Job của mình, không bao giờ "lỡ tay" bấm nhầm sang Job deploy của đội Frontend được.
- Không dính líu đến User cá nhân: Ở phần roleAssignments, chúng ta hoàn toàn không gán quyền cho anh Nguyễn Văn A hay chị Trần Thị B. Chúng ta gán vào hẳn một Nhóm (Group) trên LDAP (Backend_Team, QA_Team). Ngày mai có 10 bạn Dev mới vào công ty, HR chỉ cần add họ vào Group Backend trên LDAP, ngay lập tức họ có quyền Build Job trên Jenkins mà anh em DevOps không cần phải bấm một cú click chuột nào!
5. Khởi chạy và tận hưởng
Mọi thứ đã định nghĩa xong xuôi, anh em chỉ việc chạy lệnh quen thuộc:
docker-compose up -d --build
Jenkins sẽ khởi động, tải plugin phân quyền, nạp cấu hình LDAP. Khi mở trình duyệt lên, màn hình đăng nhập sẽ hiện ra. Thử đăng nhập bằng tài khoản nội bộ của công ty, anh em sẽ thấy giao diện hiển thị chính xác những gì mà tài khoản đó được phép nhìn thấy.
Chỉ bằng một file cấu hình duy nhất, anh em đã thiết lập được một hàng rào bảo mật tuân thủ hoàn toàn các tiêu chuẩn kiểm toán (Audit) khắt khe nhất của các tập đoàn lớn.
Lời kết cho Hành trình Jenkins Docker Hub
Chúc mừng Hiếu! Trạm cuối này đã khép lại chuỗi series biến Jenkins từ một công cụ "tay không tấc sắt" thành một bộ máy CI/CD Enterprise đích thực.
Từ việc chống "mất trí nhớ" bằng Volumes, tích hợp sức mạnh của Docker (DooD), biến ảo môi trường với Docker Agent, cho đến "Mã hóa mọi thứ" với JCasC và cuối cùng là Phân quyền tập trung (LDAP/RBAC). Tất cả những kiến thức này chính là bộ kỹ năng của một Senior DevOps/System Engineer thực thụ, giúp đảm bảo những hệ thống xương sống luôn vững vàng và bảo mật.
Cứ lưu lại bộ source code 4 file (Dockerfile, docker-compose.yml, plugins.txt, jenkins.yaml) này thành một repo template cá nhân. Lần tới có dự án mới, anh em chỉ cần mang nó ra, sửa vài dòng là có ngay một hệ thống xịn xò trong 2 phút. Happy Automation & Secure Coding!
All rights reserved