自然の赴くままに・そのときの 気分次第で・なんとなく

興味を持ったことを、なんとなく気の向くまま書いています。

Amazon Linux 2 をオンプレミス vSphere 環境に作ってみた

vSphere 7 いじりも一段落し、ちょっとある所のお手伝いをしはじめた関係で Linux 環境が必要になったので、Ubuntu にするか CentOS にするかいろいろと考えたんだけれど、変わり種として Amazon Linux 2 をオンプレミスに立ててみることにしました。

Amazon Linux 2 とは

Amazon Linux はアマゾン ウェブ サービス(AWS)より提供されている Linux サーバーオペレーティングシステムで、RedHat 系の Linux ディストリビューションのようです。私は AWS はあまり詳しくないので「ようです」になってしまっていますが、2020 年 12 月 31 日に標準サポートが終了した Amazon Linux AMI と、それに代わるものとして新しく提供された Amazon Linux 2 があります。Amazon Linux AMI は RHEL 6 ベースのようで、Amazon Linux 2 はそれ以降がベースのようです。こちらを見る限り、今時点は RHEL 7 がベースのようですね。

aws.amazon.com

Amazon Linux 2 の入手

Amazon Linux 2 では、AWS EC2 上だけではなく、オンプレミスの以下のプラットホーム上で動かすことができます。そして、それぞれの仮想マシンイメージがあらかじめ用意されています。4月18日現在提供されている各仮想マシンのバージョンは、以下の通りです。

使用したいハイパーバイザーの仮想マシンイメージをダウンロードします。Hyper-V については zip 圧縮されているので、使用前に解凍し vhdx 形式にしておきます。

ちなみに、VMware と書かれていますが、用意されているイメージファイルは ova 形式ですので、vSphere だけではなく Workstation Pro や Player、Fusion でも展開することが可能です。

ダウンロードした仮想マシンイメージの展開

ダウンロードした ova イメージを、vSphere に展開します。以下の例では無償の ESXi Hypervisor に Amazon Linux 2 を展開しています。

f:id:imaisato:20210418171023p:plain

OVF ファイルと VMDK ファイルの選択

重要なのは、設定ファイルの編集が必要なため、ova の展開後に仮想マシンを自動的にパワーオンさせないようにする必要があります。

「デプロイのオプション」の画面が出たら、「自動的にパワーオン」のチェックを外し、デプロイ後に自動的に仮想枚sンが起動しないようにします。

f:id:imaisato:20210418171254p:plain

デプロイのオプション

これで ova ファイルが展開され、Amazon Linux 2 の仮想マシンの準備が出来上がりました。

f:id:imaisato:20210418171634p:plain

Amazon Linux 2

起動イメージ seed.iso を作成する

仮想マシンイメージは、あくまでも Amazon Linux 2 のベースが入っているだけで、これだけでは正しく起動させることができません。Amazon Linux 2 をオンプレミスで最初に起動させるためには、seed.iso を作成して仮想マシンの CD イメージとしてマウントさせる必要があります。

仮想マシンイメージと seed.iso それぞれは、以下のようになっています。

そのため、仮想マシンのイメージをダウンロードして、各ハイパーバイザーにインポートできたからと言って、その後すぐに仮想マシンを起動してはいけません。seed.iso をマウントしてから仮想マシンは起動するようにします。

seed.iso に書き込むファイルの作成手順は以下の通りです。Linux ではとても簡単に作ることができるのですが、Windowsユーザーのために Windows で作る方法を書いておきます。

  1. 設定情報ファイルを保管するフォルダを作成する
    例:seedconfig という名前のフォルダとデスクトップに作成
  2. フォルダー中に meta-data ファイルを作成し、中に以下の設定情報を記述する
  3. local-hostname: vm_hostname 
    network-interfaces: |
    auto eth0 iface eth0
    inet static
    address 192.168.110.5
    network 192.168.110.0
    netmask 255.255.255.0
    broadcast 192.168.110.255
    gateway 192.168.110.254

    vm_hostname:任意の VM ホスト
    network-interfaces :デフォルトで作成されている eth0 に関するネットワークアドレスの設定

  4. meta-data ファイルを保存
  5. テキストエディタを使用して、seedconfig フォルダ内に user-data ファイルを作成し、中に最低限以下の設定情報を記述する
    #cloud-config
    #vim:syntax=yaml
    users:
    # A user by the name `ec2-user` is created in the image by default.
      - default
    chpasswd:
      list: |
        ec2-user:plain_text_password # In the above line, do not add any spaces after 'ec2-user:'.

    plain_text_password:設定するパスワード
    user-data の中には、以下のような他の設定も記述することができます。
    ・他のユーザーアカウントとパスワード、アクセス権限、キーペア
    詳細はモジュールディレクティブを参照して設定してください。

  6. user-data 設定ファイルを保存して閉じます。

  7. フォルダを iso ファイルに変換する
    Linux では genisoimage などのツールを使えば簡単にできます。seedconfig フォルダの中で以下のコマンドを実行するだけです。 

    $ genisoimage -output seed.iso -volid cidata -joliet -rock user-data meta-data

    Windows ではコマンドがありませんので、別途ツールを用意する必要があります。ネットではフォルダーを iso に変換できるツールが色々と公開されrていますので、それを使いフォルダーの中の meta-data と user-data が入った iso イメージを作成してください。私の場合はインストール不要の Folder2Iso というのを使ってみました。
    ここで重要なのは Linuxコマンドラインを見てもらうとわかるのですが、iso イメージのラベル名は「cidata」である必要があります。iso イメージがこの名前じゃない場合は、仮想マシンを起動しても iso イメージのデータを読み取らないため、初期設定に失敗します。

iso イメージ作成はこれで完了です。

仮想マシンの設定の編集

展開された仮想マシンには、CDドライブが設定されていません。つまり、そのままでは作成した seed.iso を読み取って初期設定をすることができません。なので、仮想マシンの設定を編集し CD ドライブを追加します。

f:id:imaisato:20210418171727p:plain

CD/DVDドライブの追加

そして、追加した CD ドライブに、7.で作成した iso イメージをマウントしておきます。

f:id:imaisato:20210418171908p:plain

seed.iso

ここまでくれば、あとは仮想マシンを起動するだけです。

仮想マシンの起動と自動初期設定

仮想マシンのパワーをオンにします。

コンソールにいろいろメッセージが表示され、以下の画面が表示されれば Amazon Linux 2 の起動と初期設定は完了です。

f:id:imaisato:20210418172126p:plain

ログイン画面

user-data に設定したパスワードを使用してログインができれば、展開は無事に終了です。 

f:id:imaisato:20210418172309p:plain

ログイン後

これ以降、必要な設定やパッケージの追加などを行っていきます。意外とと簡単に展開できるので、EC2 を使い始める前に Amazon Linux 2 を触ってみたいときなどには便利かなと思いました。

 vSphere や Workstation Pro, そして Player で展開しても、Open VMware-tools がインストールされているのですぐに使えるのがとても便利です。

 TeraTerm などを使って SSH ログインするには

Amazon Linux 2 のデフォルトでは、コンソールでは user-data に設定したアカウントとパスワードでログインすることができますが、TeraTerm などのターミナルからは接続はできてもログインすることができません。これはパスワード認証を許可していない Amazon Linux 2 のデフォルト設定があるからです。そのため、SSH などで外部から接続できるようにするためには、パスワード認証を許可するか、SSH キーペアを作成してログインできるようにするかのどちらかを選択することになります。セキュリティの面からは後者で対応するのが望ましいのですが、オンプレミスに Amazon Linux 2 を展開した後の状態では、SSH キーペアの登録も簡単にはできません。

ただ、以下の手順で最初の 1回だけパスワード認証を許可して必要なキーファイルを転送してしまえば、あとはパスワード認証を拒否にしても SSH キーペアでログインできるようになります。

流れとしては、

  1. パスワード認証を許可する
  2. SSH キーペアを作成する
  3. SSH 公開鍵を Amazon Linux 2 に、SSH 秘密鍵を手元のデバイスに置く
  4. パスワード認証を拒否する

やることはこれだけです。

SSH キーペアを作成する

SSH キーペアの作成は、展開した Amazon Linux 2 または Windows 上で行います。どちらで作成しても秘密鍵は手元のデバイスに、公開鍵は Amazon Linux 2 上に配置します。

Widnows で鍵を作る場合は以下の流れになります。Linux の場合は -C のコメントの囲みを " から ' にするだけです。もちろん、フォルダー指定も「cd %USERPROFILE%」ではなく「cd ~」のようになります。ここは Linux 使いの人には当たり前のことですね。

1.コマンドプロンプトを開く
2.以下のコマンドを実行し、秘密鍵を置くフォルダを作成する
  c:\>md %USERPROFILE%\.ssh
3.以下のコマンドを実行し、作成した秘密鍵を置くフォルダに移動
  c:\>cd %USERPROFILE%\.ssh
4.以下のコマンドを実行し、鍵のペアを作成する(例は RSA で)
  ssh-keygen -t rsa -b 4096 -C "[自分のメールアドレス]"
  -C はコメントですが、メールアドレスを入れることを推奨しているところもあるのでこの例でもそれにしてあります。
  暗号強度は RSA では 2048 以上にしてください。
5.「Enter file in which to save the key (C:\Users\<自分のホームディレクトリ>/.ssh/id_rsa):」では、特にキーの作成場所を変える必要が無いのでそのまま[Enter]
6.「Enter passphrase (empty for no passphrase):」と聞かれるので、長くて安全なパスフレーズを入力し、「Enter same passphrase again:」で再度入力
7.コマンドプロンプトに戻ればキーの作成は終了

この後、鍵を置くディレクトリの中を確認し、id_rsa と id_rsa.pub が出来ていれば、鍵の作成は終了です。

パスワード認証を一時的に許可する

このままでは SSHキーペアを手元のデバイスと Amazon Linux 2 に配置ができません。そこで Amazon Linux 2 のパスワード認証を、以下の手順で一時的に許可します。

1.Amazon Linux 2 のコンソールにログイン
2.以下のコマンドを実行し、sshd_config を編集する
 sudo vi /etc/ssh/sshd_config
3.PasswordAuthentication の行を探し、「no」を「yes」に書き換える
4.ファイルを保存して終了
5.sshd を再起動

これで一時的に TeraTerm などのターミナルエミュレータからログインができるようになります。

SSHキーの転送

この後 SCP などを使用して、Amazon Linux 2 で SSH キーペアを作成していれば、秘密鍵を手元のデバイスに、手元のデバイスで SSH キーペアを作成していれば、公開鍵を Amazon Linux 2 側に転送します。TeraTerm だとメニューの「ファイル」の中に「SSH SCP...」がありますので、これを使って簡単にファイルを送受信できます。

以下のフィールドの参照ボタン[...]があるほうが Windows 側なので、Windows で SSH キーペアを作成した場合はそのボタンをクリックして転送するファイルを選択するか、Amazon Linux 2 側で SSH キーペアを作成した場合は、受信先つまり先ほど作成した .ssh フォルダを指定します。

もう一つの方は Amazon Linux 側の SSH キーペアのファイルを指定します。Windows 側からの場合は公開鍵 id_rsa.pub を指定、Amazon Linux 2 側から受け取る場合は秘密鍵なので id_rsa を指定します。

f:id:imaisato:20210419145449p:plain

SCP

フォルダとファイルを指定後[Send]または[Receive]ボタンをクリックすれば、ファイルの送受信は完了です。例えば、手元の Windows 10 デバイスで作成した SSH 公開キーを送るには、From:のところでf:id:imaisato:20210425085132p:plainボタンを押して id_rsa.pub ファイルを指定、To:には ~/.ssh/. を指定後に f:id:imaisato:20210425085344p:plain ボタンを押すだけです。

パスワード認証を拒否する

転送完了後は、以下の手順でパスワード認証を拒否し、元の状態に戻します。

1.Amazon Linux 2 のコンソールにログイン
2.以下のコマンドを実行し、sshd_config を編集する
 sudo vi /etc/ssh/sshd_config
3.PasswordAuthentication の行を探し、「yes」を「no」に書き換える
4.ファイルを保存して終了
5.sshd を再起動

また、Amazon Linux 側で SSH キーペアを作成している場合、秘密鍵が .ssh 内に残っているため、その秘密鍵 id_rsa を削除します。これにより、Amazon Linux 2 からの秘密鍵の漏洩は無くなります。

SSH 公開鍵の追加

その後 Amazon Linux 2 の鍵を置くディレクトリ .ssh に移動し、その中にある authorized_keys に公開鍵を追加します。特に何もしていなければ authorized_keys のパーミッションは 600(-rw-------)になていますが、違っていたら 600 に変更してください。

$ cd ~/.ssh
$ cat id_rsa.pub >> ~/.ssh/authorized_keys
$ chmod 600 authorized_keys

これで SSH キーペアを使い、TeraTerm などのターミナルソフトウエアで、リモートログインができるようになりました。

便利なターミナルソフトウエア

私は以下のターミナルソフトウエアを使用しています。

Tera Term

実はこの Tera Term には思い入れがあって、今は OSDN のプロジェクトになっていますが、この前のまだ平田さんが管理している時代、Microsoft のモジュールが必ず必要だったものを OpenSSL 対応及び IPv6 対応の手伝いをリモートでしました。二人でメールで連絡を取りながらテストとデバッグをしたのがとても良い思い出です。それからずっと使っています。OSDNに登録後もテスターをしていたのですが、多忙になって今では名前だけになっています。

Poderosa

実はターミナルエミュレータ関連では、こちらにもかかわっています。こちらは今の名前になる前の Guevara 時代、やはり IPv6 対応を岡島さんと一緒にやりました。こちらも本業が終わったあと、メールで夜通しテストと修正を繰り返して IPv6 対応したのを思い出します。実は Guevara にかかわることになったのは Tera Term 側で SSH2 対応していなかったときに、別のターミナルエミュレーターは無いかを探していた時に Guevara に出会い、いろいろとメールでやり取りしながら改善する際に IPv6 対応を提案して組み込んでもらう際のテスターをしていました。

海外産のターミナルエミュレーターはいろいろありますが、日本産のこの2つのターミナルエミュレーターには思い入れあります。(笑)