Chương 1: Giới thiệu chung về nội dung đề tài, các giai đoạn thực hiện và tổng quan báo cáo. • Chương 2: Trình bày các kiến thức nền tảng về Docker container và Kubernetes. • Chương 3: Trình bày các hướng tấn công, khai thác đối với Docker container. • Chương 4: Trình bày các hướng tấn công, khai thác đối với Kubernetes.
• Chương 5: Phân tích thiết kế hệ thống và hiện thực công cụ. • Chương 6: Đưa ra tập kiểm thử và đánh giá độ hiệu quả của công cụ. 2 Thuật ngữ host được sử dụng để nói đến máy tính hoặc hệ thống máy tính đang chạy mà container đang triển khai trên đó. 3 • Chương 7: Tổng kết về Luận văn tốt nghiệp, trình bày những hạn chế và hướng phát triển trong tương lai.
4 2 Kiến thức và công nghệ nền tảng 2.1 Một số khái niệm trong hệ điều hành Linux có liên quan Container được xây dựng và triển khai trên nền tảng của hệ điều hành Linux vì thế sẽ có nhiều khái niệm liên quan đến hệ điều hành Linux được sử dụng xuyên suốt luận văn. Mục đích của phần này cung cấp thông tin về một số khái niệm này. • Linux kernel: Linux kernel là lõi của hệ điều hành Linux. Nó là phần cốt lõi của hệ thống, chịu trách nhiệm quản lý tài nguyên hệ thống, điều khiển các thiết bị và cung cấp các dịch vụ cơ bản cho các chương trình đang chạy trên hệ thống.
Nó là một phần không thể thiếu của hệ thống Linux và là nơi mà các thay đổi cơ bản đến từ các nhà phát triển được thực hiện. Kể từ bây giờ cho đến hết luận văn, thuật ngữ “kernel” sẽ được sử dụng để chỉ Linux kernel. • credentials: Trong Linux, credentials là thuật ngữ đề cập đến thông tin xác định người dùng và kiểm soát truy cập người dùng đến các tài nguyên. Thông tin này thường bao gồm user ID (UID) và group ID (GID) của người dùng và các nhóm mà người dùng đang là thành viên.
Nhân kernel quản lý thông tin này trong một cấu trúc được gọi là credentials structure, cấu trúc này được liên kết với mỗi tiến trình đang chạy trên hệ thống. • capablilities: Trong hệ điều hành Linux, capabilities đề cập đến các quyền truy cập được gán cho các tiến trình. Cabilities được sử dụng để kiểm soát quyền truy cập của các tiến trình đến các tài nguyên hệ thống, chẳng hạn như các tập tin và các thiết bị. Bằng cách phân chia các quyền truy cập thành các khả năng riêng biệt, hệ điều hành có thể điều chỉnh mức độ truy cập của các tiến trình đến các tài nguyên một cách linh hoạt hơn.1 minh họa một số quyền truy cập mà Linux hỗ trợ.
Trong hệ điều hành Linux, thuật ngữ filesystem đề cập đến cách mà dữ liệu được lưu trữ và quản lý trên thiết bị lưu trữ như đĩa cứng hoặc thiết bị flash. Hệ thống tập tin cung cấp các chức năng như tạo, xóa và đọc/ghi các tập tin và thư mục trên thiết bị lưu trữ, quản lý việc truy cập các tài nguyên bằng cách sử dụng các quyền truy cập và capabilities. Một số hệ thống tập tin phổ biến trên Linux bao gồm ext4 (fourth extended file system), XFS (High Performance Scalable File System) và Btrfs (B-Tree File System).1: Một số capabilities trong Linux • cgroups. cgroups (control groups) là một tính năng của hệ điều hành Linux, cho phép người dùng giới hạn và quản lý các tài nguyên của các tiến trình trên hệ thống.
Cgroups giúp người dùng có thể đặt giới hạn cho các tiến trình như sử dụng CPU, bộ nhớ và dung lượng đĩa, giúp cho hệ thống hoạt động hiệu quả hơn và tránh việc một tiến trình chiếm quá nhiều tài nguyên của hệ thống. Cgroups cũng giúp cho việc quản lý và theo dõi các tiến trình trên hệ thống Linux trở nên dễ dàng hơn. Trong Linux, không gian tên (namespaces) là một cơ chế cho phép tách biệt các tiến trình trên hệ thống bằng cách tạo ra các không gian riêng biệt cho mỗi tiến trình. Namespaces cung cấp một tập hợp các tài nguyên riêng biệt cho tiến trình đang chạy trong đó, chẳng hạn như các tên tập tin, bộ nhớ, các bộ đếm thời gian và các tên thiết bị.
Điều này giúp ngăn chặn các tiến trình truy cập vào các tài nguyên của các tiến trình khác và đảm bảo rằng các tiến trình có thể chạy một cách độc lập với nhau. Đây là một công nghệ bảo mật cho Linux, cho phép người quản trị hệ thống cấu hình và quản lý các chức năng bảo mật khác nhau trên hệ thống của họ. LSMs giúp xây dựng các giải pháp bảo mật cho hệ thống Linux trở nên linh hoạt và cho phép người quản trị hệ thống tùy chỉnh các chức năng bảo mật theo nhu cầu của họ. seccomp là tên viết tắt của “secure computing mode” trong Linux.
Nó là một cơ chế bảo mật cho phép người dùng cấu hình quyền truy cập của các tiến trình trên các lời gọi hệ thống. Nó giúp người dùng bảo vệ máy tính của họ khỏi các cuộc tấn công bằng cách giới hạn quyền truy cập của các tiến trình. OverlayFS là một giao diện tập tin đặc biệt trong Linux, cho phép bạn gắn hai hoặc nhiều hệ thống tập tin lớn lên nhau để tạo ra một hệ thống tập tin mới. Điều này cho phép bạn sử dụng các tập tin và thư mục từ các hệ thống tập tin dưới đáy như là các tập tin và thư mục trong hệ thống tập tin gốc, trong khi vẫn có thể ghi đè lên chúng bằng cách sử dụng một hệ thống tập tin bên trên.
OverlayFS có thể được sử dụng cho nhiều mục đích khác nhau, như tạo ra một hệ thống tập tin độc lập cho một chương trình hoặc dịch vụ, hoặc để tạo ra một bản sao lưu của hệ thống tập tin hiện tại mà không cần phải sử dụng rất nhiều dung lượng đĩa. daemon là một loại chương trình trong hệ điều hành Linux và các hệ điều hành tương tự. Đặc điểm của daemon là nó chạy trong nền và thường được dùng để thực hiện các tác vụ hệ thống, như quản lý các dịch vụ mạng, quản lý bộ nhớ, hoặc theo dõi và ghi lại các hoạt động trên hệ thống. Daemon thường không được làm việc trực tiếp với người dùng hoặc các ứng dụng khác trên hệ thống, thay vào đó nó thường được quản lý và điều khiển bởi hệ thống hoặc bởi các tiện ích quản lý hệ thống khác.
SMAP (Secure Memory Access Protection) là một tính năng trong nhân Linux giúp bảo vệ bộ nhớ hệ thống khỏi truy cập không được phép. Nó làm điều này bằng cách thiết lập một không gian địa chỉ riêng cho mã và dữ liệu của kernel, điều này ngăn chặn mã từ người dùng truy cập bộ nhớ kernel trực tiếp. SMEP (Supervisor Mode Execution Protection) là một tính năng của hệ điều hành Linux để ngăn chặn các ứng dụng với chế độ người dùng thực thi mã trong không gian bộ nhớ của hệ điều hành. Đây là một biện pháp bảo mật quan trọng giúp ngăn chặn mã độc điều khiển hệ điều hành và có thể gây hại cho hệ thống.
ASLR (Address Space Layout Randomization) là một tính năng bảo mật của Linux kernel nhằm ngẫu nhiên hóa các địa chỉ bộ nhớ được sử dụng bởi một số phần quan trọng nhất định của hệ điều hành, chẳng hạn như chính kernel và các thư viện dùng chung. Điều này khiến kẻ tấn công khó dự đoán vị trí của mã hoặc dữ liệu cụ thể trong bộ nhớ giúp ngăn chặn chúng khai thác thành công các lỗ hổng trong hệ thống. ASLR là một công cụ quan trọng để chống lại phần mềm độc hại và các mối đe dọa bảo mật khác. KASLR có chức năng giống với ASLR, làm ngẫu nhiên hóa các địa chỉ bộ nhớ của kernel.
SUID (set user ID upon execution) là một tùy chọn trong Linux, nó cho phép một tệp tin có thể được chạy với quyền của người dùng khác so với người dùng đang chạy nó. Ví dụ, nếu một tệp tin có SUID được đặt thành root, khi người khác chạy nó, tệp tin sẽ được chạy với quyền root và cho phép nó thực hiện các hành động có đặc quyền cao hơn so với người dùng bình thường. Tuy nhiên, sử dụng SUID có thể gây nguy hiểm cho bảo mật hệ thống nếu không được sử dụng một cách cẩn thận.1 Giới thiệu về container Container là một giải pháp nhằm đóng gói phần mềm và tất cả các thành phần liên quan (thư viện lập trình, cấu hình tham số,. ) nhằm cô lập và quản lý truy cập vào tài nguyên hệ thống.
Sự khác biệt giữa triển khai theo cách truyền thống và theo container được thể hiện ở Hình 2.2: So sánh kiến trúc truyền thống với container Hiệu suất làm việc là một điểm mạnh của container khi so sánh với những công nghệ truyền thống. Trước khi có container, việc triển khai ứng dụng lên môi trường vận hành (production) phải đi kèm với các thư viện, tệp tin cấu hình và các thành phần liên quan. Điều này không ảnh hưởng nhiều tới doanh nghiệp vì khi đó mọi người vẫn theo các mô hình phát triển phần mềm waterfall1. Tuy nhiên, trong vài năm trở lại đây, khi các công ty bắt đầu hướng tới việc sử dụng micro services2 cho các phần mềm của mình thì mô hình truyền thống đã bắt đầu hạn chế và không còn phù hợp, đặc biệt là các công ty đang sử dụng mô hình phát triển Scrum3.
Hạn chế cần phải đề cập đến chính là thời gian downtime khi cập nhật một phiên bản mới vì sẽ phải đồng bộ tất cả các thư viện, tệp tin cấu hình,. với nhau mới có thể hoạt động bình thường. Sau khi container ra đời, nó đã giải quyết các khó khăn sau đây cho doanh nghiệp: • Tự động hóa: Container giúp tự động hoá việc triển khai lên môi trường vận hành tiện lợi và nhanh chóng. • Dễ dàng cập nhật: Dễ dàng cập nhật các phiên bản mới mà không bị Downtime.
• Low Hardware Footprint: Sử dụng những tính năng của hệ điều hành như cgroups, namespaces để tạo ra môi trường độc lập, giảm thiểu thời gian overhead của bộ xử lý trung tâm (CPU) và bộ nhớ.org/software-engineering-classical-waterfall-model/ 2 Microservice là một kiểu kiến trúc phần mềm, trong đó một hệ thống phần mềm được xây dựng bằng cách sử dụng nhiều dịch vụ nhỏ và độc lập, mỗi dịch vụ chỉ có một mục đích rõ ràng.org/ 8 • Triển khai nhanh chóng và có thể tải sử dụng: Container được triển khai nhanh chóng vì nó không cần phải cài đặt toàn bộ dựa trên hệ điều hành. Chúng được xây dựng dựa trên các container images. Người dùng có thể sử dụng ảnh này nhiều theo nhu cầu của mình.