3.2 Phân tích các vấn đề an ninh trong Openstack và đưa ra giải pháp,
3.2.4 Cô lập dữ liệu
Theo chương 2, chúng ta sử dụng mã hóa MD5 để mã hóa đường dẫn logical của Object, sau đó dựa vào phương pháp dịch bit để có được thông tin về partion sẽ được lưu Object đó thông qua vòng Ring.
Với mã hóa hoàn hảo thì với mọi đường dẫn sẽ được mã hóa cho ra một giá trị tuyệt đối không trùng lặp với các giá trị khác. Tuy nhiên với mã hóa MD5 sử dụng 16 bytes và độ dài giá trị mà tùy ý. Do đó không có gì đảm bảo rằng có hai đường dẫn khác nhau và có một giá trị hash sau khi mã hóa.
57
1. Tài khoản A tải lên FileA trong containerA 2. Tài khoản B tải lên FileB trong containeB
3. Tài khoản B tải xuống fileB nhưng nhận được fileA
Việc trên xảy ra khi chức năng mã hóa MD5 đã cho ra 1 giá trị trong khi mã hóa 2 đường dẫn khác nhau.
1. Khi server được yêu cầu lưu trữ fileA trước tiên nó kiểm tra thông tin đăng nhập userA. Sau khi xác nhận rằng UserA có quyền tải file lên ContainerA. Nó cho phép tải lên
2. Sau đó, chức năng mã hóa sẽ mã hóa đường dẫn /accountA/containerA/FileA.
3. Dựa vào phép dịch bit số thứ tự của partion sẽ được tính.Khi đó đường dẫn vậy lý của ObjectA là Object/Bit arithmetic/def/hash code.
4. AccountB tài lên cũng tương tự như AccountB. Do giá trị mã hóa giống nhau lên số partion cũng giống nhau, dẫn đến đường dẫn vật lý giống nhau. Và theo như quy định, Object có timedate cũ hơn sẽ bị xóa.
5. Cuối cùng khi AccountA tải xuống fileA nó sẽ nhận được FileB thay vì fileA như ban đầu.
Các nhà phát triển đã nhận ra được các mối đe dọa này nếu người tấn công tìm ra được các đường dẫn mà mã MD5 mã hóa ra cùng giá trị thì sẽ tiến hanh tải file lên và do đó dữ liệu cũ của khách hàng khác sẽ bị xóa. Thực tế cho thấy khả năng mã hóa MD5 cho ra cùng giá trị với các đầu vào khác nhau là 0.1% [11] tuy nhiên với các công ty lớn như Gmail thì một ngày có rất nhiều email được gửi đó. Do đó khả năng của 0.1% là rất lớn.
Thêm nữa là chức năng hash của Openstack dễ dàng được tìm thấy trong tệp cấu hình ở đường dẫn sau:
58
Hình 41 Cấu hình mã hóa MD5
Dựa vào hình 40 chúng ta thấy Keystone đã sử dụng đường dẫn cho các Container, Object… và giá trị Hash_Path_Suffix để tránh lỗi hổng MD5 có thể bị khai khác.
Chúng ta thử nghiệm việc thay đổi cách mã hóa MD5 này thì hệ thống không thể truy cập được vào các Container.
Hình 42 Trước khi thay đổi chức năng Md5
Sau khi thay đổi chức năng MD5 thì Openstack đã không thể kiểm tra được thư mục được tạo trước đó.
Hình 43 Sau khi thay đổi chức năng MD5
Để ngăn chặn việc này chúng ta thêm một giá trị khác vào đường dẫn logical của Object trước khi đem đi mã hóa gọi là Hash_Path_Prefix. Cho dù một người tấn
59
công có thể dò ra được các đường dẫn có giá trị mã hóa giống nhau, tuy nhiên Openstack lại thêm của Hash_Path_Prefix nên giá trị mã hóa lúc đó sẽ khác nhau. Bởi vì người tấn công không thể biết được Hash_Path_Prefix
Hình 44 Giá trị Hash_Path_Prefix trong tệp cấu hình
Việc tiếp theo đó chính là Hash_Path_Prefix cần được bí mật. Tuy nhiên thông số này hiện đang được cấu hình trong tệp đính kèm và có thể đọc dưới dạng ký tự nên có khả năng bị tấn công.
Trong việc phân tích vấn đề này chúng ta đưa ra các khuyến nghị sau:
Người quản trị hệ thống phải đảm bảo rằng tệp cấu hình /etc/swift/swift.config phải được bảo vệ trước việc thay đổi nội dung. Kèm theo đó một bản sao lưu cũng được lưu ý tới. T Nếu giá trị Hash_Path_Prefix mà bị thay đổi thì các dữ liệu được tải lên Openstack Object trước đó sẽ không thể truy cập, lúc đó nếu chúng ta có bản sao lưu của Hash_Path_prefix thì mới có thể khôi phục được dữ liệu.