Giới thiệu
Trong bài viết trước, tôi đã giới thiệu về hành trình của mình trong Google Summer of Code (GSoC), từ giai đoạn chuẩn bị, ý tưởng, đến khi hoàn thành dự án. Bài viết này sẽ đi sâu vào các khía cạnh kỹ thuật của dự án mà tôi đã thực hiện. Nếu bạn quan tâm đến hệ điều hành, kernel, quản lý bộ nhớ và các vấn đề liên quan, hãy theo dõi tiếp.
Tổng quan về dự án
Tôi đã hoàn thành GSoC’25 tại Dự án FreeBSD. FreeBSD là một hệ điều hành tương tự Unix, nổi tiếng với độ ổn định, hiệu suất và bảo mật. Dự án của tôi bao gồm hai phần cải tiến: cải tiến mac_do(4) và mdo(1).
Cải tiến mac_do(4)
mac_do(4) là một mô-đun bảo mật kernel cho phép thay đổi thông tin danh tính của tiến trình một cách có kiểm soát. Tôi đã đặt ra hai mục tiêu chính cho mô-đun này:
- Hỗ trợ danh sách các ứng dụng được phép yêu cầu thay đổi thông tin danh tính.
- Hỗ trợ các cuộc gọi hệ thống truyền thống như
setuid(2),setgid(2).
Mục tiêu 1: Danh sách cấu hình theo từng jail
Một nhược điểm lớn của mac_do(4) là nó được cài đặt cứng để chỉ cho phép các tiến trình từ /usr/bin/mdo. Để khắc phục điều này, tôi đã tạo ra một cấu trúc mới cho phép lưu trữ và quản lý cả quy tắc và đường dẫn ứng dụng:
c
struct exec_paths {
char exec_paths_str[EXEC_PATHS_MAXLEN];
char exec_paths[MAX_EXEC_PATHS][PATH_MAX];
int exec_path_count;
};
struct conf {
struct rules rules;
struct exec_paths exec_paths;
volatile u_int use_count __aligned(CACHE_LINE_SIZE);
};
Thiết kế này giúp duy trì khả năng quản lý và cập nhật đồng bộ cho cả quy tắc và đường dẫn ứng dụng. Điều này cho phép quản trị viên cấu hình các đường dẫn ứng dụng theo từng jail.
Mục tiêu 2: Hỗ trợ các cuộc gọi hệ thống truyền thống
Một nhược điểm nữa của mac_do(4) là chỉ cho phép thay đổi thông tin danh tính thông qua setcred(2) mà không hỗ trợ các cuộc gọi hệ thống như setuid(2). Để giải quyết vấn đề này, tôi đã mở rộng mac_do(4) để bao gồm các cuộc gọi này.
c
static int
mac_do_priv_grant(struct ucred *cred, int priv) {
switch (priv) {
case PRIV_CRED_SETUID:
// Logic kiểm tra quyền
break;
// Các trường hợp khác...
}
}
Nhờ vào việc mở rộng này, các ứng dụng có thể thay đổi thông tin danh tính mà không cần thiết phải sử dụng bit setuid.
Cải tiến mdo(1)
mdo(1) là công cụ giao diện người dùng cho mac_do(4) để thay đổi thông tin danh tính. Tôi đã cải tiến mdo(1) để hỗ trợ:
- Đặt nhóm chính và danh sách nhóm phụ.
- In ra các quy tắc tương ứng với yêu cầu chuyển đổi.
Mục tiêu 1: Quản lý thông tin danh tính chi tiết
Phiên bản cải tiến của mdo(1) giờ đây hỗ trợ nhiều tùy chọn hơn cho việc kiểm soát thông tin danh tính:
bash
mdo -u bob -g wheel -G staff,operator /bin/sh
Mục tiêu 2: In ra quy tắc
c
if (print_rule) {
fprintf(stdout, "uid=%u,gid=%u,", wcred.sc_uid, wcred.sc_gid);
exit(0);
}
Kết luận
Tôi đã cố gắng đưa ra nhiều chi tiết kỹ thuật trong bài viết này, nhưng thực tế dự án phức tạp hơn rất nhiều so với những gì tôi có thể trình bày. Từ những lần kernel gặp sự cố, đến việc khắc phục các lỗi, mỗi vấn đề mà tôi giải quyết lại mở ra thêm nhiều kiến thức mới. Hành trình Google Summer of Code của tôi đến đây là kết thúc. Hy vọng bạn đã thích bài viết này!
Hỏi & Đáp
Câu hỏi 1: Tôi có thể tham gia GSoC không?
Có, bất kỳ ai cũng có thể tham gia GSoC nếu đáp ứng các yêu cầu của tổ chức.
Câu hỏi 2: Làm thế nào để chuẩn bị cho GSoC?
Hãy tham gia vào các dự án mã nguồn mở, tìm hiểu về công nghệ và lập kế hoạch cho dự án của bạn.
Câu hỏi 3: Tôi có thể tìm hiểu thêm ở đâu?
Bạn có thể tham khảo tài liệu của FreeBSD và các dự án mã nguồn mở khác để nâng cao kiến thức.
Mẹo tốt nhất
Hãy luôn tìm kiếm sự hỗ trợ từ cộng đồng và tham gia vào các cuộc thảo luận để cải thiện kỹ năng của bạn.