Tổng quan
Khoá luận chủ yếu nói về kiến trúc Microservices và cách áp dụng quy trình DevSecOps vào kiến trúc Microservices và Cloud để tạo ra quy trình tự động triển khai. Mục tiêu cuối cùng của nhóm là thiết kế hệ thống Website Microservices và áp dụng quy trình pipeline DevSecOps vào hệ thống nói trên do các vấn đề về năng lực cá nhân, thời gian thực hiện và phạm vi đề tài. Ngoài ra, viết các bài kiểm tra cơ bản mà không quá phức tạp, và trang web mà em hướng đến chỉ hỗ trợ phân giải toàn màn hình và không phản hồi. Trong quá trình thực hiện đề tài, đề tài của nhóm được chia làm hai phần, phần 1 là triển khai và tự động hoá Website theo kiến trúc Microservices và phần 2 sẽ là quy trình triển khai tự động các tài nguyên lên hạ tầng Cloud sử dụng AWS Cloud.
Phần 1: Thiết kế và tự động triển khai ứng dụng Microservices :
- Client được triển khai bằng ReactJs, một thư viện JS phổ biến hiện nay đối với các doanh nghiệp. Ngoài ra, để đẩy nhanh quá trình phát triển giao diện với các thành phần (Components) được cung cấp bởi các thư viện thứ ba, nhóm đã kết hợp với Ant Design và Bootstrap.
- NodeJs, một framework viết dựa trên JS, sẽ được sử dụng để xây dựng server. Nó được phát triển dựa trên kiến trúc Microservices với các module được xây dựng riêng biệt. Các dịch vụ này sẽ sử dụng Mongo, một database riêng biệt. Các dịch vụ sẽ được trao đổi thông tin với nhau thông qua một cơ chế Message Queue gọi là Nats được xây dựng và phát triển bởi CNCF.
- Sử dụng Gitlab để quản lý mã nguồn và giao thức HTTP Request được sử dụng để kết nối Client và Server
- Ngoài ra, nhóm sẽ tích hợp quy trình pipeline DevSecOps để tạo ra một quy trình tự động triển khai ứng dụng từ môi trường phát triển đến sản xuất. Nhóm cũng sẽ tích hợp các công cụ kiểm thử và đánh giá hiệu năng của ứng dụng trong quá trình triển khai tài nguyên.
- Ngoài ra, nhóm sẽ tích hợp mô hình chatbot vào ứng dụng Web để người dùng dễ dàng hỏi đáp chatbot mà không cần sử dụng các ứng dụng chatbot khác.
Phần 2: Triển khai các tài nguyên một cách tự động lên môi trường Cloud:
- Viết các tài nguyên dưới dạng các modules dễ tái sử dụng và áp dụng CI/CD để tự động triển khai các tài nguyên lên môi trường AWS.
- Công cụ kiểm thử mã nguồn được tích hợp vào quá trình CI/CD để hỗ trợ phát hiện các lỗ hổng bảo mật.
- Kết quả thu được là một ứng dụng trên web để quản lý công việc sẽ được phát triển để giúp các công ty quản lý công việc của họ một cách hiệu quả mà không cần phải sử dụng các công cụ do bên thứ ba quản lý. Điều này giúp các công ty bảo mật thông tin của họ mà không sợ rò rỉ thông tin quan trọng
Mục tiêu nghiên cứu
- Vận dụng các kiến thức đã được học vào đề tài mà nhóm thực hiện.
- Giúp tối ưu hóa quy trình triển khai để đạt được tốc độ nhanh chóng và có hiệu suất cao, bên cạnh đó cũng có khả năng mở rộng một cách linh hoạt.
- Triển khai ứng dụng trên môi trường Cloud giúp việc quản lý trở nên dễ dàng và an toàn hơn, bên cạnh đó tập trung vào việc triển khai tự động hạ tầng Cloud giúp dễ dàng bảo trì và tránh các lỗi xảy ra.
- Ứng dụng được một quy trình DevSecOps vào triển khai dự án nhằm nâng cao tính linh động cũng như nâng cao tính bảo mật, cũng như thiết kế môi trường từ Dev tới Prod để giúp quá trình phát triển ứng dụng trở nên dễ dàng và đảm bảo tính an toàn cũng như tránh các trường hợp lỗi xảy ra trước khi đưa về phía người dùng.
- Xây dựng quy trình triển khai tự động để giúp giảm thiểu các lỗi trong quá trình sửa chữa hay bảo trì hệ thống.
- Tạo ra một ứng dụng đơn giản có thể phục vụ cho nhu cầu của cộng đồng thông qua giao diện đơn giản và dễ sử dụng.
- Tích hợp các công cụ kiểm thử đánh giá chất lượng giúp cho việc kiểm tra và đánh giá xem có lỗ hổng bảo mật hay hiệu năng ứng dụng có tốt hay không.
- Ứng dụng mô hình Chatbot giúp người dùng có thể hỏi đáp trực tiếp ngay trên Website mà không cần phải truy cập qua các trang Chatbot AI bên ngoài.
- Triển khai quản lý tập trung cụm K8S Cluster giúp cho việc kiểm soát dễ dàng hơn.
- Xây dựng các tính năng mà người dùng có thể sử dụng miễn phí so với các tính năng trả phí ở ứng dụng khác.
- Triển khai kịch bản Canary giúp một số người dùng có thể trải nghiệm trước phiên bản mới của ứng dụng điều đó giúp cho việc theo dõi và Rollback về phiên bản cũ dễ dàng hơn nếu trên phiên bản mới có lỗi xảy ra.
Phạm vi nghiên cứu
- Tìm hiểu và xây dựng một quy trình DevSecOps để tự động triển khai ứng dụng, tích hợp các công cụ bảo mật vào các môi trường đó.
- Tìm hiểu và tích hợp các công cụ đánh giá hoặc giám sát vào hệ thống.
- Tìm hiểu sâu hơn vào kiến trúc của K8S và Docker.
- Tìm hiểu và ứng dụng một vài dịch vụ cơ bản của AWS.
- Tìm hiểu và triển khai hạ tầng tự động bằng cấu hình Terraform.
- Triển khai các server để dựng các ứng dụng, kho lưu trữ cũng như Gitlab Server cũng như Gitlab Runner.
Nội dung đề tài
Đầu tiên khi lập trình viên viết code để triển khai các resources sử dụng terraform, sau khi push code lên github sẽ tiến hành trigger sự kiện CI/CD trên github actions. Trước quá trình CI/CD thì sẽ tích hợp công cụ kiểm tra tính đúng đắn mã nguồn của
hạ tầng trước khi triển khai sử dụng CheckOv.
Nếu có lỗi thì dừng quá trình build, nếu thành công thì sẽ thực hiện các bước terraform init để khởi tạo các plugins cần thiết, sau đó sử dụng terraform validate để kiểm tra tính đúng đắn của mã nguồn, sau đó sẽ sử dụng terraform plan để xem trước các tài nguyên sẽ được triển khai lên hạ tầng như thế nào và sau cùng sẽ sử dụng terraform apply để tiến hành tạo các tài nguyên lên aws.
Hạ tầng sau khi build xong sẽ trả về file tfstate chứa toàn bộ cấu hình các tài nguyên được triển khai lên AWS, file tfstate này sẽ được lưu trên s3 bucket. Khi muốn xóa hạ tầng này bằng CI/CD thì chỉ cần cung cấp thông tin xác thực s3 lên runner và kéo file hạ tầng này về thì sẽ có thể sử dụng lệnh terraform destroy để huỷ toàn bộ tài nguyên mà không cần phải xóa thủ công giúp tránh trường hợp sai sót.
Khi lập trình viên tiến hành push code của từng service tương ứng thì sẽ tiến hành trigger pipeline của project service tương ứng. Lập trình viên sẽ tiến hành tạo tag cho từng pipeline với sự kiên merge request hoặc push tương ứng thì sẽ chạy pipeline cho nhánh Dev, với sự kiện push thì chỉ chạy bước unit test còn merge sẽ cho phép chạy toàn bộ pipeline.
Đầu tiên sẽ tiến hành chạy Jest (Unit Test) để trả về kết quả test độ bao phủ của mã nguồn, sau đó kết quả sẽ đưa vào SAST sử dụng SonarQube (đã giải thích công dụng ở phần 4.2.1.2) và có thể theo dõi kết quả trực quan bằng thông qua server được dựng ở một máy chủ riêng lẽ sử dụng UTM.
Tiếp theo sẽ chạy đến stage SCA sử dụng Snyk và sau cùng sẽ tiến hành build image ở bước Dockerfile và sẽ sử dụng Image Scan là Trivy để quét image và kết quả test sẽ được xuất ra file HTML và lưu trữ trên Aritfactory sử dụng Jfrog.
Sau khi test thành công image thì sẽ áp dụng image mới thì tiến hành lưu trữ image đã triển khai vào Private Registry sử dụng Portus. Sau đó cần có 1 người manager phê duyệt quá trình chạy stage CI/CD ở bước cuối bằng thủ công để đẩy image lên manifest github. Sau đó argocd trong K8S Stage sẽ lắng nghe và đồng bộ hoá nhánh giữa 2 bên và cập nhật image mới nhất lên pod.Trong cụm K8S sẽ cài metrics server để cho phép HPA khi vượt ngưỡng tài nguyên
cấu hình.
Kết luận
- Triển khai thành công được một ứng dụng với các tính năng cơ bản cần có của một dự án quản lý công việc. Bên cạnh đó ứng dụng này được phát triển dựa trên kiến trúc Microservices giúp cho việc phát triển và mở rộng trở nên dễ dàng hơn cũng như bảo trì.
- Triển khai thành công quy trình pipeline DevSecOps vào ứng dụng Microservices , giúp ứng dụng tạo được một quy trình tự động nhanh chóng từ môi trường phát triển đến môi trường thực tế. Trong các quá trình đó cũng tích hợp các công cụ phân tích để tìm kiếm và phân tích các lỗ hổng bảo mật từ đó đưa ra các giải pháp khắc phục kịp thời trước khi đưa vào môi trường sản xuất.
- Hiểu và có thể xây dựng được môi trường hạ tầng cloud với các cấu hình tự động cũng như tích hợp CI/CD và công cụ quét bảo mật để giúp việc khởi tạo và kiểm tra trở nên dễ dàng hơn.
- Tích hợp các công cụ giúp cho việc quản lý trở nên cá nhân hơn thay vì phụ thuộc vào các dịch vụ cung cấp thứ 3 (như xây dựng minio để lưu trữ dữ liệu thay vì phải lưu trữ trên s3,… giúp đảm bảo an toàn và bảo mật hơn).
- Tích hợp các công cụ giám sát và thu lập log tập trung giúp phát hiện ra các vấn đề cũng như hiệu suất của ứng dụng được dễ dàng hơn từ đó có thể khắc phục lỗi một cách nhanh chóng nhất.
- Xây dựng được pipeline chatbot và tích hợp vào trong ứng dụng giúp người dùng có thể có những trải nghiệm được tốt nhất.
- Sử dụng các công cụ để backup cụm K8S thường xuyên giúp việc khôi phục hệ thống trở nên dễ dàng nếu có lỗi xảy ra.
- Phân quyền các loại tài khoản có thể tương tác vào các tài nguyên trong cụm trên cloud.