Quá tr nh lấy dữ liệu được mô tả như h nh sau đây.
30
Người dùng của Openstack Object Storage sẽ lấy dữ liệu của h thông qua HTTP Call tới một Server Proxy bởi đưa ra một đường dẫn logic tới một thực thể. Thực thể ở đây có thể là Object, Container hay Account. Một đường dẫn vật lý sẽ bao gồm URL lưu trữ mà người dùng lấy được t một Server xác thực. Dưới đây là định dạng cho đường dẫn logical của một Object là myObject được lưu trong Container myContainer
https://<PublicURL>:8080/v1/AUTH_e6595be640324be4abf5c4faa6cdc524
/ myContainer/myObject
Server Proxy có nhiệm vụ chuyển đổi đường dẫn logic tới vị trí vật lý nơi mà dữ liệu được nằm trong các Clusters. Để t m ra nơi trong Cluster dữ liệu sẽ được lưu ch ng ra sử dụng Rings[30]. Toàn bộ Cluster được chia làm nhiều các partition và m i partition được ánh xạ tới một thiết bị. Thiết bị có thể là ổ đĩa cứng Cluster. M i một partition được nhân lên trong Cluster. Và cấu tr c vòng Ring để tính toán node nào được sử dụng, Partition nào sẽ lưu dữ liệu.
Một khi Server proxy có được vị trí vật lý của thực thể, nó sẽ liên lạc với các tác vụ tương ứng trong node Storage. Dưới đây là m cho thấy đường dẫn vật lý của thực thể myObject
https://<STORAGE−NODE−IP>:6000/sdb1/99721/AUTH_e6595be640324 be4abf5c4faa6cdc524/myContainer/myObject
Trong phần trước luận văn phân tích phương thức tính toán vị trí dữ liệu cho các thực thể Openstack. Dưới đây là thông tin được thu thập thông qua các tài liệu về Rings và m nguồn. Với m i thực thể, dù cho tài khoản của nó, Container hay Object là khác nhau nhưng được tạo với chung một cách sau:
1. Một đường dẫn tới thực thể được tạo bởi sử dụng sự tương quan của tài khoản, Container và Object và được phân tách với dấu “/”. Ví dụ:
Https://PROXY−IP>:8080/v1/AUTH_e6595be640324be4abf5c4faa6cdc524/ myContainer/myObject
31
2. Đường dẫn được tạo ra ở bước 1 sẽ được n i với Hash_Path_Suffix, đó là một giá trị bí mật trong tệp cấu h nh.
3. Chức năng m hóa MD5 sẽ tính toán với giá trị bên trên.
4. Dựa vào giá trị Hash, s parititon cho một thực thể sẽ được tính toán bởi sử dụng phép dịch bit.
5. Dựa vào s partition, danh sách các node được tính toán t tệp Ring. M i node sẽ có các bản sao chép thực thể chung.
6. Vị trí của thực thể sẽ như sau:
File://node/entity/partition/last_three_symbols_of_- hash/hash
trong đó entity có thể là Accounts, Containers hay Object tùy thuộc vào thực thể được lưu
2.3.2 Sao lưu và phục hồi
CSA ch ra rằng sao lưu dữ liệu là một cơ chế cho phép sự ngăn chặn việc mất mát dữ liệu, việc ghi đ không mong mu n và sự phá hủy. Và c ng thông báo người dùng rằng dữ liệu trên mây được sao lưu và có thể phục hồi.
Để ngăn chặn việc mất mát dữ liệu và phá hủy c ng như việc tăng khả năng đáp ứng của dữ liệu, Openstack Object Storage lưu trữ dữ liệu trong các vị trí trên toàn cluster. Một tiến tr nh riêng cho việc này đó là Replicator được chạy trên node để truyển các bản copy dữ liệu đến các node khác nhau. Có các tiến tr nh riêng cho việc nhân rộng tài khoản, object và container.
Một vấn đề với Openstack đó là sao lưu và phục hồi không được h trợ. Khi tải lên một object mới có cùng tên với một file đ tải lên trước đó th các tệp c sẽ được xóa b đi cho dù quá tr nh nhân lên các bản sao để phòng tránh việc mất dữ liệu nhưng không thể phòng tránh việc ghi đ dữ liệu.
Với ý kiến của luận văn, ch ng ta có thể thêm được việc sao lưu, phụ hồi dữ liệu dễ dàng bằng việc sửa m nguồn. Như đ biết th khi tải tệp lên nó sẽ được đánh dấu thêm bằng dấu thời gian. Các dấu thời gian c hơn sẽ bị xóa đi khi tệp có dấu thời gian mới. Bằng việc sửa m nguồn ta có thể cấu h nh giữa lại N bản sao của tệp. Ý kiến này đ được thảo luận với các nhà phát triển Openstack [31]. H
32
phản hồi rằng sự áp dụng việc này có thể ảnh hướng đến sự phân ph i dữ diệu và cần sửa rồi cấu tr c của Ring [31].
2.3.3 Xóa dữ liệu
Liên quan đến điện toán đám mây th vấn đề xóa dữ liệu liên quan đến việc phải thận tr ng trong việc xóa hết các bản sao của dữ liệu rằng tồn tại trong cluster. Nó có thể sảy ra khi dữ liệu đ xóa đi tất cả tuy nhiên sẽ được phụ hồi lại nếu có l i trong quá tr nh xóa một bản sao nào đó. Để phân tích việc xóa dữ liệu ch ng ra sẽ t m hiểu cách mà dữ liệu được tải lên trước. Bởi t m hiểu m nguồn luận văn thấy rằng trước tiên tệp được viết vào một vị trí tạm trên thiết bị lưu trữ, mặc đ nh là:
/srv/node/sdb1/tmp. Thư mục tạm này là chung cho tất cả khách hàng trong hệ th ng. Sau đó, khi tất cả các tệp được tải lên th sẽ được di chuyển tới vị trí mới với tên tệp mới bằng với dấu thời gian được ch định trong HTTP Header X-Timestamp
Sử dụng dấu thời gian cho tệp sẽ cho phép việc kiểm tra các phiên bản c hơn của tệp. Khi tệp được chuyển sang vị trí mới t thư mục tạm, Openstack sẽ chạy một thuật toán để so sánh giữa các tên tệp và xác định tệp mới nhất. Tệp với dấu thời gian c hơn sẽ được xóa đi.
Khi người dùng quyết định xóa tệp đo, Openstack sẽ tạo một tệp r ng với phần mở rộng là *.ts (tombstone) [9] với dấu thời gian mới nhất. Sau đó một thuật toán sẽ xóa các tệp có dấu thời gian c hơn. Với việc sử dụng Tomstone th sẽ gây ảnh hướng đến việc nhân các Tomstone đến các node khác.
2.4 Kết Luận
Qua chương này ch ng ta đ đi sâu vào t ng vấn đề an ninh được ch n để phân tích. Đó là các vấn đề cấp thiết, cần phải được phân tích, kiểm thử ngay trước khi áp dụng Openstack và triển khai. Các vấn đề này c ng được các tài liệu của CSA, ENIST, NIST ch ra rằng cần phải có sự quan tâm đặc biệt. Dựa vào sự phân tích hoạt động của vấn đề an ninh đó trong dự án Object Storage, ch ng ta có được các vấn đề sẽ được phân tích, kiểm thử trên Openstack. Qua đó nghiên cứu các phương án xử lý, làm giảm thiểu ảnh hưởng và đưa ra các khuyến nghị cho Openstack.
33
Chương 3 Triển khai Openstack, phân tích các vấn đề an ninh
Trong chương này, ch ng ta phân tích các vấn đề an ninh thiết yếu ảnh hưởng và đưa ra các khuyến nghị cho Openstack trong việc triển khai. Các vấn đề đó đ được Openstack xử lý ra sao. Có bất ký vấn đề an ninh nào đang tồn tại hay không. Cùng với đó nghiên cứu đưa ra các giải pháp nhằm giảm bớt c ng như tránh các m i an ninh đó.
3.1 Triển khai Openstack 3.1.1 Thông tin Lab 3.1.1 Thông tin Lab
Cài đặt OpenStack Liberty trên Ubuntu Server 14.04, môi trường giả lập Vmware-Player
Các thành phần cài đặt trong OpenStack: Keystone, Glance, Nova (sử dụng KVM), Neutron, Horizon, Swift
Neutron sử dụng plugin ML2, GRE và use case cho mô h nh mạng là Per- teanant Per-Router
Máy ảo sử dụng 2 NICs. Eth0 dành cho Extenal, API, MGNT. Eth1 dành cho Internal.
Hình 3 Mô hình Openstack
3.1.2 Các bước thực hiện
Cài đặt Ubuntu Server trong môi trường Vmware player
34
Hình 4 Cấu h nh Ubuntu Server RAM 3GB
1st HDD (sda) 50Gb cài đặt Ubuntu server 12.04-4 2nd HDD (sdb) 5Gb làm volume cho CINDER 3rd HDD (sdc) 5Gb dùng cho cấu h nh SWIFT
NIC 1st: External - dùng chế độ Bridge - Dải IP 10.51.177.0/24 - Gateway 10.51.177.1
NIC 2nd : Inetnal VM - dùng chế độ Vmnet1 (Cài đặt trong Vmware Player trước khi cài Ubuntu - dải IP 172.16.1.0/24 )
35
Dựa vào h nh 5 ta có thể thấy được địa ch tương tác với Openstack là 10.51.177.26 và các mạng nội bộ giữa các Project con giao tiếp với nhau.
3.1.3 Cài đặt các thành phần Openstack
Cài đặt các gói bổ trợ như đồng bộ thời gian NTP, giao tiếp giữa các thành phần Openstack qua RabbitMQ, cấu h nh interface [Phục lục 2] Openstack sử dụng SQL cho việc lưu trữ cơ sở dữ liệu. Trong việc triển
khai này sẽ sử dụng MySQL. Cài đặt MYSQL, tạo DB cho Keystone, Glance, Nova, Neutron, Swift [Phụ lục 3]
Hình 6 Tạo các user
Hình 6 thể hiện các user cho các dịch vụ đ được tạo và lưu trong SQL server
36
Hình 7 Tạo các Databases
Hình 7 thể hiện các cơ sở dữ liệu trong SQL cho các project con của Openstack
Cài đặt Keystone, một Project có chức năng xác thực cho toàn bộ các thành phần của Openstack. Nó xác thực qua user/pass và cung cấp token cho user và các project để làm việc với nhau [Phụ lục 4]
Các thành phần của Openstack giao tiếp với nhau dựa trên các Endpoint URL. Mục này sẽ cài đặt các user, tenant, role cho các project [Phụ lục 5]
37
Hình 9 Tạo các tenants
Hình 10 Tạo các roles
Hình 8 thể hiện thông tin các user của các project con cùng các thông tin của nó như email, trạng thái. H nh 9 là thông tin về các tenant thuê để sử dụng các dịch vụ trên Openstack. Trong khi h nh 10 cho thấy quyền của người dùng trên Openstack mà người dùng sẽ được gán vào.
Dịch vụ Glance được dùng để lưu trữ, quản lý các image Cài đặt glance và cấu h nh [Phụ lục 6]
Hình 11 Các image được upload lên Glance
Trên hình 11 cho thấy các tệp tin ảnh máy ảo đang được Openstack quản lý và có thể dùng để khởi tạo máy ảo. Nó bao gồm các hệ điều hành phổ biến như Ubuntu, Centos, Windows server…
Thành phần Nova có nhiệm vụ tạo máy ảo, phân ph i, quản lý tài nguyên Cài đặt Nova và cấu h nh [Phụ lục 7]
38
Hình 12 Các thành phần của Nova
Nova gồm 5 thành phần với nhiệm vụ tạo máy ảo. Như thành phần nova- scheduler sẽ tổ chức, kiểm tra và phân ph i các nguồn tài nguyên RAM, CPU… nhằm cung cấp cho nova-compute và nova-conductor khởi tạo máy ảo. Nova- consleauth đảm nhiệm việc truy cập máy ảo thông qua console.
Cinder là thành phần cung cấp các Volume cho các máy ảo nhằm tăng tính tiện lợi c ng như linh hoạt
Cài đặt Cinder và cấu h nh [Phụ lục 8]
Hình 13 Danh sách các Block Storage trong Cinder
Hình 13 cho thấy Cinder đang cung cấp các volume nào, được gắn với máy ảo nào và trạng thái ra sao.
Neutron là project có nhiệm vụ cung cấp quản lý mạng cho các instant, tenant. Neutron có nhiều dạng, trong việc triển khai này sẽ sử dụng kiểu network per tenant
Cài đặt Openswitch, Neutron và cấu h nh [Phụ lục 9]
39
Neutron gồm 4 thành phần nhằm cung cấp cách dịch vụ liên quan đến mạng như cấp phát địa ch DHCP agent, cung cấp định tuyến Router là L3 agent… H nh 14 ch ra các dịch vụ k m theo trạng thái của t ng dịch vụ có hoạt động hay không.
Swift là project cho việc cung cấp dịch vụ lưu trữ Cài đặt Swift và cấu h nh [Phục lục 10]
Hình 15 Thông tin Swift
Hình 15 kiểm tra thông tin về Swift như s lượng Container, s lượng Object trên tài khoản đang truy cập
Hoziron là project cung cấp Dashboard để người dùng có thể cấu h nh, quản lý instance… Horizon là project dựa trên Django
Cài đặt Horizon và cấu h nh [Phụ lục 11]
3.1.4 Sử dụng Openstack và chạy các dịch vụ
Đăng nhập vào Horizon qua địa ch 10.51.177.190
Hình 16 Đăng nhập vào Horizon Upload image qcow2 của Centos 7 lên Glance
40
Hình 17 Upload image lên Glance Tạo mạng ngoài Admin với dải 10.51.177.0/24
Hình 18 Thông tin mạng ngoài EXT
41
Hình 19 Thông tin mạng trong INT
Tạo Router và gắn Default Gateway là mạng ngoài và Interfaces là mạng trong của tenant CustomerA
42 Hình 21 Topolopy mạng
Hình 21 là một sơ đồ mạng của 1 công ty sử dụng dịch vụ với 2 máy ảo Tạo instance Windows XP gắn mạng trong và ch n Default Rules,
chờ đợi Openstack scheduling và swaming để khởi tạo. Gắn địa ch IP ngoài cho instance
Hình 22 Cấu h nh Instance
Cấu h nh Rules mở cổng để SSH vào máy ảo thông qua IP ngoài.
43
Hình 23 Cấu h nh security
Sử dụng máy ảo chạy các dịch vụ Web server, File server…
Hình 24 Khởi chạy Instance Centos 7
Comment [SH4]: OK Giữ lại
44
Hình 25 Chạy dịch vụ Webserver
3.2Phân tích các vấn đề an ninh trong Openstack và đưa ra giải pháp, khuyến nghị nghị
3.2.1 Tấn công Injection
Openstack sử dụng Horizon là project cho việc cung cấp Dashboard để người dùng đăng nhập và sử dụng các dịch vụ Openstack. Horizon là một ứng dụng nền web dựa trên Django. Horizon tương tác với Keystone nhằm xác thực thông qua username và password sau đó lấy token để làm việc với các project khác. Keystone sử dụng SQL làm cơ sở dữ liệu cho việc lưu trữ thông tin user. Một trong những m i nguy hiểm, an ninh liên quan đến SQL đó là Injection. K tấn công có thể lợi dụng l h ng bảo mật này để ch n các câu lệnh truy vấn nhằm đạt được bảng cơ sở liệu liệu và có các hành động bất hợp pháp như xóa dữ liệu, sửa đổi…
Mặc định Django sử dụng các Queryset cho phép m hóa dữ liệu đầu vào để ch ng sự tấn công SQL, tuy nhiên Django vẫn cho phép sử dụng các RawQuery và custom SQL có khả năng bị tấn công [17]. Horizon sử dụng forms.py cho việc xử lý xác thực người dùng với Keystone. Tùy vào các nhà phát triển sẽ ch n và sử dụng loại truy vấn nào.
/usr/lib/python2.7/dist-packages/openstack_auth/forms.py
Trong tệp cấu h nh forms.py các dữ liệu đầu vào đ được m hóa nhằm ch ng lại sự tấn công Injection.
Comment [SH6]: OK Giữ lại
45
region = forms.ChoiceField(label=_("Region"), required=False) username = forms.CharField(label=_("User Name"))
password = forms.CharField(label=_("Password"), widget=forms.PasswordInput(render_value=False))
def __init__(self, *args, **kwargs):
super(Login, self).__init__(*args, **kwargs)
self.fields.keyOrder = ['username', 'password', 'region']
Nhìn vào mã code ta thấy tất cả các thông tin đầu vào usename, password và domain đ được tổng hợp dưới dạng self.fields.keyOrder nhằm tránh các câu lệnh
truy vấn luôn trở lên đ ng.
Tiếp theo sử dụng một công cụ kiểm tra các m i an ninh cho một ứng dụng web bao gồm cả m i nguy cơ Injection là SQLmap [18] – Hình 26
Hình 26 Phần mềm SQLMap
Tiến hành chạy để kiểm tra m i an ninh với địa ch của Horizon là
46
Hình 27 Kết quả kiểm tra Injection
Với kết quả trên hình 27 th không có bất kỳ l hổng bảo mật nào liên quan đến Injection. Horizon đ vượt quá các bài kiểm tra và l h ng này. Qua đó cho thấy được Horizon dựa trên Django đ có các cách truy vấn Query rất t t để phòng ch ng tấn công dạng này. Tuy nhiên do Django vẫn h trợ các kiểu truy vấn sơ khai như Rawquery. Các nhà quản trị nếu không có sự nghiên cứu mà sử dụng kiểu truy vấn này cho Django sẽ dẫn đến việc giảm sự bảo vệ trước nguy cơ tấn công Injection và là l hổng cho việc tấn công. Do Django là m nguồn mở, không nằm dưới sự quản lý của Openstack nên rất khó để Django khóa chức năng này lại. Do đó việc quan tr ng nhất chính là các nhà quản trị nên lưu ý vấn đề này.