山本ゆうごブログ

山本ゆうごの仕事メモ

接続元のドメイン名×メソッドでアクセス制限するのが楽で効果的

攻撃者が捕まるケース

相変わらずセキュリティの問題は出てきていますが、その犯人ってあっけなく捕まったり捕まらなかったり。一方で携帯で匿名掲示板に殺害予告を書くとあっけなく逮捕されてる。これは、接続元のIPアドレスが分かれば、携帯電話会社に警察が問い合わせて契約者を特定できてしまうため。

携帯電話って比較的本人確認が厳格なので、すぐに足がつく。なので、本当に攻撃をしている人達って、日本の通信会社を使わない。IPアドレスで言えば中国が多い。

じゃぁ接続元を日本に絞ればいいじゃない

日本のIPアドレスはだいたいわかる。そして、.htaccessみたいなところに書いておけばいい。 日本[jp]に割り当てられたIPアドレスの一覧 : ipv4.fetus.jp

ただしこの制限をそのまま入れちゃうと、たまに不便。AndoridのChromeとかは、Googleのプロキシを通してアクセスすることで、通信量を節約している。そうなると接続ができない。ちなみにこの制限で私個人も、GyaOとかスカパーのサービスに接続できなくて苦労した。ただし、それくらい乱暴だけどよく使われている手法ではある。

さらにGoogleクローラーは許可したかったりする。

じゃぁ中国と北朝鮮のみを制限すればいいじゃない

そういうフィルタもある。 krfilter : ipv4.fetus.jp

ただし、.htaccessレベルでドーンと制限しちゃうと、「中国からは拒否してるよ!」ってことが攻撃者にバレちゃう。対策練られやすい。

Location × メソッド × ドメインで絞る

例えば、WordPressではadminのディレクトリは、自分しかアクセスしないのなら、自分が契約しているプロバイダのみに絞る。自分が接続しているプロバイダのドメインは、確認くんとかで見れる。

確認くん

私は今、Biglobeでアクセスしているので、mesh.ad.jp のみを許可すればいい。ドメイン別に許可を与えるのは昔ながらのApacheの機能でもできる。

ミケネコの htaccess リファレンス

固定IPアドレスがあるといいのだけれど、そこまで厳密でなくても、プロバイダ外からのアクセスを防止するだけでも1000倍リスクは減る。

また、ドメインでの制限を加えると、IPアドレスからドメイン逆引きするので、パフォーマンスが落ちる。だからログインにつかうようなPOSTメソッドだけに絞るといいでしょう。ログインが高速である必要はない。あと、攻撃者のIPアドレスって、ドメイン名を持ってないことが多いので、逆引きに時間がかかる。攻撃者のみに嫌がらせもできて一石二鳥。

アプリレイヤーでカバーする方法

Webサーバ自体にドメインの逆引きをやらせるのってインフラ面ではハードルが高かったりする。ログイン周りが一番狙われやすいので、ログインの直前に接続元のチェックを入れるという方法もある。IPアドレスPHPでは、$_SERVER['REMOTE_ADDR']で取得可能。

<?php
echo gethostbyaddr("60.237.175.89"); // => flh1aef089.tky.mesh.ad.jp
require 'resolv'
r =  Resolv::DNS.new(:nameserver => ['8.8.8.8'])
p r.getname("202.225.233.218").to_s # "FLH1Amj218.tky.mesh.ad.jp

これで、ドメインが絞れる。docomoからのアクセスがいいなら、「spmode.ne.jp」で絞ったりする。

大半の日本のプロバイダは、.jpで終わるから、それで判断してもいいけど、ソフトバンクはbbtech.netだったりするので面倒。

アプリレイヤーで、接続元ドメインを把握できれば、ユーザが別プロバイダからログインした時に強く警告を出すというようなことも可能。

まとめ

セキュリティに絶対はないので「何桁リスクを減らせるか」を考える。鍵をガチガチにかけると一般ユーザも不便になる。一方で監視カメラは一発目の犯罪の防止はできないが、「足が付きやすい」ことから、抑止にはなる。ピッキングは防げないけど、ドアにカメラがあるとかなりハードルが高い。