Azure Database for MySQL での Azure AD 利用方法

# 目的
Azure Database for MySQL （以下 Azure MySQL）で、
Azure Active Directory 認証によってログインする方法の整理。

Microsoft Docs を辿ってもフワッとした箇所が多く、手探りで確認する場面が多かったので備忘録。

- [Active Directory authentication - Azure Database for MySQL] (https://docs.microsoft.com/en-us/azure/mysql/concepts-azure-ad-authentication)
- [Use Azure Active Directory - Azure Database for MySQL] (https://docs.microsoft.com/en-us/azure/mysql/howto-configure-sign-in-azure-ad-authentication)

# 手順の概略
**Azure AD 管理者の操作**

1. Azure にログイン
2. アクセストークンを取得
3. Azure MySQL サーバーに接続
4. Azure AD ユーザーを作成
5. Azure AD ユーザーに権限を付与

**Azure AD ユーザーの操作**

1. Azure にログイン
2. アクセストークンを取得
3. Azure MySQL サーバーに接続

# 準備物
#### Azure CLI
クロスプラットフォームのCLIツール。
Azure ポータルで操作が完結しないため、「az」コマンドの実行に必要。

- [Azure CLI のダウンロード] (https://docs.microsoft.com/en-us/cli/azure/install-azure-cli?view=azure-cli-latest)

#### MySQL Workbench (必要に応じて)
MySQL 公式のGUIツール。Azure MySQL サーバーへの接続用。

- [MySQL Workbench のダウンロード] (https://dev.mysql.com/downloads/workbench/)

- Visual C++ 2019 Redistributable Packages のインストールを求められる場合は、以下をダウンロード。

    - [Visual C++ 2019 のダウンロード] (https://support.microsoft.com/en-us/help/2977003/the-latest-supported-visual-c-downloads)

#### Azure AD 管理者
- Azure ポータルで**「Active Directory 管理者」**として指定したユーザー

#### Azure AD ユーザー
- Azure テナントに存在するユーザー

# Azure AD 管理者の操作
## 1. Azure にログイン
＊Azure CLI のインストール後
Windows Powershell 等で以下のコマンドを入力。

```login.ps1
az login
```

Web ブラウザが立ち上がったら Azure で使用するアカウントを選択し、ログイン。

## 2. アクセストークンを取得
Azure MySQL サーバーに接続するためのアクセストークンを取得する。
**これがパスワードの代わりになる。AD パスワードではない**

以下のコマンドを入力。

```get_token.ps1
az account get-access-token --resource-type oss-rdbms
```

以下のような JSON が返ってくる。

```token.json
{
  "accessToken": "めちゃめちゃ長い文字列",
  "expiresOn": "...",
  "subscription": "...",
  "tenant": "...",
  "tokenType": "Bearer"
}
```

accessToken にある文字列をアクセストークンとして接続に使用する。
**アクセストークンの有効期限は取得後の60分間**
expiresOn にある時刻が有効期限。
有効期限が切れたら再度コマンドでトークンを取得し直さなきゃいけない。

## 3. Azure MySQL サーバーへの接続
###  MySQL Workbench を使用する場合
以下の情報を使用し、Azure MySQL サーバーに接続する。

| 項目名 | 値 |
|:--|:--|
| Hostname | サーバー名 <br> (例: hogehogedb.mysql.database.azure.com) |
| Port | 3306 |
| Username | Azure AD 管理者@サーバー <br> (例: AzureADadmin@yourdomain.com@hogehogedb) |
| Password | **取得したアクセストークン** |

Advanced タブ下にある **[Enable Cleartext Authentication Plugin] をオンにする**こと。

### mysql.exe を使用する場合
mysql.exe を使って Azure MySQL サーバーに接続する場合は、以下のコマンドを実行。

```
mysql -h hogehogedb.mysql.database.azure.com \ 
  --user AzureADadmin@yourdomain.com@hogehogedb \ 
  --enable-cleartext-plugin \ 
  --password=`az account get-access-token --resource-type oss-rdbms --output tsv --query accessToken`
```

## 4. Azure AD ユーザーを作成
そのままでは Azure AD 管理者以外のユーザーは Azure AD 認証でサーバーに接続できないため、
Azure AD でログインできるユーザーを作成する。

以下の SQL を実行。

```create.sql
CREATE AADUSER 'piyo01@yourdomain.com';
```

## 5. Azure AD ユーザーに権限を付与
作成したユーザーはデフォルトでは権限を持たないため、権限を指定して付与。

以下の SQL を実行。（例）

```grant.sql
GRANT
    SELECT, INSERT, UPDATE, DELETE
ON
    hogehogedb.*
TO
    'piyo01@yourdomain.com'@'%'
WITH GRANT OPTION;
FLUSH PRIVILEGES;
```

# Azure AD ユーザーの操作
## 1. Azure にログイン
**ユーザーが個別に**ログイン。

```login.ps1
az login
```

## 2. アクセストークンを取得
ログイン後、**ユーザーが個別に**アクセストークンを取得。

```get_token.ps1
az account get-access-token --resource-type oss-rdbms
```

## 3. Azure MySQL サーバーへの接続
各自の Azure AD ユーザー名と、個別で取得したアクセストークンを使い、
Azure MySQL サーバーに接続する。

| 項目名 | 値 |
|:--|:--|
| Username | Azure AD ユーザー@サーバー <br> (例: piyo01@yourdomain.com@hogehogedb) |
| Password | **取得したアクセストークン** |

**Azure AD 管理者が取得したアクセストークンとは別**

# まとめ
Azure AD の情報で Azure Database for MySQL サーバーにログインできるー

## その他
＊ SQL Server や Azure SQL の行レベルセキュリティを再現したい場合は、Azure AD グループユーザーを作成し、DB/テーブル権限を与えて制御するしかなさそう