CentOSのsshの認証方式をパスワード認証から公開鍵認証に変更します。実施した環境は以下です。CentOSにsshdはインストールされていて、パスワード認証が出来ているものとします。
クライアント、サーバーともログインアカウントには tak を使用しています。
鍵ファイルの作成
公開鍵ファイルと秘密鍵ファイルをクライアント側のubuntuで作成します。
[ クライアント側作業 ]
ubuntuにログインしてホームディレクトリ配下の .ssh ディレクトリに移動します。ssh-keygenコマンドで鍵生成をします。鍵の形式は RSA、ビット長は4096としました。
$ pwd
/home/tak/.ssh
$ ssh-keygen -t rsa -b 4096
鍵ファイルの名前を id_rsa.j として、パスワードの設定もしました。ログは以下のようになります。
$ ssh-keygen -t rsa -b 4096 Generating public/private rsa key pair. Enter file in which to save the key (/home/tak/.ssh/id_rsa): /home/tak/.ssh/id_rsa.j ←★鍵ファイルの名前を指定 Enter passphrase (empty for no passphrase): ←★鍵ファイルにパスワードを設定 Enter same passphrase again: Your identification has been saved in /home/tak/.ssh/id_rsa.j. Your public key has been saved in /home/tak/.ssh/id_rsa.j.pub. The key fingerprint is: SHA256:yjDweZqZvZQ/k8jnpD8xPAWnmsFQ0F633V1yLDQCdyU tak@maria The key's randomart image is: +---[RSA 4096]----+ : : +----[SHA256]-----+
カレントディレクトリの配下(/home/tak/.ssh)に以下の名前で鍵ファイルが作成されます。
秘密鍵ファイル・・・id_rsa.j
公開鍵ファイル・・・id_rsa.j.pub
公開鍵ファイルのアップロード
公開鍵ファイルをCentOSにアップロードします。サーバー側の作業とクライアント側の作業があるので、それぞれ行います。
[ サーバー側作業 ]
CentOSにログインします。僕の環境ではホームディレクトリ配下に .ssh ディレクトリがなかったため新規で作成します。鍵ファイルの格納場所となるため、他のユーザーがアクセスできないように制限をつけておきます。
$ pwd
/home/tak
$ mkdir .ssh
$ chmod 700 .ssh
[ クライアント側作業 ]
scpコマンドで公開鍵ファイルをCentOSにアップロードします。CentOSのIPアドレスは伏せさせていただきました。
$ pwd
/home/tak
$ scp .ssh/id_rsa.j.pub tak@xxx.xxx.xxx.xxx:~/.ssh/
[ サーバー側作業 ]
公開鍵ファイルが /home/tak/.ssh 配下にアップロードされていることを確認します。アップロードした公開鍵ファイルを authorized_keys という名前にリネームします。権限も変えます。
$ pwd
/home/tak/.ssh
$ mv id_rsa.j.pub authorized_keys
$ chmod 600 authorized_keys
なお、今回は authorized_keys には公開鍵ファイルは1つだけですが、複数の公開鍵ファイルを登録することも出来ます(その場合は、公開鍵ファイルを authorized_keys にアペンドしていきます)。
sshd_configの編集
sshd_configの編集をrootユーザーで行います。
[ サーバー側作業 ]
sshd_configは /etc/ssh 配下にあります。必要に応じてsshd_configのバックアップをとっておいてください。
# cd /etc/ssh
# vi sshd_config
編集する内容は、PubkeyAuthentication を yes にして、PasswordAuthentication を no にします。
修正前
#PubkeyAuthentication yes
:
PasswordAuthentication yes
修正後
PubkeyAuthentication yes ←コメントアウトを外す
:
PasswordAuthentication no ←yesからnoにする
修正が出来たら、sshdを再起動します。
# systemctl restart sshd
公開鍵認証での接続
[ クライアント側作業 ]
sshでクライアントから接続します。-i オプションで秘密鍵ファイルを指定します。
$ pwd
/home/tak
$ ssh -i .ssh/id_rsa.j tak@xxx.xxx.xxx.xxx
Enter passphrase for key ‘.ssh/id_rsa.j’:
鍵ファイルのパスワードを入力して、サーバーに接続が出来ます。
なお、sshではこれで問題ないのですが、plinkだと以下のエラーとなりました。
$ plink -i .ssh/id_rsa.j tak@xxx.xxx.xxx.xxx Unable to use key file ".ssh/id_rsa.j" (OpenSSH SSH-2 private key (old PEM format)) Using username "tak". FATAL ERROR: Disconnected: No supported authentication methods available (server sent: publickey,gssapi-keyex,gssapi-with-mic)
「old PEM format」のようです。手持ちのツールの FileZilla で鍵ファイルのフォーマット変換が出来ましたので、書いておきます。FileZilla は ubuntu上で動くFTPクライアントソフトです。
FileZilla のサイトマネージャーを開いて、プロトコルは「SFTP」、ログオンの種類を「鍵ファイル」にして接続を試みます。
接続ボタンを押下すると、鍵ファイルの変換のダイアログが出ます。
「はい」を押下します。パスワードが必要と促されるので、鍵ファイルを生成したときと同じパスワードを入力します。
新しい鍵ファイルの名前を決めて保存します。今回は id_rsa.g としました。
plinkで作り直した鍵ファイルを指定して接続してみます。
$ plink -i .ssh/id_rsa.g tak@xxx.xxx.xxx.xxx
Using username “tak”.
Passphrase for key “imported-openssh-key”:
鍵ファイルのパスワードを入力すれば、サーバーに接続が出来ます。