おつかれさまです。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の挙動チェックのために実施したので、詳しい負荷計測までは実施していないのですが、こちらを利用することでどのくらいのリクエスト数に耐えられるのか測ることが出来そうです。
導入もそこまで難しくないので、興味がある方は試してもらえればと思います。