M365のURLやIPアドレス範囲の情報は以下の公式ドキュメント内でJSONファイルで公開されていますが、約1か月ごとに更新されることで知られています。
そのM365のURLやIPアドレス範囲の情報をpowershellで取得できたら、
powershell上で変更点の洗い出しや加工ができるので自動化などにつなげられるのではないか?と思い、「powershellでM365のURLやIPアドレス範囲を取得」することを試してみました。
M365のURLやIPアドレス範囲が掲載されている場所
上記、Microsoft公式ドキュメントのリンク先ページ内の「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がないかをフィルタにかけて調べてみるとよいと思います。
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 アドレス範囲」で更新があった際の差分の取得については以下の記事にまとめていますので興味があれば見てみてください。
コメント