Cloud9からMicrosoft365の監査ログを取得する

# はじめに
Microsoft365の監査ログですが、保存期間は90日しかなく、S3への長期保存のために手動操作以外から取得できる方法を探していました。

PowerShellを使えばCLIで取得できるため、AWSからの自動取得の前段階として、Cloud9から取得する方法を備忘録として記事にします。

# まとめ

- LinuxだとPowerShellに以下のモジュールのインストールが必要
    - ExchangeOnlineManagement
    - PSWSMan
- OSはUbuntu
    - Amazon Linuxだと、上記モジュールがうまく入らない・・・？
- MS社公式のDockerイメージを使うと、とても楽
    - Amazon Linux上でも動く

# やったこと
Cloud9のEC2インスタンスに直接PowerShellを入れる方法と、PowerShellインストール済みのDockerイメージを使う方法の2つを記載します。

## 方法１：EC2に直接インストール

### Cloud9作成

PlatformでUbuntuを選択する点に注意するだけで、性能は最低のもので問題ありませんでした。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/4055542e-9f5e-4be0-f13e-aa8fdfba72f2.png)


### PSインストール

以下のサイトを参考にしました。

https://docs.microsoft.com/ja-jp/powershell/scripting/install/installing-powershell-on-linux?view=powershell-7.2&preserve-view=true&viewFallbackFrom=powershell-7.1

https://docs.microsoft.com/ja-jp/powershell/scripting/install/install-ubuntu?view=powershell-7.2

まずはインストーラパッケージをダウンロードします。
```
$ wget https://github.com/PowerShell/PowerShell/releases/download/v7.0.11/powershell-lts_7.0.11-1.ubuntu.18.04_amd64.deb

```

次のコマンドを実行するとエラーになりますが、公式によると問題ないそうです。
> `dpkg -i` コマンドが依存関係が満たされずに失敗する場合は、その次のコマンド `apt-get install -f` によって、これらの問題が解決され、PowerShell パッケージの構成が完了します。

```
# エラーになってもよい
$ sudo dpkg -i powershell-lts_7.0.11-1.ubuntu.18.04_amd64.deb

# これを動かせば問題ないとのこと
$ sudo apt-get install -f

# 試しに実行
$ sudo pwsh
PS> Get-TimeZone
PS> exit
```


### EXO V2 モジュールのインストール
#### PSWSManのインストール
以下の公式にあるコマンドを実行しました、

https://docs.microsoft.com/ja-jp/powershell/exchange/exchange-online-powershell-v2?view=exchange-ps#linux

```powershell
$ sudo pwsh
PS> Install-Module -Name PSWSMan

# メッセージが出てくるので、念のためpwshを出て再度起動
PS> Install-WSMan
WARNING: WSMan libs have been installed, please restart your PowerShell session to enable it in PowerShell
PS> exit
$ sudo pwsh
```
#### ExchangeOnlineManagementのインストール
以下では、「PowerShellGetをインストールする」とありますが、Windowsのみ必要なようですので、今回はやっていません。

https://docs.microsoft.com/ja-jp/powershell/exchange/exchange-online-powershell-v2?view=exchange-ps#install-the-exo-v2-module

ExchangeOnlineManagementだけインストールします。

```powershell
PS> Install-Module -Name ExchangeOnlineManagement
```

### 実行
認証の仕方は色々ありますが、Cloud9を表示しているブラウザでMS365の認証が出来る方法を取りました。
```powershell
PS> Import-Module ExchangeOnlineManagement
PS> Connect-ExchangeOnline -Device
(略)
To sign in, use a web browser to open the page https://microsoft.com/devicelogin and enter the code XXXXXXXXXX to authenticate.
```

`https://microsoft.com/devicelogin`にアクセスすると、以下の画面が出てきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/b2bbc0b0-f17b-fa21-d2fe-aac9924ad3cd.png)

コードを入力すると、アカウントを選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/99e27fda-e9ef-48cb-bde5-433cfc905c9c.png)

許可するために「続行」をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/4c550fac-d042-4528-b120-2b716b254da5.png)

以下の画面が出てきたら、PowerShell側で準備が開始されます。色々ダウンロードするらしく、1分ほどかかりました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/553680/d4c22210-5908-fd7d-81be-e3611e8faa32.png)

終わったら、試しに監査ログを取得します。
```powershell
PS> Search-UnifiedAuditLog -StartDate 6/1/2022 -EndDate 6/2/2022
```

認証方法も複数ありますので、用途に応じて使い分けることが可能です。

https://docs.microsoft.com/ja-jp/powershell/exchange/connect-to-exchange-online-powershell?view=exchange-ps

https://blog.rykoma.net/2020/09/27/1551/

https://docs.microsoft.com/ja-jp/powershell/exchange/app-only-auth-powershell-v2?view=exchange-ps

切断するときは以下で。`-Confirm:$false`で確認なしで切断できます。
```powershell
PS> Disconnect-ExchangeOnline -Confirm:$false
```

## 方法２：公式のDockerイメージを使用
Amazon Linux上でもDockerのコンテナで動かせば同じことが可能です。
公式でPowerShellインストール済みのUbuntuのイメージがありますのでそれを使います。

https://mcr.microsoft.com/en-us/product/powershell/about

```powershell
# 停止時に削除する方法で起動
$ docker run --rm -it mcr.microsoft.com/powershell:lts-7.2-ubuntu-20.04

# モジュールのインストール
PS /> Install-Module -Name ExchangeOnlineManagement
PS /> Install-Module -Name PSWSMan

# 再起動を促すメッセージが表示されたけど、大丈夫の模様
PS /> Install-WSMan

```

後は方法１の実行と同様に認証します。
```powershell
PS /> Connect-ExchangeOnline -Device
PS /> Search-UnifiedAuditLog -StartDate 6/1/2022 -EndDate 6/2/2022
```

片づけるのも、ダウンロードしたイメージを削除するだけなので簡単でした。
```
PS /> exit

# 対象のイメージIDを確認
$ docker images | grep powershell

# 削除
$ docker rmi <対象イメージのID>
```

# おわりに

今回はMicrosoft365の監査ログをCloud9(EC2)から取得する方法を記載しました。
AWSから取得できれば、S3において長期保存したり、Athenaで検索しやすくしたりできるかと考えています。

自動で取得できるよう調べ続ける予定なので、また記事に出来ることがあったら起こそうと思います。