Herokuで罠サイトを作ってアクセスログを確認した
こちらの記事でやりたかったことの続きです。
これまで、Firebase Hosting, Netlifyで試してみましたが、どちらも公開しているWebアプリのアクセスログを確認することができませんでした。
ということで今回は、アクセスログを確認できるHerokuで罠用Webアプリを公開し、アクセスログを確認するところまで試してみました。
目次
やりたかったこと
先日、「iTunesカードの窃取」を狙ったメッセージを受信しました(最終的にはいたずらでしたが)。
アカウントを乗っ取られた可能性のある友人の助けになるため、罠サイトを作成して、アカウントを乗っ取った犯人に罠サイトを踏ませることで、犯人のアクセス元IPアドレスを取得することを考えました。
この方法は、以前参加したSECCONの問題で使われていたものです。SECCONの問題もまた、実際の事件を元にして作られているらしいです。
環境
Ubuntu 16.04
罠サイト公開までの手順
Herokuのアカウント作成
Herokuにアクセスし、アカウントを作成します。
クラウド・アプリケーション・プラットフォーム | Heroku
アカウント作成が完了したら、作成したアカウントでログインしておきます。
各種ツールのインストール
Heroku CLI
Heroku CLIは、コマンドラインからHerokuを操作するためのツールです。
Herokuの環境をgitで操作したり、ローカルに開発用Webサーバを起動したりすることができます。
The Heroku CLI | Heroku Dev Center
$ sudo snap install heroku --classic sudo: snap: command not found
Ubuntuのバージョンを上げていなかったので、snapが入っていませんでした。
ということでsnapdをインストールするところから。
$ sudo apt-get install snapd $ sudo snap install heroku --classic
無事インストールできたので、Heroku CLIでログインしておきます。
$ heroku login
pipenv
今回はHeroku上でflaskを使ってWebアプリを動かそうと思います。pipenvが入っていない場合はインストールしておきます。
$ pip install pipenv
pipenvの使い方などはこちら
pythonのバージョンを指定し、pipenvの仮想環境を作ります。
$ pipenv install --three
flask、gunicorn
pipenvの環境に、flaskとgunicornを追加します。
flaskは、pythonで使える軽量のWebアプリケーションフレームワークで、gunicornはWebサーバーです。
$ pipenv install flask $ pipenv install gunicorn
必要なもののインストールが終わったので、罠コンテンツを作成します。
罠コンテンツ作成&ローカルで確認
今回はitunesカードが表示されているだけの、シンプルな静的ページを準備します。 コンテンツの装飾には、以前から1度使ってみようと思っていたBulmaを使いました。
構成は下記のようになっています。
$ tree . . ├── Pipfile ├── Pipfile.lock ├── Procfile ├── static │ ├── css │ │ └── bulma.css │ └── images │ └── card.png ├── templates │ └── index.html └── trap-app.py
Herokuで必要となるProcfileは下記のようになっています。
$ cat Procfile web: gunicorn trap-app:app --log-file=-(trap-app)
コンテンツが完成したら、ローカルでWebサーバを起動して確認してみます。
今回はpipenv環境にflaskを入れているので、pipenv環境のshellに入ってからHeroku CLIでローカルWebサーバを起動します。
$ pipenv shell $ heroku local web 23:43:52 web.1 | [2019-02-11 23:43:52 +0900] [8587] [INFO] Starting gunicorn 19.9.0 23:43:52 web.1 | [2019-02-11 23:43:52 +0900] [8587] [INFO] Listening at: http://0.0.0.0:5000 (8587) 23:43:52 web.1 | [2019-02-11 23:43:52 +0900] [8587] [INFO] Using worker: sync 23:43:52 web.1 | [2019-02-11 23:43:52 +0900] [8590] [INFO] Booting worker with pid: 8590
ブラウザでアクセスしてみます。
Herokuにpush
gitリポジトリを作成します。
$ git init $ git add . $ git commit -m "init."
Heroku上にアプリを作成し、pushします。
$ heroku create {アプリ名} $ git push heroku master
罠サイトにアクセスしてアクセスログを確認
ターミナルで下記のコマンドを実行します。
$ heroku logs --tail
Heroku上にdeployした環境にアクセスします。
アクセスログを見ると、「{IPアドレス}」の部分にアクセス元のIPアドレスが表示されていることが確認できました。
(IPアドレスやidは適当にマスクしてます。)
2019-02-11T15:00:26.415703+00:00 heroku[router]: at=info method=GET path="/" host=XXXXX.herokuapp.com request_id={id} fwd="{IPアドレス}" dyno=web.1 connect=1ms service=9ms status=200 bytes=772 protocol=https 2019-02-11T15:00:26.414844+00:00 app[web.1]: YYY.YYY.YYY.YYY - - [11/Feb/2019:15:00:26 +0000] "GET / HTTP/1.1" 200 611 "-" "Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.96 Mobile Safari/537.36"
後は、「$ heroku create {アプリ名}」の時にそれらしき名前をつけたり、bit.lyなどでURLを短縮すれば犯人にアクセスしてもらう可能性が上がるかもしれません。
その他
他の端末にHerokuで作ったアプリケーションをgit clone
$ heroku git:clone -a {アプリ名}
で、Heroku上のアプリをgit cloneしてくることができます。
感想
以前はVPSを契約していたのですが、作っていたWebアプリの公開をやめたので解約していました。今回Herokuを初めて使ったのですが、無料で簡単にWebアプリを公開できるのは、とてもありがたいですね。
ブログを書きながら「MediaDevices.getUserMedia()
を使って、犯人の写真を保存できるようにしたら、もっと役に立つかも」と思ったので、またの機会に試してみようと思います。