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 toà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 soá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,
bộ nhớ, thiết bị….
• Mỗi }ile kiểm soá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,
31
saved group id. • Có ba loại quyền • Đọc (read) • Ghi (write) • Thực thi (execute)
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
17964
None
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.
32
• 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.
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 là 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 được 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 được 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…
được kiểm soá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ó toà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
được 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ó toà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 hơn (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
37
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.
2.4 Xóa qile an toà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 hoàn toàn bị loại bỏ trên đĩa.
• 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.
• Giải pháp
• 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
• Một vài mẫu được sử dụng
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 luôn luôn 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
umask(mode_t
mask);
39
gọi
tạo
}ile.
#include
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 bộ }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 nào cũng tuân 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) đọ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
khóa: • Shared Lock: Cho phép các tiến trình khác (kể cả tiến trình giành được
2.6 Khóa qile
• 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
• Các hàm khóa }ile trên Windows
CreateFile.
• Đoạn chương trình sau sẽ mở một }ile để đọc với chế độ Shared Lock.
buff[1024];
GENERIC_READ|GENERIC_WRITE, FILE_SHARE_READ|FILE_SHARE_WRITE, 0, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);
41
char DWORD bytesRead = 0; HANDLE fileHandle = NULL; fileHandle = CreateFile(L"C:\\SecureProgramming\\Test.txt",
2.6 Khóa qile
• VD (tiếp)
42
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);
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 toàn, và xóa khi kết thúc chương
trình.
• 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
• Trên unix/linux:
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
• 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,
0);
FILE_ATTRIBUTE_TEMPORARY| FILE_FLAG_DELETE_ON_CLOSE,
44
• Trên Windows:
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()
• 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:
• Sau khi gọi chroot():
#include
chroot("/new/root/directory");
chdir("/");
45