🍣

SSHの基本と、公開鍵を登録してサーバーに入るまでの手順

2021/07/18に公開

sshで接続出来るように設定する際、具体的に何をやればいいのかよく分かっていなかったのでまとめました。

SSHとは

Secure Shell(セキュアシェル、SSH)は、暗号や認証の技術を利用して、安全にリモートコンピュータと通信するためのプロトコル。

Secure Shell - Wikipedia

とのことです。具体的には、sshコマンドを使うと、ネットワークに接続されたサーバーの中に入って作業をすることが出来ます。

SSHの概要を理解するには、インフラエンジニアじゃなくても押さえておきたいSSHの基礎知識
SSHの仕組みを理解するには、SSHの公開鍵認証における良くある誤解の話が参考になると思います。

設定のポイント

  • SSHで接続したいサーバーに公開鍵を登録して、そのペアの秘密鍵を使って接続する
  • 公開鍵は、SSH先のサーバーの~/.ssh/authorized_keysに保存する
  • ~/.ssh/configに設定を書くことで、sshコマンドの引数を省略できる

実践

サーバーに公開鍵を置いて、SSHで接続するところまでやってみます。

必要なもの

  • ネットワークに接続されたサーバー

僕はEC2インスタンスでやってみました。

STEP1: 公開鍵の作成

$ ssh-keygen -t rsa -f <鍵の名前>

コマンドを実行すると、ファイルが2つ作成されます。pubがついているほうが公開鍵で、もう一方が秘密鍵です。作成したファイルは~/.ssh配下に置きます。

STEP2: 公開鍵の登録

まず、サーバーの中に入って、すでに登録されている公開鍵を確認してみます。

# パスワード認証の場合(パスワードを求められるので入力する)
$ ssh <ユーザー名>@<サーバーのIPアドレス>

# 既に公開鍵認証の設定をしている場合
$ ssh -i <秘密鍵のパス> <ユーザー名>@<サーバーのIPアドレス>

サーバーの中に入ったら、~/.ssh/authorized_keysの中身を見てみます。このファイルが公開鍵を保存するファイルです。

ubuntu@ip-10-0-0-208:~$ cat ~/.ssh/authorized_keys
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCAK5oAaW4J69QfP/JKGQy7JuE7Oo21Xy1UEP4ph/3ZDe0YK0RX5nw//09UtAEnMrAUXvc/f4CCVm2ErDSJGh4Y8HXXKqGvDNP75HOERilOcKpzAxryhj32ROI1yq2mALflU51WHRXvWcTOBlyayATU2An5WY7PsrPPh5HcmzRANvpw89Q+cqAOh2sLKGYQ3TLcMzv2+SN/QDhD9ibAuh2E8UsDrI1mZZpYX/70+ogKYbOEbmCJZGGIXX97RuNt4RUSCvy7dh6B0+twX7dQUvhNKDIVasiAw9Tsfm8YdKQUQpMDSfOakOk9WpFMZ0KTcBFlx0RyVPAzd72zo0StxUKv key_20210714

EC2インスタンスを作成するときに登録した公開鍵が書かれていました。まだ公開鍵認証の設定をしていない場合は、ファイルが存在しないか、空になっていると思います。

次に、新しい公開鍵を登録します。作成した公開鍵をサーバーの~/.ssh/authorized_keysにコピー&ペーストしても大丈夫ですが、ssh-copy-idというコマンドがあるのでそれを使います。

# パスワード認証の場合
$ ssh-copy-id -i <追加したい公開鍵のパス> <ユーザー名>@<サーバーのIPアドレス>

# 公開鍵認証の場合
$ ssh-copy-id -i <追加したい公開鍵のパス> -o IdentityFile=<秘密鍵のパス> <ユーザー名>@<サーバーのIPアドレス>

以下のようなメッセージが出たらOKです。[1]

Number of key(s) added:        1

Now try logging into the machine, with:   "ssh -o 'IdentityFile=<秘密鍵のパス>' '<ユーザー名>@<IPアドレス>'"
and check to make sure that only the key(s) you wanted were added.

サーバーの~/.ssh/authorized_keysを確認してみると、新しい公開鍵が追加できていました。

$ ssh -i <秘密鍵のパス> <ユーザー名>@<IPアドレス> 'cat ~/.ssh/authorized_keys'
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCAK5oAaW4J69QfP/JKGQy7JuE7Oo21Xy1UEP4ph/3ZDe0YK0RX5nw//09UtAEnMrAUXvc/f4CCVm2ErDSJGh4Y8HXXKqGvDNP75HOERilOcKpzAxryhj32ROI1yq2mALflU51WHRXvWcTOBlyayATU2An5WY7PsrPPh5HcmzRANvpw89Q+cqAOh2sLKGYQ3TLcMzv2+SN/QDhD9ibAuh2E8UsDrI1mZZpYX/70+ogKYbOEbmCJZGGIXX97RuNt4RUSCvy7dh6B0+twX7dQUvhNKDIVasiAw9Tsfm8YdKQUQpMDSfOakOk9WpFMZ0KTcBFlx0RyVPAzd72zo0StxUKv key_20210714
# ↓さっき追加した公開鍵
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQDZ02uzonNWftiEtqAB+x+or3+Yrd1sOEzTGUoiatKF6Jl2UnffMmk6iNpW6aaH5hVMbOzr72rdNrHXxQQInEecy+sqMUCaHtY9plLt8cQ3sFbSlUxA3PTTliT9yxh7zEMZzJynPHDHr4j0fLHiqFZ0i4QzXhZzoLq2sQzuV8KlCjfBOorA0qMon8u5DXjbDA0twgXukPdKz4X7dfyxMQxYpCdSymHmxX4YkcIasiLprqnkGUvkgGRrSov81WS/qfHpadg8Kux2hKlU3hV4SCx1dlJUEMaJOdo7xWBSUWzmq52Wpkhzrn0D8h6NCV2tUSB0UTW58qaEUi2CGL8BhKrqJ1imhLAjw7Va7P69FO6uDPtuV2HEJ3qt+w7wTR5aAqgcrFacuGri0uAfib56+1IdDjcZOpquMI/jU5ZgQC0z4ZCcZtLyzv4TmuFz6nnaJFK6DQcqayqxXwVlW+DD2G6VA0LI7n/L5k0JxQIaQ0AsZELYWC6NCnujlGk/++MeJO0= gib0017@gib0017.local

以上で、新しく作成した鍵のSSH接続設定は完了です。

STEP3: コマンド入力の簡略化

sshコマンドを使う際、毎回秘密鍵のパスやIPアドレスを入力するのは面倒です。これは、~/.ssh/configに設定を書くことで省略することが出来ます。

~/.ssh/config
# 以下の設定で、ssh <名前>で接続出来るようになります
Host <名前>
  HostName <サーバーのIPアドレス>
  User <ユーザー名>
  IdentityFile <秘密鍵のパス>

参考資料

脚注
  1. 僕の環境だと、WARNING: All keys were skipped because they already exist on the remote system.(if you think this is a mistake, you may want to use -f option)というエラーメッセージが出て登録出来なかったため、-fオプションを付けて実行しました。 ↩︎

GitHubで編集を提案

Discussion