Azure Automationを使ってオンプレミスActive Directoryユーザを無効化・MLから離脱させる
前回の記事で、Office365(AzureAD)ユーザの無効化は行えましたが、オンプレミス側のADユーザが無効化できていないためセキュリティリスクとなります。
今回はAzure Automationを利用してオンプレミス側のADユーザの無効化し、登録されているMLから脱退させるを実施したいと思います。
Azure Automationとは
公式サイトからの説明
ハイブリッド環境全体にわたって更新を自動化、構成、インストール
- ハイブリッド環境を制御
- サーバーレスの Runbook を使用して管理システムを統合
- Windows と Linux で一貫性のある管理を実現
500分以内のジョブであれば料金は発生しません。素敵!
今回やるジョブは数分で終わるので、数百アカウントとかを月内で処理しなければ十分に事足りると思います。
今回の内容で実現すること
- 退職・休職者のオンプレミス側Active Directoryのユーザアカウントを無効化する
- 退職・休職者が所属してるML(配布リスト)から退職・休職者アカウントを取り除く
です。
前提
- オンプレミスActivie Directory側のユーザ情報にメールアドレス情報が入力されていること
- Azureの有効な契約があること(無料枠で可)
オンプレサーバ設定
Windows PowerShell 用 Active Directory モジュールインストール
Azure Automationを利用して操作したいサーバにPowerShellからADを操作するためのモジュールをインストールします。
PowerShellを起動し下記コマンドを実行します。
1 |
Install-WindowsFeature RSAT-AD-PowerShell |
Azure Automationを設定
https://portal.azure.com/ へアクセスし、ログインします。
リソースグループの作成
今回利用するリソースをわかりやすくするために、リソースグループを作成しておきます。
automationアカウントの作成
automationアカウント作成する必要があるので、automationアカウントを作成します。
どのジョブで利用されるアカウントなのかがわかりやすいようにしておくのがいいのかもしれませんが、ベストプラクティスってどんな形なのでしょう?
Windows Hybrid Runbook Worker のインストール
オンプレミスのWindows Serverへ指示がだせるように操作対象のオンプレミスマシンにWindows Hybrid Runbook Workerをインストールします。
- PowerShellを管理者権限で起動します
- 下記コマンドを実行します
1Install-Script -Name New-OnPremiseHybridWorker - 基本的にY(はい)と入力し、進めていきます
123456789101112PATH 環境変数の変更システムに既定のスクリプトのインストール パスがまだ構成されていません。つまり、スクリプトを実行するには、必ずスクリプトファイルの完全パスを指定する必要があります。この操作を実行すると、スクリプトをフォルダー 'C:\ProgramFiles\WindowsPowerShell\Scripts' に配置し、そのフォルダーを PATH 環境変数に追加します。スクリプトのインストール パスを'C:\Program Files\WindowsPowerShell\Scripts' PATH 環境変数に追加しますか?[Y] はい(Y) [N] いいえ(N) [S] 中断(S) [?] ヘルプ (既定値は "Y"): y信頼されていないリポジトリ信頼されていないリポジトリからスクリプトをインストールしようとしています。このリポジトリを信頼する場合は、Set-PSRepository コマンドレットを実行して、リポジトリの InstallationPolicy の値を変更してください。'PSGallery'からスクリプトをインストールしますか?[Y] はい(Y) [A] すべて続行(A) [N] いいえ(N) [L] すべて無視(L) [S] 中断(S) [?] ヘルプ (既定値は "N"): y - 下記コマンドを実行します
1New-OnPremiseHybridWorker.ps1 - 対話式で色々と聞かれるので先ほど作成したリソースグループ名等を入力していきます。
123456789101112131415マンド パイプライン位置 1 のコマンドレット New-OnPremiseHybridWorker.ps1次のパラメーターに値を指定してください:AAResourceGroupName: ←先ほど作成したリソースグループを入力しますSubscriptionID: ←AzureのサブスクリプションIDを入力しますAutomationAccountName: automation-adUserHybridGroupName: ←オンプレミスサーバ用のグループ名を入力します。WinSVとかわかりやすい名前Importing necessary modules...Successfully installed version 6.13.1 of AzureRM...Pulling Azure account credentials...Accessing Azure Automation Account named automation-adUser in region japaneast...Creating new OMS Workspace named hybridWorkspace48321 in region japaneast...Downloading and installing the Microsoft Monitoring Agent...Waiting for agent registration to complete...Registering the hybrid runbook worker...PS C:\Program Files\Microsoft Monitoring Agent\Agent\AzureAutomation\7.3.396.0\HybridRegistration> - Automationアカウントの【ハイブリッドWorkerグループ】をクリックします
- 入力したHybridGroupNameが表示されていることを確認します
- グループ名をクリックすると、登録台数(?)が表示されます
- ハイブリッドWorkerをクリックすると、先ほどPowerShellを実行したマシン名が表示されるので確認しておきます
資格情報の作成
PowerShellからo365やオンプレミスのADを触るので資格情報が必要になります。
IDやパスワードはハードコーディングはしたくないですよね
Azure Automationには資格情報をまとめる機能があるのでそちらに利用する資格情報を登録します。
- Automationアカウントを開き、【資格情報】をクリックします
- 【資格情報の追加】をクリックします
- Office365にログインするための情報を入力します。
今回はPowerShellのGet-DistributionGroupコマンド等を利用したいので、Exchange管理者をもったユーザを指定してください。(全体管理者でもOK) - 今回は名前にo365adminとつけました。
Runbookの作成
事前時準備が終わったのでここからはハイブリッド環境で実行させるPowerShellを作成していきます。
- RunBook → 【Runbookの作成】をクリックします
- 必要情報を入力し、【作成】をクリックします。
今回は、下記のようにしました。名前 userAccountDisable Runbookの種類 PowerShell - あとはPowerShellを書いていけばOKです。
つたないPowerShellで下記のようにしてみました。12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970param([Parameter(Mandatory=$false)][String] $parm_email)$Cred = Get-AutomationPSCredential -Name 'o365admin'Connect-MSolService -Credential $Credimport-module ActiveDirectoryimport-module azuread$Session = New-PSSession –ConfigurationName Microsoft.Exchange -ConnectionUri https://outlook.office365.com/powershell-liveid -Credential $Cred -Authentication Basic -AllowRedirectionImport-PSSession -Session $Session -DisableNameChecking:$true -AllowClobber:$true | Out-NullStart-Sleep -s 2connect-azuread -Credential $Cred"$parm_email"$adusername = Get-AdUser -Filter {mail -eq $parm_email}Get-AdUser -Filter {mail -eq $parm_email} | Set-ADUser -Enabled $false"$?"if($?){"オンプレADアカウント($adusername.Name)を無効化しました。"}else{"オンプレADアカウント($adusername.Name)の無効化に失敗しました"}$aaduser = get-azureaduser -objectid $parm_email#配列に値があるか確認if($null -eq $aaduser){"ユーザが見つかりませんでした"}else{$aadUserObjId = $aaduser[0].ObjectId.ToString()$aadUserDisp = $aaduser[0].DisplayName.ToString()"$aadUserDisp""$aadUserObjId"}$DistributionGroups = Get-DistributionGroup | where { (Get-DistributionGroupMember $_.Name | foreach {$_.PrimarySmtpAddress}) -contains "$parm_email"}foreach($val in $DistributionGroups){$mladdress = $val.PrimarySmtpAddress$mllist = get-azureadgroup -filter "proxyAddresses/any(c:c eq 'smtp:$($mladdress)')"$mlObjId = $mllist[0].ObjectId.ToString()$mlName = $mllist[0].DisplayNameWrite-Output $mlObjIdWrite-Output $aadUserObjIdStart-Sleep -s 2#Remove-AzureADGroupMember -ObjectId "$($mlObjId)" -MemberId "$($aadUserObjId)"Remove-DistributionGroupMember -Identity $mlName -Member $aadUserDisp -Confirm:$false$?if($?){"$mlNameから離脱しました"}else{"$mlNameの離脱から失敗しました"}}Remove-PSSession $Session"処理完了"エラー処理があまかったり、確認用コードが入っていますが環境に合わせて変更してください。
横にあるアセット等を展開し、必要な項目を「キャンパスに追加」とするとコードが自動的に入るので便利ですね
Runbookのテスト
PowerShellの作成が完了したら正常に動作するかの確認をします。
- 【テストウィンドウ】をクリックします
- PARM_EMAIL欄にアカウントを無効化するユーザのメールアドレスを入力します(変数が変という指摘は受け付けませんw)
実行対象は必ず「ハイブリットWorker」を選択してください。
ハイブリットWorkerグループの選択では、オンプレ側のサーバを登録したグループを選択してください。
- 設定が完了したら、【▶開始】をクリックします。実行中と表示されます
- 最初は特に何も表示されないですが処理が進んでいくと、ストリームが更新されログっぽいのが表示されます
- 処理が完了すると「完了」と表示されます
Power Shellでのエラーも表示されるので、エラー内容を確認しPower Shellを修正します。
- 処理が完了した後に対象アカウントを確認すると以下のようになっています。
・オンプレミスActive Directory上のユーザアカウントが無効化
・配布リストからの脱退
Runbookの公開
テストで問題ないことが確認できたら、次はRunbookを公開します。
- Runbookの編集画面に戻り(横スクロールバーを戻すと編集画面にいけます)、【公開】をクリックします
- 確認ダイアログが表示されるので【はい】をクリックします
- 状態が「発行済み」となったことを確認します
これでFlowから呼び出せる状態になったので、Flowに組み込んでいきます
Microsoft Flowから実行するには
Flowの作成
前回と同じようにジョブ実行でFlowを作成します。
parm_emailに対してメールアドレスを渡す必要があるので、前回作成したSPOリストからメールアドレスを取得します
- 下記URLの内容を同じように設定します。
スケジュール設定(https://blog.intracker.net/archives/1681#outline__4_1)
SPOリストから項目の取得(https://blog.intracker.net/archives/1681#outline__4_2) - 下記URLの4番まで設定します
https://blog.intracker.net/archives/1681#outline__4_3 - 検索ボックスに「automation」と入力し、【Azure Automation】をクリックします
- 【ジョブの作成】をクリックします
- 【詳細オプションを表示する】をクリックします
- Azure契約のアカウントとFlowを作成しているアカウントが同じであればサブスクリプション候補が自動的に表示されます。
- 必要な値を入力します
サブスクリプション Azureのサブスクリプション識別子を選択 リソースグループ 作成したリソースグループ名を選択 Automationアカウント 作成したAzure Automationアカウントを選択 Automationのハイブリットworkerグループ 作成したハイブリットworkerグループ名を入力 Runbook名 作成したRunbookを選択 ジョブの待機 はい Runbook Parameter parm_email 氏名.Email - 【アクションの追加】をクリックします
- 「Azure Automation」 → 【ジョブの状態を取得します】をクリックします
- 必要情報を選択し、ジョブID欄に、ジョブの作成のジョブIDを選択します
- 「制御」 → 【条件】をクリックします
- 条件の値の選択に、【状態】を指定します
- 値の選択欄に「Completed」と入力します
最初日本語で完了といれてて失敗しました。
RunbookのライフサイクルはこちらのURLが参考になります。
- 「はいの場合」「いいえの場合」の処理を追加します
成功したらメールで送信するように今回は設定します(Teamsへの投稿とかのほうが共有は簡単かもしれません)
下記画像のように設定しました。ジョブが何分で終了したかを見るために開始時刻と終了時刻も飛ばすように設定しています
- Flowのテストを実行し、正常に処理が完了するか確認します
- 正常に処理が完了すると下記のようなメールが届きます
Azure Automationジョブの確認
flowをテストするとAzure Automation側にジョブが作成されるので、ジョブの状態を確認してみます。
- 対象Runbookの概要を開きます
- 「最近のジョブ」欄にジョブの状態が表示されます
ここに実行中のものがあれば現在処理中です。
- 実行中等のステータスをクリックし、【すべてのログ】をクリックすると該当ジョブのログを確認することができます
- Failしてしまった場合等にはこちらのログを確認していきます
オンプレミスADユーザの状態確認
オンプレミス側のADユーザを確認すると、「アカウントは無効」にチェックが入った状態になっており該当ユーザではADにログインできない状態となっています。
以前の記事のflowと組み合わせることで、Office365とオンプレ側両方のアカウントを無効化することができます。
人事がFormsやPowerAppsを利用して人事データを登録
↓
情シスが内容を確認し、承認
↓
Azure Automationで自動処理
とすることができるので、ほぼ自動で処理をすることができるようになりますね!
参考URL
Office365で(ほぼ)全自動ユーザー登録システムを作ってみた~実装編
Azure Automation での Runbook の実行