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.
3.2.2 Lưu trữ mật khẩu và yêu cầu độ mạnh yếu
Trong vận hành và sử dụng Openstack ch ng ta sử dụng các tài khoản admin của các dịch vụ. Các tài khoản admin này được cung cấp username và password trong tệp cấu h nh để các dịch vụ sử dụng. Việc lưu các mật khẩu này dưới dạng ký tự công khai sẽ gây ra nhiều nguy cơ tiềm ẩn. Ví dụ như trong dịch vụ Swift, file cấu h nh chứa thông tin về username và password của tài khoản admin nằm trong tệp proxy-server.config.
admin_tenant_name = service admin_user = swift
47
Hình 28 Tệp cấu h nh Swift
Việc để thông tin admin như vậy có thể bị đánh cắp với các tài khoản Unix trong hệ điều hành (Các tài khoản superuser như root). Do đó luận văn khuyến nghị cần thiết phải đổi mật khẩu ngay sau khi cài đặt xong Openstack, cùng với đó là đặt quyền đ c/ghi cho các tệp cấu h nh ch có những user cho thẩm quyền mới có thể nh n và đ c được. Theo khuyến nghị của NIST th ch ng ta nên sử dụng hash mật khẩu trước khi lưu trữ. Một modul Hashlib [19] có thể được sử dụng để tránh sử đánh cắp mật khẩu dạng này.
Tiếp theo là mật khẩu của người sử dụng trên Horizon. Hiện tại người dùng có thể sử dụng bất kỳ mật khẩu nào mà không có sự cảnh báo, thông báo của Openstack rằng mật khẩu người sử dụng là đ đủ mạnh hay chưa. Bằng thực
48
nghiệm ch ng ta thấy rằng người dùng có thể sử dụng mật khẩu bất kỳ như 123… hay ch một ký tự. Điều này là rất dễ bị đoán hoặc k tấn công có thể dùng các biện pháp kiểm thử với hàng loạt mật khẩu phổ biến.
Hình 29 Tạo user với mật khẩu 1 ký tự
Theo như NIST đưa ra trong tài liệu Electronic Authentication Guideline [20] cung cấp các điều khoản cho việc tạo mật khẩu như độ dài t i thiểu, các ký tự viết hoa, đặc biệt… Theo nghiên cứu luận văn đưa ra hai khuyến nghị cho việc kiểm tra độ mạnh yếu của mật khẩu.
Sử dụng một modul Python-crack [22] cho việc kiểm tra mật khẩu, tránh tạo các mật khẩu gi ng các mật khẩu thông thường
Sử dụng Regex trong chính Djagno của Horizon [21] để kiểm tra việc mật khẩu có đ ng tiêu chuẩn độ dài, các ký tự đặc biệt, in hoa hay không trước khi được đưa vào đăng ký với SQL
Trong luận văn khuyến nghị sử dụng ch nh sửa Regex v tính tiện lợi và nhẹ của nó. Tuy nhiên khi đi vào hoạt động doanh nghiệp, ch ng ta nên sử dụng các modul chuyên dụng như Python-crack để việc sử lý được chính xác hơn như việc cập nhật như viện các thông tin đăng nhập thông dụng.
49
Ch ng ta tiến hàng thêm các bước kiểm tra mật khẩu bằng việc thêm trường Regex trong tệp cấu h nh của Horizon local_settings.py tại /usr/share/openstack-
dashboard/openstack_dashboard/local/local_settings.py
"regex": ' ^((?=.*\d)(?=.*[a-zA-Z])[a-zA-Z0-9!@#$%&*]{6,20})$ '
Với ch nh sửa trên mật khẩu người sử dụng phải đảm bảo t 6 đến 20 ký tự, bao gồm ký tự in hoa và ký tự đặc biệt như @,#,$...
Hình 30 Thêm kiểm tra mật khẩu
Sau khi thêm kiểm tra mật khẩu cùng với khởi động lại dịch vụ. Bây giờ sẽ xuất hiện thông báo mật khẩu không đạt yêu cầu và sẽ không thể sử dụng bởi Horizon khi mật khẩu là các mật khẩu yếu.
Hình 31 Mật khẩu không đạt yêu cầu
Qua quá tr nh nguyên cứu luận văn đưa ra khuyến nghị trong phần này như sau:
50
Việc triển khai Openstack cần bật chức năng kiểm tra mật người người dùng, tránh cho người dùng sử dụng các mật khẩu không mạnh, dễ đoán và có thể được k tấn công t m ra dễ dàng. Luận văn khuyến nghị sử dụng các modul kiểm tra mật khẩu có tích hợp các dữ liệu về các mật khẩu dễ dàng suy đoán như Cracklib...
3.2.3 Vấn đề an ninh Token
Token được cấp phát cho người dùng khi h đ được xác thực bởi Keystone và người dùng sẽ dùng Token để làm việc với các project. Việc phân tích các vấn đề an ninh của Token có thể tránh được các tấn công đạt được Token t những Token trước đó. Giờ đây Token đ được bảo vệ rất t t khi truyền t server xu ng client thông qua SSL. Do đó ch ng ta cần phân tích đó chính là cơ chế tạo ra Token ngoài việc bảo đảm Token khi vận chuyển. Việc phân tích cơ chế tạo ra Token c ng sẽ phản ánh được độ khó, độ ngẫu nhiên của Token.
Để đánh giá phân tích Token ch ng ta sử dụng 2 công cụ đánh giá là OWASP WebScarab [23]. WebScarab sẽ ghi lại các sessionID thông qua lời g i HTTP sau đó chuyển đổi sang các s và đưa lên biểu đồ. Tuy nhiên Webscarab ch ghi lại SessionID t HTTP header cho các ứng dụng Website thông thường trong khi Keystone sẽ trả về Token qua trường X-Subject-Token, do đó luận văn sẽ sử dụng một Proxy trung gian nhằm chuyển đổi Token thu được t hệ th ng xác thực keystone thông qua X-Subject-Token và đưa vào trường sessionID để WebScarad thu được và đánh giá. Một công cụ khác đó chính là Burp Sequencer t PortSwigger [24].
Để đánh giá sự tạo Token ch ng ta tiến hành phân tích kiểm thử như sau: Thiết đặt thời gian hết hạn của token xu ng nh nhất để có thể lấy được các
Token khác nhau trong một thời gian ngắn Lấy được 100-10000 Token
Phân tích các Token lấy được với OWASP WebScarab để kiểm tra có hay không các vấn đề trong các Token được tạo ra
Phân tích tạo Token với Burp Sequenser để kiểm tra mức độ ngẫu nhiên giữa các Token được tạo dựa vào phân tích cấu tạo Token
51
Với OWASP WebScarab ch lấy thông tin t Set-Cookie header và Response
body trong khi Token của Openstack được chứa trong trường X-Subject-Token, do
đó ch ng ta cần sử dụng một phần mềm trung gian để lấy nội dung trường X- subject-Token để đưa vào trường Set-Cookie header cho OWASP WebScarab để sử dụng. Phần mềm này là Reverse proxy [25]
Hình 32 Chạy Reverse Proxy
Tiến hành chạy OWASP WebScarab và sử dụng chức năng SessionID Analysis
Hình 33 Phần mềm OWASP WebScarab
Dựa vào các hàm API của Openstack được cung cấp sẵn trong Keytone API[36], cho phép ch ng ta sử dụng các hàm g i HTTP thông qua POST và GET để lấy được các thông tin như Token… dựa vào các Header có tương ứng.
Điền thông tin của người dùng đế xác thực với hệ th ng Keystone trong Openstack theo các tham s sau:
POST http://127.0.0.1:9562/v3/auth/tokens HTTP/1.0 Content-Type: application/json
Content-length: 403
52 Password: Welcome@123
Thông qua đoạn m hàm g i HTTP bởi API cho phép giao tiếp với Keystone để lấy Token [phục lục 1]. Ch ng ta có thể xác thực với Keystone với tài khoản user và lấy được Token qua trường X-Subject-TokenĐoạn m trên sử dụng URL của keystone với lời g i HTTP 1.0 và cung cấp các thông tin đăng nhập. Ở đây ch ng ta sẽ phân tích Token cho user có quyền Admin với thông tin đăng nhập là Admin và password: Welcome@123
Webcarab lấy được các Token dựa vào trường X-Storage-Token và sau đưa