ベジータいれてみた

 

おつかれさまです。Dです。

表題から飛んできた方は、「え、あの異国の王子?」とか思うかと思うんですが、「vegeta」って名前の負荷ツールのお話になります。業務上でWAFの機能チェックをする必要が出てきて手軽にサーバーにリクエストを投げて負荷をかけられるものを探してたら、同僚が使っているのを発見して真似しましたw

せっかくなのでやった内容を備忘録がてらで纏めていきたいと思います。あまり深いことまでは実施していないのでインストールとこのコマンド実行すれば負荷をかけられるくらいの内容です。ちなみですが、負荷ツールなので自分が所有しているサーバー以外にベジータアタックするのはマジでやめましょう。試す際は自己所有のサーバーでお願いします。

内容


環境は毎度おなじみAlmaLinux8.7になります。



-----------------------------------------
# cat /etc/redhat-release
AlmaLinux release 8.7 (Stone Smilodon)
-----------------------------------------

vegetaを使うには、GO言語の環境が必要になります。まずはGO言語の環境から構築していきます。以下のコマンドを実行していきましょう。


----------------------------------------
# yum install golang

Last metadata expiration check: 0:52:15 ago on Fri 16 Jun 2023 07:52:05 AM JST.
Dependencies resolved.
=============================================================================================================================================================================================
 Package                                       Architecture                     Version                                                            Repository                           Size
=============================================================================================================================================================================================
Installing:
 golang                                        x86_64                           1.18.10-1.module_el8.7.0+3495+2165ce2a                             appstream                           695 k
Installing dependencies:
 golang-bin                                    x86_64                           1.18.10-1.module_el8.7.0+3495+2165ce2a                             appstream                           105 M
 golang-src                                    noarch                           1.18.10-1.module_el8.7.0+3495+2165ce2a                             appstream                           9.2 M
 keyutils-libs-devel                           x86_64                           1.5.10-9.el8                                                       baseos                               47 k
 krb5-devel                                    x86_64                           1.18.2-22.el8_7                                                    baseos                              559 k
 libcom_err-devel                              x86_64                           1.45.6-5.el8                                                       baseos                               38 k
 libkadm5                                      x86_64                           1.18.2-22.el8_7                                                    baseos                              186 k
 libselinux-devel                              x86_64                           2.9-6.el8                                                          baseos                              199 k
 libsepol-devel                                x86_64                           2.9-3.el8                                                          baseos                               86 k
 libverto-devel                                x86_64                           0.3.2-2.el8                                                        baseos                               17 k
 openssl-devel                                 x86_64                           1:1.1.1k-9.el8_7                                                   baseos                              2.3 M
 pcre2-devel                                   x86_64                           10.32-3.el8_6                                                      baseos                              604 k
 pcre2-utf16                                   x86_64                           10.32-3.el8_6                                                      baseos                              228 k
 pcre2-utf32                                   x86_64                           10.32-3.el8_6                                                      baseos                              219 k
Enabling module streams:
 go-toolset                                                                     rhel8

Transaction Summary
=============================================================================================================================================================================================
Install  14 Packages

Total download size: 120 M
Installed size: 427 M
Is this ok [y/N]:

以下のGOバージョンが問題無く表示されていれば、GOのインストールは完了です。


-----------------------------------------
# go version
go version go1.18.10 linux/amd64

-----------------------------------------

それではvegetaのインストールに移ります。以下のコマンドでインストールしようとして失敗しました。。。

ここで少し詰まったのですが、go get コマンドはGOのバージョンが17系までが使用できるようで、今回インストールしたGOがバージョン18系なので使えなくなりエラーが出ている状況のようでした。


------------------------------------------------------------
# go get -u github.com/tsenart/vegeta
go: go.mod file not found in current directory or any parent directory.
        'go get' is no longer supported outside a module.
        To build and install a command, use 'go install' with a version,
        like 'go install example.com/cmd@latest'
        For more information, see https://golang.org/doc/go-get-install-deprecation
        or run 'go help get' or 'go help install'.
------------------------------------------------------------

go installを使えとエラーメッセージにも出ているので、改めて以下を実行します。
今回はうまくいきましたね。


------------------------------------------------------------
# go install github.com/tsenart/vegeta@latest
go: downloading github.com/tsenart/vegeta v12.7.0+incompatible
go: finding module for package github.com/tsenart/go-tsz
go: finding module for package github.com/mailru/easyjson/jlexer
go: finding module for package github.com/mailru/easyjson/jwriter
go: finding module for package github.com/c2h5oh/datasize
go: finding module for package github.com/influxdata/tdigest
go: finding module for package golang.org/x/net/http2
go: downloading golang.org/x/net v0.11.0
go: downloading github.com/tsenart/go-tsz v0.0.0-20180814235614-0bd30b3df1c3
go: downloading github.com/influxdata/tdigest v0.0.1
go: downloading github.com/mailru/easyjson v0.7.7
go: downloading github.com/c2h5oh/datasize v0.0.0-20220606134207-859f65c6625b
go: found github.com/c2h5oh/datasize in github.com/c2h5oh/datasize v0.0.0-20220606134207-859f65c6625b
go: found github.com/influxdata/tdigest in github.com/influxdata/tdigest v0.0.1
go: found github.com/mailru/easyjson/jlexer in github.com/mailru/easyjson v0.7.7
go: found github.com/mailru/easyjson/jwriter in github.com/mailru/easyjson v0.7.7
go: found golang.org/x/net/http2 in golang.org/x/net v0.11.0
go: found github.com/tsenart/go-tsz in github.com/tsenart/go-tsz v0.0.0-20180814235614-0bd30b3df1c3
go: downloading github.com/josharian/intern v1.0.0
go: downloading golang.org/x/text v0.10.0
------------------------------------------------------------

実際の負荷のかけ方ですが、以下のコマンドで出来ます。

-duration」が負荷をかける時間になり、今回だと5秒です。「-rate」は1秒間でリクエストをどれくらいの数を送るかになりますので、今回は1秒間に2リクエスト送っていることになります。

実行結果でリクエスト数や、ステータスコード、レイテンシー等の確認が出来ます。



-------------------------------------------------------------------------------------
echo "GET http://対象のIPアドレスまたはドメイン" | /root/go/bin/vegeta attack -rate=2 -duration=5s | tee results.bin | /root/go/bin/vegeta report
-------------------------------------------------------------------------------------

※実行結果
-------------------------------------------------------------------------------------
Requests      [total, rate, throughput]  10, 2.22, 2.22
Duration      [total, attack, wait]      4.501107299s, 4.499452925s, 1.654374ms
Latencies     [mean, 50, 95, 99, max]    2.15504ms, 1.31498ms, 9.942995ms, 9.942995ms, 9.942995ms
Bytes In      [total, mean]              0, 0.00
Bytes Out     [total, mean]              0, 0.00
Success       [ratio]                    100.00%
Status Codes  [code:count]               200:10
-------------------------------------------------------------------------------------

 

【まとめ】

今回はシンプルにWAFの挙動チェックのために実施したので、詳しい負荷計測までは実施していないのですが、こちらを利用することでどのくらいのリクエスト数に耐えられるのか測ることが出来そうです。

導入もそこまで難しくないので、興味がある方は試してもらえればと思います。