動的にIPアドレス制限を更新する knockrd - fujiwara-ware 2024 day 19
この記事は fujiwara-ware advent calendar 2024 の19日目です。
knockrd とは
knockrd は、サイトにアクセスするためのIPアドレス制限を動的に更新するためのツールです。「ノッカーディー」と読みます。
knockrd は Web アプリケーションとして動作し、HTTP リクエストを受け取ると、そのリクエスト元の IP アドレスを許可リストに追加します。許可リストに追加された IP アドレスは、一定時間が経過すると自動的に削除されます。最初にアクセスするリクエストを適切な方法で認証することで、認証された人が使っている IP アドレスのみを動的に許可リストに追加することができます。
なぜ作ったのか
令和の時代になっても、IPアドレス制限という風習はなかなかなくなりません。ゼロトラストを適切に導入すればそのような前時代的な制限は不要とも思えるのですが、それが難しい場合もあります。
筆者の場合、具体的にはスマホアプリ(ゲーム)の開発環境に、開発用のアプリケーションからのアクセスのみを許可する必要がありました。アクセスは HTTPS なので OIDC などの認証を導入することはできますが、Unity で作られたゲームのアプリケーションから OIDC を使って認証を通過するのはなかなか難しいものです。そもそも本番ではアクセス元の認証は必要ないアプリケーションですし、そのために特別な仕組みを入れるのは大変です。
IP アドレス制限は、固定の IP アドレスを持つ場所からのアクセスを許可するための一番簡単な方法です。しかし折しも時代はコロナ禍で、オフィスなどの固定のアドレスを期待することが難しい状況でした。そこで動的に許可リストを更新するための仕組みとして knockrd を作りました。
動作原理
knockrd は HTTP サーバーとして動作します。HTTP リクエストを受け取ると、そのリクエスト元の IP アドレスを DynamoDB のテーブルに追加します。(このリクエストを別途、適切な方法で認証することが最も重要です)
DynamoDB Stream から起動される Lambda によって、追加された IP アドレスをセキュリティグループや WAF IP Set に反映します。
DynamoDB の TTL 機能を使って、一定時間が経過した IP アドレスを削除します。Stream から起動される Lambda によって、セキュリティグループや WAF IP Set からも削除されます。
WAF IP Set と連携するシーケンス図を以下に示します。
他にセキュリティグループや nginx auth request の仕組みを使って IP アドレス制限を動的に更新する運用も可能です。詳細は README を参照してください。
運用方法
knockrd はこのアドベントカレンダーの10日目で紹介した ridge を組み込んでいるため、AWS Lambda で動かすことができます。Lambda で実行する場合、サーバーの運用は不要です。
knockrd にアクセスした最初のリクエストは、別途適切な方法で認証認可を行う必要があります。例えば、Basic 認証や OIDC などです。
ただし knockrd 自体には、リクエストに対する認証認可の機能はありません。認証認可は別途用意する必要があります。筆者は主に ALB (Application Load Balancer) の OIDC 認証を使い、ALB から Lambda を起動していました。
HTTP アクセスを受け付ける Lambda の他に、DynamoDB Stream から起動される Lambda が必要です。この Lambda は、DynamoDB のテーブルに追加/削除された IP アドレスをセキュリティグループや WAF IP Set に反映する役目を担います。Web アプリケーション用の Lambda と DynamoDB Stream から起動される Lambda のどちらも knockrd のひとつのリリースバイナリを bootstrap
という名前で配置するだけで動作するため、デプロイは簡単です。
運用時は稀にしか実行されない(アクセス許可を更新するリクエストのみ) Lambda と DynamoDB で完結するため、一旦導入できれば固定費用はほぼ掛からずに運用できるはずです。
まとめ
knockrd は、IP アドレス制限を動的に更新するためのツールです。AWS Lambda で動作し、DynamoDB と連携して IP アドレスの追加と削除を行います。
固定の IP アドレスリストを用意した場合、リクエストに応じて頻繁に更新し、さらに不要になったアドレスを削除してセキュアに保つのはとても手間がかかります。knockrd を使うことで、その手間を大幅に削減できるはずです。
もしこのようなニーズがある場合は、ぜひ knockrd を試してみてください。
それでは、明日もお楽しみに!
参考資料
Discussion