前回の記事でsshコマンドのパスワード認証までを説明しました。sshコマンドのもう一つの認証方式である公開鍵認証の設定を行い、接続確認をするところまでやっていきましょう。 macOSの場合には新たにソフトウエアをインストールする必要はありませんが、Windowsの場合にはGit for Windowsが必要です。 また、基本的な公開鍵認証設定を行うため、ファイアーウォールの設定変更などは行いません。

SSH接続のための公開鍵認証設定

3年以内に更新されました。情報が古い可能性があります。
更新日 : 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 秘密鍵ファイルパス

これで作成した秘密鍵で、公開鍵認証を行います。パスフレーズを設定した場合にはパスフレーズの入力を求められるので、入力するとログインできます。

パスワードでの認証を禁止する

公開鍵認証が成功した後は、パスワードでの認証を禁止する設定を導入しましょう。

パスワードが漏れたり、総当たり攻撃に合うとログインされてしまう可能性があるため、パスワードでの認証を禁止し、公開鍵認証のみでログインできるように設定を変更します。

  1. まずは公開鍵認証でログイン
  2. ログイン後、sudoコマンドで/etc/ssh/sshd_configを開く
  3. ファイルを以下のように編集(79行目)
    76 # To disable tunneled clear text passwords, change to no here!
    77 #PasswordAuthentication yes
    78 #PermitEmptyPasswords no
    79 PasswordAuthentication no

    このようにPasswordAuthentication noを有効化(#のコメントアウトを解除)し、noとすることで、パスワード認証を禁止する設定になります。

  4. 保存後、sshd -tで構文チェック

    上の構文チェックコマンド実行時に以下のようにエラーが表示されると、表示されている行番号の記述が間違えているので直しましょう!

    $sshd -t
    /etc/ssh/sshd_config: line 76: Bad configuration option: To
    /etc/ssh/sshd_config: terminating, 1 bad configuration options

    上記の場合、76行目にミスがあります。構文のミスが無ければ何も表示されません。

  5. 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の設定を逸脱するため、別記事で解説します。