Chef 対象サーバーと knife サーバーの鍵共有

#[SoftLayerクッキングLABO] (http://qiita.com/MahoTakara/items/464da29ccf932698b753)

Chef-Solo や Chef-Zero を利用する場合には、必ず SSH でリモートログインが実行されます。今回は SSH鍵のペアを生成して、登録する方法について、ご案内します。

# SSH鍵の生成

鍵を保管しておくディレクトリを作っておく便利です。 少しでもタイプする量を減らしたいので sを省いてしまいます。

```
chef@ChefWs:~$ mkdir key
chef@ChefWs:~$ cd key
```
鍵のペアは、次のコマンドで作成できるのですが、-f オプションでファイル名を指定すると、目的別に判別しやすく便利です。
パスフェースを求めてくるのですが、何も入力せずに ENTERキーを押しています。 このパスフェースは秘密鍵ファイルを暗号化する鍵ためです。よって鍵ファイル流出に対して効果がありますが、サーバーを保護する上で差は出ないので、自動化や利便性の利益を優先して設定しません。

```
chef@ChefWs:~/key$ ssh-keygen -t rsa -f chefkey
Generating public/private rsa key pair.
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in chefkey.
Your public key has been saved in chefkey.pub.
The key fingerprint is:
5f:15:a7:32:53:50:5d:7e:25:20:28:0f:f0:e4:35:cc chef@ChefWs
The key's randomart image is:
+--[ RSA 2048]----+
|    ...oo.. o+=.=|
|     +o.E. . . *o|
|      o+    + o o|
|        .    =  .|
|        S   .    |
|         . .     |
|          .      |
|                 |
|                 |
+-----------------+
```
鍵保管のディレクには、二つのファイルが作られています。 pubが付いている方が公開鍵で SoftLayerの管理システムへ登録する方です。

```
chef@ChefWs:~/key$ ls -la
合計 16
drwxrwxr-x 2 chef chef 4096  9月 30 21:49 .
drwxr-xr-x 9 chef chef 4096  9月 30 21:47 ..
-rw------- 1 chef chef 1675  9月 30 21:49 chefkey
-rw-r--r-- 1 chef chef  393  9月 30 21:49 chefkey.pub
```


# コマンドラインから SoftLayer への鍵登録

先に作成したSSHの鍵の公開鍵を SoftLayer の管理システムに登録しておき、物理サーバーや仮想サーバーをプロビジョニングする際に、root に対する鍵として、自動的に埋め込んでしまう様にします。このための登録は次のコマンドで実行します。slcliコマンドの最後のパラメータの chefkey は、カスタマーポータルに表示される時のラベル名です。 

```
chef@ChefWs:~$ slcli sshkey add --in-file ~/key/chefkey.pub  chefkey
SSH key added: 5f:15:a7:32:53:50:5d:7e:25:20:28:0f:f0:e4:35:cc
```
登録した鍵を確認するには、以下のコマンドでリストとして表示することができます。

```
chef@ChefWs:~$ slcli sshkey list
:........:...........:.................................................:.......:
:   id   :   label   :                   fingerprint                   : notes :
:........:...........:.................................................:.......:
: 370981 :  chefkey  : 5f:15:a7:32:53:50:5d:7e:25:20:28:0f:f0:e4:35:cc :   -   :
:........:...........:.................................................:.......:
```

# プロビジョニング時のSSH鍵の利用方法

登録したSSH鍵のid番号を次の様に、--key のパラメータとして id 番号をセットします。

```
#!/bin/bash
slcli vs create \
--hostname webap1 --domain softlayer.com \
--datacenter tok02 \
--cpu 1 --memory 1 \
--os UBUNTU_LATEST_64 \
--billing hourly \
--public \
--postinstall https://raw.githubusercontent.com/takara9/ProvisioningScript/master/ubuntu_basic_config \
--key 370981 \   #<<==== これ　sshkey list の id 番号をココにセット
--network 100
```

このシェルを実行して、作成した仮想サーバーには、ssh で次の様に、対応する秘密鍵を指定して、パスワード無しでログインすることができます。最初だけ接続するか確認を求めてきます。

```
chef@ChefWs:~$ ssh 10.132.253.39 -l root -i ~/key/chefkey
The authenticity of host '10.132.253.39 (10.132.253.39)' can't be established.
ECDSA key fingerprint is 86:fa:26:39:22:0f:8f:40:fc:65:4f:ab:f3:62:3d:2e.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '10.132.253.39' (ECDSA) to the list of known hosts.
Welcome to Ubuntu 14.04.2 LTS (GNU/Linux 3.13.0-55-generic x86_64)

 * Documentation:  https://help.ubuntu.com/
Last login: Wed Sep 30 22:11:52 2015 from 10.0.80.186
```
２回目移行は、インタラクション無しにログインできます。

```
chef@ChefWs:~$ ssh 10.132.253.39 -l root -i ~/key/chefkey
Welcome to Ubuntu 14.04.2 LTS (GNU/Linux 3.13.0-55-generic x86_64)

 * Documentation:  https://help.ubuntu.com/
Last login: Wed Sep 30 22:13:15 2015 from 10.132.253.38
root@webap1:~# 
```


サーバーのOSをリロードしたり、サーバーをキャンセルした後に、同じIPアドレスが再利用された場合に、次の様なエラーが出ます。

```
chef@ChefWs:~/shells$ ssh 10.132.253.39 -l root -i ~/key/chefkey
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@    WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!     @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
Someone could be eavesdropping on you right now (man-in-the-middle attack)!
It is also possible that a host key has just been changed.
The fingerprint for the ECDSA key sent by the remote host is
db:d8:1a:4e:b3:19:06:87:b2:78:df:4d:35:bb:b4:91.
Please contact your system administrator.
Add correct host key in /home/chef/.ssh/known_hosts to get rid of this message.
Offending ECDSA key in /home/chef/.ssh/known_hosts:1
  remove with: ssh-keygen -f "/home/chef/.ssh/known_hosts" -R 10.132.253.39
ECDSA host key for 10.132.253.39 has changed and you have requested strict checking.
Host key verification failed.
```

こんな時は 次にコマンドで .ssh/known_hosts からエントリを削除して、再度登録しなおしとなります。

```
chef@ChefWs:~/shells$ ssh-keygen -R 10.132.253.39
# Host 10.132.253.39 found: line 1 type ECDSA
/home/chef/.ssh/known_hosts updated.
Original contents retained as /home/chef/.ssh/known_hosts.old
```

余談ですが、サーバーを初期化するためのシェルは以下になります。ここで、SSH鍵ファイルとプロビジョニング・スクリプトは毎回指定しなければなりません。 パラメータの最後の数字は、サーバーのID番号で、slcli vs list でサーバー名やIPアドレスと対比して見ることができます。

```
#!/bin/bash
slcli vs reload \
--postinstall https://raw.githubusercontent.com/takara9/ProvisioningScript/master/ubuntu_basic_config \
--key 370981 \
12933295
```


# まとめ

Chefを必要とするエンジニアは、おおよそ、少ない人数で非常に多くのサーバーを構築や運営している事が殆どで、その様なエンジニアからするとカスタマーポータルの反応速度は許せない！　そこで、slcliコマンドから、シェル化して高速に処理できる様にして、案内してきました。
SSH鍵の運用は、とても重要なポイントなので、参考になれば幸いです。