SSHではパスワード認証の代わりに公開鍵認証を使うことができます。
公開鍵認証は公開鍵(イメージは錠前)と秘密鍵(イメージは鍵)のペアによって認証を行う仕組みです。
公開鍵(錠前)からは秘密鍵(鍵)を作れないため、仮に公開鍵が悪意のある人に渡っても安全です。(正確に言うと「作るためには長い時間がかかる」となります)
公開鍵認証はパスワード認証に比べて以下のメリットがあるとされます。
- 安全性が高い
これは「公開鍵認証だから」というより「自分で入力するわけではないので長くできる」という要素の方が強いですね。数千文字のパスワードを毎回自分で入れられるなら、理論上そっちの方が安全だったりします。
一応それ以外にも盗聴されていたとしても鍵そのものは盗まれないという公開鍵自体のメリットもあります。 - 使い回しができる
パスワードと違って公開鍵は流出しても問題ありません。逆に公開鍵を広く配って「この公開鍵に合う秘密鍵を持っているので私たちは本人です安心してください」なんて使い方がされていたりします。(「電子証明書 公開鍵」で検索してみてください)
このため使いまわしをしても問題がありません。
まあ、うっかり秘密鍵が流出したりすると悲惨なことになりますが……
逆にデメリットとしては秘密鍵が無いとSSH接続ができなくなるので、出先でアクセスができなくなるという点があります。(秘密鍵を入れたUSBなんかを持ち歩けば出先でもアクセスできますが、うっかり落としたりすると……)
では、公開鍵認証の設定をしたいと思います。
この記事で行うこと
- 鍵の作成
- 秘密鍵を持ってくる
- 公開鍵を配置
- SSHの設定
1. 鍵の作成
※この作業はログインしたいユーザのアカウントで実施します。
以下の通りに公開鍵と秘密鍵のペアを作ります。
$ ssh-keygen -b 4096 -C "" Generating public/private rsa key pair. Enter file in which to save the key (/home/yuto/.ssh/id_rsa): (エンターを押す) Created directory '/home/yuto/.ssh'. Enter passphrase (empty for no passphrase): (パスフレーズを入力する) Enter same passphrase again: (パスフレーズを入力する) Your identification has been saved in /home/yuto/.ssh/id_rsa. Your public key has been saved in /home/yuto/.ssh/id_rsa.pub. The key fingerprint is: SHA256:7rJCmFT1deAsnXdJLaouh4XROKshwS9HNQd71RYmBsg The key's randomart image is: +---[RSA 4096]----+ | ....o+o=.+o | | . .E*.= ++..| | o .+=* .oo. | | . o . +o.... | | . o + S= . | | o + +.o o | | . + o.+ | | . o.o o | | ..o.o | +----[SHA256]-----+
- ssh-keygen : SSHの鍵(key)を生成する(generate)コマンドです。
- -b 4096 : 「-b」はSSHの鍵長(鍵の強さ)を指定するオプションです。デフォルトだと2048ビットですが、若干心もとないので4096ビットに設定しています。
- -C “” : 「-C」で秘密鍵にコメントを入れることができます。デフォルトだとユーザ名が入ります。個人的にはあまり余計な情報を残したくないので空欄にします。必要に応じて「”」の間にコメントを入れてください。
パスフレーズは秘密鍵を使うときに入力が必要なパスワードです。
これを設定することで万一秘密鍵が流出してもパスフレーズがばれない限りはその鍵を使われずに済みます。
絶対に流出しないという自信があるのであれば設定しなくても良いですが……
2. 秘密鍵を持ってくる
鍵は作成できましたが、今は公開鍵も秘密鍵もサーバ上にあります。
秘密鍵をこちらに持ってこなくてはいけません。
もっとも簡単な方法はSSHクライアントで秘密鍵を開いてコピーペーストをすることです。
$ vi ~/.ssh/id_rsa
viについてはこのページを参照してください。Linuxで設定ファイルを編集するときの基本
ファイル内の -----BEGIN OPENSSH PRIVATE KEY-----
から -----END OPENSSH PRIVATE KEY-----
までをコピーして新しいテキストファイルに貼り付けて保存します。
これが秘密鍵ファイルとなります。
また、後に問題なく接続ができることが確認出来たらサーバ上の秘密鍵ファイルは削除してください。
3. 公開鍵の配置
公開鍵の場所はすでに正しいところに配置されているため変更する必要はありませんが、SSH接続で使うには公開鍵の名称と権限設定を変える必要があります。
公開鍵の名称を authorized_keys
に、ディレクトリの権限許可を「700」に、公開鍵ファイルの権限許可を「600」に設定しましょう。
$ mv ~/.ssh/id_rsa.pub ~/.ssh/authorized_keys $ chmod 700 ~/.ssh $ chmod 600 ~/.ssh/authorized_keys
コマンドの詳細に関しては、名称変更はLinuxの基本コマンド – ファイル操作を、権限設定はLinuxの基本コマンド – 権限設定を確認してください。
この時点で一度公開鍵認証でログインしてみてください。
公開鍵認証を使ったログインの方法は利用しているクライアントごとに違うため、各自で確認してください。
4. SSHの設定
ここではパスワードを使ったSSHでのログインができないように設定をします。
※この設定を行うとパスワードでのログインができなくなります。必ず公開鍵認証を使ったログインができることを確認してから設定してください。
現時点ではパスワードを使ったログインも許可されている状態です。せっかく安全な公開鍵認証での接続ができるようになっても脆弱なパスワード認証が破られて侵入されたりしたら目も当てられませんからね。
ファイルは前回rootへの直接ログイン禁止の時と同じファイルです。
/etc/ssh/sshd_config
ファイルの編集はこのページを参照してください。Linuxで設定ファイルを編集するときの基本
今回は以下の部分を編集します。「-」は削除する行(変更前)、「+」は追加する行(変更後)となります。
- PasswordAuthentication yes + PasswordAuthentication no
設定ファイルを編集したらSSHを再起動して完了です。
# systemctl restart sshd
SSHでパスワードを使ったログインを試してみてください。
パスワードの入力画面に入るまでもなく接続が拒否されるはずです。
もし、ログインできてしまった場合は設定ファイルの編集を間違っていないか、SSHを再起動したか確認してみてください。
まとめ
今回はSSHの公開鍵認証の設定をしました。
鍵を持っていない端末からは接続できないなど面倒な点もありますが、安心のためと思って是非設定することをお勧めします。
次回はSSH周りの設定の最後「SSHの接続ポート変更」を行います。