Introduction
SSH (secure shell)は、サーバーの管理や通信に使用される暗号化されたプロトコルです。
SSHサーバーにログインする方法はいくつかありますが、このガイドでは、SSH鍵の設定に焦点を当てます。 SSH鍵は、サーバーにログインするための簡単かつ非常に安全な方法です。
How Do SSH Keys Work?
SSH サーバは、さまざまな方法でクライアントを認証することができます。
パスワードは安全な方法でサーバーに送信されますが、一般的には、繰り返される永続的な攻撃者に対抗できるほど複雑で長くはありません。 現代の処理能力と自動化されたスクリプトを組み合わせることで、パスワードで保護されたアカウントへのブルートフォースが非常に可能になります。
SSH キー・ペアとは、クライアントを SSH サーバーに認証させるために使われる 2つの暗号的に安全な鍵のことです。 それぞれの鍵ペアは、公開鍵と秘密鍵で構成されています。
秘密鍵はクライアントが保持するもので、絶対に秘密にしておく必要があります。 秘密鍵が漏洩した場合、攻撃者は追加の認証なしに、関連付けられた公開鍵で設定されたサーバーにログインすることができます。
関連する公開鍵は、悪影響を及ぼすことなく自由に共有することができます。 公開鍵は、秘密鍵だけが解読できるメッセージの暗号化に使用できます。
公開鍵は、SSHでログインできるようにしたいリモートサーバーにアップロードされます。
公開鍵は、SSHでログインしたいリモートサーバーにアップロードされ、ログインするユーザーアカウント内の~/.ssh/authorized_keys
という特別なファイルに追加されます。
クライアントがSSH鍵を使って認証しようとしたとき、サーバーはクライアントが秘密鍵を所有しているかどうかをテストすることができます。
SSH鍵の作成方法
サーバーにSSH鍵認証を設定するための最初のステップは、ローカルコンピュータ上でSSH鍵ペアを作成することです。
これを行うには、標準の OpenSSH ツール群に含まれている ssh-keygen
という特別なユーティリティを使用します。
ローカル コンピュータで、次のように入力して SSH 鍵ペアを生成します。
ssh-keygen
Generating public/private rsa key pair.Enter file in which to save the key (/home/username/.ssh/id_rsa):
ユーティリティーは、生成される鍵の保存場所を選択するよう促します。 デフォルトでは、鍵はユーザーのホームディレクトリ内の~/.ssh
id_rsa
id_rsa.pub
という名前になります。
通常、この段階ではデフォルトの場所を維持するのがベストです。 そうすることで、SSHクライアントが認証しようとしたときに、自動的にSSHキーを見つけることができます。
以前に SSH キーペアを生成していた場合は、次のようなプロンプトが表示されます:
/home/username/.ssh/id_rsa already exists.Overwrite (y/n)?
ディスク上のキーを上書きすることを選択すると、以前のキーを使用して認証することができなくなります。
Created directory '/home/username/.ssh'.Enter passphrase (empty for no passphrase):Enter same passphrase again:
次に、鍵のパスフレーズを入力するように求められます。 これは、ディスク上の秘密鍵ファイルを暗号化するために使用されるオプションのパスフレーズです。
パスフレーズを入力する必要があるのに、SSH キーにはどんな利点があるのかと疑問に思われるかもしれません。
- SSH の秘密鍵 (パスフレーズで保護できる部分) は、ネットワーク上に公開されることはありません。 パスフレーズは、ローカルマシン上で鍵を復号化するためにのみ使用されます。
- 秘密鍵は、制限されたディレクトリ内に保管されます。 SSH クライアントは、制限されたディレクトリに保管されていない秘密鍵を認識しません。 また、鍵自体のパーミッションも制限されている必要があります(所有者のみが利用できる読み取りと書き込み)。 これは、システム上の他のユーザーがスヌープできないことを意味します。
- プライベート SSH キーのパスフレーズを解読しようとする攻撃者は、すでにシステムへのアクセス権を持っている必要があります。 つまり、あなたのユーザー アカウントや root アカウントへのアクセス権をすでに持っているということです。 もしあなたがこのような立場であれば、パスフレーズによって攻撃者が他のサーバーにすぐにログインできないようにすることができます。
秘密鍵はネットワークに公開されることはなく、ファイルのパーミッションによって保護されているため、このファイルはあなた (およびルート ユーザー) 以外の誰にもアクセスできないはずです。 パスフレーズは、これらの条件が損なわれた場合に備えて、追加の保護レイヤーとして機能します。
パスフレーズはオプションで追加できます。 パスフレーズを入力した場合、この鍵を使用するたびにパスフレーズを入力する必要があります(復号化された鍵を保存するSSHエージェントソフトウェアを使用している場合を除く)。
Your identification has been saved in /home/username/.ssh/id_rsa.Your public key has been saved in /home/username/.ssh/id_rsa.pub.The key fingerprint is:a9:49:2e:2a:5e:33:3e:a9:de:4e:77:11:58:b6:90:26 username@remote_hostThe key's randomart image is:+------+| ..o || E o= . || o. o || .. || ..S || o o. || =o.+. ||. =++.. ||o=++. |+-----------------+
これで、認証に使用できる公開鍵と秘密鍵ができました。
サーバー作成時に公開鍵を埋め込む方法
DigitalOceanのサーバーを新規に立ち上げる場合、SSH公開鍵を新規サーバーのルートアカウントに自動的に埋め込むことができます。
Droplet作成ページの下部に、サーバーにSSH鍵を追加するオプションがあります:
既にDigitalOceanアカウントに公開鍵ファイルを追加している場合は、ここに選択可能なオプションとして表示されます(上記の例では、「Work key」と「Home key」の2つの既存の鍵があります)。 既存の鍵を埋め込むには、その鍵をクリックするだけで、ハイライト表示されます。
アカウントにアップロードされたパブリック SSH キーがまだない場合、または新しいキーをアカウントに追加したい場合は、「+ Add SSH Key」ボタンをクリックします。
「SSH Key content」ボックスに、SSH公開鍵の内容を貼り付けます。
cat ~/.ssh/id_rsa.pub
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDNqqi1mHLnryb1FdbePrSZQdmXRZxGZbo0gTfglysq6KMNUNY2VhzmYN9JYW39yNtjhVxqfW6ewc+eHiL+IRRM1P5ecDAaL3V0ou6ecSurU+t9DR4114mzNJ5SqNxMgiJzbXdhR+j55GjfXdk0FyzxM3a5qpVcGZEXiAzGzhHytUV51+YGnuLGaZ37nebh3UlYC+KJev4MYIVww0tWmY+9GniRSQlgLLUQZ+FcBUjaqhwqVqsHe4F/woW1IHe7mfm63GXyBavVc+llrEzRbMO111MogZUcoWDI9w7UIm8ZOTnhJsk7jhJzG2GpSXZHmly/a/buFaaFnmfZ4MYPkgJD [email protected]
この値の全体を大きい方のボックスに貼り付けます。 コメント(オプション)」のボックスでは、キーのラベルを選択できます。 これはDigitalOceanのインターフェイスで鍵の名前として表示されます:
Dropletを作成すると、選択した公開SSH鍵がルートユーザーのアカウントの~/.ssh/authorized_keys
ファイルに置かれます。
How To Copy a Public Key to your Server
すでにサーバーを利用していて、作成時に鍵を埋め込んでいなかった場合でも、公開鍵をアップロードしてサーバーへの認証に使用することができます。
使用する方法は、利用可能なツールや現在の構成の詳細によって大きく異なります。 以下の方法はすべて同じ結果をもたらします。
Copying your Public Key Using SSH-Copy-ID
既存のサーバーに公開鍵をコピーする最も簡単な方法は、ssh-copy-id
というユーティリティを使用することです。
ssh-copy-id
というツールは、多くのディストリビューションのOpenSSHパッケージに含まれているので、あなたのローカルシステムでも利用できるかもしれません。
このユーティリティを使うには、接続したいリモートホストと、パスワードによるSSHアクセスが可能なユーザーアカウントを指定するだけでよいのです。
構文は次のとおりです:
ssh-copy-id username@remote_host
次のようなメッセージが表示されることがあります:
The authenticity of host '111.111.11.111 (111.111.11.111)' can't be established.ECDSA key fingerprint is fd:fd:d4:f9:77:fe:73:84:e1:55:00:ad:d6:6d:22:fe.Are you sure you want to continue connecting (yes/no)? yes
これは、ローカル コンピューターがリモート ホストを認識していないことを意味します。 これは、新しいホストに初めて接続したときに起こります。
次に、ユーティリティーはローカル アカウントをスキャンして、先ほど作成した id_rsa.pub
キーを探します。
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new [email protected]'s password:
パスワードを入力して (セキュリティ上、入力した文字は表示されません)、Enter キーを押します。 ユーティリティーは、提供されたパスワードを使用して、リモートホスト上のアカウントに接続します。 そして、~/.ssh/id_rsa.pub
~/.ssh
authorized_keys
というファイルにコピーします。
以下のような出力が表示されます:
Number of key(s) added: 1Now try logging into the machine, with: "ssh '[email protected]'"and check to make sure that only the key(s) you wanted were added.
この時点で、id_rsa.pub
キーがリモートアカウントにアップロードされました。 次のセクションに進むことができます。
SSH を使用して公開鍵をコピーする
ssh-copy-id
が利用できなくても、サーバー上のアカウントへのパスワード ベースの SSH アクセスがある場合は、従来の SSH 方法を使用して鍵をアップロードすることができます。
ローカル コンピュータ上で公開 SSH 鍵の内容を出力し、リモート サーバーへの SSH 接続を介してパイプすることで実現できます。 一方で、使用しているアカウントの下に ~/.ssh
authorized_keys
というファイルに出力します。
>>
リダイレクト シンボルを使用して、コンテンツを上書きする代わりに追加します。
完全なコマンドは次のようになります:
cat ~/.ssh/id_rsa.pub | ssh username@remote_host "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys"
次のようなメッセージが表示されるかもしれません:
The authenticity of host '111.111.11.111 (111.111.11.111)' can't be established.ECDSA key fingerprint is fd:fd:d4:f9:77:fe:73:84:e1:55:00:ad:d6:6d:22:fe.Are you sure you want to continue connecting (yes/no)? yes
これは、あなたのローカル コンピュータがリモート ホストを認識していないことを意味します。 これは、新しいホストに初めて接続したときに起こります。 yes」と入力し、Enterキーを押して続行します。
その後、接続しようとしているアカウントのパスワードの入力を求められます:
[email protected]'s password:
パスワードを入力すると、id_rsa.pub
authorized_keys
ファイルの最後にコピーされます。
公開鍵を手動でコピーする
サーバーへのパスワード ベースの SSH アクセスが利用できない場合は、上記のプロセスを手動で行う必要があります。
id_rsa.pub
~/.ssh/authorized_keys
にあるファイルに何らかの方法で追加する必要があります。
id_rsa.pub
キーの内容を表示するには、ローカル コンピュータに次のように入力します。
cat ~/.ssh/id_rsa.pub
キーのコンテンツが表示されますが、次のようになります。
リモート サーバーの自分のアカウントにアクセスできたら、~/.ssh
ディレクトリが作成されていることを確認してください。
mkdir -p ~/.ssh
さて、このディレクトリ内に authorized_keys
id_rsa.pub
authorized_keys
ファイルの末尾に追加するには、次のようにします。
echo public_key_string >> ~/.ssh/authorized_keys
上記のコマンドで、public_key_string
cat ~/.ssh/id_rsa.pub
コマンドの出力に置き換えます。
これがうまくいくと、パスワードなしでの認証に進むことができます。
SSH キーを使用したサーバーへの認証
上記の手順のいずれかがうまくいくと、リモート アカウントのパスワードなしでリモート ホストにログインできるようになります。
基本的なプロセスは同じです。
ssh username@remote_host
このホストに初めて接続する場合 (上記の最後の方法を使用した場合)、次のようなものが表示されるかもしれません。
The authenticity of host '111.111.11.111 (111.111.11.111)' can't be established.ECDSA key fingerprint is fd:fd:d4:f9:77:fe:73:84:e1:55:00:ad:d6:6d:22:fe.Are you sure you want to continue connecting (yes/no)? yes
これは、ローカル コンピューターがリモート ホストを認識していないことを意味します。
秘密鍵のパスフレーズを指定しなかった場合は、すぐにログインします。 秘密鍵の作成時にパスフレーズを指定した場合は、パスフレーズの入力が必要になります。
成功した場合は、サーバーをロックダウンする方法に進みます。
Disabling Password Authentication on your Server
パスワードなしで SSH を使用してアカウントにログインできた場合は、アカウントへの SSH 鍵ベースの認証の設定が成功したことになります。
このセクションの手順を実行する前に、このサーバーの root アカウントに SSH キーベース認証が設定されていること、または、できればこのサーバーの sudo
アクセス権を持つアカウントに SSH キーベース認証が設定されていることを確認してください。
上記の条件が満たされたら、rootまたはsudo
の権限を持つアカウントで、リモートサーバーにSSHキーでログインします。 SSHデーモンの設定ファイルを開きます:
sudo nano /etc/ssh/sshd_config
ファイルの中で、PasswordAuthentication
というディレクティブを探します。 これはコメントアウトされている可能性があります。 この行のコメントを外して、値を「no」に設定してください。 これにより、アカウントのパスワードを使用して SSH でログインする機能が無効になります。
PasswordAuthentication no
作業が終わったら、ファイルを保存して閉じます。 今行った変更を実際に実行するには、サービスを再起動する必要があります。
UbuntuやDebianのマシンでは、次のコマンドを実行します:
sudo service ssh restart
CentOS/Fedoraのマシンでは、デーモンの名前はsshd
です。
sudo service sshd restart
このステップを完了すると、SSHデーモンがSSHキーにのみ反応するように移行することに成功します。
おわりに
これで、サーバー上で SSH 鍵ベースの認証が設定・実行され、アカウントのパスワードを入力しなくてもサインインできるようになりました。 ここからは、さまざまな方向に進むことができます。 SSHを使った作業についてもっと詳しく知りたい方は、SSH essentials guideをご覧ください。