macOSのアプリケーションファイアウォール Vallum
この記事で実現すること
macOS(Big Sur)向けアプリケーションファイアウォールのVallumを使い、macOS標準のファイアウォールよりも高度な制御をします。自宅のWi-Fiの接続状態やVPN接続状態に応じたコントロールが可能です。
Vallumについて
Vallum4は、macOS Big Sur向けに作成されたアプリケーションファイアウォールです。Catalina以前のmacOSにはVallum3が提供されています。作者はイタリアの方で現在3名程度のチームでエンハンスされているようです。仕組みとしてはアプリケーション毎に外への接続要求、および受信を受け入れる要求とをそれぞれにルールを決めるタイプのものです。Vallumの価格は$15に日本国内の消費税を加え、1,850円前後でとても安価です。
ファイアウォールは一般的に上位のルールから順に下位に順次チェックを行っていき、ルールが最初に一致したものを選択しアクセス制御をするのが一般的です。しかし、このVallumはファイアウォールルールが特徴的で、複数一致するルールを用意し、最後に一致したものが採用されるという方式です。
Vallum4から実装された機能に接続中のWi-FiのAP名でルールを機動的に変更できます。仕事用のAPと自宅用APとで制御を変えるなど、外出事の運用には非常に有用です。
Vallum Firewall
https://vallumfirewall.com
アプリケーションファイアーウォールの有用性
個人向けのサイバーセキュリティ対策としてのアプリケーションファイアーウォールは難易度が高いことや、アプリケーションの信頼性評価が難しい事によって積極的に厳格な設定を勧める記事はあまり見かけません。しかし、昨今のランサムウェアなどの個人向けサイバー攻撃の脅威を考えると、アプリケーション自身に悪意はなくとも、脆弱性を悪用されるケースが懸念されます。アプリケーションの振る舞いを把握し制約を与える事は個人向けの一歩進んだセキュリティ対策と言えるでしょう。Windowsでは、Windows Defenderのセキュリティが強化されたWindows Defenderファイアウォールの設定で、受信/送信それぞれのルール毎にIPアドレスやPortを詳細にフィルタできます。なお、セキュリティ対策ソフトに付属するアプリケーションファイアウォールはレピュテーションチェック[1]がメインであり、アプリケーションの信頼性評価によって通信の可否をコントロールする事を目的としていますので趣旨は異なります。
一方、macOSのファイアウォールには昔からLittle Snitchという定番のソフトウェアがあります。これは非常にグラフィカルで、世界地図を見せながらどの場所からアクセスしているのか、非常にわかりやすくなっています。こちらはアプリケーションの特性からどの範囲に通信を認めるかをユーザーが厳格に決める事を目的としています。45ユーロなので6,000円弱というコストで非常に長い間多くの方に愛用されているソフトウェアです。
Little Snitch
https://www.obdev.at/products/littlesnitch/index.html
Little Snitchのおかげか、macOSユーザーがアプリケーションファイアウォールに求めるレベルは高いものがあります。グラフィカルな見せ方や設定よりも、シンプルに細かい制御をしたいという事であればVallum Firewallは廉価でお勧めです。
この記事ではVallumを使い、以下のセキュリティ強化策を実現します。
- ローカルネットワークへのアクセス不要なアプリケーションはアクセス要求を拒否します。
- インターネット接続先が固有ドメインなど決まっている場合はそのドメインのみ許可します。
- 受信ルールとして最低限度必要なサービスのみ受信要求を許可します。
- 自宅と自宅外で受信ルールを変え、外出先ではさらに受信要求を拒否します。
Vallumは、アプリケーションのレピュテーションをチェックする機能はありません。しかし、macOSの場合はフォルダへのアクセス権などセキュリティとプライバシーでアプリケーション毎に明確に設定可能です。またApp StoreやHomebrewを使う事で正当なアプリケーションである事に一定の信頼性が担保されています。
Vallum設定の一例(Outbound)
いくつかOutbound(外に出ていく通信)のルールの例を挙げてみます。まずは翻訳ソフトのDeepLです。
これは翻訳するためにDeepLのサイトに接続する事だけを許可するというわかりやすい例です。そして、 Localsというのは私が作成したグループですが、IPv4、IPv6のプライベートネットワークアドレス(リンクローカル、IPv6のULAを含む)です。翻訳ソフトは自宅のネットワークのホストにアクセスする必要は無いので、プライベート宛通信をブロックしています。iOSのローカルネットワークの機能で制限を与えるのと同等の設定になります。
ルールに無いものは自動的にポップアップされ、その動作をユーザーに決めるよう促されます。
上記の例、例えばSafariであれば、さまざまなURLへとアクセスするので、個々のサイト、ドメインに対して許可するのではなく、Safariに対してインターネットアクセス全てを認める事になるでしょう。
Vallumのセットアップ
まずはVallumのWebサイトに DOWNLOAD VALLUM 4という文字を見つけそこからダウンロードします。macOSのCatalina以前はVallumのVersionは3となり、この記事での説明は該当しませんのでご注意ください。Vallum4にはBig Surが必要です。2021-9-4時点の最新バージョンは、4.0.3となります。
また、Homebrewでもインストール可能です。
1 | brew install vallum --cask |
まず、アプリケーションのインストールが完了するとOS起動時に自動起動するように構成されます。初期セットアップでは、基本ルールをVallum Assistantによって決定します。
ルールは、Inbound、Outboundそれぞれ分かれています。
Inbound Policy①
項目 | 説明 |
---|---|
Pass connections from local networks | プライベートIP(IPv6はリンクローカル)からの接続要求を許可 |
Pass mDNS connections | マルチキャストDNS(Bonjour) による名前解決の要求を受入 |
Block unsigned apps | 署名されていないアプリケーションをブロック |
Outbound Policy②
項目 | 説明 |
---|---|
Pass root connections | rootユーザーによる接続を許可 |
Pass mDNS connections | マルチキャストDNS(Bonjour) による名前解決の要求を許可 |
Pass connections to local networks | プライベートIP(IPv6はリンクローカル)への接続要求を許可 |
Pass connections to Apple and iCloud | Appleのパブリックネットワークおよび関連ドメイン、iCloudへの接続要求を許可 |
Pass all App Store apps | Appストアでインストールしたアプリケーションは接続要求を許可 |
Pass all macOS preinstall apps | macOSのプリインストールされたアプリケーションは接続要求を許可 |
Pass trusted system process | macOSの信頼されたシステムプロセスは接続要求を許可 |
Pass Safari Bookmarks | ブラウザSafariのブックマークされたURLへの接続要求を許可 |
Block unsigned apps | 署名されていないアプリケーションをブロック |
ルールに該当しない場合の挙動③
これらのデフォルトのルールや個別のアプリケーションで明確なルールが見つからなかった場合の挙動を選択します。
- Request user authorizationユーザーに許可するかどうかをポップアップし判断を促します(デフォルト)
- Block all inbound connections by defaultユーザーに尋ねずInboundの接続要求をブロックします
- Allow all inbound connections by defaultユーザーに尋ねずInboundの接続要求を受け入れます
- Allow all outbound connections by defaultユーザーに尋ねずOutboundの接続要求を許可します。
最初はデフォルト設定で運用し、安定してきたらInboundの接続要求をブロックするなどカスタマイズされる事をお勧めします。最初から厳しくするとトラブルの元なので慣れるまでは割と緩めの設定が良いでしょう。
初期設定の後は、常駐プロセスがアクセスする都度、しばらくポップアップのラッシュが続きます。落ち着くまではPassボタンをクリックし続けるしかありませんが、ある程度経ってから、アプリケーション毎にアクセスする形態を鑑み、サブドメイン単位の許可、Port単位の許可など調整していくのが良いでしょう。
Outboundルールについては、数時間ルールと格闘する事にはなりますが、やがて落ち着きポップアップの頻度も減ってくる事でしょう。
Outboundルール
デフォルトのポリシーでセットアップした場合のOutboundルールを見てみましょう。VallumのアイコンからFirewall Configurationを選択し、FIREWALLS RULESのOutboundを選択します。
Outboundのルール0にユーザーに尋ねる原則ルール(ASK)があります(これは必ず一致するルールです)。ルール1以降に一致する条件が無ければ、ルール0が選択され、”ユーザーに尋ねる”という事です。
VallumはASKの選択の仕方にも種類があります。
Actionの項目でユーザーに動作を尋ねるASKがありますが、ユーザーが応答しなかった場合、さらにその挙動を明示できます。VallumのConfigurationからPreferenceボタンをクリックし、Alert画面で設定が可能です。上記のキャプチャの右側にNotification expire afterという項目があります。ここではデフォルトの30秒となっていますが、この30秒ユーザーが無応答の場合は2分だけ接続を許可する設定ができます。また、許可する場合も永遠に許可する、今日は許可するなどの設定も可能です。
なお、Bg Actionという項目は、Vallumが稼働していない時の挙動を決めるものです。厳密にいえば、OS起動時にネットワーク接続した時点ではVallumはまだ起動していないでしょう。この時にルール0で許可するか拒否するかを決めます。Vallumが起動していなければルール1以降の判断は不可能で通信を許可するかしないかのいずれかです。特にOutboundのBg ActionをBlockにすると、DHCPのIP配布に必要な通信も行えない事で、Wi-Fiが接続完了にならない事、自動起動するアプリが軒並み通信リトライとなり、大幅にOSの起動完了が遅れますのでBlockする事はお勧めしません。
初期セットアップで自動作成されたルール1は、最初から用意されたグループlocal-nets、これはプライベートIPネットワークアドレスからUDP/67のDHCPのリクエストがあります。ここのルールにはquickという記述がされています。このquickはVallum独特の考え方で、これ以降のルールチェックは行わないというものです。Vallumは最後に有効となったルールが選択されるという原則がありますが、quickが付いたルールの場合はそれ以降のチェックは行いません。DHCPのやりとりでIPアドレスの配布が受けられないと何も始められません。
続いてルール2はUDP/53のDNSリクエスト、UDP/5353のmDNS(Bonjour)リクエストです。こちらもquick付きで許可されています。
ルール3は信頼されたシステムプロセスが許可されています。これはquickがついていないので、この後ろに拒否ルールを加える事である条件でリクエストを拒否できます。
サブドメインで許可する
ここからは、個別のアプリケーションの通信毎にポップアップされる都度、許可する事でルールが追加されていきます。ユーザーにアクションが求められた場合、IPアドレスで許可する、サブドメインで許可する、このアプリケーションは全て許可するなどの設定が行えます。翻訳ソフトや画像編集ソフトなど、インターネット接続先が固定的になるものはできるだけサブドメインで許可するとメンテナンスが簡単になります。
ローカルネットワークへのアクセスを拒否する
前述の翻訳ソフトのDeepLなど、ローカルネットへのアクセスが不要な場合は、手動でlocal-netsに対するアクセス拒否を加えます。ちなみに、DeepLに限らず大半のアプリケーションは、ネット接続するためにDNSによる名前解決が必須です。DeepLが自宅内(ローカルネット)のDNSにリクエストする際は、1つ前の章で説明したルール2のDNSリクエストが該当します。ルール2はquickオプションがついているため、どんなアプリケーションもDNSへの名前解決は拒否されない仕組みです。よく考えられているなと感心します。
Outboundルールの工夫
アプリケーションには、写真編集やフローチャート作成などネットアクセスを必要としない種類がありますが、バージョンアップの目的でインターネットにアクセスする場合があります。こういったケースでアクセスするドメインを絞る事ができます。またアプリケーションのバージョンアップはApp StoreまたはHomebrew任せにしているのであればアプリケーション単体のバージョンアップチェックも拒否できます。
ウィルス対策ソフトなどによるURLチェックなど、信頼するしかないという場合などはベンダー指定で許可できますのでルールもシンプルになります。
Inboundのルール
Inboundルールは、Outboundに比べると多少設定はやや難しいのですが、自宅か外出先で制御を変えられるのが魅力です。Inboundは他の端末からどのようにアクセスされているのかわかりづらいため、ログファイルを活用して検証する必要があります。
デフォルトのポリシーでセットアップした場合のInboundルールを見てみましょう。VallumのアイコンからファイアウォールConfigurationを選択し、FIREWALLS RULESのInboundを選択します。
- ルール0
Outbound同様に原則ルール(ASK)があります。 - ルール1ダイナミック/プライベートPortを許可します。
これはIANAによって明示された範囲外のPortでユーザーが自由に使えます。アプリケーションがサーバーPortを任意のタイミングで開く場合があるので明確に不要と判断できるまでは削除しないほうが良いでしょう。ダイナミック/プライベートPortに関する説明はJPNICのWebサイトを参照してください。 - ルール2 DHCPサーバーからの受信
- ルール3 mDNS(Bonjour)の受信(名前解決の要求)
- ルール4 IPv6のicmp
IPv6のicmpはIPv4とは異なり、通信に必須のものなので止める事はできません。
JPNIC -ポート番号とは-
https://www.nic.ad.jp/ja/basics/terms/port-number.html
なお、IPv6でDHCPv6を使っていらっしゃる方は、UDP/546も手動で加える必要があります。
macOSのアプリケーションファイアウォールの設定
まずはmacOSのファイアウォールを有効にし、ファイアウォールオプションから必要なアプリケーションを許可します。
外部からの接続をすべてブロックのチェックを外します。チェックされていると印刷できない、またはファイル共有できない場合があります。ここでは一般的に良く利用されるAirDropを例に許可していきます。以下のようにsharingdを許可します。内蔵ソフトウェアが外部からの接続を受け入れるのを自動的に許可にチェックしておく事で、macOSのファイアウォールで細かくアプリケーション毎に設定する必要がなくなり、Vallumに集約してコントロールできます。アクセス要求の受け入れ
macOS自身がサーバーPortをクライアントからの接続要求を受け入れる場合、macOS自身のアプリケーションからの接続要求についてはフックできません。アプリケーションがPortをオープンし、そのPortに外部のクライアントが接続しようとしたところでVallumは検出し、許可/拒否をユーザーに尋ねます。
ログの確認
外部のクライアントから接続の際、ログを確認しながらルールを検証します。アクセスが来ていないのか、Vallumで拒否されているのか、はたまたmacOSのファイアウォールで拒否されているのかを切り分けします。
コンソールを開きます。
次にVallumのログをフィルタし、フィルタ条件を保存します。
- コンソールの右上の検索窓で”flow”と入力し、Enterキーを押します。
- 検索窓のプルダウン”いずれか”をクリックし、”カテゴリ”を選択します。
- これでVallumのログが絞り込まれます。
- 最後に保存ボタンをクリックし、”Vallum log”など名前を付けて条件を保存します。
- ログを出力するにはコンソール上で開始ボタンをクリックします。
接続を受け入れる
実際にAirDropの例でやってみます。スマホからmacOSにAirDropすると、Vallumはsharingdについてポップアップします。AirDropと表示されており分かりやすいですね。ちなみに、Firewall ConfigurationのServices and PortsでPort名称のカスタマイズができます。NetBIOS(137-139)やSMBの445などは”File Sharing”となっていますので、気になる人は変更してください。
許可、Passする際、Logを出力するようにチェックボックスにチェックを入れてください。これでコンソールを起動しログ出力させておけば、AirDropされる度にコンソールへログが出力されます。
AirDropは、IPv6のリンクローカルアドレスで通信しているようですね。これだとどの端末からアクセスされたのかはわかりづらいですが。。。
自宅Wi-Fi/有線LAN/VPNと外出時の制御
いよいよVallumの高度な設定に取り組みます。ここでは、自宅Wi-Fiに接続しているor有線LANに接続しているor自宅へのVPNに接続しているという条件でAirDropを許可し、それ以外の状態、自宅外のAPに接続している場合はAirDropを許可しないというものです。大まかなルールは以下のように記述します。
- AirDropなど個々のアプリケーションで受信を許可
- 条件として、自宅Wi-FiまたはLANの物理インタフェースがActiveでない場合は、全てのアプリケーションを拒否
- VPNのインタフェースがActiveの場合、AirDropなど個々のアプリケーションで受信を許可
1と3が重複感がありますが、VPNが入った場合の条件が複雑で今のVallumではこのような設定になります。2については、個々のルールで”quick”と指定したDHCPやDNSなどのネットワーク系通信以外は1で許可したものが2の条件(外出中)で全て拒否される事になります。それで3で外出中であってもVPNが有効な場合は再び許可する事になります。
2の条件はINBOUND RULEの一覧を右クリックしADD New Ruleを選択します。
さらに、Advancedをクリックします。
- Logの出力をチェックします。
- Conditionのタブをクリックし、Not Connected to hotspotsの項目に自宅のWi-Fiのアクセスポイント名を入力します。
- 有線接続時の条件のために、Interfaces are not activeにインタフェース名を入力します。有線接続し、
ifconfig
で実際にIPが割り当てられているインタフェースの名前を入力します。私の場合はLANはen5でした。
この設定を加える事で自宅外の接続ではAirDropはできなくなります。
簡単にテストするために、Wi-Fi接続からiPhoneなどへのテザリングに切り替え、そこでiPhoneからmacOSにAirDropすると以下のログがコンソールに出力されます。
1 | Log: 🔴 block ⬇️ Rule:18 sharingd PID:445 UID:501 from fe80::xxxx:xxxx:xxxx:xxxx:50392 to fe80::xxxx:xxxx:xxxx:xxxx:8770 |
一旦は許可したAirDropが再び拒否されるようになりました。テザリングを停止し自宅Wi-Fiに戻した際にはこのログは出力されず、再びAirDropできるはずです。
さて、最後にVPNです。
- AirDropを許可したルールを複製します。
- 複製したルールを選択、ドラッグし自宅外はDropするルールの下に移動します。
- このルールをVPN接続中のみ有効にします。
ルールのAdvancedを選び、Logの出力をチェック、Interface is activeにVPNのインタフェース名を入力します。これもVPN接続時にifconfig
でインタフェース名を確認できます。
いよいよテストです。macOSをiPhoneへテザリング接続し、さらにVPNに接続します。iPhoneからmacOSにAirDropが行え、ログに以下の通り出力される事が確認できます。
1 | Log: 🟢 pass ⬇️ Rule:19 sharingd PID:445 UID:501 from fe80::xxxx:xxxx:xxxx:xxxx:60433 to fe80::xxxx:xxxx:xxxx:xxxx:8770 |
ログは上記のように最後に選択されたルールのみが出力されます。
NetBIOSやmDNSの拒否など外出中には基本は拒否設定としつつ、VPN接続中には一部のサービスを生かすという使い方ができます。
設定ファイルの保存
ルールはファイルに保存できます。Firewall ConfigurationからImport / Exportボタンをクリックし、Exportを選んでください。初期設定のRun Assistantを選ぶと既存ルールが全てクリアされます。定期的にバックアップをお勧めします。
なお、Vallum4に関するオンラインヘルプが用意されています。
Vallum 4 Help
https://help.vallumfirewall.com/index.php?chapter=introduction
その他機能
Flows Monitor
Flows Monitorを選択すると、現在通信しているプロセスの一覧が参照できます。
帯域制限ツール Snail
Vallumには、アプリケーション毎に帯域制限できるツール、Snailのライセンスが付属します。Snailは別途インストールする必要があり、Homebrewには登録されていません。詳細は以下を参照してください。
[1]
レピュテーションチェック アプリケーションの信頼性を第三者となる企業によって評価したもの。セキュリティベンダーなどが独自の尺度でアプリケーションを評価したりアプリケーションの振る舞いによって安全か不審かを評価するもの。