 
							- 
							
							最新のMacのためのNetwork ExtensionKernel Extensionを使用せずにmacOSのネットワーキング機能を拡張およびカスタマイズできるAppを作成するために使用できる、macOSの強力な新APIについてご確認ください。 リソース関連ビデオWWDC21WWDC19
- 
							このビデオを検索(音楽) (拍手) Network Extensionの セッションへようこそ 僕はジェイミー ソフトウェアエンジニアです 僕たちはmacOS Catalinaに 新たにパワフルなAPIを導入しました Network Kernel Extensionを使わずに 機能の拡張などが可能な アプリケーションを作れます まずは皆さんの フィードバックに感謝します アプリケーションで Network Kernel Extensionを どう使うか WWDCでは 皆さんに聞いてきました 頂いたフィードバックを元に カテゴリーごとに アプリケーションを分類しました macOS Mojave以前のOSでは これらの実行には Network Kernel Extensionが必要でした 今日は皆さんに このカテゴリーを 1つずつ説明しながら macOS Catalinaに導入した APIについてお話しします Network Kernel Extensionは使いません では始めましょう コンテンツフィルタAppを説明します パーソナル ファイアウォールAppがそうです システムに流れるトラフィックを 監視して 不審なものをブロックします ペアレンタルコントロールAppも そうです これはWebの閲覧活動に フォーカスして 子供に適さないサイトの 視聴を制限します 他にも まだ例があります トラフィックを積極的に遮断せずに ネットワーク活動を 記録することもできます 記録した活動のログを あとで解析できるので 例えば 極秘情報の 送信時刻の特定もできます 新たに導入されたAPIについて お話しする前に コンテンツフィルタApp実行時の 要件を説明します コンテンツフィルタAppのコードには 実行時の明確な要件があります システムにログインがなくても コードが常時 実行されていることです 例えばペアレンタルコントロールApp アプリケーションを 実行していない時でも アクセスの制限が必要です パーソナルファイアウォールAppでは 攻撃からMacを守らなくてはなりません ログインのない間もです Kernel Extensionでコードを実行した時 コードはKernel内で作動しているので 要件を満たしています ログインのない間も ずっと動いていますね ユーザ空間での 実行要件を満たすため― System Extensionという技術を 新たに導入しました App Extensionをご存じですね? これはmacOSで実行可能な 一連のコードで ユーザ体験の拡張と カスタマイズができます System Extensionは これと似ています アプリケーションに組み込まれており OSによって管理されています ですからファイルシステムに 配置するための ユーザ用の インストールパッケージは不要です 削除するためのアンインストーラも 書く必要はありません System Extensionの 開始や停止については OSが必要に応じて実行してくれます App Extensionとの他の相似点は 開発とデバッグが簡単なことです 開発には一般的なツールが使えます XcodeやLLDB Instrumentsなどです Kernel Extensionの開発とデバッグは かなり厄介ですよね 開発の間は何度も再起動が必要です デバッグには2台の装置を 接続しなくてはなりません その後 デバッガを起動できても ソースコードの シングルステップ実行は不安定です System Extensionは ログイン中のユーザに関係なく動きます ですからネットワーク処理の― コードの実行に理想的です System Extensionの詳細は “System Extensions and DriverKit”を見てください 今週 開催したセッションです System Extensionを使って このリストの アプリケーションを実行するとします コンテンツフィルタAppや DNSプロキシAppなどです 新しく導入したAPIを使うと コンテンツフィルタAppを実行できます Network Extensionフレームワーク内の コンテンツフィルタAPIは iOS 9で初めて導入されました macOS Catalinaでも導入しました これらAPIの使い勝手は向上しています ではコンテンツフィルタAPIを 説明します メインUI Appでは NEFilterManagerで コンテンツフィルタを設定します その設定で コンテンツフィルタを登録するので システムで実行できます 更にSystem Extensionを作り コードを実行します このAPIは2つのレイヤで コンテンツをフィルタさせます フローレイヤとパケットレイヤです フローレイヤのフィルタリングには NEFilterDataProviderの サブクラスを作ります 設定と登録の後 コンテンツフィルタが実行されます ネットワークデータの 新しいTCPやUDPのフローは システムで作られます フローは NEFilterDataProviderの サブクラスに渡されます これは NEFilterFlowオブジェクトです その後はサブクラスが各フローについて 許可するかドロップするかを決定します フローの存続中は皆さんも決定できます フローが最初に開いた時や フローの量を確認したあとに 決められます NEFilterDataProviderのクラスが フローへの読み取り専用アクセスを 提供します フローの性質を 修正することはできません システムは NEFilterDataProviderのサブクラスに TCPとUDPデータのフローを渡します ペアレンタルコントロールAppを 書いているなら 重要なのはWebトラフィックですね NEFilterの設定でルールを作り フィルタで見たいフローを システムに通知します これがフローレベルの フィルタリングの仕方です パケットレイヤで トラフィックをフィルタするには NEFilterPacketProviderの サブクラスを作ります System Extensionにおいてです システムは流れている ネットワークパケットを FilterPacketProviderのサブクラスに オブジェクトとして渡します 皆さんは各パケットを 許可するか決めます 以上がコンテンツフィルタAPIと アプリケーションでの使い方です 次のアプリケーションは System Extensionと コンテンツフィルタAPIを使って ファイアウォールを実行します このアプリケーションの機能は単純です ポート8888での受信TCP接続を 許可するか拒否するよう ユーザを誘導します では実際にお見せしますね SimpleFirewallという アプリケーションです コンテンツフィルタは停止中なので UIインジケータが赤くなっています スタートをクリックします System Extensionが ブロックされていると出ました System Extensionがあれば システムで多くのことを実行できます ネットワークトラフィックも 調べられます System Extensionを実行する前に ユーザの承認を得てください システム環境設定から “セキュリティとプライバシー”を 開きます 管理者の認証情報を入れて “許可”をクリックし実行します ネットワークトラフィックの フィルタリングをしてもいいか― 確認する画面が出ます “同意”をクリック コンテンツフィルタが動いているのが 色で確認できますね 僕のMacのポート8888に接続して どうなるか見てみましょう ポート8888でWeb Serverを実行中です Safariを開きます ローカルWeb Serverをクリックすると ロードし始めますが中断されました SimpleFirewall Appから ポート8888での 新しい接続を通知されます 許可するか確認されるので “同意”をクリックすると ロードが再開します よし 動いていますね さて次は System Extensionと コンテンツフィルタAPIの 使い方をお話ししますね 僕のプロジェクトにはターゲットが2つ メインUI Appである “SimpleFirewall”と “SimpleFirewallExtension”です こちらは System Extensionです まずはアプリケーションのコードです メインのビューコントローラの クラスを実行します まず最初に見るのは startFilter関数です SimpleFirewall UIのスタートボタンを クリックすると呼び出せます まずSystem Extensionの バンドルIDを取得 System Extensionの activationRequestを作成します ビューコントローラオブジェクトを デリゲートに設定するので activationRequestの完了後 通知があります OSSystemExtensionManagerに 作成した要求を送ると System Extensionの アクティベーションが開始 必要に応じて ユーザから実行許可を得ます System Extensionの実行を ユーザが許可したら didFinishWithResult関数を 呼び出します 要求が完了したのを確認したら 次はコンテンツフィルタの設定です NEFilterManagerで設定し システムに登録します 設定の詳細がここに 入力されているのが分かりますね filterSocketsは“true”にして トラフィックをフローレイヤで フィルタリング filterPacketsは“false” パケットレイヤでは フィルタリングしません コンテンツフィルタの設定を イネーブルにして saveToPreferencesを呼び出し 設定を登録します 設定がイネーブルになったので System Extensionと コンテンツフィルタを開始できます では次に行きましょう NEFilterDataProviderの サブクラスです System Extensionの中で実行します このFilterDataProviderという サブクラスでは 3つのメソッドを オーバーライドしました “startFilter”と“stopFilter” “handleNewFlowです” startFilterは― コンテンツフィルタ開始時に 呼び出される関数です システムはデフォルトで TCPとUDPのフローを コンテンツフィルタに全部渡します ここで気になるのは ポート8888への受信TCP接続です NEFilterSettingsオブジェクトを作り 見たいトラフィックを システムに知らせます TCP接続がどこから来ているのかは 気にしません どんなアドレスにTCP接続が つながっているのかも関係ありません NEFilterRuleを2つ作ります IPv4ワイルドカードアドレスのものと 同じくIPv6のものです ルールごとに NENetworkRuleオブジェクトを作り ルールに合っている 見たいフローの特徴を指定します remoteNetworkと remotePrefixは“nil”と“0” つまりこのルールは どのトラフィックにも合います どこからのでも大丈夫 ローカルネットワークには ワイルドカードアドレスと ポート8888で作った NWHostEndPointを渡しました このルールは受信フローと合います ポート8888に接続しているフローです protocolを“TCP”に directionを“inbound”に指定 NEFilterRuleオブジェクトを作り NENetworkRuleを渡します actionは“filterData”です NENetworkRuleに合うデータの 新しいフローが システムに作られます 更にフィルタ情報のアクションごとに コンテンツフィルタに渡されます これらのNEFilterRuleができたら NEFilterSettingsオブジェクトを作って ルールを渡します デフォルトのアクションを “許可”にします 新しいフローが フィルタルールと合わない場合に コンテンツフィルタに 渡さないようにするのです “apply”を呼び出し 設定を適用します 次にstartFiltercompletionHandlerを 呼び出して フィルタは準備完了だと システムに知らせます 関数“handleNewFlow”は ルールに合った新しいフローが 作成されると呼び出されます この関数はNEFilterFlow オブジェクトであるパラメータを取り 新しいフローを判定して どうすべきか示します ここではディクショナリの フローの詳細をパッケージにして そのディクショナリをUI Appに送ります フローを許可するか指示を促すのです ユーザの決断のプロセスは 同期していません “pause”の判定をシステムに渡して フローを再開するまで 何もしないようOSに指示します ユーザが決断したら それに合わせて “allow”または“drop”の 判定を作ります 次に“resumeFlow”を呼び出します 以上がアプリケーションの一例です System Extensionと コンテンツフィルタAPIを使い ファイアウォールを実行しました 透過プロキシAppの説明に移ります その一例である クラウドセキュリティAppは 特定サイトへのトラフィックを クラウドサービスに回り道させます ここで補助的な安全確認を行うのです ユーザ認証や認可などです 透過プロキシAppとしては 他にも 特別な送信を トラフィックに行うものがあります 暗号化アルゴリズムの適用や 特殊な方法で受信した リソースのキャッシュなどです 他にも透過プロキシAppは単一接続で トラフィックのフローを多重化します ネットワーク遅延を減らす 特殊なプロトコルも使えます 透過プロキシAppは ユースケースが多数あります macOS Catalinaでは新しいAPIを Network Extensionフレームワークに 導入しました Kernel Extensionなしで 透過プロキシAppsを作れます これらのAPIはNetwork Extension フレームワークにあります 次はアプリケーションでの使い方です メインUI Appで NETransparentProxyManagerを使い 透過プロキシの設定をして登録します ですからシステムは 透過プロキシを実行できます System Extensionを作り プロキシを実行します これらAPIはフローレイヤでの フローをプロキシ可能にします それにはNEAppProxyProviderの サブクラスを作ります システムはフローを プロキシに回り道させないので NENetworkRuleを作り プロキシするフローを指定しましょう 透過プロキシを実行し NENetworkRuleをインストールします ルールにマッチする― 新しいTCPとUDPのフローが開きます これらフローはNEAppProxyProviderの サブクラスに回り道します ここからのフローの処理は あなた次第です 他の接続でのフローの多重化や 特殊な送信も可能 皆さんが決めてください 以上 透過プロキシAPIの アプリケーションでの使い方でした 次は DNSプロキシAppです DNSプロトコルはパワフルで実用的です ただ安全とはいえません DNSレスポンスになりすまし ブラウザを不正なサイトに導くのも容易 閲覧をスパイするのも簡単です DNSクエリーを 見ればいいだけですからね 対処法としてDNSプロキシは DNSプロトコルに セキュリティを付加します 例えばDNSトラフィックを暗号化したり 安全な伝送路でプロキシするのです 新たに導入したAPIのおかげで DNSプロキシAppを実行できます Network Kernel Extensionは不要です Network Extensionフレームワークに これらAPIはあります 実はiOS 11で導入されたのですが macOS Catalinaでも利用できます 次はアプリケーションでの 動作の仕方です メインUI Appで NEDNSProxyManagerを使い DNSプロキシを設定します ですからシステムは DNSプロキシを実行できます System Extensionを作り DNSプロキシを実行 NEDNSProxyProviderクラスの サブクラスとしてプロキシを実行します 設定の登録後 System Extensionを動作します NEDNSProxyProviderのサブクラスに DNSクエリーは回り道させられます ここからDNSクエリーの処理は あなた次第です 暗号化してもいいし 安全な伝送路で― 送信してもいいです 以上がDNSプロキシAPIの概要です 次はVPN Appです VPN Appのよくあるユースケースは 企業の社内ネットワーク 安全なリモートアクセスを 社員に提供します 更に 最近人気があるのは パーソナルVPN Appです これらを使えば 匿名で安全にネットを閲覧できます macOS 10.10のVPN APIを また導入しました 今回のリリースでは 更に改良しています VPN APIを詳しく説明します メインUI Appで NETunnelProviderManagerを使います VPNを設定し VPNクライアントを登録 System Extensionを作り コードを実行します NEPacketTunnelProviderの サブクラスとしてVPNクライアント実行 NEPacketTunnelProviderに対応する― utunインターフェイスを作ります NEPacketTunnelProviderは VPNの経路を指定し システムに伝えます IPパケットは指定された経路を通ります utunインターフェイスに向かい― NEPacketTunnelProviderへ回り道します そこから カスタムトンネリングプロトコルの トンネル接続で それらのパケットは送られます 以上がVPN APIの動作の仕方です 次はVPN APIの向上した点です “includeAllNetworks”は VPN設定にセットできるフラッグで パーソナルVPN Appで特に有用です VPNトンネルの外に トラフィックは漏れません 全部 VPNを通したいですよね (拍手) ですよね (拍手) 設定でincludeAllNetworksを イネーブルすれば トラフィックはVPNの経路を通ります VPNが利用できない時がありますね 例えばMacが WiFiネットワークを変える時とか VPNが一時的に ダウンしている時などです こういう場合 トラフィックはドロップされます includeAllNetworksをイネーブルしたが ローカルネットワークの リソースにアクセスさせたい そんな時はexcludeLocalNetworksを イネーブルしてください Per-App VPNも改良しました トラフィックを送れるドメインの リストを3つ 追加しました どういうものか説明しますね 各リストと一致するアプリケーションが ホストと接続します ホストのドメインがリストにあれば トラフィックは Per-App VPNでルートを指定されます 例えばメールAppに アカウントが2つあるとします 個人的なEメールのアカウントと 会社のアカウントですね 会社のEメールサーバーのドメインを メールドメインのアレイに指定します メールが 会社の Eメールサーバーに接続すると その接続はPer-App VPNを経由します 個人のEメールサーバーへの接続は Per-App VPNを経由しません CalenderDomainsや ContactsDomainsも同様です カレンダーAppとコンタクトAppは 除外です 以上がmacOSで利用可能なVPN APIと VPN App作成の概要でした Network Kernel Extensionは使いません 次は仮想マシンを作成し管理する 仮想マシンAppです 仮想マシンはネットワークへの 接続が必要ですね macOSのvmnetフレームワークによって 仮想マシンを接続できます このフレームワークは macOS 10.10で導入されました 今回のリリースでは より多くの接続方法を提供しています 仮想マシンを接続するための いくつかのモードが使えます 共有モードを改良しました IPv6が利用可能です 仮想マシンに割り当てるIPの 範囲を指定でき ポートフォワーディングルールも 設定可能です 新しいブリッジモードでは 仮想マシンはローカルネットワークに 存在するかのようです 以上が仮想マシンAPIの概要です これらAPIで仮想マシンを ネットワークに接続できます 次にお話しするのは カスタム低レイヤプロトコルを 使うアプリケーションです カメラやオーディオデバイスなどの ハードウェアとの通信を 必要とするものです つまり― 低レイヤプロトコルだけを 理解するハードウェアです カスタムリンク層プロトコルなどですね カスタムIPプロトコルを使う アプリケーションは 他のマシンとの通信が必要なものです 高度に最適化された プロトコルを使います お知らせできてうれしいです 新しいAPIでは カスタム低レイヤプロトコルを使い Kernel Extensionなしで通信できます まずはカスタムIPプロトコルのAPIです ネットワークフレームワークの 新しいAPIです 動作の仕方は アプリケーションにあります NWParametersオブジェクトを作り カスタムIPプロトコルの ID番号を指定します 次にNWParametersオブジェクトで NWConnectionを作成 今度はNWConnectionを使います TCPやUDPのNWConnectionのように カスタムIPプロトコルを使い 通信します 昨年の“Introducing Network Framework”に詳細があります 次はカスタムIPプロトコルの 使い方を示す― コードのサンプルです このコンストラクタに カスタムIPプロトコルのID番号を渡し NWParametersオブジェクトを 作っています ここで渡すのは システムが処理しているプロトコルの 番号ではないので注意してください TCPやUDP ICMPなどですね 次にデスティネーションを作成 NWConnectionに パラメータと一緒に渡します ここからは― 他のNWConnectionと同じく その接続を使います カスタムIPプロトコルを使って パケットを送受信します 次はカスタムリンクレイヤ プロトコルAPIです ネットワークフレームワークに 追加されました これが作動する方法は アプリケーションにあります NWEthernetChannelオブジェクトを作り カスタムイーサタイプを指定します イーサネットインターフェイスで 通信を行います コードを見てみましょう まずイーサネットインターフェイスの リファレンスを取得します NWEthernetChannelオブジェクトを作り インターフェイスと カスタムイーサタイプを渡します カスタムIPプロトコルAPIのように ここでも渡さなくてはなりません IPやIPv6など システムが既に 扱っているイーサタイプではダメです チャンネルを作ったら コールバックのブロックを設定 stateUpdateHandlerのブロックは チャンネルの状態が変化すると 呼び出されます チャンネルが準備できたら カスタムイーサタイプのパケットの 送受信を開始します 新しいパケットを受信すると receiveHandlerのブロックが 呼び出されます チャンネルが全部セットされたら カスタムイーサタイプでの 通信が開始可能です 以上が新たに導入したAPIの概要です Kernel Extensionなしで 通信が可能になりました 今日はたくさんのAPIについて お話ししました こちらのカテゴリーで アプリケーションを作れます Network Kernel Extensionは不要です さてここで 今後についてお話しします Network Kernel Extensionには 問題があります まず開発が難しいです 前に言ったように 新しい機能を試す際は 何度も再起動が必要です 他にも とても低レベルの概念を 頻繁に使わなくてはなりません マニュアルのM-Buffチェーン操作などは 厄介なコードで間違いやすいです Kernel Extensionは デバッグも難しいです 前に言ったように2台の装置が必要で シングルステップ実行は面倒です 他にもKernel Extensionの― 不安定さはシステムにとって打撃です Kernel Extensionがクラッシュすると アプリケーションは閉じ システム全体が再起動 ユーザにはストレスですし データの紛失もあり得ます macOSは節目を迎えたと言えるでしょう Network Kernel Extensionを使わずに アプリケーションを 作れるようになったのですから Network Kernel Extensionは macOS Catalinaでは非推奨です 現行のものは macOS Catalinaでも 今までと同じように使用できます しかし新しいAPIを ぜひ試していただきたいです アプリケーションの作成に これらのAPIを使ってください なるべく早くそうしてほしいです Network Kernel ExtensionのmacOSでの サポートをまもなく廃止するからです さて今日説明したのは パワフルなAPIについてでした macOS Catalinaに導入されたAPIで コンテンツのフィルタや プロキシが可能です 仮想マシンとネットワークの接続も カスタム低レイヤプロトコルでの 通信も可能です すべてNetwork Kernel Extensionは 不要です 皆さんに強くお勧めします 新しいAPIをぜひ使ってください Network Kernel Extensionは 非推奨となり 今後のリリースでは サポートも終了します このセッションのWebページに デモを行ったトンネルコードへの リンクがあります ネットワーキングラボも開催中です ぜひいらしてください 質問にもお答えします ありがとうございました (拍手) 
-