【Powershell】M365の更新されたURLやIPアドレスを取得してみた

Powershell Powershell

M365のURLやIPアドレス範囲は月に1度更新されることが知られていますが、
その更新された箇所を差分としてPowerShellを利用して取得してみました

「更新されたこと」については、以下のリンク先の [変更ログのサブスクリプション] という部分から知ることができますが、具体的にどこが違うのかについては分からないので、PowerShellで簡単に表示できないか?と思ったのがきっかけです。

Microsoft 365 の URL と IP アドレスの範囲 - Microsoft 365 Enterprise
概要: Microsoft 365 にはインターネットへの接続が必要です。 以下のエンドポイントは、Government Community Cloud (GCC) を含む Microsoft 365 プランを使用しているお客様には到達可能...
「変更ログのサブスクリプション」の場所

・ [変更ログのサブスクリプション] をクリックして表示されるページ

[変更ログのサブスクリプション] をクリックして表示されるページ

xml形式で更新の履歴が表示されますが、更新された日付何個のURLが更新されたのかなどの概要の情報を知ることはできますが、具体的な変更点についてが記載されているわけではありません

広告

1.M365のURLやIPアドレス範囲の情報を取得する

まず、公開されているURLやIPアドレスの情報をテキストファイルとして取得します。

取得方法は以下の記事で紹介していますので参考にしてください。

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

2.powrshellで差分を取得する

上記「1.M365のURLやIPアドレス範囲の情報を取得する」が完了したら、
いよいよ差分を取得します。

今回は、先月分との差分を比較することを前提にpowershellを作成しました。

しかし今時点だと先月分ファイルがなく比較のしようがないので、
今回は今月分のファイルを少し編集して先月分のファイルとして扱い、そのファイルとの比較を確認してみました。

手動で編集した変更点は以下の通りです。

  • 今月分のid1「13.1.1.1/32,13.2.2.2/32」を追加(今月の新規追加IPとして扱う)
  • 今月分のid9から「52.238.78.88/32」を削除(今月削除されたIPとして扱う)
  • 今月分のid160「hoge.com」を追加(今月の新規追加URLとして扱う)
  • 今月分のid2から「smtp.office365.com」を削除(今月削除されたURLとして扱う)

①IPの差分があるかを確認する

IPの差分があるかを確認するpowershellコマンドです。

#先月分のファイルを取得(手動で日付指定)
$input_date = Read-Host "Enter the date you want to compare of 'yyyyMMdd'"
$date_lastmonth = $input_date
$path_lastmonth = Join-Path C:\hogehoge\ ("m365_" + $date_lastmonth + ".txt")
$json_lastmonth = Get-Content $path_lastmonth | ConvertFrom-Json

#今月分(実行日の日付)のファイルを取得
$date = Get-Date -Format "yyyyMMdd"
$path = Join-Path C:\hogehoge\ ("m365_" + $date + ".txt")
$json = Get-Content $path | ConvertFrom-Json

#先月分、今月分のIPアドレスをそれぞれ取得
$all_ip = $json.ips
$all_ip_lastmonth = $json_lastmonth.ips

#IPv4のみを格納するための配列を先月分、今月分それぞれ用意
$all_ip_v4 = @();
$all_ip_v4_lastmonth = @();

#IPv4への変換(今月分)
for ($i=0; $i -lt $all_ip.length; $i++){
    if( $all_ip[$i] -match "::" ){
        continue
    }
    $all_ip_v4 += $all_ip[$i]
}

#IPv4への変換(先月分)
for ($i=0; $i -lt $all_ip_lastmonth.length; $i++){
    if( $all_ip_lastmonth[$i] -match "::" ){
        continue
    }
    $all_ip_v4_lastmonth += $all_ip_lastmonth[$i]
}

#変更されたIPを格納する配列を定義
$new_ip = @();
$old_ip = @();

#「先月分のIPの中に今月分のIPが含まれているかを判定し、含まれていないもの(=今月になって新しい値が追加されたもの)は [$new_ip] に格納する」という処理を実行
for ($i=0; $i -lt $all_ip_v4.length; $i++){
    if( $all_ip_v4_lastmonth -contains $all_ip_v4[$i] ){
        continue
    }else{
        $new_ip += $all_ip_v4[$i]
    }
}

#「今月分のIPの中に先月分のIPが含まれているかを判定し、含まれていないもの(=先月から値が削除されたもの)は [$oid_ip] に格納する」という処理を実行
for ($i=0; $i -lt $all_ip_v4_lastmonth.length; $i++){
    if( $all_ip_v4 -contains $all_ip_v4_lastmonth[$i] ){
        continue
    }else{
        $old_ip += $all_ip_v4_lastmonth[$i]
    }
}

#差分を表示
$new_ip
$old_ip

各処理の説明については上記のコマンド内にコメントで記載してあります。

このコマンドを実行した結果は以下の通りとなりました。

PS C:\> $input_date = Read-Host "Enter the date you want to compare of 'yyyyMMdd'"
Enter the date you want to compare of 'yyyyMMdd': 20220703
PS C:\> $date_lastmonth = $input_date
PS C:\> $path_lastmonth = Join-Path C:\hogehoge\ ("m365_" + $date_lastmonth + ".txt")
PS C:\> $json_lastmonth = Get-Content $path_lastmonth | ConvertFrom-Json
PS C:\> $date = Get-Date -Format "yyyyMMdd"
PS C:\> $path = Join-Path C:\hogehoge\ ("m365_" + $date + ".txt")
PS C:\> $json = Get-Content $path | ConvertFrom-Json
PS C:\> $all_ip = $json.ips
PS C:\> $all_ip_lastmonth = $json_lastmonth.ips
PS C:\> $all_ip_v4 = @();
PS C:\> $all_ip_v4_lastmonth = @();
PS C:\> for ($i=0; $i -lt $all_ip.length; $i++){
>>     if( $all_ip[$i] -match "::" ){
>>         continue
>>     }
>>     $all_ip_v4 += $all_ip[$i]
>> }
PS C:\> for ($i=0; $i -lt $all_ip_lastmonth.length; $i++){
>>     if( $all_ip_lastmonth[$i] -match "::" ){
>>         continue
>>     }
>>     $all_ip_v4_lastmonth += $all_ip_lastmonth[$i]
>> }
PS C:\> $new_ip = @();
PS C:\> $old_ip = @();
PS C:\> for ($i=0; $i -lt $all_ip_v4.length; $i++){
>>     if( $all_ip_v4_lastmonth -contains $all_ip_v4[$i] ){
>>         continue
>>     }else{
>>         $new_ip += $all_ip_v4[$i]
>>     }
>> }
PS C:\> for ($i=0; $i -lt $all_ip_v4_lastmonth.length; $i++){
>>     if( $all_ip_v4 -contains $all_ip_v4_lastmonth[$i] ){
>>         continue
>>     }else{
>>         $old_ip += $all_ip_v4_lastmonth[$i]
>>     }
>> }
PS C:\> $new_ip
13.1.1.1/32
13.2.2.2/32
PS C:\> $old_ip
52.238.78.88/32
PS C:\>

今回手動で変更した内容を考えると、

  • [$new_ip] には「13.1.1.1/32,13.2.2.2/32」が格納されている
  • [$old_ip] には「52.238.78.88/32」が格納されていれいる

となっていれば差分を表示できているということになりますので、
このコマンドでIPの差分を取得することできました

②URLの差分があるかを確認する

上記と同じようにURLについても差分を確認してみます。

#先月分のファイルを取得(手動で日付指定)
$input_date = Read-Host "Enter the date you want to compare of 'yyyyMMdd'"
$date_lastmonth = $input_date
$path_lastmonth = Join-Path C:\hogehoge\ ("m365_" + $date_lastmonth + ".txt")
$json_lastmonth = Get-Content $path_lastmonth | ConvertFrom-Json

#今月分(実行日の日付)のファイルを取得
$date = Get-Date -Format "yyyyMMdd"
$path = Join-Path C:\hogehoge\ ("m365_" + $date + ".txt")
$json = Get-Content $path | ConvertFrom-Json

#先月分、今月分のURLをそれぞれ取得
$all_url = $json.urls
$all_url_lastmonth = $json_lastmonth.urls

#変更されたURLを格納する配列を定義
$new_url = @();
$old_url = @();

#「先月分のIPの中に今月分のIPが含まれているかを判定し、含まれていないもの(=今月になって新しい値が追加されたもの)は [$new_url] に格納する」という処理を実行
for ($i=0; $i -lt $all_url.length; $i++){
    if( $all_url_lastmonth -contains $all_url[$i] ){
        continue
    }else{
        $new_url += $all_url[$i]
    }
}

#「今月分のIPの中に先月分のIPが含まれているかを判定し、含まれていないもの(=先月から値が削除されたもの)は [$oid_url] に格納する」という処理を実行
for ($i=0; $i -lt $all_url_lastmonth.length; $i++){
    if( $all_url -contains $all_url_lastmonth[$i] ){
        continue
    }else{
        $old_url += $all_url_lastmonth[$i]
    }
}

$new_url
$old_url

各処理の説明については上記のコマンド内にコメントで記載してあります。

このコマンドを実行した結果は以下の通りとなりました。

PS C:\> $input_date = Read-Host "Enter the date you want to compare of 'yyyyMMdd'"
Enter the date you want to compare of 'yyyyMMdd': 20220703
PS C:\> $date_lastmonth = $input_date
PS C:\> $path_lastmonth = Join-Path C:\hogehoge\ ("m365_" + $date_lastmonth + ".txt")
PS C:\> $json_lastmonth = Get-Content $path_lastmonth | ConvertFrom-Json
PS C:\> $date = Get-Date -Format "yyyyMMdd"
PS C:\> $path = Join-Path C:\hogehoge\ ("m365_" + $date + ".txt")
PS C:\> $json = Get-Content $path | ConvertFrom-Json
PS C:\> $all_url = $json.urls
PS C:\> $all_url_lastmonth = $json_lastmonth.urls
PS C:\> $new_url = @();
PS C:\> $old_url = @();
PS C:\> for ($i=0; $i -lt $all_url.length; $i++){
>>     if( $all_url_lastmonth -contains $all_url[$i] ){
>>         continue
>>     }else{
>>         $new_url += $all_url[$i]
>>     }
>> }
PS C:\> for ($i=0; $i -lt $all_url_lastmonth.length; $i++){
>>     if( $all_url -contains $all_url_lastmonth[$i] ){
>>         continue
>>     }else{
>>         $old_url += $all_url_lastmonth[$i]
>>     }
>> }
PS C:\> $new_url
hoge.com
PS C:\> $old_url
smtp.office365.com
PS C:\>

今回手動で変更した内容を考えると、

  • [$new_url] には「hoge.com」が格納されている
  • [$old_url] には「smtp.office365.com」が格納されていれいる

となっていれば差分を表示できているということになりますので、
このコマンドでURLの差分を取得することできました

[参考] 差分のあったIPやURLがどのidに所属するのかを確認する

参考となりますが、差分のあったIPやURLがどのidに所属するのかについても確認してみました。

追加されたIPのidを確認するコマンド

$id_add_ip = @();
for ($i=0; $i -lt $new_ip.length; $i++){
    $id_add_ip += $json | Where-Object {$_.ips -like $new_ip[$i]}
}
$id_add_ip.id

・実行結果

PS C:\> $id_add_ip = @();
PS C:\> for ($i=0; $i -lt $new_ip.length; $i++){
>>     $id_add_ip += $json | Where-Object {$_.ips -like $new_ip[$i]}
>> }
PS C:\> $id_add_ip.id
1
1
PS C:\>

今回は2つのIPを id1 に追加したので、この結果で合っています。

削除されたIPのidを確認するコマンド

$id_del_ip = @();
for ($i=0; $i -lt $old_ip.length; $i++){
    $id_del_ip += $json_lastmonth | Where-Object {$_.ips -like $old_ip[$i]}
}
$id_del_ip.id

・実行結果

PS C:\> $id_del_ip = @();
PS C:\> for ($i=0; $i -lt $old_ip.length; $i++){
>>     $id_del_ip += $json_lastmonth | Where-Object {$_.ips -like $old_ip[$i]}
>> }
PS C:\> $id_del_ip.id
9
PS C:\>

今回は1つのIPを id9 から削除したので、この結果も合っています。

追加されたURLのidを確認するコマンド

$id_add_url = @();
for ($i=0; $i -lt $new_url.length; $i++){
    $id_add_url += $json | Where-Object {$_.urls -like $new_url[$i]}
}
$id_add_url.id

・実行結果

PS C:\> $id_add_url = @();
PS C:\> for ($i=0; $i -lt $new_url.length; $i++){
>>     $id_add_url += $json | Where-Object {$_.urls -like $new_url[$i]}
>> }
PS C:\> $id_add_url.id
160
PS C:\>

今回は1つのURLを id160 に追加したので、この結果も合っています。

削除されたURLのidを確認するコマンド

$id_del_url = @();
for ($i=0; $i -lt $old_url.length; $i++){
    $id_del_url += $json_lastmonth | Where-Object {$_.urls -like $old_url[$i]}
}
$id_del_url.id

・実行結果

PS C:\> $id_del_url = @();
PS C:\> for ($i=0; $i -lt $old_url.length; $i++){
>>     $id_del_url += $json_lastmonth | Where-Object {$_.urls -like $old_url[$i]}
>> }
PS C:\> $id_del_url.id
2
PS C:\>

今回は1つのURLを id2 から削除したので、この結果も合っています。

上記のコマンドを利用することで更新されたIPやURLに関わる id も特定することができました。

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