0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

ServicePrincipalを用いたAzure認証

Last updated at Posted at 2022-06-09

1. やりたいこと

AzureのSQL serverに外部から接続するためには、ファイヤウォールで許可するipを設定しなければならない。クライアント側がglobal ipだったらいいのだが、今回はそうではない。ルーターの電源を切らなければ、ipは変わってないので大丈夫なのだけど、停電とかその他理由で突然ipが変更になった場合に、SQL Serverに接続できなくなる。

なので、global ipが変わったときに、ファイヤウォールの設定を自動的に行いたいというのが、やりたいこと。
そのためには、Azure認証を自動的に行う必要がある。AzureのServicePrincipalを使って、Azure認証を行い、PowershellでSQL Serverのファイヤウォールの設定を変更する。

参考:

2. Service Principalの作成

サービスプリンシパルについてはここを参照。

・Azure Active Directory > アプリの登録 > 新規登録
アプリケーションの名前を決める。ここでは、ServicePrincipalTestとする。
image.png

・アプリケーションIDとテナントIDを後から使うので控えておく。
image.png

・"証明書とシークレット"を追加。
新しいクライアント シークレットを選択。有効期限を決めて、追加。
image.png

・"値"というのが認証用のパスワードになるので、覚えておく。
image.png

3. カスタムロールの作成

ServicePrincipalにどのような権限を持たせるかを定義する。ロールに紐づいたActionがあって、ServicePrincipalにロールを割り当てるのだが、今回やりたいのはファイヤウォール規則の変更なので、それだけをもつロールを定義して、そのロールをServicePrincipalに割り当てる。

・サブスクリプション>アクセス制御(IAM)>カスタムロールを作成する
カスタムロール名を決める。ここでは、"SQL firewallRules”とする。
image.png

・アクセス許可の追加をクリック。
image.png

・今回ファイヤウォールのルール作成なので、firewallと検索窓に入れて、アクションを選択。
Microsoft.Sql/servers/firewallRulesのCreateなどにチェック。
image.png

4. ServicePrincipalにロールを割り当てる

・サブスクリプション>アクセス制御(IAM) > 追加 >ロールの割当の追加
image.png

・検索窓にfirewallと打って、先ほど追加したロールを探す。
image.png

・“メンバーを選択する”。
image.png

・"選択"で、さきほど作成したServicePrincipalの名前を入れると、下にでてくるので、選択して"選択"ボタンを押す。
image.png
image.png

5. Azure PowerShellをインストール

ログインを行うPCにAzure PowerShellを入れる。

# PowerShellGetの更新
# PowerShellを管理者として起動する。アイコンを右クリックして管理者として実行するを行う。
Install-Module PowerShellGet -Force

# ポリシーの変更
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned

# Azure PowerShellのインストール
Install-Module -Name Az -AllowClobber -Scope CurrentUser
#Import-Module Az.Resources
$tenantId = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
$applicationId = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
$passwd = ConvertTo-SecureString "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" -AsPlainText -Force
$pscredential = New-Object System.Management.Automation.PSCredential($applicationId, $passwd)
Connect-AzAccount -ServicePrincipal -Credential $pscredential -Tenant $tenantId
Read-Host "続けるには Enter キーを押してください..."

tenantIdはテナントID、applicationIdはアプリケーションID、passwdは、ServicePrincipalを作ったときに出てきた"値"を入れる。このスクリプトを走らせれば、Azureにログインができる。それから、ログインしたあとにファイヤーウォールの設定をする。

6. ファイヤウォールの設定

$ipaddress = (Invoke-WebRequest inet-ip.info/ip -UseBasicParsing).Content
Write-Host "Global IP: "  $ipaddress

New-AzSqlServerFirewallRule -ResourceGroupName "xxxxxxxxxx" -ServerName "xxxxxxxxx"
-FirewallRuleName xxxxxxxxxx -StartIpAddress $ipaddress -EndIpAddress $ipaddress
Read-Host "続けるには Enter キーを押してください..."

ResourceGroupName はリソースグループ、ServerNameは接続するサーバー名を入れる。
FirewallRuleNameはファイヤウォール規則の名前を適当に入れる。

実際には、このスクリプトをC#でつくったサービスで実行させている。一連のスクリプト全体を一応エンコードしている。
あと、Invoke-WebRequestで-UseBasicParsingを使わないと、サービスで実行したときにIEが設定されてないと言われてエラーになる。これで結構はまった。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?