エンドポイントに ACL を!
「オープン」が身上の Windows Azure ですが、いささかオープンすぎて困ったなこりゃ。という面もあったのです。そう、これです。エンドポイント。
Windows Azure の仮想マシンが外部からの接続を受け入れるには、「エンドポイント」を定義します。これは、仮想マシンの前段にいる負荷分散機が外部に対して開く「パブリックポート」と、パブリックポート宛の着信接続の転送先となる仮想マシンの「プライベートポート」を定義するもので、パブリックポートとプライベートポートが 1:1 なら単純なポート転送、1:N なら負荷分散が行われることになります。
で、このエンドポイントを定義しない限り外からの接続は受け付けられないわけですが、一旦定義してしまうとどこからの接続でも受け入れてしまいます。「社内ネットワークからの接続だけ許可する」的なアクセス制御を普通はしたいものですよね。
そこで Endpoint ACL ですよ
この機能、エンドポイントに対して「特定の IP アドレス(の範囲)」からの接続 を 「許可 or 拒否」するというルールを複数個追加できるものです。これで、「品川オフィスと自宅からだけ接続可」といった設定が可能になるわけです。
やってみましょう
いま、私の検証環境に "hpc12head" という仮想マシンがあります。これを使って実験してみます。
PS C:\> $vm = Get-AzureVM -ServiceName kshpc12 -Name hpc12head
PS C:\> $vm.Name
hpc12head
この仮想マシンにどんなエンドポイントがあるかといえば、
PS C:\> Get-AzureEndpoint -VM $vm
LBSetName :
LocalPort : 3389
Name : RemoteDesktop
Port : 56768
Protocol : tcp
Vip : 168.63.xxx.yyy
ProbePath :
ProbePort : 0
ProbeProtocol :
ProbeIntervalInSeconds :
ProbeTimeoutInSeconds :
EnableDirectServerReturn : False
Acl : {}
デフォルトで作成される RDP のエンドポイントですね。パブリックポートが 56768 で、プライベートポートが 3389 です。このエンドポイントに対して、弊社内部からのみ接続可能な ACL を設定してみようと思います。
まず、空っぽの ACL を作って、
$acl = New-AzureAclConfig
次に、ACL にルールを追加します。"207.46.0.0/16"はマイクロソフトが持っている IP アドレスです。
Set-AzureAclConfig -AddRule Permit -RemoteSubnet "207.46.0.0/16" -Order 1 -ACL $acl -Description "Lockdown RDP"
これで、 $acl はルールを一つだけ含む単純な ACL になりました。確認してみましょう。
PS C:\> $acl
RuleId : 0
Order : 1
Action : Permit
RemoteSubnet : 207.46.0.0/16
Description : Lockdown RDP
では、この ACL をエンドポイントにくっつけます。$vm 変数は先ほど Get-AzureVM の結果を受けたやつです。最後の Update-AzureVM をお忘れなく。
$vm | Set-AzureEndpoint -Name RemoteDesktop -Protocol tcp -LocalPort 3389 -PublicPort 56768 -ACL $acl | Update-AzureVM
では、試してみます。まずは私が今ブログを書いている社内の PC から RDP してみます。
無事ログオンできました。netstat で自分の接続を見てみます。マイクロソフトの IP アドレスから 3389 へ繋がってますね。
次に、全然別の IP アドレスからの接続を試しましょう。こういう時は、そう、 Azure 上の別サービスから試せば良いのです。
“sasawork” という作業用の仮想マシンから、先ほどと同じ “hpc12head” に RDP 接続を試行しました。
見事(?)拒否されましたね。エンドポイント ACL が効いているようです。
では、今度はこの “sasawork” というマシンからの接続を許可してみましょう。このマシンのグローバル IP アドレスは 168.63.218.132 ですから、これをピンポイントで許可してみようと思います。
コマンドラインはさっきの続きです。 $acl 変数には先ほど定義した ACL が収まっているものとします。
Set-AzureAclConfig -SetRule 1 -RemoteSubnet "168.63.218.132/32" -Order 2 -ACL $acl -Description "Allow RDP from Azure"
-RemoteSubnet オプションに与える IP アドレスは CIDR 形式にしてください。単に "168.63.218.132” と IP アドレスだけを指定すると後悔します。(すぐエラーになればいいのに、後で怒られる)
そして、変更した ACL をエンドポイントに適用します。このコマンドは先ほどと全く同じ。
$vm | Set-AzureEndpoint -Name RemoteDesktop -Protocol tcp -LocalPort 3389 -PublicPort 56768 -ACL $acl | Update-AzureVM
いざ接続!
つながるようになりました。 ACL がちゃんと効いていますね。(自分の PC から、”sasawork” にログオンして、そこからさらに “hpc12head” にログオンしてます)
よろしく Windows Azure PowerShell
さて。今回はしれっと何の断りもなく PowerShell で ACL 設定をしました。そうなのです。Endpoint ACL はまだ管理ポータルから設定できません。この際ですから便利な Windows Azure PowerShell をどうぞよろしくお願いします。Web PI でインストールすると簡単ですよ。へばな。
__END__