こんばんは。
まだまだ暑い日が続いていますが、皆様いかがお過ごしでしょうか?
そういえば、Azure Active Directory、今後は「Microsoft Entra ID」と名称が変更されましたね。Azure ADとかAADと言って長年慣れ親しんできましたが、全然よくわからない名称に変わりちょっと寂しい気分です。それにしてもMSさん、名称変更好きですよね・・・。
本日は、以前アップしたマルチリージョンでのDR構成構築手順で、データベースへのアクセスに手を抜いてSQL認証を利用しており、いろいろと突っ込まれそうな感じでしたので、別建てとしてマネージドIDを利用したSQL Databaseへのアクセスにして、セキュリティを高めていきたいと思います。
今回のゴール
上記図を簡単に説明すると、変更前は、SQL DatabaseへのアクセスにSQL認証を利用しています。つまり、接続文字列をAzure Functionsの環境変数やKey Vaultなどから利用することでAzure SQL Databaseとの認証を行っています。
「SQL認証のどこが問題なのか」というと、接続文字列内にSQL認証用のIDとパスワードを保持しているということです。接続文字列(IDとパスワード)が漏洩するだけで、Azure SQLへの不正アクセスリスクが一気に増大するわけです。
では、どうするか。それが今回のゴールです。マネージドIDというメカニズムを利用し、Azure SQLへのアクセスからIDとパスワードを廃棄し、許可されたAzureリソースのみがアクセスできるようにしていくわけです。
手順としては以下の通りです。
- Azure FunctionsのマネージドIDを発行する。
- Azure Active Directory(以下AAD)のグループにAzure SQL Databaseへのアクセス専用グループを追加し、発行したAzure FunctionsマネージドIDを追加する。
- Azure SQL DatabaseにAzure SQLアクセスグループのユーザー追加&権限設定
- Azure Functionsの接続文字列変更
- Azure SQL Databaseへの認証を「Azure Active Directory認証のみ」に設定
上記5ステップを行っていきます。
ちょっと手順が多そうですが、そんなに難しい作業でもないため慣れれば5~10分程度でできるのではと思います。
それではレッツゴ~~~w
Azure SQL DatabaseにマネージドIDを利用してアクセスする手順
本投稿でこの手順を進めていく上での前提条件です。
Azure FunctionsとAzure SQL Databaseの連携実装に関しては以下をご参考にしていただければ、その続きから当手順を実施可能です。
Azure FunctionsのマネージドID発行
まずは今回の主役、マネージドIDを発行していきます。
対象のAzure Functionsにアクセスし、[設定]の「ID」をクリックします。
「システム割り当て済み」タブの[状態]を「オン」に変更し、「保存」をクリックします。
マネージドID有効化の確認画面がでるので「はい」をクリックします。
システム割り当てマネージドIDの発行ができました。簡単。
登録したマネージドIDはAzure Active Directoryの[エンタープライズアプリケーション]-[すべてのアプリケーション]から、「アプリケーションの種類」フィルターを「マネージドID」にすると確認することができます。この後利用するので、「名前」を覚えておいてください。基本的にはAzure Functionsのリソース名になっていると思います。
Azure Active Directoryグループの作成&マネージドIDをグループに追加
続いてAADにAzure SQL Databaseへのアクセス用グループを追加していきます。AADにSQLアクセス用のグループを追加し、そのグループにAADユーザーやマネージドID、つまりアプリを登録してあげるだけで、Azure SQL Databaseへの認証をAADで一元管理することができるようになります。
実際はアプリ(マネージドID)がアクセスする場合と、ユーザーがアクセスする場合でグループを分けてあげると、Azure SQL側でロールを分離することができるので便利かと思います。こんなイメージです。
今回はSqlAccessGroupというグループを追加し、マネージドIDをそのグループに追加していきます。
まずはAADにアクセスし、「グループ」を選択します。
「新しいグループ」をクリックします。
以下の画面でグループの種類に「セキュリティ」を選択し、グループ名を入力します。その後、メンバーの部分の「メンバーが選択されていません」をクリックしてください。
メンバーの追加ブレードが表示されるので、検索欄で検索を行うか、「エンタープライズアプリケーション」タブを選択し、マネージドIDを生成したAzure Functionsにチェックを付け、「選択」をクリックします。
画面が戻るので「作成」をクリックしましょう。
グループを追加し、Azure SQLにアクセスするAzure FunctionsのマネージドIDをグループに追加することができました。
Azure SQL Databaseのユーザー&ロール追加
次に、Azure SQL Databaseのユーザーとして、前手順で追加したAADグループを追加していきます。また、追加したユーザーにデータベースへの読取/変更権限を設定していきます。
この手順ではAzure SQL Databaseにアクセスを行って実施していきます。ここではSSMSを利用していきますが、クエリーが実行できればAzureポータルからでも可能です。
以下のクエリーを対象のデータベースに対して実行します。(データベース単位に実行する必要があります。)
1 2 3 4 5 6 |
-- AADグループをユーザーとして追加 CREATE USER [作成したAADグループ名] FROM EXTERNAL PROVIDER; -- AADグループにデータベースの読取/変更権限を設定 ALTER ROLE db_datareader ADD MEMBER [作成したAADグループ名]; ALTER ROLE db_datawriter ADD MEMBER [作成したAADグループ名]; |
今回のグループ名「SqlAccessGroup」を例にすると以下のクエリーを実行する感じです。
1 2 3 4 5 6 |
-- AADグループをユーザーとして追加 CREATE USER [SqlAccessGroup] FROM EXTERNAL PROVIDER; -- AADグループにデータベースの読取/変更権限を設定 ALTER ROLE db_datareader ADD MEMBER [SqlAccessGroup]; ALTER ROLE db_datawriter ADD MEMBER [SqlAccessGroup]; |
こんな感じでユーザーにAADグループ名が追加されていればOKです。
Azure Functionsの接続文字列変更
もうひと踏ん張りです。現在、Azure Functionsに保持しているAzure SQL Databaseへの接続文字列をID&パスワード保持の接続文字列から、マネージドIDアクセスの接続文字列へと変更する必要があります。
Azure Functionsの環境変数、Key Vaultなど、接続文字列を保持しているところを以下の例をご参考に書き換えてみてください。
変更前(例:ADO.NET SQL認証) | Server=tcp:xxxxxxxx.database.windows.net,1433;Initial Catalog={your_database};Persist Security Info=False;User ID={your_userid};Password={your_password};MultipleActiveResultSets=False;Encrypt=True;TrustServerCertificate=False;Connection Timeout=30; |
変更後 | Server=tcp:xxxxxxxx.database.windows.net,1433;Initial Catalog={your_database};Encrypt=True;TrustServerCertificate=False;Connection Timeout=30;Authentication=Active Directory Managed Identity; |
「Authentication=Active Directory Managed Identity;」がポイントかと。
変更したら、Azure Functionsを実行してみます。
マネージドIDを利用して、無事Azure SQL Databaseへのアクセスが確認できました。
Azure SQL Databaseへの認証を「Azure Active Directory認証のみ」に設定
最後の手順です。マネージドIDでのアクセスを設定して、AADにSQLアクセス用グループも設定して、そのグループにAADユーザーを当てがったのであれば、そもそもSQL認証用のID、パスワードを保持している必要性はありません。ですので、認証をAAD認証のみに変更していきましょう。
Azure SQL Databaseのサーバーリソースにアクセスし、[設定]の「Azure Active Directory」をクリックします。
「このサーバーのAzure Active Directory認証のみをサポートする」にチェックをつけ、「はい」をクリックします。
最後に、「保存」をクリックすれば、AAD認証のみに設定したAzure SQL Databaseの完成です。
さいごに
とっても簡単な手順でAzure FunctionsのマネージドIDを利用して、Azure SQL DatabaseへIDとパスワードを利用せずアクセスする環境が整いました。
Azure Functionsに限らず、マネージドIDを利用すればデータベースやストレージなど、対応する様々なリソースのセキュリティを高めてくれます。
マネージドID、利用しない手はないですね。
コメント