Bài giảng Lập trình an toàn - Chương 2: Kiểm soát truy nhập trình bày các nội dung: Cơ chế kiểm soát truy nhập trên Unix/Linux, cơ chế kiểm soát truy nhập trên Windows, hạ thấp quyền truy nhập của tiến trình, xóa file an toàn, hạn chế quyền truy nhập trên file, khóa file, tạo file tạm, hạn chế truy nhập hệ thống file. Mời các bạn cùng tham khảo.
Chương 2 Kiểm soát truy nhập Access Control Lương Ánh Hoàng hoangla@soict.hut.edu.vn Nội dung 2.1 Cơ chế kiểm soát truy nhập trên Unix/Linux 2.2 Cơ chế kiểm soát truy nhập trên Windows 2.3 Hạ thấp quyền truy nhập của tiến trình 2.4 Xóa }ile an tồn 2.5 Hạn chế quyền truy nhập trên }ile 2.6 Khóa }ile 2.7 Tạo }ile tạm 2.8 Hạn chế truy nhập đến hệ thống }ile 30 2.1 Cơ chế kiểm sốt truy nhập trên Unix/ Linux • Trên Unix/Linux tất cả các tài nguyên đều được coi là }ile: tệp tin, ổ đĩa, nhớ, thiết bị… • Mỗi }ile kiểm sốt bởi user id và group id • Mỗi tiến trình có ba quyền: effective user id, real user id, saved user id Effective user id được sử dụng trong phần lớn các kiểm tra • Mỗi tiến trình cũng thuộc về ba nhóm: effective group id, real group id, saved group id • Có ba loại quyền • Đọc (read) • Ghi (write) • Thực thi (execute) 31 2.1 Cơ chế kiểm soát truy nhập trên Unix/ Linux • Mỗi }ile sẽ có ba nhóm quyền tương ứng với: user id, group id, và other -‐rwxr-‐xr-‐x 1 Luong Anh Hoang None 17964 Aug 28 23:45 test.exe • Khi tiến trình tạo một }ile hoặc tài nguyên, hệ thống sẽ gán user id và group id cho }ile mới đó bằng effective user id và effective group id của tiến trình • Khi tiến trình truy nhập một }ile hoặc tài nguyên, hệ thống sẽ lần lượt so sánh user id, group id của tiến trình và }ile và chọn ra tập quyền tương ứng Nếu khơng khớp thì lớp quyền thứ 3 sẽ được sử dụng 32 2.1 Cơ chế kiểm soát truy nhập trên Unix/ Linux • Mỗi }ile cũng có thể có 3 bit đặc biệt • Sticky Nếu bit này được thiết lập, người dùng sẽ khơng thể xóa hay đổi tên }ile của người khác nằm trong thưc mục mà người dùng quản lý Mặc định khơng được thiết lập • Setuid: Bit này liên quan đến quá trình tạo một tiến trình mới Nếu bit này thiết lập, tiến trình được tạo từ }ile này sẽ khơng kế thừa quyền từ tiến trình cha, mà sẽ có quyền từ user id của chính }ile đó • Setgid: • Đối với }ile thực thi, nếu bit này được thiết lập thì một tiến trình mới tạo sẽ có quyền từ groupd id của }ile đó chứ khơng kế thừa từ tiến trình cha (tương tự Setuid) • Đối với thưc mục, nếu bit này được thiết lập thì các }ile tạo trong thư mục này sẽ có groupd id của thư mục cha, chứ không kế thừa từ tiến trình tạo ra }ile đó 33 2.2 Cơ chế kiểm soát truy nhập trên Windows • Windows sử dụng ACL: Access Control List để phân quyền tài nguyên • Các tài nguyên của Windows: }ile, registry, mutex, event, IPC… kiểm sốt thơng qua DACL và SACL • DACL là danh sách các ACE, mỗi ACE là một luật quy định một quyền hạn cụ thể • DACL rỗng tương đương với việc tất cả mọi người có tồn quyền truy nhập tới đối tượng • Mỗi ACE bao gồm 3 thơng tin: • SID: Đại diện cho một user hay một group trong hệ thống • Quyền truy nhập • Giá trị boolean tương ứng với cho phép hay không cho phép 34 2.2 Cơ chế kiểm soát truy nhập trên Windows • Các quyền truy nhập TÊN Diễn giải DELETE The ability to delete the object READ_CONTROL The ability to read the object's security descriptor, not including its SACL SYNCHRONIZE The ability for a thread to wait for the object to be put into the signaled state; not all objects support this functionality WRITE_DAC The ability to modify the object's DACL WRITE_OWNER The ability to set the object's owner GENERIC_READ The ability to read from or query the object GENERIC_WRITE The ability to write to or modify the object GENERIC_EXECUTE The ability to execute the object (applies primarily to }iles) GENERIC_ALL Full control 35 2.2 Cơ chế kiểm soát truy nhập trên Windows • Ví dụ ACE • DENY GENERIC_ALL Everyone: Cấm mọi quyền với group Everyone • ALLOW GENERIC_WRITE Marketing: Cho phép nhóm group Marketing quyền ghi • Mỗi đối tượng đều có một Owner, chính là người tạo ra đối tượng • Owner có tồn quyền với đối tượng bất kể trong DACL có cấm hay khơng • Owner có thể bị chiếm bởi user khác 36 2.3 Hạ thấp quyền truy nhập của tiến trình • Nếu một tiến trình có đặc quyền cao, thực hiện các thao tác nguy hiểm => cần hạ thấp quyền trước khi thực hiện • Tiến trình có thể kiểm tra real user id, real group id bằng lệnh getuid (), getgid() Đây là các đặc quyền kế thừa từ tiến trình cha • Tiến trình có thể kiểm tra effective user id và effective group id bằng lệnh geteuid() và getegid() Đây thường là user id có đặc quyền cao (do được khởi chạy từ super user, hoặc các bit setuid được bật) • Tiến trình từ bỏ đặc quyền bằng việc thiết lập group mới chính là real user id qua lệnh • setgroups(): Thiết lập lại nhóm của tiến trình • setegid(): Thiết lập lại effective group id của tiến trình • seteuid(): Thiết lập lại effective user id của tiến trình 37 2.4 Xóa qile an tồn • Thơng thường, một }ile sau khi xóa sẽ được hệ điều hành đánh dấu là xóa, nội dung chưa hồn tồn bị loại bỏ trên đĩa • Giải pháp • • • • Ghi đè thơng tin khác nhiều lần lên đĩa Ghi đè dữ liệu ngâu nhiên nhiều lần lên đĩa Ghi đè sử dụng mẫu định sẵn lên đĩa Sau mỗi chu kỳ ghi, sử dụng fsync để đồng bộ với đĩa, vơ hiệu hóa cơ chế cache Hoặc lệnh f}lush() nếu sử dụng thư viện C • Một vài mẫu được sử dụng • static unsigned char single_pats[16] = { 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff }; • static unsigned char triple_pats[6][3] = { { 0x92, 0x49, 0x24 }, { 0x49, 0x24, 0x92 }, { 0x24, 0x92, 0x49 }, { 0x6d, 0xb6, 0xdb }, { 0xb6, 0xdb, 0x6d }, { 0xdb, 0x6d, 0xb6 } }; 38 2.5 Hạn chế quyền truy nhập trên qile • Unix/Linux sử dụng umask cho mỗi tiến trình để vơ hiệu hóa một vài bit khi tiến trình tạo }ile • Hàm fopen, open ln ln tạo }ile với quyền 666 • Giả sử tiến trình muốn tạo }ile với quyền 666: requested_permissions = 0666; actual_permissions = requested_permissions & ~umask( ); • Ứng dụng thay đổi umask bằng hàm umask() trước khi thực hiện lời gọi tạo }ile #include #include mode_t umask(mode_t mask); 39 2.6 Khóa qile • Tiến trình muốn kiểm soát truy nhập trên một phần của }ile hay toàn }ile để tránh xung đột khi có nhiều tiến trình cùng truy nhập trên }ile • Unix/Linux cung cấp cơ chế khóa mềm: Mọi tiến trình đều có quyền giành được khóa và thao tác trên }ile, tuy nhiên khơng phải tiến trình cũng tn thủ theo khóa và có thể phá hỏng dữ liệu của tiến trình khác • Windows thực hiện vấn đề này tốt hơn bằng khóa cứng Có hai loại khóa: • Shared Lock: Cho phép các tiến trình khác (kể cả tiến trình giành được khóa) đọc nhưng khơng được ghi vào một phần đã khóa của }ile • Exclusive Lock : Cấm tất cả các tiến trình khác khơng được đọc hay ghi vào phần đã khóa của }ile Tiến trình giành được khóa có quyền đọc hoặc ghi vào }ile 40 2.6 Khóa qile • Các hàm khóa }ile trên Windows • LockFile, UnlockFile: Khóa và mở khóa đồng bộ, sẽ không trở về đến khi giành được khóa hoặc mở được khóa • LockFileEx, UnlockFileEx: Khóa và mở khóa đồng bộ hoặc bất đồng bộ • Khóa }ile cũng có thể xác định lúc tạo lập/truy nhập }ile thông qua hàm CreateFile • Đoạn chương trình sau sẽ mở một }ile để đọc với chế độ Shared Lock char buff[1024]; DWORD bytesRead = 0; HANDLE fileHandle = NULL; fileHandle = CreateFile(L"C:\\SecureProgramming\\Test.txt", GENERIC_READ|GENERIC_WRITE, FILE_SHARE_READ|FILE_SHARE_WRITE, 0, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0); 41 2.6 Khóa qile • VD (tiếp) ReadFile(fileHandle,buff,128,&bytesRead,0); buff[bytesRead] = 0; printf("File content:%s\n",buff); LockFile(fileHandle,0,0,100,0); // Exclusive Lock printf("File is locked, press any key to unlock \n"); getch(); UnlockFile(fileHandle,0,0,100,0); printf("File is unlocked\n"); getch(); CloseHandle(fileHandle); 42 2.7 Tạo qile tạm • Ứng dụng tạo }ile tạm để lưu trữ thông tin tạm thời của chương trình • File tạm nên được tạo lập một cách an tồn, và xóa khi kết thúc chương trình • Trên unix/linux: • Hàm mkstemp() có thể sử dụng để tạo }ile tạm với tên ngẫu nhiên • Ứng dụng cần xóa }ile theo tên, ngay sau lời gọi mkstemp để đảm bảo khơng tiến trình nào truy nhập được • Sau khi tiến trình kết thúc một cách bình thường/khơng bình thường, }ile tạm sẽ khơng thể truy nhập được nữa • VD char szPath[] = “fileXXXXXX"; int fd; fd = mkstemp(szPath); unlink(szPath); printf("Temperary file created, press any key to continue "); write(fd,"Hello",5); close(fd); 43 2.7 Tạo qile tạm • Trên Windows: Khơng có hàm tương đương mkstemp() GetTempFileName() sinh tên }ile ngẫu nhiên nhưng dễ đoán GetTempPath() lấy đường dẫn đến thư mục tạm của người dùng hiện tại Tạo }ile bằng hàm CreateFile với hai thuộc tính FILE_ATTRIBUTE_TEMPORARY và FILE_FLAG_DELETE_ON_CLOSE • VD HANDLE }ileHandle = NULL; }ileHandle = CreateFile(L"C:\\SecureProgramming\\Tmp.txt", GENERIC_READ|GENERIC_WRITE, FILE_SHARE_READ|FILE_SHARE_WRITE, 0, OPEN_ALWAYS, FILE_ATTRIBUTE_TEMPORARY| FILE_FLAG_DELETE_ON_CLOSE, 0); 44 • • • • 2.8 Hạn chế truy nhập đến hệ thống qile • Trên Unix/Linux, ứng dụng có thể tự giới hạn phạm vi truy nhập hệ thống tệp tin của mình bằng lệnh chroot() • Sau khi gọi chroot(): • Tiến trình không thể mở rộng phạm vi truy nhập bằng lệnh chroot lần nữa • Tiến trình chỉ có thể thu hẹp hơn nữa phạm vi truy nhập của mình • Tiến trình phải chủ động gọi thêm chdir() để lệnh chroot có hiệu lực • VD: #include chroot("/new/root/directory"); chdir("/"); 45 ... 2. 1 Cơ chế kiểm soát truy nhập trên Unix/Linux 2. 2 Cơ chế kiểm soát truy nhập trên Windows 2. 3 Hạ thấp quyền truy nhập của tiến ? ?trình 2. 4 Xóa }ile ? ?an tồn 2. 5... 2. 1 Cơ chế kiểm soát truy nhập trên Unix/ Linux • Mỗi }ile sẽ có ba nhóm quyền tương ứng với: user id, group id, và other -? ?‐rwxr-‐xr-‐x 1 Luong Anh Hoang... Mặc định không được thiết ? ?lập • Setuid: Bit này liên quan đến quá ? ?trình tạo một tiến ? ?trình mới Nếu bit này thiết ? ?lập, tiến ? ?trình được tạo từ }ile này sẽ