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("/");

pdf17 trang | Chia sẻ: huongthu9 | Lượt xem: 452 | Lượt tải: 0download
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:

  • pdfgiao_trinh_lap_trinh_an_toan_chuong_2_kiem_soat_truy_nhap_lu.pdf