Hướng dẫn khắc phục lỗ hổng bảo mật CVE-2019-11477 trên Cloud365
Hướng dẫn khắc phục lỗ hổng bảo mật CVE-2019-11477 trên Cloud365
Nơi chứa các tài liệu tham khảo của dịch vụ Cloud365.
Kiểm tra, đánh giá tải là điều cần thiết trước khi triển khải sản phẩm. Và thật khó nếu sử dụng sức người để thử các kịch bản đặt ra. Lấy ví dụ cơ bản, để tạo ra tải mô phỏng cho 100 người truy cập cùng thời điểm chúng ta không thể tìm 100 người để thực hiện kịch bản này. Vậy để giải quyết vấn đề, ta sẽ sử dụng công cụ Apache HTTP server benchmarking tool (ab) để tạo ra tải mô phỏng.
Công cụ Apache HTTP server benchmarking tool (ab) được phát triển bởi Apache Software Foundation, là công cụ tạo ra tải mô phỏng cho Web Server bằng cách gửi các request đồng thời tới máy chủ. Công cụ này được tích hợp mặc định sau khi cài dịch vụ HTTP Apache Web Server phục vụ việc đánh giá Web server sau khi cài đặt.
Truy cập Nhân hòa, đăng ký 1 Máy ảo CentOS 7 với cấu hình 2 CPU, 2GB RAM - 25 GB Disk (Cấu hình gói B)
Kết quả
Truy cập máy chủ ảo trên hệ thống nhân hòa
Cài đặt dịch vụ apache
yum install httpd -y
echo '<h1>Chào mừng tới Blog Cloud365</h1>' > /var/www/html/index.html
systemctl start httpd
systemctl enable httpd
Kết quả
Tại máy tính cá nhân (chạy hệ điều hành ubuntu 18.04) cài đặt các gói sau
sudo apt-get install apache2-utils
Cú pháp đầy đủ
Cấu trúc: ab [options] [http[s]://]hostname[:port]/path
Hiển thị các tùy chọn
ab -h
Kết quả
thanhnb@thanhnb-pc:~$ ab -h
Usage: ab [options] [http[s]://]hostname[:port]/path
Options are:
-n requests Number of requests to perform
-c concurrency Number of multiple requests to make at a time
-t timelimit Seconds to max. to spend on benchmarking
This implies -n 50000
-s timeout Seconds to max. wait for each response
Default is 30 seconds
-b windowsize Size of TCP send/receive buffer, in bytes
-B address Address to bind to when making outgoing connections
-p postfile File containing data to POST. Remember also to set -T
-u putfile File containing data to PUT. Remember also to set -T
-T content-type Content-type header to use for POST/PUT data, eg.
'application/x-www-form-urlencoded'
Default is 'text/plain'
-v verbosity How much troubleshooting info to print
-w Print out results in HTML tables
-i Use HEAD instead of GET
-x attributes String to insert as table attributes
-y attributes String to insert as tr attributes
-z attributes String to insert as td or th attributes
-C attribute Add cookie, eg. 'Apache=1234'. (repeatable)
-H attribute Add Arbitrary header line, eg. 'Accept-Encoding: gzip'
Inserted after all normal header lines. (repeatable)
-A attribute Add Basic WWW Authentication, the attributes
are a colon separated username and password.
-P attribute Add Basic Proxy Authentication, the attributes
are a colon separated username and password.
-X proxy:port Proxyserver and port number to use
-V Print version number and exit
-k Use HTTP KeepAlive feature
-d Do not show percentiles served table.
-S Do not show confidence estimators and warnings.
-q Do not show progress when doing more than 150 requests
-l Accept variable document length (use this for dynamic pages)
-g filename Output collected data to gnuplot format file.
-e filename Output CSV file with percentages served
-r Don't exit on socket receive errors.
-m method Method name
-h Display usage information (this message)
-I Disable TLS Server Name Indication (SNI) extension
-Z ciphersuite Specify SSL/TLS cipher suite (See openssl ciphers)
-f protocol Specify SSL/TLS protocol
(SSL2, TLS1, TLS1.1, TLS1.2 or ALL)
ab -n <Số lượng request> -c <Số lượng đồng thời> <IP hoặc Domain>:<port><path>
Các tham số cơ bản:
-n
- -c
- Ở ví dụ này, ta sẽ sử dụng công cụ ab tool để tạo tải mô phỏng cho 200 người truy cập trong cùng một thời điểm. Và mỗi người truy cập sẽ thực hiện nhấn refresh page
50 lần. Để tạo ra kịch bản này, ta sẽ thiết tùy chọn concurrency
bằng 200 và tùy chọn requests
bằng 10000. Có thể hiểu đơn giản tùy chọn concurrency
tức số người truy cập trong cùng thời điểm và tùy chọn requests
là tổng số thao tác mà tất cả người truy cập cùng thực hiện (200 người thực hiện 50 lần vậy tổng thao tác là 10000).
Thực hiện test (Thực hiện tại máy tính cá nhân)
ab -n 10000 -c 100 http://10.10.11.38/
Kết quả
Server Software: Apache/2.4.6
Server Hostname: 10.10.11.38
Server Port: 80
Document Path: /
Document Length: 42 bytes
Concurrency Level: 100
Time taken for tests: 8.030 seconds
Complete requests: 10000
Failed requests: 0
Total transferred: 3020000 bytes
HTML transferred: 420000 bytes
Requests per second: 1245.28 [#/sec] (mean)
Time per request: 80.304 [ms] (mean)
Time per request: 0.803 [ms] (mean, across all concurrent requests)
Transfer rate: 367.26 [Kbytes/sec] received
Connection Times (ms)
min mean[+/-sd] median max
Connect: 1 30 136.5 8 2233
Processing: 5 45 50.7 30 964
Waiting: 4 43 44.8 30 658
Total: 7 75 146.7 38 2242
Percentage of the requests served within a certain time (ms)
50% 38
66% 60
75% 99
80% 106
90% 118
95% 137
98% 382
99% 1090
100% 2242 (longest request)
Giải thích ý nghĩa
Phân tích kết quả:
Apache/2.4.6
Concurrency Level
)2.8801 MB
(3020000 bytes) cho 10000 request1245.28
request thực hiện trong 1s (Requests per second
)367.26 Kbytes/sec
(Transfer rate
)gnuplot format
Bổ sung thêm tùy chọn -g <Tên file>
vào câu lệnh test
Thực hiện test (Thực hiện tại máy tính cá nhân)
ab -n 10 -c 2 -g data.txt http://10.10.11.38/
Kết quả
cat data.txt
starttime seconds ctime dtime ttime wait
Thu Jan 31 11:56:44 2019 1548910604 1 2 3 2
Thu Jan 31 11:56:44 2019 1548910604 1 2 3 2
Thu Jan 31 11:56:44 2019 1548910604 1 2 3 2
Thu Jan 31 11:56:44 2019 1548910604 1 2 3 2
Thu Jan 31 11:56:44 2019 1548910604 1 2 4 2
Thu Jan 31 11:56:44 2019 1548910604 1 2 4 2
Thu Jan 31 11:56:44 2019 1548910604 1 2 4 2
Thu Jan 31 11:56:44 2019 1548910604 2 2 4 2
Thu Jan 31 11:56:44 2019 1548910604 2 2 4 2
Thu Jan 31 11:56:44 2019 1548910604 2 3 5 3
Lưu ý:
seconds
: Kiểu dữ liệu thời gian (Dạng timestamp linux, UTC) (VD: 1548910604 = Thursday, January 31, 2019 4:56:44 AM)ctime
: Thời gian mở kết nối (Connection Time)dtime
: Thời gian xử lý (Processing Time)ttime
: Tổng thời gian (Tổng = ctime + dtime )wait
: Thời gian chờ (Waiting Time)Để tạo ra bài test sát với thực tể hơn, ta sẽ cài đặt một web động để test. Ở đây ta sẽ sử dụng Flask Python
Thực hiện tại máy chủ ảo
Cài đặt python3.6
và virtualenv
yum install https://centos7.iuscommunity.org/ius-release.rpm -y
yum install python-devel -y
yum install python36-devel -y
yum install python36 -y
yum install python36u-mod_wsgi -y
yum install python-pip -y
yum install python36u-pip -y
pip3.6 install virtualenv
Cài đặt flask
mkdir webserver_demo && cd webserver_demo
virtualenv env
source env/bin/activate
pip install Flask==0.10.1
pip freeze > requirements.txt
echo 'from flask import Flask
app = Flask(__name__)
@app.route("/")
def hello():
return "Hello World!"
if __name__ == "__main__":
app.run(host="0.0.0.0")' > app.py
Chạy web server
python app.py
Kết quả
AB Tool hỗ trợ nhiều tham số hỗ trợ cho việc mô phỏng tải thực tế. Việc hiểu và sử dụng các tham số hợp lý sẽ hỗ trợ việc đánh giá tải sát với thực tế hơn.
Thực hiện Test với request cơ bản (Thực hiện tại máy tính cá nhân)
ab -n 100 -c 1 http://10.10.11.38:5000/
Kết quả bài test đơn giản
Test với request bổ sung thêm các tùy chọn mở rộng (Thực hiện tại máy tính cá nhân)
ab -l -r -n 100 -c 1 -k -H "Accept-Encoding: gzip, deflate" http://10.10.11.38:5000/
Giải thích tham số:
-l
- Cho phép nhiều độ dài file khác nhau (Dùng web động)-r
- Mặc định ab sẽ tự thoát khi nhận lỗi phản hồi từ webserver, với tham số -r
ab sẽ thông báo lỗi nhưng bài test vẫn tiếp tục thực hiện-H
- Thêm các thông số vào header request (Tham số giúp request giống với thực tế hơn)Kết quả bài test nâng cao
Màn hình tay trái (thanhnb@thanhnb-pc:~$) là máy tính cá nhân của tôi, màn hình tay phải máy chủ Web (root@webserver-apache-centos7: ~). Sẽ có sự khác biệt giữa test với các request đơn giản và các request với thêm các tùy chọn. Dễ thấy nhất, trong lần đầu tiên test (với tham số mặc định) kết quả lại là 106.35
request trên 1s còn trong lần thứ 2 test(với tham số tùy chọn) kết quả trả lại là 85
request trên 1s. Từ đây ta sẽ có thểm các số liệu để đánh giá với hệ thống thực tế trước khi triển khai.
Tham số tùy chọn khác:
-v 2
- Trong trường hợp thực hiện bài test gặp lỗi, sử dụng tham số này để thấy header HTTP phản hồi lại từ serverCác kết quả có được khi đánh giá hệ thống Web theo AB Tool có thể không phản ánh chính xác hiệu năng của server. HTTP chỉ là 1 phần rất nhỏ khi muốn đánh giá hiệu năng hệ thống, hiệu năng của hệ thống Web còn bao gồm rất nhiều thành phần khác như các templating engine
, database
. Cuối cùng, công cụ sẽ cung cấp các thông số để so sánh, đánh giá ban đầu
Các công cụ đánh giá hệ thống Web khác:
https://www.digitalocean.com/community/tutorials/how-to-use-apachebench-to-do-load-testing-on-an-ubuntu-13-10-vps
http://httpd.apache.org/docs/2.2/programs/ab.html
Thực hiện bởi cloud365.vn