ファイヤーウォール(nftables)のホワイトリストを動的に変更する

ファイヤーウォール Linux
このサイトはアフィリエイト広告(Amazonアソシエイト含む)を掲載しています。
スポンサーリンク

管理者からのアクセスを nftables や Apache(Require ip)で許可する際、固定 IP アドレスを前提に設定する場合は簡単ですが、固定 IP を持っていないユーザーに対してポート制限やアクセス制限を動的に変更できないかという相談を受けました。

要件

  • Web サイト担当者の自宅から FTP(990、60000~60100)ポートと、WordPress の管理画面(/wp-admin)にアクセスできるようにさせたい。
  • 担当者の自宅はフレッツ光の常時接続なので滅多にグローバル IP が変わらないが、年に数回変わることがある。現在契約しているプロバイダーの固定 IP アドレスオプションは高額(OCN:10,780円/月)なので使いたくない。
  • 固定 IP アドレスの安いプロバイダー(GMOとくとくBB:1,210円/月)もあるが、プロバイダーの乗り換えは不可。
  • VPS の管理画面へのアクセスは不可。
  • 会社への VPN 接続は不可。

年に数回、ウェブマスターのグローバル IP が変わってしまったときに対応できれば良いようなので、ブラウザからファイヤーウォールの設定と、Apache のアクセス制限を変更できる仕組みを作ることにします。

準備

ディレクトリの作成

今回は /usr/share/ip_refresh に一連のファイルを作成していく事にします。

データを格納するサブディレクトリ(data)を作成し、パーミッションを変更します。

設定ファイルの作成

ユーザー情報の設定ファイル(config.ini)を作成します。

設定ファイルのフォーマット

  • [セクション]: 拠点名
  • description: 拠点の説明
  • ipv4: グローバル IPv4 アドレス
  • host: リモートホスト(後方一致、前半の変動する部分は記述しない)

セクションを分けることで、複数の拠点も登録できます。

データは PHP から書き換えるので、所有者を Apache に変更しておきます。

WebUI の作成

フォームの作成

まずはメインとなるフォームを作成します。

フォームと非同期通信するための JavaScript を作成します。

フォームのリクエストを実際に処理する PHP を作成します。

ウェブマスターの IP アドレスに変更があった場合は、nftables と Apache に読み込める形でホワイトリストを作成します。

設定を反映させるのに cron を使います(後述)ので、変更を検出しやすいようにフラグファイルも作成しています。

Basic 認証

WebUI に Basic 認証をかけて、不正なアクセスを防ぎます。

Apache の公開設定

Apache の設定ファイルを作成して、WebUI を公開します。

Alias にあえて日本語を使用することで、少しでも推測されにくい URL にしている(つもり)です。

サービスに適用する

ホワイトリストを nftables と Apache のディレクトリに移動し、サービスに反映するシェルスクリプトを作成します。

実行権限を付けておきます。

作成したシェルスクリプトに visudo で sudo 権限を編集し、Apache(php)から shell_exec しようとしましたが、上手くいきませんでした。

代わりに Cron から実行したところ意図した通りに動きましたが、タイムラグが発生してしまいます。

今回の依頼者はタイムラグを許容できるとの事だったので、Cron で 5 分おきにチェックして、フラグファイルが存在したら(IP アドレスが変更されていたら)処理を実行するようにしました。

nftables の設定変更

今回はウェブマスター用のホワイトリスト(/etc/nftables/list/webmaster)に対して、FTP 用のポートを通すように nftables の設定を変更していきます。

ベースとなるファイヤーウォールの設定は、過去の記事を参照してください。

Apache の設定変更

次に Apache の WordPress 用の設定を変更して、管理画面(/wp-admin)にアクセス制限を追加します。IncludeOptional で取り込むと、ファイルが無かった場合でもエラーにならないので便利です。

※同様に設定すれば、phpMyAdmin などにも流用できて便利です。

fail2ban の設定変更

ついでに fail2ban の除外設定にも追加しておきます。

アクセス元の IP アドレスが config.ini に記述してあれば、監視対象から除外します。

whitelist (ignoreip dynamically) · fail2ban/fail2ban · Discussion #3615
When logging in from home into my server I'm getting assigned an IP from my service provider s taying constant for a whi...

まとめ

以上で、ブラウザからファイヤーウォールの設定を動的に変更する事ができるようになりました。

今回は依頼者の希望でこのように設定しましたが、Basic 認証がかかっているとはいえ公開サイト上に設置するのはリスクがあります。

この記事のやり方を推奨するものではなく、こんな方法もあるよという感じで参考程度にしてください。


本来はプロバイダーの固定 IP アドレスサービスを利用するのが無難だと思います。固定 IP アドレスを追加するなら GMOとくとくBB が、月額 1,210円で最も安くておすすめです。

コメント

タイトルとURLをコピーしました