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

Powershell Powershell

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:\>
広告

[参考] ファイルにDLすることなくURLやIPアドレス範囲を取得する

上記では手元の端末に情報としてDLしてからURLやIPアドレスを取得していましたが、そのままURLとIPアドレスを取得もできます。

URLの一覧を取得する

#M365のURL一覧を取得
$urls = Invoke-WebRequest -Uri 'https://endpoints.office.com/endpoints/worldwide?clientrequestid=b10c5ed1-bad1-445f-b386-b919946339a7' | ConvertFrom-Json
$urls.urls

実行結果

PS C:\> $urls = Invoke-WebRequest -Uri 'https://endpoints.office.com/endpoints/worldwide?clientrequestid=b10c5ed1-bad1-445f-b386-b919946339a7' | ConvertFrom-Json
PS C:\> $urls.urls
outlook.office.com
outlook.office365.com
outlook.office365.com
smtp.office365.com
*.outlook.com
autodiscover.*.onmicrosoft.com
*.protection.outlook.com
*.mail.protection.outlook.com
*.mx.microsoft
*.lync.com
*.teams.microsoft.com
teams.microsoft.com
*.keydelivery.mediaservices.windows.net
*.streaming.mediaservices.windows.net
mlccdn.blob.core.windows.net
aka.ms
*.users.storage.live.com
adl.windows.com
*.secure.skypeassets.com
mlccdnprod.azureedge.net
*.sharepoint.com
ssw.live.com
storage.live.com
*.search.production.apac.trafficmanager.net
*.search.production.emea.trafficmanager.net
*.search.production.us.trafficmanager.net
*.wns.windows.com
admin.onedrive.com
officeclient.microsoft.com
g.live.com
oneclient.sfx.ms
*.sharepointonline.com
spoprod-a.akamaihd.net
*.svc.ms
*.microsoftstream.com
nps.onyx.azure.net
*.azureedge.net
*.media.azure.net
*.streaming.mediaservices.windows.net
*.keydelivery.mediaservices.windows.net
*.officeapps.live.com
*.online.office.com
office.live.com
*.office.net
*.onenote.com
*.microsoft.com
*cdn.onenote.net
ajax.aspnetcdn.com
apis.live.net
officeapps.live.com
www.onedrive.com
*.auth.microsoft.com
*.msftidentity.com
*.msidentity.com
account.activedirectory.windowsazure.com
accounts.accesscontrol.windows.net
adminwebservice.microsoftonline.com
api.passwordreset.microsoftonline.com
autologon.microsoftazuread-sso.com
becws.microsoftonline.com
ccs.login.microsoftonline.com
clientconfig.microsoftonline-p.net
companymanager.microsoftonline.com
device.login.microsoftonline.com
graph.microsoft.com
graph.windows.net
login-us.microsoftonline.com
login.microsoft.com
login.microsoftonline-p.com
login.microsoftonline.com
login.windows.net
logincert.microsoftonline.com
loginex.microsoftonline.com
nexus.microsoftonline-p.com
passwordreset.microsoftonline.com
provisioningapi.microsoftonline.com
*.hip.live.com
*.microsoftonline-p.com
*.microsoftonline.com
*.msauth.net
*.msauthimages.net
*.msecnd.net
*.msftauth.net
*.msftauthimages.net
*.phonefactor.net
enterpriseregistration.windows.net
policykeyservice.dc.ad.msft.net
*.compliance.microsoft.com
*.protection.office.com
*.security.microsoft.com
compliance.microsoft.com
defender.microsoft.com
protection.office.com
security.microsoft.com
*.portal.cloudappsecurity.com
*.blob.core.windows.net
firstpartyapps.oaspapps.com
prod.firstpartyapps.oaspapps.com.akadns.net
telemetryservice.firstpartyapps.oaspapps.com
wus-firstpartyapps.oaspapps.com
*.aria.microsoft.com
*.events.data.microsoft.com
*.o365weve.com
amp.azure.net
appsforoffice.microsoft.com
assets.onestore.ms
auth.gfx.ms
c1.microsoft.com
dgps.support.microsoft.com
docs.microsoft.com
msdn.microsoft.com
platform.linkedin.com
prod.msocdn.com
shellprod.msocdn.com
support.microsoft.com
technet.microsoft.com
*.office365.com
*.aadrm.com
*.azurerms.com
*.informationprotection.azure.com
ecn.dev.virtualearth.net
informationprotection.hosting.portal.azure.net
*.sharepointonline.com
dc.services.visualstudio.com
mem.gfx.ms
staffhub.ms
*.microsoft.com
*.msocdn.com
*.onmicrosoft.com
o15.officeredir.microsoft.com
officepreviewredir.microsoft.com
officeredir.microsoft.com
r.office.microsoft.com
activation.sls.microsoft.com
crl.microsoft.com
office15client.microsoft.com
officeclient.microsoft.com
go.microsoft.com
ajax.aspnetcdn.com
cdn.odc.officeapps.live.com
officecdn.microsoft.com
officecdn.microsoft.com.edgesuite.net
otelrules.azureedge.net
*.virtualearth.net
c.bing.net
ocos-office365-s2s.msedge.net
tse1.mm.bing.net
www.bing.com
*.acompli.net
*.outlookmobile.com
login.windows-ppe.net
account.live.com
login.live.com
www.acompli.com
*.appex-rf.msn.com
*.appex.bing.com
c.bing.com
c.live.com
d.docs.live.net
docs.live.net
partnerservices.getmicrosoftkey.com
signup.live.com
account.live.com
auth.gfx.ms
login.live.com
*.yammer.com
*.yammerusercontent.com
*.assets-yammer.com
www.outlook.com
eus-www.sway-cdn.com
eus-www.sway-extensions.com
wus-www.sway-cdn.com
wus-www.sway-extensions.com
sway.com
www.sway.com
*.entrust.net
*.geotrust.com
*.omniroot.com
*.public-trust.com
*.symcb.com
*.symcd.com
*.verisign.com
*.verisign.net
apps.identrust.com
cacerts.digicert.com
cert.int-x3.letsencrypt.org
crl.globalsign.com
crl.globalsign.net
crl.identrust.com
crl3.digicert.com
crl4.digicert.com
isrg.trustid.ocsp.identrust.com
mscrl.microsoft.com
ocsp.digicert.com
ocsp.globalsign.com
ocsp.msocsp.com
ocsp2.globalsign.com
ocspx.digicert.com
secure.globalsign.com
www.digicert.com
www.microsoft.com
officespeech.platform.bing.com
*.skype.com
*.office.com
www.microsoft365.com
*.microsoftusercontent.com
*.azure-apim.net
*.flow.microsoft.com
*.powerapps.com
*.powerautomate.com
*.activity.windows.com
activity.windows.com
*.cortana.ai
admin.microsoft.com
cdn.odc.officeapps.live.com
cdn.uci.officeapps.live.com
compass-ssl.microsoft.com
*.cloud.microsoft
*.static.microsoft
*.usercontent.microsoft
PS C:\>

IPアドレスの一覧を取得する

すべてのIPアドレスを取得する

#M365のIPアドレス一覧を取得
$ips = Invoke-WebRequest -Uri 'https://endpoints.office.com/endpoints/worldwide?clientrequestid=b10c5ed1-bad1-445f-b386-b919946339a7' | ConvertFrom-Json
$ips.ips

実行結果

PS C:\> $ips = Invoke-WebRequest -Uri 'https://endpoints.office.com/endpoints/worldwide?clientrequestid=b10c5ed1-bad1-445f-b386-b919946339a7' | ConvertFrom-Json
PS C:\> $ips.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
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
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
2a01:111:f400::/48
2a01:111:f403::/48
40.92.0.0/15
40.107.0.0/16
52.100.0.0/14
104.47.0.0/17
2a01:111:f400::/48
2a01:111:f403::/48
13.107.64.0/18
52.112.0.0/14
52.122.0.0/15
2603:1063::/38
13.107.64.0/18
52.112.0.0/14
52.122.0.0/15
52.238.119.141/32
52.244.160.207/32
2603:1027::/48
2603:1037::/48
2603:1047::/48
2603:1057::/48
2603:1063::/38
2620:1ec:6::/48
2620:1ec:40::/42
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
2603:1061:1300::/40
2620:1ec:8f8::/46
2620:1ec:908::/46
2a01:111:f402::/48
13.107.6.171/32
13.107.18.15/32
13.107.140.6/32
52.108.0.0/14
52.244.37.168/32
2603:1006:1400::/40
2603:1016:2400::/40
2603:1026:2400::/40
2603:1036:2400::/40
2603:1046:1400::/40
2603:1056:1400::/40
2603:1063:2000::/38
2620:1ec:c::15/128
2620:1ec:8fc::6/128
2620:1ec:a92::171/128
2a01:111:f100:2000::a83e:3019/128
2a01:111:f100:2002::8975:2d79/128
2a01:111:f100:2002::8975:2da8/128
2a01:111:f100:7000::6fdd:6cd5/128
2a01:111:f100:a004::bfeb:88cf/128
20.20.32.0/19
20.190.128.0/18
20.231.128.0/19
40.126.0.0/18
2603:1006:2000::/48
2603:1007:200::/48
2603:1016:1400::/48
2603:1017::/48
2603:1026:3000::/48
2603:1027:1::/48
2603:1036:3000::/48
2603:1037:1::/48
2603:1046:2000::/48
2603:1047:1::/48
2603:1056:2000::/48
2603:1057:2::/48
13.107.6.192/32
13.107.9.192/32
52.108.0.0/14
2620:1ec:4::192/128
2620:1ec:a92::192/128
PS C:\>

IPv4のIPアドレスを取得する

IPアドレス一覧を抜き出す際に何もしないとIPv6も一緒に出力されますので、次にIPv4だけを抜き出してみます。

#IPv4のIPアドレスのみを取得する
$ips = Invoke-WebRequest -Uri 'https://endpoints.office.com/endpoints/worldwide?clientrequestid=b10c5ed1-bad1-445f-b386-b919946339a7' | ConvertFrom-Json
$ips.ips | Where-Object {$_ -notmatch "::"} 

実行結果

PS C:\> $ips = Invoke-WebRequest -Uri 'https://endpoints.office.com/endpoints/worldwide?clientrequestid=b10c5ed1-bad1-445f-b386-b919946339a7' | ConvertFrom-Json
PS C:\> $ips.ips | Where-Object {$_ -notmatch "::"}
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
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
40.92.0.0/15
40.107.0.0/16
52.100.0.0/14
104.47.0.0/17
13.107.64.0/18
52.112.0.0/14
52.122.0.0/15
13.107.64.0/18
52.112.0.0/14
52.122.0.0/15
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.244.37.168/32
20.20.32.0/19
20.190.128.0/18
20.231.128.0/19
40.126.0.0/18
13.107.6.192/32
13.107.9.192/32
52.108.0.0/14
PS C:\>
広告

さいごに

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

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

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

コメント

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