標的型攻撃メール訓練システムを無料で作ってみた

# 目的
* 社内で標的型攻撃メール訓練を**無料**で実施すること。
* 訓練に対するEラーニングを**無料**で実施すること。

※OSやサーバの費用はゼロ円で計算しています。

# やりたいこと
* 標的型攻撃メールは、URLリンク方式
* メールのURLをクリックしたユーザは、社内のIISサーバに飛ばされる
* IISサーバではWindows統合認証によりアクセスしたユーザを特定する
* 引っ掛かったユーザにはEラーニングを受けてもらう

# システム構成図
システム構成は以下の図の通り。
![WS000002.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/300531/f2cca113-e6e3-1771-513a-6db00160e1c4.jpeg)

# 作業
## フリーメールサーバ
訓練メールを送信するためのフリーメールアカウントを取得します。今回は、AOLを使用しましたが、どこでもいいと思います。

## リダイレクト用サーバ
訓練メールに記載するURLは、自由に設定したいので、リダイレクト用サーバを立てます。

* OS: CentOS7
* Webサーバ: Apache

httpd.confにリダイレクトの設定を記述します。

```
<Directory />
    AllowOverride all
    Require all denied
    Redirect / http://<訓練用Webサーバホスト名>/
</Directory>
```

## 訓練用Webサーバ
リダイレクト用サーバからリダイレクトして、アクセスするWebサーバです。
統合Windows認証をして、アクセスしたユーザを特定します。なので、ドメインに参加する必要があります。
また、アクセスしたユーザ情報を保存するために、MySQLでRDBを作成しています。

* OS: WindowsServer2016 R2
* Webサーバ: IIS11
* RDB: MySQL

**訓練ページのaspxファイル**

```
<%@ Page Language="C#" %>
<%@ Import Namespace="System.Data" %>
<%@ Import Namespace="MySql.Data.MySqlClient" %>

<script runat="server">

protected void btn1_click(object sender, EventArgs e){
    Response.Redirect("test2.aspx");
}

protected void Page_Load(Object source, EventArgs e) {
    if (IsPostBack) {
        return;
    }

    if (User.Identity.Name == null) {
        return;
    }

    //アカウント抽出
    string id = User.Identity.Name;
    id = id.Replace("HHKD0004\\", "");
    
    // 接続文字列を作成
    string connectionString =
        "Server=localhost;" +
        "Database=ac_db;" +
        "User ID=XXXX;" +
        "Password=XXXX";
    
    // 取得したデータ退避用
    DataTable dt = new DataTable();
    
    using (MySqlConnection con = new MySqlConnection(connectionString))
    using (MySqlDataAdapter adapter = new MySqlDataAdapter()) {
        con.Open();

        // 書き込みクエリ実行
        // コマンドを作成
        MySqlCommand cmd =
             new MySqlCommand("insert into ac_table ( emp_id, ac_page, ac_date ) values ( @emp_id, @ac_page, @ac_date )", con);
        // パラメータ設定
        cmd.Parameters.Add(new MySqlParameter("emp_id", id));
        cmd.Parameters.Add(new MySqlParameter("ac_page", 1));
        cmd.Parameters.Add(new MySqlParameter("ac_date", DateTime.Now));
        // Exec
        cmd.ExecuteNonQuery();    
    }
}
</script>

<html>

<head>
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<link href="./fontawesome-free-5.8.2-web/css/all.min.css" rel="stylesheet">

<style type="text/css">

h1 {
  position: relative;
  color: black;
  background: #d0ecff;
  line-height: 1.4;
  padding: 0.25em 0.5em;
  margin: 2em 0 0.5em;
  border-radius: 0 5px 5px 5px;
}

h1:after {
  /*タブ*/
  position: absolute;
  font-family: "Font Awesome 5 Free",'Quicksand','Avenir','Arial',sans-serif;
  content: '\f00c Check';
  background: #2196F3;
  color: #fff;
  left: 0px;
  bottom: 100%;
  border-radius: 5px 5px 0 0;
  padding: 3px 7px 1px;
  font-size: 0.7em;
  line-height: 1;
  letter-spacing: 0.05em
}

img {
  max-width: 100%
  max-height: 100%
}

.ribbon {
    position: relative;
    color: #ffffff ;
    background: #ec524e;
    font-size: 16pt ;
    line-height: 1;
    margin: 20px -10px 20px -10px;
    padding: 10px 5px 10px 20px;
    box-shadow:1px 3px 7px 0px  #ccc ;
    border-top:3px solid #ea9878;
}
.ribbon:after, .ribbon:before {
    content: &amp;quot;&amp;quot;;
    position: absolute;
    top: 100%;
    height: 0;
    width: 0;
    border: 5px solid transparent;
    border-top: 5px solid #bb2925;
}
.ribbon:after {
    left: 0;
    border-right: 5px solid #bb2925;
}
.ribbon:before {
    right: 0;
    border-left: 5px solid #bb2925;
}

</style>
</head>

<body>
<form runat="server">

<h1>これは標的型攻撃メールの訓練用のページです。</h1>

<p class="ribbon"><span>訓練の目的</span></p>
<h2>
あなたにお送りしたメールは、標的型攻撃メールを疑似体験していただき、<br>
標的型攻撃メールへの耐性を身につけていただく目的で送付したものです。<br>
害はありませんので、ご安心下さい。<br>
また、メールを確認していない人に訓練であることを知らせないようにお願い致します。
</h2>

<p class="ribbon"><span>今後について</span></p>
<h3>
下記の注意事項を読んでから、ブラウザを閉じてください。<br>
今後の訓練のため、アクセスした人のデータを取得しています。<br>
取得したデータをもとに、学習コンテンツの作成やテストなどを実施する予定です。<br>
この訓練に関するお問い合わせは、システムサービス課までご連絡下さい。
</h3>

<img src="./pict/teach.png">

<p>
<asp:button runat="server" id="btn1" onclick="btn1_click" text="button1" />
</p>

</form>
</body>

</html>
```

**アクセス結果表示ページのaspxファイル**

```
<%@ Page Language="C#" %>
<%@ Import Namespace="System.Data" %>
<%@ Import Namespace="MySql.Data.MySqlClient" %>

<script runat="server">

protected void Page_Load(Object source, EventArgs e) {
    if (IsPostBack) {
        return;
    }

    if (User.Identity.Name == null) {
        return;
    }

    
    // 接続文字列を作成
    string connectionString =
        "Server=localhost;" +
        "Database=ac_db;" +
        "User ID=XXXX;" +
        "Password=XXXX";
    
    // 取得したデータ退避用
    DataTable dt = new DataTable();
    
    using (MySqlConnection con = new MySqlConnection(connectionString))
    using (MySqlDataAdapter adapter = new MySqlDataAdapter()) {
        con.Open();
  
        // クエリを実行して、結果をDataTableに退避
        string query = "SELECT * FROM ac_table";
        adapter.SelectCommand = new MySqlCommand(query, con);
        adapter.Fill(dt);
        
    }
    
    // 画面上のDataGridとバインド
    datagrid.DataSource = new DataView(dt);
    DataBind();
}
</script>

<html>

<head>
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<link href="./fontawesome-free-5.8.2-web/css/all.min.css" rel="stylesheet">

<style type="text/css">

h1 {
  position: relative;
  color: black;
  background: #d0ecff;
  line-height: 1.4;
  padding: 0.25em 0.5em;
  margin: 2em 0 0.5em;
  border-radius: 0 5px 5px 5px;
}

h1:after {
  /*タブ*/
  position: absolute;
  font-family: "Font Awesome 5 Free",'Quicksand','Avenir','Arial',sans-serif;
  content: '\f00c Check';
  background: #2196F3;
  color: #fff;
  left: 0px;
  bottom: 100%;
  border-radius: 5px 5px 0 0;
  padding: 3px 7px 1px;
  font-size: 0.7em;
  line-height: 1;
  letter-spacing: 0.05em
}

img {
  max-width: 100%
  max-height: 100%
}

</style>
</head>

<body>
<form runat="server">

<h1>標的型攻撃メールの結果表示ページです。</h1>


<p>

</p>

<asp:DataGrid id="datagrid" runat="server" />

</form>
</body>

</html>
```

**統合Windows認証を行うためのweb.config設定**
※認証が失敗した場合なども強制的に訓練用コンテンツを表示するために、エラー時は"error.html"を表示するように設定しています。

```
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
  <system.web>
    <authentication mode="Windows" />
    <customErrors defaultRedirect="error.html" mode="On" />
  </system.web>
    <system.webServer>
        <directoryBrowse enabled="true" />
    </system.webServer>
</configuration>
```

**統合Windows認証を行うためのIISの認証設定**
![WS000003.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/300531/506804d2-6e03-1f3b-29ae-9e822dfd3038.jpeg)


## ADサーバ兼DNSサーバ
訓練メールに記載するURLのホスト名とリダイレクト用サーバのIPアドレスを紐づけするAレコードを登録します。

## LMSサーバ
LMSとは、Learning Management System（学習管理サーバ）のことです。
OSSのLMSとして**iroha Board**を使用しています。
引っ掛かったユーザに対して、Eラーニングで学習を行わせます。
学習コンテンツは、IPAの標的型攻撃メール対策動画と自作の選択式テストを用意しました。

* OS: CentOS7
* Webサーバ: Apache

* iroha Boardのインストールは[ "iroha Boardインストール" ](https://irohaboard.irohasoft.jp/download/)をご参照ください。

# 動作結果
ユーザ画面
![クライアント画面.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/300531/9b2563b6-c5e3-fd2a-5dc2-c65e663430ab.gif)

管理者画面
![WS000005.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/300531/7b38f5b4-ae20-10b2-3642-d5f3e7844f1e.jpeg)

Eラーニング画面
![Eラーニング画面.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/300531/129cffcb-b234-926a-98a2-98ef579cc7bb.gif)