Japan
サイト内の現在位置
シェルスクリプトとGrafanaを使用したサーバ監視~Hardening 2023 Generatives~
NECセキュリティブログ2023年11月27日
2023年10月5日~6日に開催されたHardening 2023 Generatives[1](以下、H2023Gと記載)にNECはスポンサーとして協賛しており、ハードニング競技会および競技会でのMarketPlace(後述)として参加を行いました。本ブログでは、MarketPlace(以下、MPと記載)で提供したサービスの詳細、そして競技およびMPに参加したメンバーの参加記を紹介します。
ハードニング競技会
ハードニング競技会は、脆弱性の潜むビジネスシステム(ECサイトなど)へのハードニング(堅牢化)力の強さを総合的に競うコンペティション[1]です。競技会参加者は、競技時間8時間の中で、攻撃からECサイトを守りつつ売上を伸ばすことを目指します。
今年のH2023Gは北海道留寿都村のルスツリゾートホテル&コンベンションで開催されました。今年のスケジュールについては以下のようになり、例年より1か月ほど早い開催となりました。
スケジュール
日程 | イベント |
8月中旬 | 競技会参加者およびチームの決定 |
9月1日 | 顔合わせミートアップ |
~ | 準備期間 |
10月4日夕方 | 競技会の資料公開 |
10月5日 | Hardening Day(競技会当日) |
10月6日 | Analysis Day(ふりかえり資料の作成) |
10月28日 | Softening Day(チーム発表&表彰) |
ハードニング競技会でのMarketPlace(MP)
ハードニング競技会では、インシデント発生時に「プロの手を借りる」「製品の力を使う」といった事象を模擬する環境が用意されています。競技会参加者は、スポンサー組織が提供する製品・サービスを購入することで、チームに不足している領域のサポートを依頼することができます。NECもH2023Gのスポンサーとして、MPサービスを提供しました。
NECが提供したMPサービス
NECはMPとしてサーバの監視&通知サービスを提供しました。監視状況を競技者からも確認可能なダッシュボードをGrafana[2]で構築し提供、不審な動作や異常が確認できた場合に競技者へ通知するサービスとなっています。

ここからは具体的にどのような実装で本サービスを構成していたかについて、その一部を紹介していきます。なお、今回提供したサービスはハードニング競技会に合わせた実装(※)となっています。実際のサイト上で使用する際には、あまりよろしくない部分もあるためご注意ください。
- (※)限られた時間内で行われる競技であり、柔軟な対応が行えることを優先した実装
監視サービスの実装について
サービス構成図(Grafanaとサーバ監視のイメージ図)
本サービスの構成図としては、以下のようになっています。

このサービスでは、エージェントを使わないという思想で設計しました。監視を行うホスト(監視ホスト)から、監視対象マシンに対してsshを使用してコマンドを実行し、ホスト内部情報を取得します。その後取得した情報をデータベース等に格納し、Grafanaで可視化しています。
内部情報等の収集を自動化するため、シェルスクリプトとcronを用いて定期実行を行う形にしていました。また、ハードニング競技会当日に新たな監視項目を依頼されても対応できる体制としていました。
なお、Windowsホストについても、WinRMを用いて監視可能ですが、本ブログでは割愛します。
サーバ監視を行うためのSSH公開鍵の配送
SSHを用いて内部情報を自動的に収集するためには、SSHの公開鍵を各サーバに登録しておく必要があります。ただし、ハードニング競技会では10台以上のサーバが運用されているため、手動でSSHの公開鍵を登録していくと時間がかかってしまいます。そのため、SSHの公開鍵を自動で配布する簡易的なシェルスクリプトを作成して対応しました。
各サーバへのSSH公開鍵の配送は、以下の手順で行いました。
-
各サーバのユーザ名とパスワードのリストを作成する。
-
SSHの鍵ペアを作成する。
-
ssh-copy-idとexpectを用いて、各サーバに公開鍵を配送する。
上記の手順をシェルスクリプトで実装しました。

また、各サーバのユーザ名とパスワードのリスト(サンプル)は以下の通りです。

ハードニング競技会用の簡易的なスクリプトではありますが、このような方式でSSHの公開鍵を配送していました。現実で使用する場合は当然パスワードのハードコードはせず、暗号化する/パスワードはユーザ入力にするなどの処理に変更する必要があります。
CPU使用率の監視方法
ハードニング競技会では、CPU使用率やファイルの改ざん検知などのさまざまな観点で監視を行っていました。本ブログでは、監視対象の1つであるCPU使用率の監視方法について紹介します。
LinuxサーバのCPU使用率は、topコマンドを実行することで確認できます。このコマンドを各サーバ上で実行し、その結果をデータベースに定期的に格納するようにしていました。
具体的には、以下の手順でCPU使用率を取得していました。
-
CPU使用率格納用のデータベースとテーブルを作成する。
-
監視対象のホスト名とログインするユーザ名を取得する。
-
SSH経由でtopコマンドを実行する。
-
topコマンドの結果を整形する。
-
整形した情報をテーブルに挿入する。
上記の手順をシェルスクリプトで簡易的に実装しました。

このシェルスクリプトをcronで定期実行することで、各サーバのCPU使用率の傾向を把握できるようにしていました。
Grafanaでの可視化
ここまでで取得した情報を、監視しやすいようにGrafanaで可視化します。 Grafanaの環境構築はどのような方法でも問題ありませんが、本サービスではDockerを用いてコンテナ上にGrafanaをホストしていました。
以下のコマンドで、Grafanaをコンテナとして起動できます。GF_SECURITY_ADMIN_PASSWORDは、WebブラウザからGrafanaへログインする際のパスワードとなるため、複雑なものを使用してください。また、GF_SERVER_ROOT_URLで可視化を行うダッシュボードのアクセス先を定義します。
docker run -itd -p 4000:3000 ¥
-v /opt/grafana-plugins:/var/lib/grafana/plugins ¥
--restart always --name=grafana ¥
-e "GF_SERVER_ROOT_URL=http://localhost:4000" ¥
-e "GF_LOG_LEVEL=debug" ¥
-e "GF_SECURITY_ADMIN_PASSWORD=secret" ¥
grafana/grafana
また、Grafanaで可視化を行う際にアクセスするデータベースによってプラグインが必要な場合があります。データベースとしてsqlite3を使用する場合は以下のコマンドでプラグインのインストールが可能です。プラグインのインストール後には、Grafanaの再起動が必要となります。コンテナ上で再起動してもよいですし、コンテナ自体を再起動しても問題ありません。
$ docker exec -it -u root grafana bash
# grafana cli plugins install frser-sqlite-datasource
ここまで準備が完了したら、最後にGrafanaをWebブラウザから操作してダッシュボードの構築を行います。
-
Grafanaにアクセスしてログインする
インストール時に設定したURL(http://localhost:4000)にアクセスし、ユーザ名「admin」と設定したパスワード(このブログではsecretとした文字列)でログインします。 -
データソースの追加
データ格納先のファイル・サービスに合わせたデータソースを追加します。SQLiteの場合であれば、ファイルパスを指定することでGrafanaのダッシュボードで可視化するためのデータソースとして扱えます。


- 3.ダッシュボードの作成
2で作成したデータソースを元にダッシュボードを作成します。表示するデータをタイムラインとして表示できるようなSQLクエリで可視化します。

このような流れで可視化できます。H2023GのNECのMPサービスでは、CPUの使用率監視のほか、ファイル改ざんやログインユーザの監視、ウェブページの監視などの監視サービスを提供しました。
H2023Gへの参加記
最後にH2023Gの参加記を紹介します。
H2023G競技参加者の参加記
競技参加者としては、10チーム中5位という結果でした。我々のチームで、競技中で発生した一番のインシデントはランサムウェアにより基幹サーバの暗号化が行われたことでした。競技では、限られた時間の中での早急な原因特定は難しいと判断し、事前に取得していたバックアップから復旧を行うことで対処しました。少ない時間の中でも迅速に原因を特定するためには、事前のログの解析方法の確認やシステムアセットの把握が非常に重要です。また、次回は原因特定につとめるのか、あるいは、一刻も早い復旧を優先すべきなのか、チームとしてのトリアージの基準をあらかじめ決め、対応方針を素早く決定できる体制を整えて臨みたいと思います。(NEC 中島、長浜)

H2023GのMPサービス提供者の参加記
競技中は、我々のサービスを購入していただいたチームに対して監視サービスを提供しました。競技参加者からの要望に沿って柔軟に監視対象を変更する仕組みや、参加者も監視ダッシュボードを確認出来る環境を整えていましたが、競技参加者は次々降りかかるインシデントやミッションに忙しく、あまり活用の機会はありませんでした。そのため、基本的にはこちらで見繕った対象を監視していました。監視している中で不審な動きがあれば、基本的にはdiscordでチャット通知するという体制を取っていましたが、緊急対処を要するような重大な異常を発見した際は別です。一刻も早い対処が必要なため、競技参加者のテーブルに走って行き、状況報告やどのように対処すべきかを直接相談していました。このような対応が功を奏したのか、我々NECはMarket Place提供企業の中から最優秀企業賞(MVV)を受賞することが出来ました。
実際にサービスを提供してみて感じたのは、適切な通知の難しさです。競技本番中、ダッシュボードは我々が細かくチェックし、怪しい挙動は都度Discordで通知しました。ただ、我々から見えない部分は競技者に確認いただくしかなく、その手間が発生したと思っています。今後は監視を改善させ、無駄な情報を減らすとともに、必要な情報は逃さず確実に届けられるよう、改善していきたいと思っています。(NEC 杉本、高橋)

おわりに
今回はHardeningを通して提供した監視の技術要素の解説と参加者の取り組みについて紹介しました。NECは今後も社会全体を衛る技術を活用し、安心安全な社会の実現を目指していきます。
参考文献
- [1]Hardening Project
https://wasforum.jp/hardening-project/
- [2]Grafana
https://grafana.com/
アクセスランキング
2025年3月30日~4月5日に読まれた記事のランキング