Laravelで管理画面に接続元IP制限をかける方法
目次
個人情報の流出を防ぎたい
各種サービスで個人情報の流出が相次いでいて恐ろしいですね。単なるログイン機能だけでは脆弱性が見つかった場合にあっさり突破される恐れがあります。
ログイン機能のセキュリティ強化としてはreCaptchaでのボット防止、2要素認証など色々とありますが、ここでは接続元IPアドレスの制限を紹介します。
接続元IPアドレスを制限することで特定のオフィスからのみアクセス可能になります。
IP制限用テーブル
接続を許可するIPアドレス保存用として次のようなテーブルを準備します。
Schema::create('ip_settings', function (Blueprint $table) {
$table->id();
$table->boolean('use_ip_restriction')->default(false)->comment('IP制限フラグ');
$table->json('allow_ips')->nullable()->comment('許可するIPアドレス');
$table->timestamps();
});
IPアドレス制限の有無を格納するフラグと、許可するIPアドレスをjson型で複数登録するテーブルです。
1レコードのみのデータを持たせる想定です。
IP制限の実装
IP制限は各管理画面のControllerの継承元にするBaseAdminControllerに実装します。
class BaseAdminController extends Controller
{
public function __construct(
ListIpSettingsService $listIpSettingsService,
)
{
// IP制限チェック
$ip_setting = $listIpSettingsService->list()->first();
if ($ip_setting instanceof IpSetting && $ip_setting->use_ip_restriction && !in_array(request()->ip(), $ip_setting->allow_ips ?? [])) {
abort(403);
}
}
BaseAdminControllerのコンストラクタ(クラスをインスタンス化した時に、必ず実行されるメソッド)でIP制限チェックを行います。
IP制限のレコードが存在し、IP制限有り(use_ip_restrictionがtrue)の場合に、アクセス元のIPアドレスが指定したIP一覧(allow_ips)に含まれるかどうかをチェックしています。
許可していないIPアドレスからのアクセスの場合は403(forbidden)エラーページに飛ばします。
BaseControllerとして実装する以外にミドルウェアとして実装し、ルーティングファイルなどでミドルウェアを実行して同様のチェックを行う実装でもかまいません。
まとめ
もちろんこれだけではセキュリティが完璧とは言えません。
オフィス内に届くフィッシングメールを開いてアカウント情報が流出し、そのPCを踏み台にされるとIP制限の意味は無くなってしまいます。
ただ少しでもハードルを上げておくことは大事です。AIの時代になり、より脆弱なシステムを見つけて攻撃してくるためです。
適切なOSやフレームワークのバージョンアップと併せて対策を行いましょう。



















