Giáo trình Lập trình An toàn - Chương 2: Kiểm soát truy nhập - Lương Ánh Hoàng
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("/");
17 trang |
Chia sẻ: huongthu9 | Lượt xem: 465 | Lượt tải: 0
Bạn đang xem nội dung tài liệu Giáo trình Lập trình An toàn - Chương 2: Kiểm soát truy nhập - Lương Ánh Hoàng, để tải tài liệu về máy bạn click vào nút DOWNLOAD ở trên
Lương
Ánh
Hoàng
hoangla@soict.hut.edu.vn
Chương
2.
Kiểm
soát
truy
nhập
Access
Control
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
Nội
dung
30
• 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,
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
31
• 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.
2.1
Cơ
chế
kiểm
soát
truy
nhập
trên
Unix/
Linux
32
• 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
đó.
2.1
Cơ
chế
kiểm
soát
truy
nhập
trên
Unix/
Linux
33
• 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.
2.2
Cơ
chế
kiểm
soát
truy
nhập
trên
Windows
34
• Các
quyền
truy
nhập
2.2
Cơ
chế
kiểm
soát
truy
nhập
trên
Windows
35
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
• 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.
2.2
Cơ
chế
kiểm
soát
truy
nhập
trên
Windows
36
• 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
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.3
Hạ
thấp
quyền
truy
nhập
của
tiến
trình
37
• 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.
• 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
}
};
2.4
Xóa
qile
an
toàn
38
• 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
gọi
tạo
}ile.
#include
#include
mode_t
umask(mode_t
mask);
2.5
Hạn
chế
quyền
truy
nhập
trên
qile
39
• 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:
• 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.
2.6
Khóa
qile
40
• 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);
2.6
Khóa
qile
41
• 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);
2.6
Khóa
qile
42
• Ứ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.
• 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);
2.7
Tạo
qile
tạm
43
• 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);
2.7
Tạo
qile
tạm
44
• 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("/");
2.8
Hạn
chế
truy
nhập
đến
hệ
thống
qile
45
Các file đính kèm theo tài liệu này:
- giao_trinh_lap_trinh_an_toan_chuong_2_kiem_soat_truy_nhap_lu.pdf