GremlinからEC2に対してシャットダウン攻撃を行う

2019.09.19

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

こんにちは、森です。

以前

Gremlinを使って障害を注入してみる

でGremlinを紹介させていただきました。

前回はCPU攻撃を行ったのですが、今回はFree Planでできるもう一つの攻撃 shutdownを試します。

環境

AWSにELB+EC2を使ったWebサイトを作って実施します。 EC2はAmazon Linux 2を使います。

攻撃はGremlin Web UIから実施します。

やってみる

EC2に必要なパッケージをインストール

  • nginx (webサーバー)
  • iproute-tc (Amazon Linux 2でgremlinを実行するために必要)
  • gremlin (Gremlinのコマンドを実行するためのクライアント)
  • gremlind (Gremlin Control Planeと通信して攻撃をスケジュール、実装、および停止するGremlinデーモン)

以下のコマンドでインストールします。

ユーザーデータ

#!/bin/bash
sudo yum install -y iproute-tc

sudo curl https://rpm.gremlin.com/gremlin.repo -o /etc/yum.repos.d/gremlin.repo
sudo yum install -y gremlin gremlind

sudo amazon-linux-extras install -y nginx1.12
sudo systemctl enable nginx
sudo systemctl start nginx

ユーザーデータに入れてEC2を起動すると手間が省けます。

Gremlin Control Planeに登録する

Gremlin Web UIから実施するには、先ほどインストールしたGremlinデーモンを起動する必要があります。

gremlin init

上記のコマンドを実行すると、

  • Team ID
  • Team Secret

の入力を求められますので、自身の環境のものを入力します。 なお、コンフィグファイルに追記する方法もあります。

https://www.gremlin.com/docs/infrastructure-layer/advanced-configuration/ を参照してください。

※ 今回は未検証です。

登録されたかどうかの確認

https://app.gremlin.com/clients/infrastructure

にアクセスし、設定を行ったインスタンスが表示されるかどうか確認してみます。

登録できているとこのような画面になります。マスクしている箇所には、

  • gremlin-client-version
  • cloud
  • local-ip
  • instance-id
  • image-id

などのメタ情報がタグづけされています。

shutdown攻撃を行う

では、実際にやってみましょう。

https://app.gremlin.com/attacks にアクセスし、 New Attack ボタンを押します。

ターゲット指定

攻撃を実行できるホスト一覧の画面に遷移します。 先ほど登録したホストが表示されているはずです。

今回はランダム実行をしてみます。

ターゲット2台の中で、1台に対して実施するという設定にしています。

攻撃タイプの指定

shutdownを行うには、CategoryをStateにします。

スケジュール指定

時間を指定するか、今実行するか選択できます。今回は即時指定します。

解き放つ

さあ、解き放ってごらん

実行中の確認と終了確認

解き放った後、https://app.gremlin.com/attacks にリダイレクトされます。 現在実行中の攻撃が表示されていると思います。

攻撃が完了すると、Completedタブに移動し、結果がわかります。

成功していますね。

AWSのマネージメントコンソールからも確認してみると、対象のインスタンスがstoppedになっている事がわかるとおもいます。今回はALBにぶら下げたので,ターゲットグループのステータスを確認すると、unusedとなっていることがわかります。

まとめ

ということで、今回はGremlinを使ってランダムにshutdownする攻撃を試しました。

こういった障害注入を普段から行い、システムがどのような影響を受けるのかを知ることができると対策もしやすいですし、実際に起こった時も対処しやすくなるかとおもいます。 テストを繰り返し、自動復旧する仕組みを作り上げていくことが大事ですね。

ちなみに、カオスエンジニアリングの5つの原則 Principles of Chaos Engineering では Run experiments in production 本番環境で実行する と書いています。他の原則も踏まえきちんと計画を立てないといけません。

カオスエンジニアリングについても今後勉強して記事にしたいと思っております。

では。