【図解】RPCとは?135番ポートと動的ポート、ファイアウォールの設定を初心者向けに解説

「RPC サーバーを利用できません」。AD のレプリケーションやリモートからのサーバ管理で、このエラーを見たことがある人は多いと思います。RPC は、Windows のドメインの裏側でいつも動いている通信のしくみです。この記事では、RPC が 135 番ポートで行き先を聞いてから動的ポートにつなぎ直す流れと、ファイアウォールで開けるポート、動的ポートを狭める方法、エラーの切り分け方を説明します。

この記事でわかること
  1. RPC とは何か、Windows のどこで使われているか
  2. 135 番ポート(エンドポイントマッパー)と動的ポートの関係
  3. ファイアウォールで開けるポートと、動的ポートを狭める方法
  4. 「RPC サーバーを利用できません」(1722)と 1753 の切り分け方

RPC とは

RPC(Remote Procedure Call、リモートプロシージャコール)は、ほかのコンピュータにある関数(プロシージャ)を、自分のコンピュータの中の関数のように呼び出すしくみです。たとえば PC01 のプログラムが「DC01 さん、この処理をして結果をください」と頼むとき、プログラムは関数を呼ぶだけで済みます。呼び出しをデータに変えてネットワークで送り、相手側で呼び出しに戻す作業は、RPC のしくみ(RPC ランタイム)が引き受けます。

PC01呼ぶ側(クライアント)DC01呼ばれる側(サーバ)プログラム「ユーザー一覧をちょうだい」と関数を呼ぶRPC のしくみ(ランタイム)呼び出しをデータにして送るネットワークTCP や SMBサービスの関数本当に処理をして結果を返すRPC のしくみ(ランタイム)データを呼び出しに戻すネットワークTCP や SMB呼び出し結果プログラムから見ると、ふつうの関数を呼んでいるのと同じ。通信の細かいことは RPC が引き受ける
図1 RPC のしくみ

ファイル共有の SMB や、ディレクトリを読む LDAP は、それぞれ決まった用途のための通信です。RPC はそれとは違い、いろいろなサービスが自分の機能を外から呼べるようにするための「共通の土台」です。サービスごとに「この関数を、この引数で呼べる」という約束(インターフェース)があり、インターフェースは UUID という長い番号で区別します。たとえば AD のレプリケーションに使う DRS(Directory Replication Service)のインターフェースは e3514235-4b06-11d1-ab04-00c04fc2dcd2 です。

Windows のどこで使われているか

RPC は、ふだん意識しないところでたくさん使われています。

AD のレプリケーションDC と DC のあいだで、AD のデータを同期するDC ⇔ DCNetlogonセキュアチャネル、NTLM のパススルー認証PC・サーバ ⇔ DCリモートからの管理サービス、イベントログ、コンピュータの管理管理用 PC ⇒ サーバDCOM と WMI証明書の登録、監視ツールの情報集めPC・サーバ ⇒ サーバふだん意識しなくても、Windows のドメインは RPC の通信であふれている
図2 Windows のドメインで使われている RPC の例
使っている機能何をしているか
AD のレプリケーションDC と DC のあいだで AD のデータを同期する。DRS のインターフェースを RPC で呼ぶ
NetlogonPC・サーバと DC のあいだのセキュアチャネルや、NTLM のパススルー認証。DC の Netlogon は、名前付きパイプと TCP の両方で待っている
リモートからの管理別のコンピュータのサービスやイベントログを見る、コンピュータの管理を開く、など
DCOM・WMIDCOM は RPC の上に作られたしくみ。証明書の登録や、WMI を使った監視ツールが使う

Netlogon とセキュアチャネルについては「Netlogonとセキュアチャネルとは?」の記事で説明しています。

135 番ポートと動的ポート

RPC の通信でいちばん大事なのは、「2段階でつなぐ」という点です。RPC のサービスは、決まったポートで待っているとは限りません。多くのサービスは、起動するときに空いているポートを割り当ててもらい、そこで待ちます。このポートを動的ポートと呼びます。

クライアントは、相手が何番で待っているかを知りません。そこで、まず相手の TCP 135 番に「この UUID のサービスは何番にいますか」と聞きます。135 番で答えているのがエンドポイントマッパー(Endpoint Mapper、EPM)です。教わった番号に改めてつなぎ直してから、本当の用件を話します。

① まず TCP 135 につなぐ② 教わったポートにつなぎ直すPC01クライアントDC01受付(TCP 135)DC01AD のサービスUUID e3514235-… のサービスはどこ?49664 番で待っています(例)TCP 49664 につなぐ・バインドOK(認証もここで済ませる)関数を呼ぶ結果
図3 RPC の2段階の接続

会社の代表番号に電話して、受付で担当者の内線番号を教わり、かけ直すのと同じです。135 番は受付で、用件そのものは受付では話しません。そのため、ファイアウォールで 135 番だけを開けても RPC は動きません。教わった動的ポートにも届く必要があります。

エンドポイントマッパーの中身

RPC のサービスは、起動したときに「自分の UUID」と「待っているポートや名前付きパイプ」をエンドポイントマッパーに登録します。エンドポイントマッパーは、その一覧を見て問い合わせに答えます。

DC01AD DSレプリケーションなどNetlogonセキュアチャネルほかのサービス…起動時に登録エンドポイントマッパー(TCP 135 で待つ)サービス(UUID)方式行き先DRS(e3514235-…)TCP49664DRS(e3514235-…)名前付きパイプ\pipe\lsassNetlogon(12345678-…)TCP49665……ポート番号は例。動的ポートは起動のたびに変わることがある135 番は「受付」だけ。本当の用件は、受付で教わった番号(動的ポート)で話す
図4 エンドポイントマッパーのしくみ

動的ポートは起動のたびに割り当てられるので、サービスやコンピュータを再起動すると番号が変わることがあります。「昨日は 49664 だったのに今日は違う」というのは正常な動きです。決まった番号で待っているサービス(LDAP の 389 や SMB の 445 など)は、エンドポイントマッパーには登録されません。

動的ポートの範囲

動的ポートは、決められた範囲の中から選ばれます。Windows Vista と Windows Server 2008 から、既定の範囲は 49152〜65535 です。それより前の Windows(Windows Server 2003 まで)は 1025〜5000 でした。

TCP・UDP のポート番号(0〜65535)49152〜655351024〜4915149152655351025〜5000:昔の動的ポート(Windows Server 2003 まで)0〜1023:決まったサービスの番号(135・389・445 など)今の動的ポートRPC のサービスが待つ番号と、通信を始める側の送信元ポートの両方に使う範囲Windows Vista・Windows Server 2008 から、この範囲が既定になった
図5 ポート番号の範囲

この範囲は、RPC のサービスが待つ番号だけでなく、通信を始める側が使う送信元ポートにも使われます。範囲は TCP と UDP、IPv4 と IPv6 で別々に決まっていて、netsh int ipv4 show dynamicport tcp で確かめられます。

DCOM とは

「Windows のどこで使われているか」の表に出てきた DCOM(Distributed COM)について、少し補足します。COM は、Windows のプログラムの部品(オブジェクト)を、ほかのプログラムから呼び出すためのしくみです。Excel をほかのプログラムから操作できるのも COM のおかげです。DCOM は、この COM をネットワーク越しに使えるようにしたもので、通信には RPC を使います。

DCOM では、まず相手の TCP 135 番(RPCSS というサービス)に「このオブジェクトを使いたい」と頼みます。これをアクティベーションと呼びます。相手はオブジェクトを用意して、「この IP アドレスの、このポートに来てください」と答えます。クライアントは教わった動的ポートに直接つないで、オブジェクトのメソッド(関数)を呼びます。

① アクティベーション(オブジェクトを用意してもらう)② 教わった相手に直接つなぐPC01監視ツールSV01RPCSS(TCP 135)SV01WMI のサービスWMI のオブジェクトを使いたい10.1.0.31 の 49670 番に来て(例)答えの中に IP アドレスとポート番号が入っているTCP 49670 につなぎ、メソッドを呼ぶ結果
図6 DCOM のしくみ

流れは普通の RPC とよく似ていますが、答えの中に IP アドレスがそのまま入る点が違います。このため、あとで説明するように、途中でアドレスを変換する(NAT する)ファイアウォールを越えられません。

DCOM を使う例補足
WMI のリモート接続監視ツールや Get-WmiObject は DCOM を使う。非同期の呼び出しでは、サーバからクライアントへの折り返しの通信(コールバック)も起きる
証明書の登録AD 証明書サービス(CA)への証明書の申請
MS DTCSQL Server などの分散トランザクション

WMI は、DCOM のほかに WinRM(WS-Management、HTTP の上で動くしくみ)でも使えます。PowerShell の Get-CimInstance などの CIM のコマンドは、既定では WinRM を使います。WinRM なら決まったポートで済むので、ファイアウォールを越えて WMI を使うときは、WinRM を使えないか先に検討するとよいでしょう。

名前付きパイプを通る RPC

RPC には、TCP で直接つなぐ方法のほかに、SMB の名前付きパイプを通る方法があります。名前付きパイプは、SMB の IPC$ という特別な共有の中にある「話をするための口」で、\pipe\lsass や \pipe\netlogon のような名前がついています。この方法なら、使うのは SMB の TCP 445 番だけです。

TCP で直接ncacn_ip_tcp135 で行き先を聞き、動的ポートにつなぐTCP 135 + 49152〜65535名前付きパイプncacn_npSMB の IPC$ につなぎ、\pipe\… を通して話すTCP 445同じコンピュータの中ncalrpcネットワークを通らないポートは使わない
図7 RPC の通り道3つ
名前通り道使うポート
ncacn_ip_tcpTCP で直接TCP 135 で行き先を聞き、動的ポートにつなぐ
ncacn_np名前付きパイプ(SMB)TCP 445。SMB の接続の上で話す
ncalrpc同じコンピュータの中ネットワークを通らない

どの通り道を使うかは、サービスとクライアントの作りで決まります。同じサービスが両方で待っていることもよくあります。たとえば別のコンピュータのサービスを操作するとき、Windows Vista 以降のクライアントはまず TCP で試し、つながらなければ名前付きパイプでやり直します。TCP がファイアウォールで止められていると、やり直すまでに 20 秒以上待つことがあり、「サービスの画面がなかなか開かない」原因になります。IPC$ については「管理共有(C$・ADMIN$・IPC$)とは?」、SMB については「SMBとは?」の記事で説明しています。

ファイアウォールで開けるポート

PC やサーバと DC のあいだにファイアウォールがあるときは、RPC のために TCP 135 と動的ポートの範囲を DC に向けて開けます。AD ではほかにも DNS や Kerberos、LDAP などを使うので、あわせて開けます。

PC・サーバのネットワークPC01FS01ファイアウォールDC のネットワークDC01RPC のためにTCP 135TCP 49152〜65535そのほか AD で使う53(DNS)・88(Kerberos)123(時刻)・389(LDAP)445(SMB)・464・6363268・3269・9389
図8 ファイアウォールで DC に向けて開ける通信
DC 側のポート用途
TCP 135RPC のエンドポイントマッパー
TCP 49152〜65535RPC の動的ポート(LSA・SAM・Netlogon、レプリケーションなど)
TCP・UDP 53DNS
TCP・UDP 88Kerberos
UDP 123時刻同期(W32Time)
TCP・UDP 389LDAP
TCP 445SMB(名前付きパイプを通る RPC もここ)
TCP・UDP 464Kerberos のパスワード変更
TCP 636LDAP over TLS(LDAPS)
TCP 3268・3269グローバルカタログ(3269 は TLS)
TCP 9389Active Directory Web Services(AD の PowerShell などが使う)

すべての場面で全部が必要なわけではありません。たとえば LDAPS を使うクライアントがいなければ 636 と 3269 はいりません。DC と DC のあいだのファイアウォールなら、レプリケーションの通信(DFSR の RPC など)も動的ポートの範囲で通す必要があります。

古い Windows が混ざっているとき

Windows Server 2003 以前の Windows が残っている環境では、昔の範囲(1025〜5000)も開ける必要があります。いまの Windows だけなら 49152〜65535 で足ります。

Windows ファイアウォールで受け付けるとき

サーバ側の Windows Defender ファイアウォールで RPC を受け付けるには、規則を2つ作ります。1つ目は、RPC サービス(RpcSs)に向けた TCP 135 番を許可する規則で、ローカルポートに「RPC エンドポイント マッパー」を選びます。2つ目は、受け付けたいサービスに向けて、ローカルポートに「RPC 動的ポート」を選ぶ規則です。こうすると、エンドポイントマッパーが割り当てた番号への通信だけが許可されるので、49152〜65535 をまるごと開けるより狭くできます。

ファイアウォールの機種による違い

次世代ファイアウォールの多くは、RPC の中身を読んで通す機能を持っています。135 番の問い合わせへの答えを読んで、エンドポイントマッパーが教えたポート番号を覚えておき、その番号への通信だけを一時的に通すしくみです。対応している機種なら、49152〜65535 をまるごと開けなくて済みます。

① 135 番のやり取りを読む② 動的ポートの通信PC01ファイアウォールRPC を理解する機能DC01UUID e3514235-… はどこ?(TCP 135)49664 番です答えの 49664 を覚え、通り道を一時的に開けるTCP 49664 につなぐ開けておいた通り道に合うので通す
図9 RPC を理解するファイアウォールの動き

この「あとから来る通信のために、通り道を一時的に開けておく」動きは、FTP のデータ通信などでも使われているもので、ピンホールと呼ばれます。どの機種でも、ファイアウォールが 135 番のやり取りを読めることが前提です。なお、名前付きパイプ(445)を通る RPC は動的ポートを使わないので、この機能とは関係ありません。

Palo Alto Networks(PAN-OS)の場合

Palo Alto のファイアウォールは、通信をアプリケーション(App-ID)として見分けます。RPC は msrpc-base というアプリケーションとして識別され、AD の通信は active-directory、WMI は ms-wmi のように、RPC の上で動くアプリケーションとして識別されます。Applipedia では、msrpc-base の標準ポートは tcp/dynamic・udp/dynamic と書かれていて、active-directory や ms-wmi は msrpc-base を暗黙に使う(Implicit use)アプリケーションになっています。

動的ポートの通信は、予測セッション(predict session)という形で受け入れます。Palo Alto のナレッジベースでは、msrpc-base は「予測セッションを作る、または ALG を必要とするアプリケーション」の一覧に入っています。予測セッションは、データが届くと普通のセッションに変わり、セッションの詳細に「session via prediction」と表示されます。

そのため、セキュリティポリシーはポート番号ではなく、アプリケーション名(msrpc-base と、使いたい active-directory や ms-wmi など)で書くことになります。サービスを application-default にすると、それぞれのアプリケーションの標準ポートだけで許可できます。予測セッションの一覧は、CLI の show session all filter type predict で確かめられます。

FortiGate(FortiOS)の場合

FortiGate では、セッションヘルパーという機能が RPC を扱います。dcerpc というセッションヘルパーが、既定で TCP と UDP の 135 番に割り当てられていて、エンドポイントマッパーのやり取りを読みます。そして、教わった動的ポートへの通信のために、期待セッション(expectation session)を作ります。

ポリシーは、135 番の通信(サービス DCE-RPC、または ALL)を許可するものだけを書きます。動的ポートへの通信は期待セッションに一致して通るので、別のポリシーはいりません。ログ上は、親の 135 番のセッションと同じポリシー ID が付きます。Fortinet の資料では、UUID ごとに許可するポリシーも作れると説明されています。

注意点もあります。期待セッションはポリシーで個別に制御できないので、Fortinet のナレッジベースでは、細かく制御したいときはセッションヘルパーを外し、必要なポートをポリシーで明示的に許可する方法も紹介されています。また、DCE-RPC のセッションヘルパーは、宛先 NAT(バーチャル IP)には対応していません(OXID Resolver のサービスを除く)。セッションヘルパーの設定は、CLI の show system session-helper で確かめられます。

項目Palo Alto(PAN-OS)FortiGate(FortiOS)
しくみの名前App-ID(msrpc-base)と予測セッションセッションヘルパー(dcerpc)と期待セッション
ポリシーの書き方アプリケーション名(msrpc-base、active-directory など)で許可。サービスは application-default135 番(DCE-RPC)を許可。動的ポートは期待セッションで通る
動的ポートの通信App-ID で中身も識別される親のセッションと同じポリシー ID が付く
確かめるコマンドshow session all filter type predictshow system session-helper
実機で確かめてから使う

ここに書いた動きは、各社の公開資料から読み取れる範囲のものです。対応の細かい点は OS のバージョンで変わることがあるので、導入するときは、お使いのバージョンの資料と実機の動きで確かめてください。Palo Alto では、予測セッションを作るアプリケーションの一覧を CLI で表示できます(設定モードで show predefined application | match "alg yes")。

DCOM は NAT を越えられない

DCOM は、通信の中に相手の IP アドレスをそのまま書き込みます。そのため、途中でアドレスを変換する(NAT する)ファイアウォールを越えて DCOM を使うことはできません。ファイアウォールが RPC を読めるかどうかとは別の問題なので、拠点間で NAT をしている構成では注意してください。

動的ポートの範囲を狭める

「49152〜65535 をまるごと開けるのは広すぎる」というときは、RPC が使うポートを狭められます。方法は大きく3つあります。

ARPC 全体を狭めるRpc\Internet キーにポートの範囲を書くRPC の動的ポートだけが対象再起動が必要少なくとも 100 個は残すBAD だけ固定するNTDS と Netlogon に決まった番号を書くAD の RPC だけが対象2 つとも設定し、別の番号にDFSR などは別に設定C動的ポート全体を変えるnetsh で範囲の始まりと数を変える送信元ポートも同じ範囲に最小 255 個、1025 から足りないとポート枯渇まず B(サービスごとの設定)を検討し、ないときに A。C は送信元ポートにも影響する
図10 動的ポートを狭める3つの方法

Microsoft は、サービスにポートを決める設定があるなら、まずそれを使うように勧めています。A の方法は、サービスにそうした設定がないときのためのものです。どの方法でも、範囲を狭めすぎるとポートが足りなくなり、サービスが起動しなくなったり通信に失敗したりします。

A:RPC 全体の範囲を決める

レジストリの HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Rpc の下に Internet というキーを作り、次の3つの値を入れます。このキーは最初からはないので、自分で作ります。

値の名前種類データの例意味
PortsREG_MULTI_SZ5000-6000ポートの範囲。1行に1つの番号か範囲を書く
PortsInternetAvailableREG_SZYY なら、Ports に書いた番号を「使ってよい番号」とする
UseInternetPortsREG_SZYY なら、RPC のサービスに上の番号から割り当てる

コンピュータを再起動すると、RPC の動的ポートはこの範囲から選ばれるようになります。5000-6000 は Microsoft の資料で説明に使われている例で、おすすめの範囲ではありません。5000 より大きい番号を選び、少なくとも 100 個は残すように説明されています。通信の多いサーバでは、もっと多く必要です。

書き間違えると Netlogon が止まる

Ports の値に読めない文字が入っていたり、範囲が 0〜65535 の外だったりすると、設定全体が無効と見なされます。この状態や、ポートが足りない状態では、エンドポイントマッパーにサービスを登録できません。Netlogon が登録できないと、システムログにイベント 5820(The Netlogon service could not add the AuthZ RPC interface)が記録され、Netlogon が止まります。DC で試すときは、1台で確かめてから広げてください。

B:AD の RPC だけを決まった番号にする

AD の RPC は、DC ごとにレジストリで番号を決められます。設定するのは次の2つです。

キー値の名前(DWORD)反映のしかた
HKLM\SYSTEM\CurrentControlSet\Services\NTDS\ParametersTCP/IP PortDC を再起動する
HKLM\SYSTEM\CurrentControlSet\Services\Netlogon\ParametersDCTcpipPortNetlogon サービスを再起動する

1つ目はレプリケーションやクライアントからの AD の RPC(DRS・SAM・LSA など)、2つ目は Netlogon の RPC の番号です。クライアントは Netlogon 以外の RPC も使うので、必ず2つとも設定し、ファイアウォールでも2つとも開けます。2つに同じ番号を入れてはいけません。同じ番号にすると、Netlogon のイベント 5809(ポートが使用中)が記録されます。なお、別の番号にしていても、Netlogon を再起動したときに 5809 が1回記録されることがあります。これは RPC のポートの扱いによる仕様で、再起動後は設定した番号が使われるので、気にしなくてかまいません。

決まった番号にしても、サービスはエンドポイントマッパーへの登録を続けます。クライアントは今までどおり 135 番で番号を聞き、決まった番号を教わってつなぎます。つまり、ファイアウォールでは TCP 135 と、決めた2つの番号を開けることになります。DFSR など、ほかのレプリケーションのサービスは別に設定が必要です。

C:動的ポートの範囲そのものを変える

netsh int ipv4 set dynamicport tcp start=10000 num=1000 のようにすると、動的ポートの範囲そのものを変えられます。この例では 10000〜10999 の 1000 個になります。範囲は 255 個以上、始まりは 1025 以上にする必要があります。

この方法は、RPC のサービスが待つ番号だけでなく、そのコンピュータが外へ通信するときの送信元ポートもこの範囲に変えてしまいます。範囲が小さすぎると、通信の多いサーバでポートが足りなくなる(ポート枯渇)ことがあるので、影響が大きい方法だと考えてください。

「RPC サーバーを利用できません」の切り分け

RPC のエラーでよく見るのは、次の3つです。番号だけが表示されることも多いので、10進と16進の両方を覚えておくと便利です。

エラー表示される文と、よくある原因
1722(0x6BA)「RPC サーバーを利用できません」(The RPC server is unavailable)。相手に TCP でつなげなかった。DNS の名前の引き間違い、ファイアウォールで動的ポートが止められている、相手が止まっている、など。いちばん多いのは、135 番には届くのに動的ポートに届かないケース
1753(0x6D9)There are no more endpoints available from the endpoint mapper。135 番には届いたが、エンドポイントマッパーにそのサービスが登録されていなかった。サービスが止まっている、起動に失敗した、DNS の間違いで別のコンピュータにつないでいる、など。ネットワークがつながらないことが原因ではない
1727(0x6BF)The remote procedure call failed and did not execute。エンドポイントマッパーまではつながったが、そのあとの接続が途中で切れた。途中のファイアウォールや WAN 高速化装置、相手の負荷など

証明書の登録などでは、同じエラーが 0x800706BA のように表示されることもあります。下の4けたが 06BA なら、中身は 1722 です。

調べる順番

図3の2段階の接続を、前から順に確かめていきます。

① 名前を引けるかResolve-DnsName引けない・違う IP → DNS を直す② TCP 135 に届くかTest-NetConnection -Port 135届かない → 1722(FW・RPC サービス)③ 受付にサービスがあるかportqry -e 135ない → 1753(サービス停止・別の相手)④ 動的ポートに届くかTest-NetConnection -Port 番号届かない → 1722(いちばん多い)⑤ 認証・権限イベントログ・klist5(アクセス拒否)など → 認証を調べる
図11 「RPC サーバーを利用できません」の切り分けの順番
  1. 名前を引いて、正しい IP アドレスが返るか確かめます。古い DNS レコードや hosts ファイルのせいで別のコンピュータにつないでいると、1722 や 1753 になります。
  2. Test-NetConnection で TCP 135 に届くか確かめます。届かなければ、ファイアウォールか、相手の RPC サービスの問題です。
  3. PortQry でエンドポイントマッパーに問い合わせ、目的のサービスが登録されているか確かめます。結果には、サービスの UUID と名前、ncacn_ip_tcp:IP アドレス[ポート番号] の形で待っているポートが並びます。AD のレプリケーションなら「MS NT Directory DRS Interface」を探します。
  4. 手順3で分かったポートに、Test-NetConnection で届くか確かめます。ここで届かないのが、1722 のいちばん多いパターンです。
  5. つながるのにアクセス拒否(5)などになるときは、認証や権限の問題です。Kerberos と NTLM の調べ方は「Windows認証の調べ方」の記事で説明しています。

手順2〜4でもはっきりしないときは、クライアントとサーバの両方で同時にネットワークトレースを取り、135 番の問い合わせの答え(ポート番号)と、そのポートへの接続(SYN の再送がないか)を見ます。

PortQry について

PortQry は Windows に最初から入っているコマンドではありません。Microsoft のダウンロードセンターから入手します。-e 135 を付けて TCP 135 に問い合わせると、エンドポイントマッパーに登録されている一覧を表示します。

RPC と認証

RPC の通信にも認証があります。クライアントは、つなぎ直したあとのバインドのときに認証します。ドメインの中では、多くの場合 Negotiate を通して Kerberos か NTLM が使われます。認証の強さは「認証レベル」で決まり、どこまで守るかが段階になっています。

2CONNECT接続のときだけ認証中身は守られない4PKT送り主だけ確かめる中身の改ざんは分からない5PKT_INTEGRITYすべてのパケットに署名改ざんに気づける6PKT_PRIVACY署名して暗号化中身も見られないDCOM は 5 以上が必須(2023年3月の更新から)
図12 RPC の認証レベル

Microsoft の資料では、守りたい通信には 5(PKT_INTEGRITY)か 6(PKT_PRIVACY)を使うように勧めています。それより低いレベルは、送り主を確かめることはできても、途中での書き換えを防げません。Negotiate や SSPI については「LSASS・SSPI・Negotiateとは?」の記事で説明しています。

DCOM の強化(KB5004442)

DCOM の脆弱性(CVE-2021-26414)への対応として、Windows は DCOM の認証レベルを段階的に引き上げました。2021年6月の更新で設定を選べるようになり、2022年6月14日の更新で既定で有効に、2023年3月14日の更新からは無効にできなくなっています。いまの Windows では、DCOM のサーバを呼び出す要求(アクティベーション)は、5(PKT_INTEGRITY)以上の認証レベルでないと受け付けられません。

古いアプリや監視ツールがつながらなくなったときは、サーバ側のシステムログにイベント 10036、クライアント側にイベント 10037 か 10038 が記録されていないか確かめます。記録されていれば、アプリ側を新しくする必要があります。

確認に使うコマンド

PC01(PowerShell):DC01 の名前を引いて、返る IP アドレスを確かめる

Resolve-DnsName dc01.corp.example.com

PC01(PowerShell):DC01 の TCP 135 に届くか確かめる

Test-NetConnection -ComputerName dc01.corp.example.com -Port 135

PC01(コマンドプロンプト):DC01 のエンドポイントマッパーに登録されているサービスとポートを表示する(PortQry が必要)

portqry -n dc01.corp.example.com -e 135

PC01(PowerShell):PortQry で分かった動的ポートに届くか確かめる(49664 は例)

Test-NetConnection -ComputerName dc01.corp.example.com -Port 49664

DC01(コマンドプロンプト):TCP の動的ポートの範囲を表示する

netsh int ipv4 show dynamicport tcp

DC01(PowerShell):RPC のサービスとエンドポイントマッパーのサービスが動いているか確かめる

Get-Service RpcSs, RpcEptMapper

DC01(コマンドプロンプト・管理者):RPC 全体のポートの範囲が設定されているか確かめる

reg query HKLM\SOFTWARE\Microsoft\Rpc\Internet

DC01(コマンドプロンプト・管理者):AD と Netlogon の RPC に決まった番号が設定されているか確かめる

reg query HKLM\SYSTEM\CurrentControlSet\Services\NTDS\Parameters /v "TCP/IP Port"
reg query HKLM\SYSTEM\CurrentControlSet\Services\Netlogon\Parameters /v DCTcpipPort

PC01・DC01(コマンドプロンプト・管理者):両方で同時にネットワークトレースを取り始める(ファイル名はそれぞれ変える)

netsh trace start scenario=netconnection capture=yes tracefile=c:\pc01_nettrace.etl maxsize=512 overwrite=yes report=yes

PC01・DC01(コマンドプロンプト・管理者):問題を再現したあと、トレースを止める

netsh trace stop

reg query でキーや値が見つからないというエラーになるのは、その設定をしていない(既定のまま)という意味です。

まとめ

項目ひとことで
RPCほかのコンピュータの関数を、自分の関数のように呼ぶしくみ。AD のレプリケーションや Netlogon、リモート管理の土台
TCP 135エンドポイントマッパー。サービスの番号を教える「受付」
動的ポートサービスが起動時に割り当てられる番号。既定は 49152〜65535
名前付きパイプSMB(TCP 445)の IPC$ を通る RPC
ファイアウォール135 だけでは足りない。動的ポートも通す(または狭めて通す)
狭める方法サービスごとの固定(AD は NTDS と Netlogon)を先に。なければ Rpc\Internet
1722 と 17531722 はつながらない(多くは動的ポート)、1753 はつながったがサービスがない

RPC のトラブルは、「135 番で番号を聞く」「その番号につなぎ直す」という2段階を思い浮かべると、どこで止まっているかが分かりやすくなります。ファイアウォールの申請で「135 番を開けてください」とだけ書いてしまうのはよくある失敗なので、動的ポートの扱いもあわせて決めておきましょう。

参考にした資料

コメント