SSH接続のための公開鍵認証設定
更新日 : 2021年05月19日
前回の記事でsshコマンドのパスワード認証までを説明しました。ssh
コマンドのもう一つの認証方式である公開鍵認証の設定を行い、接続確認をするところまでやっていきましょう。
macOSの場合には新たにソフトウエアをインストールする必要はありませんが、Windowsの場合にはGit for Windowsが必要です。
また、基本的な公開鍵認証設定を行うため、ファイアーウォールの設定変更などは行いません。
事前準備
公開鍵の設定前に事前準備をいくつか行います。ssh
コマンドでrootユーザーでパスワード認証を利用してログインを行っておきましょう。
パスワード認証でログインをすると、一定時間コマンドを実行しない場合には自動的に接続が切れるので注意しましょう。
サーバー内でユーザー作成
rootでリモートログインするのはセキュリティ的に危険なので、サーバーにログインして新規でユーザー作成と作成したユーザーのパスワードを設定しておきましょう。
また、作成したユーザーのsudo追加も行っておきます。これを行うことにより、リモートでログインするユーザーは一般ユーザーになりますが、sudo
コマンドを利用することもできるようになります。
rootユーザーでのログインを禁止する
ユーザー作成と、追加したユーザーのsudo追加ができたことをまずは確認しましょう。
作成したユーザーでリモートログインができることを確認し、作成したユーザーがsudo
コマンドを実行できるかどうかが確認できた段階で次の作業へ進みます。
確認しないとサーバーにアクセスできなくなる可能性があるので注意しましょう。
確認できたらrootユーザーでのリモートログインの禁止を設定していきます。
まずは作成したユーザーでリモートログインを行いましょう。
ssh
コマンドの設定ファイルを編集しますが、設定ファイルにミスがあるとアクセスできなくなる可能性もあるため、コピーをとってバックアップしておきます。
# sshd_configファイルのバックアップをコピーしておく
$sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bk
これでいざとなったらsshd_config.bk
ファイルをsshd_config
ファイルに上書きすれば元に戻せます。
ではsshd_config
の設定ファイルを編集していきましょう。
$sudo vi /etc/ssh/sshd_config
vi
エディタを起動して編集します。
37 #LoginGraceTime 2m
38 PermitRootLogin no
39 #StrictModes yes
PermitRootLogin yes
の項目が#
でコメントアウトされている状態になっているので、#
を消してコメントアウトを解除します。
さらにyes
の部分をno
にしてrootのリモートログインを禁止する設定に変更します。これで保存終了をしておきましょう。
最後にssh
のデーモン(ssh接続を受け付けるための常時起動ソフト)を再起動して先程の設定を反映します。
$sudo systemctl restart sshd
これでrootユーザーでのリモートログインを禁止する設定が完了です。試しにサーバーからログアウトしてrootユーザーでログインし直してみると以下の用にパスワードを入れても入れません。
$ssh root@*****.vs.sakura.ne.jp
root@*****.vs.sakura.ne.jp's password:
Permission denied, please try again.
公開鍵認証設定
ようやく本命の公開鍵認証のための設定です。
まずはサーバーからログアウトしていくつか準備を行います。
秘密鍵・公開鍵の作成
PC上で秘密鍵と公開鍵の生成を行います。ホームディレクトリに.ssh
ディレクトリがあれば.ssh
ディレクトリに移動して作業を行います。.ssh
ディレクトリが存在しない場合には作成しておきましょう。
# .sshディレクトリへ移動
$cd ~/.ssh
# 秘密鍵・公開鍵の作成(ファイル名は任意)
$ssh-keygen -f ファイル名
Generating public/private rsa key pair.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in ファイル名.
Your public key has been saved in ファイル名.pub.
The key fingerprint is:
SHA256:************************************** ********@******-Macbook-pro.local
The key\'s randomart image is:
+---[RSA 2048]----+
|*****************|
|*****************|
|*****************|
|*****************|
|*****************|
|*****************|
|*****************|
|*****************|
|*****************|
+----[SHA256]-----+
実行後、指定したファイル名のファイルと、ファイル名.pub
ファイルの2つが作成されます。
パスフレーズは任意で設定してください。設定しなくても作成できますが、もちろん設定したほうが安全です。
指定したファイル名そのままのファイルは秘密鍵です。秘密鍵は誰にも渡してはいけません。
そしてファイル名.pub
のファイルは公開鍵です。こちらは他人に見られても問題ありません。
そして公開鍵の方をサーバーに配置して、設定を進めていきます。
サーバーへ公開鍵を配置
作成したファイル名.pub
ファイルをサーバーへ配置します。scp
コマンドを利用することで暗号化した状態でサーバーへファイルを送信できます。
# ファイル名.pubファイルをサーバーのホームディレクトリに送信
$scp ~/.ssh/ファイル名.pub ユーザー名@ホスト名:~
******@*************'s password:
ファイル名.pub 100% 417 3.3KB/s 00:00
サーバーで作成したユーザーのパスワードを入力してEnterを押すとファイルが送信されます。
サーバーで公開鍵の設定
PCで作成した公開鍵をサーバーに送ることができました。サーバーにログインして送信された公開鍵を確認し、ssh
コマンドで公開鍵認証ができるように設定していきましょう。
まずはサーバーへ作成したユーザーでパスワード認証ログインを行い、サーバーで以下のコマンドを実行します。
# .sshディレクトリを作成
$mkdir ~/.ssh
# ディレクトリの権限をユーザーのみrwxに制限
$chmod 700 ~/.ssh
# 公開鍵を設置する
$mv ~/ファイル名.pub ~/.ssh/authorized_keys
# ディレクトリの権限をユーザーのみrw-に変更
$chmod 600 ~/.ssh/authorized_keys
まずは.ssh
ディレクトリの作成です。作成したユーザーのホームディレクトリに作成します。
次に作成した.ssh
ディレクトリの権限を700
に変更します。これで作成したユーザーのみがこのディレクトリにアクセスできます。これを行わないと公開鍵認証ができないので注意しましょう。
そして送られてきた公開鍵ファイル名.pub
がホームディレクトリにあるので、.ssh
ディレクトリ内のauthorized_keys
ファイルに変更して移動します。
最後にauthorized_keys
の権限を600
に変更します。これでauthorized_keys
ファイルには作成したユーザーのみがアクセスできます。これも行わないと公開鍵認証ができないので注意しましょう。
公開鍵認証でアクセスできるか確認
これで公開鍵認証のための設定は終了です。
最後に公開鍵認証でアクセスできるか確認しましょう。PCから以下のssh
コマンドで接続を試してみます。
$ssh サーバーのユーザー名@サーバーのホスト名 -i 秘密鍵ファイルパス
これで作成した秘密鍵で、公開鍵認証を行います。パスフレーズを設定した場合にはパスフレーズの入力を求められるので、入力するとログインできます。
パスワードでの認証を禁止する
公開鍵認証が成功した後は、パスワードでの認証を禁止する設定を導入しましょう。
パスワードが漏れたり、総当たり攻撃に合うとログインされてしまう可能性があるため、パスワードでの認証を禁止し、公開鍵認証のみでログインできるように設定を変更します。
- まずは公開鍵認証でログイン
- ログイン後、sudoコマンドで
/etc/ssh/sshd_config
を開く - ファイルを以下のように編集(79行目)
76 # To disable tunneled clear text passwords, change to no here! 77 #PasswordAuthentication yes 78 #PermitEmptyPasswords no 79 PasswordAuthentication no
このように
PasswordAuthentication no
を有効化(#
のコメントアウトを解除)し、no
とすることで、パスワード認証を禁止する設定になります。 - 保存後、
sshd -t
で構文チェック上の構文チェックコマンド実行時に以下のようにエラーが表示されると、表示されている行番号の記述が間違えているので直しましょう!
$sshd -t /etc/ssh/sshd_config: line 76: Bad configuration option: To /etc/ssh/sshd_config: terminating, 1 bad configuration options
上記の場合、76行目にミスがあります。構文のミスが無ければ何も表示されません。
sudo systemctl restart sshd
でsshdを再起動
以上で設定が完了になります。以下のようにパスワード認証でアクセスし、アクセスできないことを確認しましょう。
$ssh サーバーのユーザー名@サーバーのホスト名 -o PreferredAuthentications=password
ユーザー名@IPアドレス: Permission denied (publickey).
上記の-o PreferredAuthentications=password
で強制的にパスワード認証でのログインを試みます。Permission denied (publickey)
と表示されればパスワード認証が禁止されていることになり、完了になります!
sshコマンドのConfig設定
毎回秘密鍵のファイルを指定してアクセスするのは面倒なので、最後にConfig設定というものを行っていきます。これを行うことにより、ssh
コマンドでの接続が楽になります。
PC内の.ssh
ディレクトリに入り、Config
という名前でvi
エディタを起動しましょう。
$cd ~/.ssh
$vi Config
エディタが起動したら以下の用にファイルに追記していきます。
Host 接続に使用したい名前(任意)
User ユーザー名
IdentitiesOnly yes
PasswordAuthentication no
IdentityFile 秘密鍵ファイルパス
ServerAliveInterval 45
HostName IPアドレスorホスト名
Port 22
これでssh
コマンドを利用する際に、1行目に記載した任意の名前を指定するだけでユーザーや秘密鍵のファイルパスを自動的に補完してくれます。
実際に接続したい場合にはssh 接続に使用したい名前
と入力するとアクセスができることが確認できるはずです。
今回は接続に使用したい名前をeducation
としたので、以下のコマンドを実行することで接続が可能です。
# 「ssh 設定した名前」で接続可能
$ssh education
Last login: Wed Oct 9 12:06:47 2019 from ******************
SAKURA Internet [Virtual Private Server SERVICE]
[********@************ ~]$
まとめ
ssh
コマンドの公開鍵認証設定を行いました。
rootでのリモートログインの禁止・公開鍵認証設定を行うことでサーバーのセキュリティが上がります。さらにいくつかセキュリティ向上のための設定がありますが、内容的にはssh
の設定を逸脱するため、別記事で解説します。
タグ
-
前の記事
sshコマンド
-
次の記事
CentOS7でPHP7のインストール