Khi mọi người nghe đến từ "kiểm toán" (audit), họ thường hình dung ra các kế toán viên, bảng tính và mùa thuế. Trong phần mềm, kiểm toán là một lĩnh vực hoàn toàn khác. Nó không hẳn là việc cân đối sổ sách mà là việc đặt ra những câu hỏi hóc búa cho mã nguồn, dữ liệu và các cơ chế kiểm soát của bạn. Một cuộc kiểm toán hệ thống đánh giá liệu các tài sản thông tin của bạn có an toàn không, dữ liệu có duy trì được tính chính xác không, và các tài nguyên của bạn có thực sự hoạt động đúng như cách bạn nghĩ hay không.
Một hệ thống hoạt động được không đồng nghĩa với một hệ thống đáng tin cậy. Một nền tảng hồ sơ học thuật có thể đăng ký sinh viên chính xác và tạo ra bảng điểm sạch sẽ trong khi âm thầm lưu trữ mật khẩu dưới dạng văn bản thuần túy (plain text). Một bảng điều khiển logistics có thể hiển thị thời gian giao hàng hoàn hảo trong khi lại để lộ thông tin đăng nhập cơ sở dữ liệu trong mã nguồn có thể đọc được công khai. Kiểm toán hệ thống tồn tại để lấp đầy khoảng cách đó.
Những gì một cuộc Kiểm toán Hệ thống thực sự bao quát
Về cốt lõi, một cuộc kiểm toán hệ thống xem xét ba yếu tố: tính bảo mật (confidentiality), tính toàn vẹn (integrity) và tính hiệu quả (efficiency). Tính bảo mật có nghĩa là hồ sơ sinh viên, nhật ký giao dịch hoặc hồ sơ bệnh nhân của bạn chỉ có thể được truy cập bởi đúng người. Tính toàn vẹn có nghĩa là dữ liệu không tự bị lỗi một cách âm thầm, không mất đi nguồn gốc (lineage) hoặc không bị sai lệch so với thực tế theo thời gian. Tính hiệu quả có nghĩa là các máy chủ, dịch vụ và quy trình của bạn mang lại giá trị thay vì chỉ tiêu tốn tài nguyên trong khi không có ai giám sát.
Ba phẩm chất này phải có khả năng kiểm chứng được. Tin tưởng vào cơ sở dữ liệu của bạn chỉ vì nó chưa bị sập không phải là sự kiểm chứng. Một cuộc kiểm toán thực thụ sẽ tạo ra bằng chứng mà bạn có thể đưa ra khi một cơ quan quản lý, một khách hàng, hoặc chính bản thân bạn trong tương lai hỏi làm thế nào bạn biết được hệ thống đang hoạt động ổn định.
Các loại Kiểm toán Hệ thống chính
Không phải cuộc kiểm toán nào cũng xem xét cùng một thứ. Tùy thuộc vào những rủi ro bạn đối mặt, bạn có thể cần một hoặc nhiều loại sau đây:
Kiểm toán Ứng dụng (Application Audit). Việc này xem xét liệu logic phần mềm có chính xác hay không. Các phép tính có chính xác không? Các máy trạng thái (state machines) có xử lý được các trường hợp biên (edge cases) không? Việc phân quyền có được thực thi trong mọi hàm có chạm đến dữ liệu nhạy cảm không? Một lỗi điển hình ở cấp độ ứng dụng là một mô-đun chấm điểm làm tròn số thập phân không chính xác hoặc một bước kiểm tra điều kiện nhận học bổng có thể bị vượt qua bằng cách thay đổi giá trị trong danh sách thả xuống (dropdown).
Kiểm toán Bảo mật (Security Audit). Việc này tập trung vào kiểm soát truy cập, mã hóa và các lỗ hổng. Nó đặt câu hỏi ai có thể đọc bản ghi nào, liệu dữ liệu có được mã hóa khi đang truyền tải (in transit) và khi đang lưu trữ (at rest) hay không, và liệu quản lý phiên (session management) của bạn có thể chống lại sự giả mạo hay không. Nó cũng kiểm tra xem các thư viện phụ thuộc (dependencies) của bạn có chứa các lỗ hổng đã biết, điều có thể âm thầm khiến bạn bị khai thác hay không.
Kiểm toán Cơ sở dữ liệu (Database Audit). Tính toàn vẹn dữ liệu nằm ở đây. Các ràng buộc tham chiếu (referential constraints) có được thực thi không? Các bản sao lưu có thực sự có thể khôi phục được không, hay bạn chỉ mới lên lịch cho chúng? Các chính sách lưu trữ có phù hợp với yêu cầu pháp lý không? Một cuộc kiểm toán cơ sở dữ liệu cũng xem xét các kế hoạch phục hồi, bởi vì một bản sao lưu mà bạn chưa bao giờ diễn tập thì cũng chỉ là lý thuyết.
Kiểm toán Mạng (Network Audit). Việc này kiểm tra máy chủ, tường lửa, định tuyến và tính khả dụng. Nó xác nhận rằng chỉ các cổng cần thiết mới được mở, các quy tắc tường lửa được ghi chép đầy đủ, và cơ sở hạ tầng của bạn có thể xử lý các đợt tăng đột biến lưu lượng hoặc các sự kiện tấn công từ chối dịch vụ (DoS). Nó cũng kiểm tra xem các hệ điều hành đã được vá lỗi chưa, chứ không chỉ riêng lớp ứng dụng.
Kiểm toán Tuân thủ (Compliance Audit). Việc này đo lường hệ thống dựa trên các quy tắc bên ngoài. Các nền tảng dành cho sinh viên có thể cần tuân thủ FERPA. Các hệ thống y tế phải đáp ứng HIPAA. Xử lý thanh toán yêu cầu sự phù hợp với PCI-DSS. Tuân thủ không chỉ là về việc bảo mật; mà còn là về khả năng chứng minh sự bảo mật đó với một cơ quan bên ngoài.
Kiểm toán Vận hành (Operational Audit). Mã nguồn chỉ là một nửa câu chuyện. Cuộc kiểm toán này xem xét các quy trình bảo trì, quy trình hỗ trợ, quản lý thay đổi và độ mới của tài liệu. Một ứng dụng xuất sắc sẽ trở thành một gánh nặng khi người duy nhất hiểu về quy trình triển khai (deployment pipeline) của nó rời khỏi tổ chức.
Một ví dụ thực tế: Kiểm toán EduManage v1.0
Gần đây, tôi đã thực hiện một cuộc kiểm toán bảo mật và ứng dụng nội bộ cho EduManage v1.0, một nền tảng quản lý học thuật. Hệ thống này xử lý việc đăng ký, hồ sơ và chấm điểm. Trước khi nó chạm vào dữ liệu thực của sinh viên, chúng tôi cần biết liệu nó có thể được tin tưởng hay không. Tôi đã tuân theo một quy trình sáu bước đơn giản, và tôi khuyên dùng cấu trúc tương tự này cho hầu hết các cuộc kiểm toán nội bộ.
Lập kế hoạch phạm vi. Các cuộc kiểm toán không có ranh giới sẽ trở thành những công việc trì trệ kéo dài vô tận. Chúng tôi đã xác định chính xác những mô-đun nào nằm trong phạm vi: xác thực, quản lý hồ sơ và các quy trình đăng ký cốt lõi. Các tích hợp bên thứ ba và cơ sở hạ tầng vật lý được xác định rõ ràng là nằm ngoài phạm vi. Chúng tôi đã phân bổ hai tuần và xác định những nhân sự chủ chốt có thể giải đáp các thắc mắc. Sự rõ ràng này giúp ngăn chặn tình trạng phình đại phạm vi (scope creep) và giữ cho mọi người luôn thống nhất.
Thu thập thông tin và tài liệu. Tôi đã thu thập các sơ đồ kiến trúc, tài liệu API, lược đồ cơ sở dữ liệu và các báo cáo sự cố trước đó. Tôi đã trao đổi với nhà phát triển chính về các quy trình triển khai và lựa chọn tech stack. Bạn không thể kiểm thử những gì bạn không hiểu, và những giả định được đưa ra ở giai đoạn này sẽ làm sai lệch mọi phát hiện sau đó.
Thực hiện kiểm thử. Chúng tôi tiếp cận hệ thống từ ba góc độ. Kiểm tra mã nguồn (code review) nhằm tìm kiếm các anti-pattern, lỗi injection và các phụ thuộc không an toàn. Kiểm thử chức năng (functional tests) nhằm xác minh rằng các quy tắc nghiệp vụ—như giới hạn đăng ký và kiểm tra điều kiện tiên quyết—thực sự ngăn chặn các trạng thái không hợp lệ thay vì chỉ che giấu chúng đằng sau mã frontend. Kiểm thử xâm nhập (penetration tests) mô phỏng một kẻ tấn công bên ngoài, thăm dò các điểm cuối (endpoints) bị lộ và thao túng các yêu cầu để xem điều gì bị rò rỉ hoặc bị phá vỡ.
Phân tích rủi ro và các phát hiện. Các lỗ hổng thô không có tầm quan trọng như nhau. Chúng tôi đã lập bản đồ cho mỗi phát hiện dựa trên khả năng xảy ra và
