LoginSignup
12
12

More than 5 years have passed since last update.

【Azure】Linux仮想マシンを公開鍵認証で作成

Last updated at Posted at 2015-09-03

概要

仮想マシンを毎回ポータルページから作成するのは面倒になったので
スクリプトで作成するように。
PowerShellのスクリプトで仮想マシン(Linux)作成時にSSHログイン認証を公開鍵認証方式で設定する。

作業環境

環境要素名
作業OS Windows8.1
証明書作成OS Linux (Raspbian)
Azure PowerShell 0.8.16
  • opensslインストール済み
  • 秘密鍵作成済み

公開鍵(証明書)の作成

Azureで仮想マシン作成時に登録する公開鍵はssh-keygenで作成した形式だと使えない。
OpenSSLを利用して、既存秘密鍵(id_rsa)からアップロード用証明書(myCert.pem)を作成。
今回はRaspberryPiを利用。

$ openssl req -x509 -key ~/.ssh/id_rsa -nodes -days 365 -newkey rsa:2048 -out myCert.pem

途中で国名、会社名等を聞かれるが適当に回答する。

証明書のフィンガープリントを出力することもでき、これをスクリプトのフィンガープリントに書くことでも登録可能
(今回はPowerShellのGet-PfxCertificateを使用している)

$ openssl x509 -in myCert.pem -sha1 -noout -fingerprint
SHA1 Fingerprint=XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX

仮想マシンの作成

Linuxのディストリビューション選択

以下の形式で検索

> get-azureVMImage | where {$_.ImageName -like "*[検索条件]*"} | select ImageName

今回はCentOS系を利用するのでOpenLogicを検索して、CentOS7.1を選択した。

> get-azureVMImage | where {$_.ImageName -like "*OpenLogic*"} | select ImageName

ImageName
---------
5112500ae3b842c8b9c604889f8753c3__OpenLogic-CentOS-65-20150128
5112500ae3b842c8b9c604889f8753c3__OpenLogic-CentOS-65-20150325
5112500ae3b842c8b9c604889f8753c3__OpenLogic-CentOS-65-20150605
5112500ae3b842c8b9c604889f8753c3__OpenLogic-CentOS-65-20150904
5112500ae3b842c8b9c604889f8753c3__OpenLogic-CentOS-66-20150128
5112500ae3b842c8b9c604889f8753c3__OpenLogic-CentOS-66-20150325
5112500ae3b842c8b9c604889f8753c3__OpenLogic-CentOS-66-20150605
5112500ae3b842c8b9c604889f8753c3__OpenLogic-CentOS-66-20150706
5112500ae3b842c8b9c604889f8753c3__OpenLogic-CentOS-66-20150731
5112500ae3b842c8b9c604889f8753c3__OpenLogic-CentOS-67-20150815
5112500ae3b842c8b9c604889f8753c3__OpenLogic-CentOS-70-20150128
5112500ae3b842c8b9c604889f8753c3__OpenLogic-CentOS-70-20150325
5112500ae3b842c8b9c604889f8753c3__OpenLogic-CentOS-70-20150605
5112500ae3b842c8b9c604889f8753c3__OpenLogic-CentOS-70-20150904
5112500ae3b842c8b9c604889f8753c3__OpenLogic-CentOS-71-20150410
5112500ae3b842c8b9c604889f8753c3__OpenLogic-CentOS-71-20150605
5112500ae3b842c8b9c604889f8753c3__OpenLogic-CentOS-71-20150731 <--- これを使用する

仮想マシンを作成

仮想マシン作成用スクリプトを用意。今回は以下のスクリプトを作成。
(PowerShellをよく理解していないのでスクリプトの書き方は適当)
公式ページを参考にしている。

createvm.ps1
$ErrorActionPreference = "Stop" # 例外時のデフォルト処理を変更

$imageName="5112500ae3b842c8b9c604889f8753c3__OpenLogic-CentOS-71-20150731" # イメージ名
$vmname="xxxxxx"           # 仮想マシン名
$vmsize="Small"            # 仮想マシンサイズ <Small, Medium, Large, ExtraLarge, A5, A6, A7, A8, A9>
$vnetname="xxxxxx"         # 仮想ネットワーク名(仮想ネットワークは事前に作成しておく)
$subnet="xxxxxx"           # サブネット名
$privateIP="192.168.0.4"   # プライベートIP
$svcname="xxxxxx"          # サービス名
$certpath="C:\tmp\myCert.pem" # Azureに登録する公開鍵(を含んだ証明書)のパス
$location="Japan East"     # サービスロケーション
$publicport="xxxxx"        # VMのssh接続用エンドポイント

try
{
  # サービス名のサービスが存在しない場合は作成する
  Get-AzureService -ServiceName $svcname
}
catch
{
  "サービスが存在しません。新しいサービスを作成します..."
  New-AzureService -ServiceName $svcname -Location $location
}

try
{
    # 仮想マシンのイメージ選択
    $image=Get-AzureVMImage | where {$_.ImageName -eq $imageName} | select -ExpandProperty ImageName -First 1
    $vm1=New-AzureVMConfig -Name $vmname -InstanceSize $vmsize -ImageName $image
    # Linuxユーザの作成・パスワード・公開鍵認証用公開鍵を登録
    Add-AzureCertificate  -ServiceName $svcname -CertToDeploy $certpath
    # 初期ログインユーザ名とパスワードの入力を促すダイアログを表示し、入力値をセット
    $cred=Get-Credential -Message "Type the name and password of the initial Linux account."
    $sshpubkeypath="/home/" + $cred.GetNetworkCredential().Username + "/.ssh/authorized_keys"
    $myLxCert = New-AzureSSHKey -PublicKey -Fingerprint (Get-PfxCertificate -FilePath $certpath).Thumbprint -Path $sshpubkeypath
    # パスワード認証・公開鍵認証有り(-NoSSHPasswordオプションでパスワード認証禁止も可能)
    $vm1 | Add-AzureProvisioningConfig -Linux -LinuxUser $cred.GetNetworkCredential().Username -SSHPublicKeys $myLxCert -Password $cred.GetNetworkCredential().Password 
    # 仮想マシンを割り当てる仮想ネットワークのサブネットを指定
    $vm1 | Set-AzureSubnet -SubnetNames $subnet
    # 固定IPの設定
    $vm1 | Set-AzureStaticVNetIP -IPAddress $privateIP
    # エンドポイント設定
    $vm1 | Set-AzureEndpoint -Name "SSH" -Protocol tcp -LocalPort 22 -PublicPort $publicport
}
catch [Exception]
{
    Write-Host $_.exception
    exit
}

# 仮想マシンの作成
New-AzureVM –ServiceName $svcname -VMs $vm1 -VNetName $vnetname

実行

> .\createvm.ps1

途中でダイアログが出るので、Linuxユーザ名・パスワードを入力して、OK
dialog1

作成に成功したらTeraTerm等でログインし、
/home/ユーザ名/.ssh/authorized_keysに公開鍵が登録されていることを確認できればOK。

以上です。誤っている箇所がありましたらご指摘いただけますと幸いです。

参考

12
12
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
12
12