Compnet

仕事とか遊びとか、日々折々

2015-06-04(木)

Ubuntu 14.04 LTS を Azure に

Posted by Nakane, R. in technical   

Note

この記事は旧ブログから移行した記事です。 元記事は ここ にあります。

ちょっと、備忘録。

Microsoft Azure に Ubuntu 14.04 LTS の仮想マシンを作ってみた。手順自体はググるなりビングるなりすればすぐに見つかるし、ポータルの UI の変更も多くあるので、あえてここには書かない。

ただし、手順中で認証用 SSH キーとやらの証明書に少々悩んだので、メモ代わりにここに書くことにした。

Azure

認証用 SSH キーの証明書って何?

筆者が悩んだ「認証用 SSH キー」は、ギャラリーから Ubuntu 14.04 LTS のイメージを選んで仮想マシンを作成する際の、仮想マシンの構成の「認証」カテゴリで「互換性のある認証用の SSH キーのアップロード」に指定する証明書だ。

「認証用の SSH キー」という言葉からは ssh 接続の際の公開鍵認証がすぐに連想される。 のは、で、そのだろう。 そして「証明書」という言葉からは、Web の HTTPS 化で使う電子証明書を連想する。

Web を HTTPS 化するときに使う電子証明書には、公開鍵暗号のための「公開鍵」、Web の名前とそれを認証する認証機関の署名などが記されている。 この電子証明書に記される「公開鍵」は、ssh 接続の公開鍵認証で使う「公開鍵」と同じ RSA とか ECDSA とかで生成した鍵だ。

つまり「認証用の SSH キー」の「証明書」とは、ssh 接続の際の公開鍵認証で使う公開鍵を記した電子証明書 (公開鍵証明書) のことだ。

ここまで理解すれば、あとは ssh 接続で使う秘密鍵から公開鍵証明書を作成するだけだ。

秘密鍵から公開鍵証明書を作成する

公開鍵認証で ssh 接続するときに必要な公開鍵と秘密鍵のペアーは拙ブログの過去記事「ssh 接続で公開鍵認証を使う」に書いた。 ここでは、このように作成した秘密鍵から公開鍵証明書を作成する。

なお、「ssh 接続で公開鍵認証を使う」では秘密鍵と公開鍵の両方を作成しているので、作成済みの公開鍵から公開鍵証明書を作成すれば簡単そうな気もするが、そういった方法は存在していない。 公開鍵証明書は秘密鍵から作成することになっている。

秘密鍵から公開鍵証明書を作成するには openssl コマンドを使う。 具体的なコマンドは Use SSH to connect to Linux virtual machines in AzureGenerate a Key from an Existing OpenSSH Compatible Key に書いてあるが、実際には指定するオプションを最低限にした以下のコマンドで十分だ。

openssl req -x509 -new -key ~/.ssh/id_rsa -nodes -out myCert.pem <<__EOT__







__EOT__

-key オプションで指定する ~/.ssh/id_rsa が秘密鍵のファイル名だ。 指定された秘密鍵から作成された証明書は -out オプションに指定した myCert.pem ファイルに保存される。 <<__EOT__ から __EOT__ までのヒア ドキュメントは、公開鍵の所有者に関する情報 (subject の C、ST、L、O、OU、CN、Email) にそうとする。 ここではすべてが初期値になるように Enter だけを渡している。

ここで保存された myCert.pem ファイルを、Azure の仮想マシンの作成で認証用 SSH キーの証明書に指定すればいい。 ところで、保存された myCert.pem はバイナリ ファイルであることを指摘しておく。

生成された公開鍵証明書の myCert.pem の内容を確認するには、以下のコマンドを実行する。

openssl x509 -in myCert.pem -noout -text
Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number: 16838857986375257327 (0xe9afa41f5d258cef)
    Signature Algorithm: sha256WithRSAEncryption
        Issuer: C=AU, ST=Some-State, O=Internet Widgits Pty Ltd
        Validity
            Not Before: May 27 03:12:50 2015 GMT
            Not After : May 26 03:12:50 2016 GMT
        Subject: C=AU, ST=Some-State, O=Internet Widgits Pty Ltd
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
                Public-Key: (2048 bit)
                Modulus:
                    00:b1:6d:47:44:dc:3b:60:7a:51:05:29:2b:87:34:
                    b0:d0:68:9b:b7:a4:be:6b:25:db:29:df:fc:fb:66:
                         :
                      (途中略)
                         :
                    ae:c6:86:ae:51:88:a5:a4:37:2d:8e:7d:fd:16:b4:
                    dc:53
                Exponent: 35 (0x23)
        X509v3 extensions:
            X509v3 Subject Key Identifier:
                3F:C2:BD:5F:9F: ...(途中略)... :1B:C8:DF:80
            X509v3 Authority Key Identifier:
                keyid:3F:C2:BD: ...(途中略)... :1B:C8:DF:80

            X509v3 Basic Constraints:
                CA:TRUE
    Signature Algorithm: sha256WithRSAEncryption
         45:2b:91:51:57:13:47:ef:32:1f:31:da:86:e3:c8:9e:1e:f9:
         9c:55:ab:29:c1:62:96:fa:95:e5:01:b2:43:2e:c2:26:77:52:
                         :
                      (途中略)
                         :
         d6:e3:bc:3e:04:e5:82:ce:a0:b1:39:6c:2d:fa:1d:be:1f:cb:
         d3:15:d1:b7

Issuer 欄や Subject 欄が openssl コマンドの初期値である C=AU ... のままだが、使われるのは Subject Public Key Info の部分だけなので、一切気にしなくてもよい。 また、Validity 欄で示される有効期間も評価されないようなので、有効期間が過ぎていても気にしなくてよい。

Subject Public Key Info ブロックがあることから、秘密鍵を元に作成された公開鍵が格納されていることがわかる。 Azure の仮想マシンの作成で、認証用 SSH キーの証明書としてこのファイル (myCert.pem) を指定したとき、実際に使われるのはこの公開鍵だけだ。

おまけ:作成された仮想マシンでの公開鍵

仮想マシン作成時に指定した公開鍵証明書がどのように使われているかも調べてみた。 といっても、ssh 接続の公開鍵認証のためのものなので、調べるのは .ssh ディレクトリ内のファイルだけだが。

Azure で作成した Ubuntu 14.04 LTS の仮想マシンに ssh で接続すしたら、まずは素直に ~/.ssh ディレクトリにあるファイルを確認する。 ここでの ssh 接続はパスワード認証と公開鍵認証のどちらでも可能だ。

ls ~/.ssh
authorized_keys

~/.ssh ディレクトリには authorized_keys ファイルだけがある。 公開鍵認証で ssh 接続される側の ~/.ssh ディレクトリとしてはごく当たり前のかたちだ。

~/.ssh/autorized_keys ファイルの中身を見てみよう。

cat ~/.ssh/authorized_keys
ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAsW1HRNw7YHpRBSkrhzSw0Gibt6S+ayXbKd/8+2YQ8oqedRU5nzXn09fPfh9MNMM9sYDfYiV7mgHdrVF8h3sF0bZScBZbr0SEBqzumXt0MYQ5XI05XOowy2fwAh2exASm1bgdm1LlVVTMcyKlv8s0lT7YIkCKKua7L6a0BUXf3ECt5gjZ0VmGtvgHtL9gvR0m5FQujFzldSaawHTDALtT3DCtmjsRAa4C0Ny0g+VVWrQj2uv3FGqf8qpsMX5dmLM7/0m9dTQdw3wEsZizQDZMj51nURAQ6Zm1aTBTPdSpvpTO0SHY97WmrpBF4CPMIFiuxoauUYilpDctjn39FrTcUw==

公開鍵がひとつだけ登録されているのがわかる。 これもまた、公開鍵認証で ssh 接続される側としてはごく当たり前だ。

Azure の仮想マシンの Ubuntu 14.04 LTS の場合、仮想マシン作成時に指定した公開鍵が別の場所にも登録されている。 これはたぶん、Azure で Linux 系の仮想マシンを作成したときの共通の仕様だと思う。

別の場所というのは、root ユーザーの .ssh/authorized_keys ファイルだ。 ログイン ユーザーと同じようにして確認してみた。

sudo ls ~root/.ssh
authorized_keys
sudo cat ~root/.ssh/authorized_keys
no-port-forwarding,no-agent-forwarding,no-X11-forwarding,command="echo 'Please login as the user \"azureuser\" rather than the user \"root\".';echo;sleep 10" ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAsW1HRNw7YHpRBSkrhzSw0Gibt6S+ayXbKd/8+2YQ8oqedRU5nzXn09fPfh9MNMM9sYDfYiV7mgHdrVF8h3sF0bZScBZbr0SEBqzumXt0MYQ5XI05XOowy2fwAh2exASm1bgdm1LlVVTMcyKlv8s0lT7YIkCKKua7L6a0BUXf3ECt5gjZ0VmGtvgHtL9gvR0m5FQujFzldSaawHTDALtT3DCtmjsRAa4C0Ny0g+VVWrQj2uv3FGqf8qpsMX5dmLM7/0m9dTQdw3wEsZizQDZMj51nURAQ6Zm1aTBTPdSpvpTO0SHY97WmrpBF4CPMIFiuxoauUYilpDctjn39FrTcUw==

これをみると、公開鍵の記述がログイン ユーザーとは若干異なっている。 公開鍵の前 (ssh-rsa の前) にいくつかのオプションがついている。 これらのオプションは、ポート フォワードの禁止、認証エージェントの転送禁止、X11 の転送禁止と、コンソールに ssh 接続されたときに azureuser (仮想マシン作成時に指定した初期ユーザー) でログインし直すようにメッセージを表示して 10 秒後に切断するといった指定だ。

Comments