ssh によるリモートサーバへの接続は、通信内容が暗号化されおりセキュアな通信が行えます。しかしグローバルに公開されているサーバのsshd サービスには外部からブルートフォースアタック(総当たり攻撃)、ディクショナリアタック(辞書攻撃)などの攻撃を常に受けています。管理者自身が強固なパスワードを設定していても、一般ユーザに安易なパスワードを設定されてしまっては、外部からの侵入を許してしまう恐れがあります。
それらを簡単にブロックする方法として公開鍵認証があります。デフォルトでは、接続先に設定されているパスワードを入力するパスワード認証を行ってログインしますが、事前に一対の公開鍵と秘密鍵を作成して、サーバー側に公開鍵を、クライアント側に秘密鍵を用意しておく公開鍵認証を利用すれば、外部からの攻撃による侵入を防ぐ事ができます。
鍵を作成するコマンドは、ssh-keygen です。鍵の暗号化方式は、デフォルトの rsa を使用します。以下のコマンドで秘密鍵と公開鍵が作成されます。
$ ssh-keygen -t rsa Generating public/private rsa key pair. Enter file in which to save the key (/home/taro/.ssh/id_rsa): <- 秘密鍵のファイル名はデフォルトのまま未入力で[Enter] Created directory '/home/taro/.ssh'. Enter passphrase (empty for no passphrase): <- 任意のパスフレーズを入力(未入力でもかまいません) Enter same passphrase again: <- パスフレーズの確認 $ ls ~/.ssh/ id_rsa id_rsa.pub <- id_rsa が秘密鍵、id_rsa.pub が公開鍵
作成された公開鍵を接続先のサーバにコピーします。
$ scp ~/.ssh/id_rsa.pub 接続先サーバアドレス:
接続先サーバにログインして公開鍵をauthorized_keysファイルへ登録します。
$ mkdir ~/.ssh $ chmod 700 ~/.ssh $ cat ~/id_rsa.pub >> ~/.ssh/authorized_keys $ chmod 600 ~/.ssh/authorized_keys
sshd_config ファイルを編集してパスワード認証によるログインは無効にし、sshd のサービスを再起動します。
/etc/ssh/sshd_config
PasswordAuthentication no
CentOS の場合 $ sudo systemctl restart sshd.service Ubuntu の場合 $ sudo service sshd restart
再度クライアントからサーバへsshログインしてみます。
$ ssh 接続先サーバアドレス 公開鍵を登録したクライアントからアクセスした場合は、先ほど設定したパスフレーズの入力を求められます。 Enter passphrase for key '/home/tsuyoshi/.ssh/id_rsa': 公開鍵を登録していないクライアントからアクセスした場合は、アクセスが拒絶されます。 Permission denied (publickey,gssapi-keyex,gssapi-with-mic).