Azureでブログを作ってみた
Feb 18, 2020 18:09 · 3066 words · 7 minute read
技術ブログをMicrosoft Azureで作ってみたときの記録
彌冨研 Advent Calendar 2019 4日目になりました。かなでです。ブログが完成しなかったら記事の内容が「2019年をタピオカで振り返る」になってたところでしたが無事間に合いました。ちなみにタピオカはTHE ALLEYが一番好きだったのですが、最近それよりも吉祥寺の丸井の中にあるcomma teaがイチオシです!!タピオカの記事はまた今度にして、今日はこのブログを作るために奮闘した記録を書き綴って行きたいと思います。
今回のアドベントカレンダーのタイトルでは「Azureを使ってアウトプット用マイブログを作ってみる」としてました。先輩方のように自分もこれから読んだ論文のことや実装したものなどをブログで発信していきたいな!と思ったので、頑張ってブログを作りました。
Azureを使う
僕の周りではクラウドと言うと大半がAWSを使っているのですが、僕は断然Azureがイチオシです!!クラウドのシェア率をこちらからみてみると、 やっぱりAmazonが強いですが、Microsoftもだんだんと伸びています。個人的にAzureはAWSと比較して初学者に優しいかなと思います。ドキュメントもわかりやすく、ポータルも使いやすいので。(AWSやってみたものの分からなくてクレジット一瞬で使い切ってさらに数十ドル課金されてしまいました。)
今回はAzure Web Serviceを使ってカンタンにブログを構築して、そこで負荷をかけてスケールさせてみたりだとか、バックアップからのリストアが細かい時間指定ができるのでそこら辺なんかを紹介しつつこのブログを作りました!と言うのを記事にしていこうと考えてたのですが、想像以上にお金がかかってしまうことがわかったので今回はAzureでVMを立てて作っていくことにしました。下の写真のようにすごくお金かかります。なのでAzureの機能についての説明はほとんどないです。それを楽しみにしていた方すみません。
DBだけで2900円/月は個人ブログでは高すぎる。
Azure portalの「リソースの作成」からUbuntuを選択してVMを作成。これなら月数百円で動かせる!
でVM作ったらまずAzure側のポートを開けてssh接続できるように設定します。
ソースIPには自分のグローバルIPアドレスを設定。
同様に公開予定の80番ポートも開けておく。
あとは基本CLIで操作。PBLで勉強したDockerを使ってwordpress環境を構築してブログを作ってみました。Docker,docker-composeを入れたらcomposeファイルを作成。公式リファレンスを参考にcomposeファイルを作成します。
version: '3.3'
services:
db:
image: mysql:5.7
volumes:
- db_data:/var/lib/mysql
restart: always
environment:
MYSQL_ROOT_PASSWORD: *************
MYSQL_DATABASE: *************
MYSQL_USER: *************
MYSQL_PASSWORD: *************
wordpress:
depends_on:
- db
image: wordpress:latest
volumes:
- ./wordpress:/var/www/html
ports:
- "80:80"
restart: always
environment:
WORDPRESS_DB_HOST: db:3306
WORDPRESS_DB_USER: *************
WORDPRESS_DB_PASSWORD: *************
WORDPRESS_DB_NAME: *************
volumes:
db_data:
これで動作確認。
そして、研究室で先輩とGithub Studentsについて話してたら無料で一年間使えるドメインを見つけたので早速使ってみました。name.comというサービスです。
ドメインを選択し、Manage DNS RecordでRecordを選択。AレコードにAzure portalのVMの概要欄にあるパブリックIPを対応させます。
これで一通りブログの作成は完了です。
使ってみた感じとしては、Azureのディスク使用量がエグくなってDBとのコネクションが頻繁に切れるので使いづらいです。頻繁に書くなら普通のブログのが断然いいです笑。
セキュリティ面にも気を配ってみる
最近、別のAzureのVMで構築してるWebサーバのログをみてみたらポートスキャンが多い日には20件ぐらい、重要な情報を盗もうとしたりする攻撃が多い日には200件以上くるなど頭を悩ませる事態が発生してしまいました。このサイトは一応ユーザ登録が必要なもののユーザ数3,4人の身内で適当にやってるサイトなので特に重大なインシデントに繋がることはないのですが対策を考えていました。(そのWebサーバもwordpress環境と同じようにDockerで立てているので、両方に対応する対策を探していました) 前はなかったのにログにこんなのが増えてしまいました。 調べてみるとそのほとんどが中国とアメリカからの攻撃だったことがわかり、攻撃されたサーバは停止して打開策を考えていました。手っ取り早い方法として海外からのアクセスを遮断する方向で考え、参考サイトなどをお手本に日本のIPのみを許可するホワイトリスト方式でiptablesの設定を作る方針で試してみましたが、nginxなどではうまく遮断できるものの、Docker環境で立てた場合では遮断することができなかったりiptablesの再起動を試すとコンテナの立ち上げでエラーが発生してしまいました。
Creating network “wordpress_default” with the default driver
ERROR: Failed to program FILTER chain: iptables failed: iptables –wait -I FORWARD -o br-ee************ -j DOCKER: iptables v1.6.1: Couldn’t load target `DOCKER’:No such file or directory
のようなエラーが出てコンテナを立ち上げられなくなってしまうこともありました。実はこの原因はDockerにあって、Dockerはコンテナの起動時にiptablesの設定を書き換えてしまうみたいで厄介なことにその状態でiptablesを編集して再起動したりするとDockerによって書き換えられた(チェーンされた)ポートの設定は全て飛んでしまうみたいです。
docker公式より
別の方法として、Azure側でこのポートの設定を行って、VMのiptablesはいじらないようにする方針を試してみました。と言ってもAzure portalのGUIでポチポチやってたらいつまでたっても終わらないのでCLIで操作できるAzure CLIを使い、スクリプトで操作することにしました。
この方のスクリプトを元にしてルールを作成し、このスクリプトの形式に合うように許可するIPアドレスのリストを作成するためこちらのサイトさんからCIDR表記のtxtファイルを落としてpythonで国コードが日本のものだけ取ってきて表記を整えました。
(シェルスわからないマンなのでpythonに逃げました)
jp_ip_list = []
f = open('cidr.txt', 'r')
line = f.readline()
while line:
line = f.readline()
if line != '':
data = line.split()
if data[0] == 'JP':
jp_ip_list.append(data[1])
f.close()
with open('cidr.txt', mode='w') as f:
f.write('\n'.join(jp_ip_list))
で、スクリプトを実行してみたのですが、遅い!!
一つのルールの作成に15〜20秒程度かかっていて2861個あるルールを全て追加するには時間がかなりかかる上、このリストは更新されるので週一回確認して直していくことを考えたらとても大変だったので今回は断念することにしました。
WordPressならプラグインで防げる
Dockerを使わずに普通にLAMP環境を構築すればiptablesを弄って出来るのでそれで作り直そうかと諦めていたところ、Wordpressの良いプラグインを発見しました。上記のような方法を使わなくともIP GEO Blockというプラグインの導入で海外からの不審なアクセスやコメントの投稿をホワイトリスト/ブラックリストで遮断できるのでこのサイトではそれを利用することとしました。
WordPressなら防げたのですが結局別のWebサーバの方は有効な打開策がまだ見つけられてないです。Docker hubにmod securityというWAFがあったので次はそれを試してみようと思いますが詳しい方もしよろしかったらコメント欄等で防衛策について教えてください。
引き続き明日も弊研のアドベントカレンダーをお楽しみください。ありがとうございました。