Furyu
[フリュー公式]

Tech Blog

フリュー株式会社の技術ブログです

2018年12月4日

Hashimoto Naoto

ESXiサーバにパスワードなしでSSH接続したい

ピクトリンク事業部開発部インフラ課の「部署名が変わったのに未だ慣れず、前世の記憶に苛まれている系エンジニア」の橋本です。こんにちは。今年がもう終わるとか信じたくないです。

本記事は フリューAdvent Calendar 2018 の12/4分です。

 

さて本題。

ESXiはVMware社 が提供する、仮想環境を構築する上で便利に使える強力なハイパーバイザです。
無料で使えるライセンスもあるので、利用されている方も多いのではないでしょうか。

 

バージョン5以前はvSphereClientの導入が必要でしたが、バージョン6以降からは割り当てたIPアドレスにブラウザからアクセスするだけでGUIによる視覚的な操作も可能です。これまでに比べるとべんりでつよいです。

 

しかし、何か作業をする際にその都度IDとパスワードによる認証を行うのは、正直面倒です。

面倒はないほうが幸せです。孫子曰く「兵は拙速を尊ぶ」とも言います。書いてる私は兵ではないですし、兵の人がこの記事を読んでいる率は低い気もしますが、簡潔なのは良いことです。(この一文が冗長であるという厳然たる事実は全力で見逃してください)

 

また、コマンドライン操作であれば自動化もしやすいです。

そのため、楽ちんにSSH接続できる環境にしましょう! というのが今回のお題です。

やりかた

  1. SSH接続を許可する
  2. 接続するユーザを作成する
  3. ユーザに権限を付与する
  4. 鍵ファイルを配置する
  5. ssh/config に接続設定を書く

SSH接続を許可する

ESXiサーバのデフォルト設定では、SSH接続を拒否するようになっています。
GUIにID, パスワードでログインしてから[アクション] → [サービス] → [SSHの有効化] を選択しましょう。

接続するユーザを作成する

[ホスト] → [管理] から [セキュリティとユーザ] タブを選択し、[ユーザーの追加]から設定してください。
英数字大文字小文字を含む、それなりに強いパスワード設定が求められます。

ユーザに権限を付与する

[アクション] → [権限]から、先ほど作成したユーザに対して権限を設定します。

そのユーザで行いたいことによって、適切な権限を設定します。

 

ゲストサーバの状態を確認する用途であれば「読み取り専用」で十分ですし、ホストの起動/停止まで自動化したいという欲求があるならば「システム管理者」といった具合にです。
「システム管理者」はなんでもできるので、迷ったらコレにしておけば、なんて気もするかもしれませんが、システムを壊さないためにも不要な権限付与は控えるほうが無難です。

もしユーザを乗っ取られたときにえらい目に遭いたくもないですし。

鍵ファイルを配置する

以降はコマンドラインでの操作です。

鍵の生成

接続するユーザ用の鍵ファイルを作成します。

ssh接続用の公開鍵をすでにお持ちの場合、鍵の作成はスキップして大丈夫です。
パスワードなしで接続したいので、パスフレーズは空のままにしておきます。github等で秘密鍵を公開してしまってはダメですよ。

鍵の配置

接続するESXi、接続したいユーザ名に置き換えて実行してください。rootのパスワード入力を求められます。
公開鍵(id_rsa.pub)はauthorized_keysという名前で置かなければなりません。

 

具体例として、先ほど作成して権限を付与したユーザがhogeというユーザだった場合は、

/etc/ssh/keys-hoge/authorized_keys

という形にしてやる必要があります。

.ssh/config に接続設定を書く

ここまでで完了でも良いのですが、より簡略化を進めるために ~/.ssh/config に以下の設定を追記しましょう。

たとえば、esx-hoge-01, esx-hoge-02, esx-hoge-03… というESXiサーバにhogeユーザで便利に接続したいのであれば、以下のようにまとめてやることも可能です。

こうしておくと、

としてやるだけでパスフレーズなしでSSH接続することが可能です。楽ちんになりました。

 

楽ができるって幸せですね! 手を抜くためには全力を尽くしましょうね。

余談

ESXiサーバを再起動すると鍵が消えるという悲しい問題もあるのですが、そちらはまた別の記事をご覧ください。


2018年02月8日

Hashimoto Naoto

ESXi6.5でOS再起動時に公開鍵が消える問題の対処方法

コンテンツ・メディア第1事業部インフラ課の橋本です。
弊社では仮想サーバをオンプレ環境で構築するための基盤(ホスト)OSとして、一部ではESXiを利用しています。

概ね便利に使えるESXiサーバには、困った特徴というか仕様がありまして、/etc 以下であるとか /bin 以下の階層に配置したファイルが、OS再起動時に初期化(クリア)されてしまいます。

接続を便利にしてくれる公開鍵なんかも、ESXiサーバを再起動するたびに消えてしまいます。

そして、以前のESXi(バージョン5.5や6.0において)で使えたいくつかの対処法は、検証した限りでは使えなくなっています。(そればかりか、再起動時にパープルスクリーンで固まってしまい、OSが起動しなくなったりさえします。なんということでしょう!)

そのため、今回ご紹介する対処方法も、これまでの方法と同様にバージョン互換性がない可能性が大いに有り得ます。具体的にはESXi6.5以外のバージョンで使えるという保障はございません。あらかじめ、ご了承いただきたく思います。

追記:ESXiの新バージョン(6.7以降?)では、このディスククリアを無効化する設定が追加されるそうです! やった……!!

対処方法

「そもそも消されないようにする」というのが実現困難でしたので、今回は「再起動時に配置しなおす」というアプローチです。

大まかな手順はふたつです。
ひとつめ、鍵をバックアップする。
ふたつめ、再起動時に展開されるようにする。

公開鍵のバックアップをとる

以下はEXSiサーバ上での操作です。sshなどで接続します。
まずは、公開鍵ファイルをバックアップするスクリプトを用意しましょう。

13〜16行目にあたる部分で、authorized_keys をリストアップし、tarで固めています。
ここで、16行目でbin/keys-backup.sh(このスクリプト自身)をも含めているのは、このスクリプトを/binに配置しているので再起動によって容赦無く消されるためですむごい。

authorized_keysではなく、自前のスクリプトや他のファイルを保持しておきたいという場合は、この13行目〜16行目の探索条件を調整してみてくださいね。
なお、tarで圧縮する際は相対パスで指定するようにお気をつけください。
絶対パスで指定すると、展開時にも絶対パスで展開されるので、えらい目に遭うことがあります。
上記スクリプトで、わざわざ3行目に cd / の後、14行目で相対パスに直してアーカイブしているのは、そのためです。

次に、実行権限をつけておきます。

keys-backup.sh を実行すると、/bootbank/sshkeys.tgzが出来ているはずです。
念のため、アーカイブの中身を確認してみましょう。

authrized_keys 各種とkeys-backup.shがアーカイブされていれば成功です。
新しくauthrized_keysを配置したときには、併せてkeys-backup.shを実行するようにしましょう。

再起動時にアーカイブを展開させる

あと少しです。再起動時にsshkeys.tgzを展開するように仕込みを行います。

/etc/rc.local.d/local.sh はEXSi6.5ではもともと配置されているファイルです。

ファイル内に

# Note: modify at your own risk!

と記述がありますように、運用にはご注意ください。
このファイルのexit 0の前に、1, 2行目の内容を挿入しておきます。
これで、再起動が完了後に/bootbank/sshkeys.tgzが展開されるようになります。

/bin/auto-backup.sh にも似たような仕組みがもともと存在するのですが、拡張を意図されていない既存のコードはなるべく変更を加えたくないなぁ……という思いから、今回は別のスクリプトで手動実行する方式としています。