M365のURLやIPアドレス範囲の情報をpowershellで取得してみた

PowershellPowershell

M365のURLやIPアドレス範囲の情報は以下の公式ドキュメント内でJSONファイルで公開されていますが、約1か月ごとに更新されることで知られています。

Office 365 URL および IP アドレス範囲 - Microsoft 365 Enterprise
概要: Office 365 にはインターネットへの接続が必要です。 Government Community Cloud (GCC) を含む Office 365プランを使用している顧客は、次のエンドポイントに到達可能です。

そのM365のURLやIPアドレス範囲の情報をpowershellで取得できたら、
powershell上で変更点の洗い出しや加工ができるので自動化などにつなげられるのではないか?と思い、「powershellでM365のURLやIPアドレス範囲を取得」することを試してみました。

広告

M365のURLやIPアドレス範囲が掲載されている場所

上記、Microsoft公式ドキュメントのリンク先ページ内の「JSON形式」というリンクの先にJSON形式で情報が公開されています。

「JSON形式」というリンクの先にJSON形式で情報が記載されている

・「JSON形式」をクリックした後に開かれるページ

「JSON形式」をクリックした後に開かれるページ

上記の画像にも赤線を引いていますが、
今回はこのURLからpowershellで情報を取得していきます。

広告

M365のURLやIPアドレス範囲を取得するコマンド

M365のURLやIPアドレス範囲を取得するPowerShellコマンドです。
3行程度で取得可能です。

$date = Get-Date -Format "yyyyMMdd"
$path = Join-Path C:\hogehoge\ ("m365_" + $date + ".txt")
Invoke-WebRequest "https://endpoints.office.com/endpoints/worldwide?clientrequestid=b10c5ed1-bad1-445f-b386-b919946339a7" -OutFile $path

コマンドの解説

1行目では、[$date] という変数に取得した日付を格納します。
 ※これはファイル名に利用するので不要であればこの行はなくても構いません。

2行目では、webページの内容を吐き出す先のファイルのパス情報を [$Path] の変数として定義します。
この時利用するフォルダは既に作成済みであることが前提となります。

3行目では、[Invoke-WebRequest] を利用してURLを読み込み、その内容を [$Path] に定義したファイルに書き込みます。

[参考] URLの変更も考慮したコマンド

更新履歴を見てみると、ずっと同じURLが利用されているので問題はないかと思いますが、
上記で紹介したURLが変更された場合にも対応できるように以下のコマンドも紹介しておきます。
 ※特にURL内の「clientrequestid」は変更の可能性がありそうと感じたためです。

$date = Get-Date -Format "yyyyMMdd"
$path = Join-Path C:\hogehoge\ ("m365_" + $date + ".txt")
$response =Invoke-WebRequest "https://docs.microsoft.com/ja-jp/microsoft-365/enterprise/urls-and-ip-address-ranges?view=o365-worldwide" -UseBasicParsing
$links = $response.Links | Where-Object {$_.href -like "*endpoints.office.com/endpoints/worldwide?clientrequestid*"} |Select-Object -ExpandProperty href
Invoke-WebRequest $links -OutFile $path

上記と異なる点だけ解説をしていきます。

  • 3行目で「Office 365 URL および IP アドレス範囲」のページを読み込みます。
  • 4行目でその中にある「*endpoints.office.com/endpoints/worldwide?clientrequestid*」と一致するURLを取得します。
  • 5行目で、4行目で取得したURLの情報を取得しています。

4行目の処理を見ていただくとわかる通り、このコマンドを利用すると
「clientrequestid」が変更されても、問題なく目的のJSON情報を取得することができます

ただし、このコマンドも「Office 365 URL および IP アドレス範囲」のページ自体のURLが変わった場合には対応できなくなってしまうので、その部分は注意が必要です。

ただ、直接取得する URL が変わったときにはこういった手段もあるんだ という形で覚えておいてもらえればと思います。

広告

取得したファイルから特定のURLやIP情報を抜き出してみる

上記でM365のURLやIPアドレス範囲をJSON形式のテキストファイルに書き込んだので、
次にそのファイルから特定のURLやIPの情報を取得してみたいと思います。

1.Portが「587」に一致するURLを抜き出す

以下のコマンドを実行します。
なお、上記のコマンドの続きで実行しますので [$Path] は上記のコマンドで変数が格納された状態である前提です。

$json = Get-Content $path | ConvertFrom-Json
$url_587 =  $json | where { $_.tcpPorts  -eq "587" } 
$url_587.urls

結果は以下の通りとなり、1行のみ出力されます。(2022/8/2時点)

PS C:\> $json = Get-Content $path | ConvertFrom-Json
PS C:\> $urldata_587 =  $json | where { $_.tcpPorts  -eq "587" }
PS C:\> $urldata_587.urls
smtp.office365.com
PS C:\>

もし「本当にこの1行以外ないのか?」をするのであれば、テキストファイルでも他に587がないかをフィルタにかけて調べてみるとよいと思います。

テキストファイルでも他に587がないかをフィルタにかけて確認する

2.Portが「587」に一致するIPを抜き出す

今度はURL情報ではなくIP情報を取得してみます。

$json = Get-Content $path | ConvertFrom-Json
$ip_587 =  $json | where { $_.tcpPorts  -eq "587" }
$ip_587.ips

結果は以下のように出力され、IPv4だけでなく、IPv6も出力されます。

PS C:\> $json = Get-Content $path | ConvertFrom-Json
PS C:\> $ip_587 =  $json | where { $_.tcpPorts  -eq "587" }
PS C:\> $ip_587.ips
13.107.6.152/31
13.107.18.10/31
13.107.128.0/22
23.103.160.0/20
40.96.0.0/13
40.104.0.0/15
52.96.0.0/14
131.253.33.215/32
132.245.0.0/16
150.171.32.0/22
204.79.197.215/32
2603:1006::/40
2603:1016::/36
2603:1026::/36
2603:1036::/36
2603:1046::/36
2603:1056::/36
2620:1ec:4::152/128
2620:1ec:4::153/128
2620:1ec:c::10/128
2620:1ec:c::11/128
2620:1ec:d::10/128
2620:1ec:d::11/128
2620:1ec:8f0::/46
2620:1ec:900::/46
2620:1ec:a92::152/128
2620:1ec:a92::153/128
2a01:111:f400::/48
PS C:\>

もしIPv4のみを取得したい場合には if を利用して追加の処理することで取得可能です。

$ipv4 = @();
for ($i=0; $i -lt $ip_587.ips.length; $i++){
    if( $ip_587.ips[$i] -match "::" ){
        continue
    }
    $ipv4 += $ip_587.ips[$i]
}
$ipv4

少し解説をすると、ここでは各項目の中身を見て
「::」が含まれていないものを新しい配列 [$ipv4] に格納していく処理 をしています。

結果は以下のようになりIPv4のアドレスのみを取得することができます。

PS C:\> $ipv4 = @();
PS C:\> for ($i=0; $i -lt $ip_587.ips.length; $i++){
>>     if( $ip_587.ips[$i] -match "::" ){
>>         continue
>>     }
>>     $ipv4 += $ip_587.ips[$i]
>> }
PS C:\> $ipv4
13.107.6.152/31
13.107.18.10/31
13.107.128.0/22
23.103.160.0/20
40.96.0.0/13
40.104.0.0/15
52.96.0.0/14
131.253.33.215/32
132.245.0.0/16
150.171.32.0/22
204.79.197.215/32
PS C:\>
広告

3.「80」「443」「80,443」に一致するIPを抜き出す

最後にweb系のポート(80、443、80と443)に関するIPを取得してみます。
ここではIPv4のみを出力します。

$json = Get-Content $path | ConvertFrom-Json
$url_web =  $json | where { $_.tcpPorts -eq "80" -or $_.tcpPorts -eq "443" -or $_.tcpPorts  -eq "80,443" }
$ipv4_web = @();
for ($j=0; $j -lt $url_web.ips.length; $j++){
    if( $url_web.ips[$j] -match "::" ){
        continue
    }
    $ipv4_web += $url_web.ips[$j]
}
$ipv4_web

結果は以下の通りとなります。

PS C:\> $json = Get-Content $path | ConvertFrom-Json
PS C:\> $url_web =  $json | where { $_.tcpPorts -eq "80" -or $_.tcpPorts -eq "443" -or $_.tcpPorts  -eq "80,443" }
PS C:\> $ipv4_web = @();
PS C:\> for ($j=0; $j -lt $url_web.ips.length; $j++){
>>     if( $url_web.ips[$j] -match "::" ){
>>         continue
>>     }
>>     $ipv4_web += $url_web.ips[$j]
>> }
PS C:\> $ipv4_web
13.107.6.152/31
13.107.18.10/31
13.107.128.0/22
23.103.160.0/20
40.96.0.0/13
40.104.0.0/15
52.96.0.0/14
131.253.33.215/32
132.245.0.0/16
150.171.32.0/22
204.79.197.215/32
40.92.0.0/15
40.107.0.0/16
52.100.0.0/14
52.238.78.88/32
104.47.0.0/17
13.107.64.0/18
52.112.0.0/14
52.120.0.0/14
52.238.119.141/32
52.244.160.207/32
13.107.64.0/18
52.112.0.0/14
52.120.0.0/14
52.238.119.141/32
52.244.160.207/32
13.107.64.0/18
52.112.0.0/14
52.120.0.0/14
52.238.119.141/32
52.244.160.207/32
13.107.136.0/22
40.108.128.0/17
52.104.0.0/14
104.146.128.0/17
150.171.40.0/22
13.107.6.171/32
13.107.18.15/32
13.107.140.6/32
52.108.0.0/14
52.238.106.116/32
52.244.37.168/32
52.244.203.72/32
52.244.207.172/32
52.244.223.198/32
52.247.150.191/32
20.190.128.0/18
40.126.0.0/18
52.108.0.0/14
52.108.0.0/14
PS C:\>
広告

さいごに

今回紹介した方法以外にもこの手の情報を取得するやり方はあるかと思いますが、私はpowershellが好きなのでpowershellで試してみました。^^

また、「Office 365 URL および IP アドレス範囲」で更新があった際の差分の取得については以下の記事にまとめていますので興味があれば見てくてください。^^

【Powershell】M365の更新されたURLやIPアドレスを取得してみた
M365のURLやIPアドレス範囲は月に1度更新されることが知られていますが、その更新された箇所を差分としてPowerShellを利用して取得してみました。 「更新されたこと」については、以下のリンク先の という部分から知ることができますが...

コメント

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