パスワード入力なしの公開鍵認証でSSH接続する設定
目次
概要
Linuxサーバにリモート接続して操作する場合、TeraTerm(Windows)やsshコマンド(Linux)を使って接続するのが通例となっています。 接続の際にはSSH(Secure Shell)プロトコルが使用され、ネットワーク上の通信が暗号化されます。 RHELではこの機能を司るSSHサーバとしてOpenSSHが採用されています。
RHELのOpenSSHで構築したSSHサーバへリモート接続する際には、 初期状態ではユーザIDとパスワードによる認証が許可されていますが、 ユーザIDとパスワードさえ知っていれば、誰でも(どのPCからでも)接続できてしまうという問題があります。
また、SSHのサブセットとして提供されているSCPを使うとリモートホストとの間でファイルコピーを 実行することができます。この機能を利用して、リモートホストとのファイルコピーをシェルで自動化して 定期的に実行しようと考えた場合、パスワード認証だとパスワードの入力待ちで止まってしまうため 想定したとおりの使い方ができません。
上記のような問題を解消する手段の一つとして、公開鍵認証を利用することができます。 この認証方式ではSSHやSCPでリモート接続を試みた際に、ユーザIDとパスワードは使用せず、 お互いが持っている鍵を使って認証を行います。 具体的にはSSHクライアントが持つ秘密鍵とSSHサーバが持つ公開鍵(これはSSHクライアントで生成したもの)を使います。
構成
サーバ構成
OSバージョン
Red Hat Enterprise Linux 5.9 x86_64
ソフトウェア・パッケージ一覧
openssh-server-4.3p2-82.el5
openssh-4.3p2-82.el5
openssh-clients-4.3p2-82.el5
openssh-askpass-4.3p2-82.el5
クライアント構成
OSバージョン
Red Hat Enterprise Linux 5.9 x86_64
ソフトウェア・パッケージ一覧
openssh-4.3p2-82.el5
openssh-clients-4.3p2-82.el5
openssh-askpass-4.3p2-82.el5
環境構築
以下ではSSHクライアントからSSHサーバに対してpostgresユーザで 接続するシーンを想定してパスワードなしで接続できる設定を行います。 なお、ユーザIDとパスワードでの認証も引き続き行える設定としています。 パスワード認証が不要な場合はsshd_configで設定をオフにしてください。
設定の大まかな流れは以下のようになります。
(1) SSHクライアントで鍵のペア(秘密鍵と公開鍵)を作成
(2) SSHクライアントからSSHサーバへ公開鍵を転送
(3) SSHサーバに公開鍵を登録
(4) SSHサーバで公開鍵認証を許可
(5) SSHサーバを再起動
SSHクライアント(接続する側)設定
まずはSSHクライアント(SSH接続する側)で鍵のペアを作成します。 鍵のペアとは公開鍵暗号方式の秘密鍵と公開鍵で、 暗号化方式にはDSA(Digital Signature Algorithm)を利用します。 秘密鍵はSSHクライアント側で保持し、公開鍵はSSHサーバ側で保持します(後の手順で転送します)。
-bash-3.2$ cd ~/.ssh/ -bash-3.2$ ssh-keygen -t dsa Generating public/private dsa key pair. Enter file in which to save the key (/var/lib/pgsql/.ssh/id_dsa): ←何も入力せずに[Enter]を押す Enter passphrase (empty for no passphrase): ←何も入力せずに[Enter]キーを押す Enter same passphrase again: ←何も入力せずに[Enter]キーを押す Your identification has been saved in /var/lib/pgsql/.ssh/id_dsa. Your public key has been saved in /var/lib/pgsql/.ssh/id_dsa.pub. The key fingerprint is: 7e:38:5c:9f:f3:e2:67:eb:ce:c6:07:83:48:c8:85:ec postgres@postgresql2 -bash-3.2$ ls -l 合計 12 -rw------- 1 postgres postgres 668 5月 25 15:11 id_dsa ←作成された秘密鍵 -rw-r--r-- 1 postgres postgres 610 5月 25 15:11 id_dsa.pub ←作成された公開鍵 -rw-r--r-- 1 postgres postgres 394 5月 25 13:34 known_hosts
SSHサーバ(接続される側)設定
公開鍵(id_dsa.pub)をSSHサーバへ転送
SSHクライアントで作成した公開鍵(id_dsa.pub)をSSHサーバへ転送します。 公開鍵はパスワードなしでログインしたいLinuxユーザのホームディレクトリ配下に 『.ssh』フォルダを作成してその中に配置します。 以下ではpostgresユーザがパスワードなしでSSH接続するための設定を行います。 表示例ではSSHクライアントのIPアドレスは『192.168.0.77』です。
# su - postgres -bash-3.2$ mkdir .ssh ←なければ作成する -bash-3.2$ chmod 700 .ssh -bash-3.2$ ls -ld .ssh drwx------ 2 postgres postgres 4096 5月 25 14:54 .ssh -bash-3.2$ cd .ssh/ -bash-3.2$ scp -p 192.168.0.77:/var/lib/pgsql/.ssh/id_dsa.pub . postgres@192.168.0.77's password: ←パスワードを入力 id_dsa.pub 100% 610 0.6KB/s 00:00 -bash-3.2$ ls -l 合計 8 -rw-r--r-- 1 postgres postgres 610 5月 25 15:11 id_dsa.pub ←コピーした -rw-r--r-- 1 postgres postgres 394 5月 25 15:14 known_hosts
公開鍵(id_dsa.pub)をSSHサーバに登録
SSHクライアントから転送した公開鍵(id_dsa.pub)をpostgresユーザの認証キーとして登録します。 認証キーファイルの名前はデフォルトでは『authorized_keys』となります。 autorized_keys ファイルの中身は認証を許可する公開鍵の羅列となっていますので、 ファイルの末尾に新しい公開鍵を追記します(authorized_keysもid_dsa.pubもテキストファイルです)。 今回は authorized_keys ファイルが新規作成となるので、ファイルのパーミッションを600に変更して 他のユーザから参照されないようにしておきます。
-bash-3.2$ cat id_dsa.pub >> authorized_keys -bash-3.2$ chmod 600 authorized_keys -bash-3.2$ ls -l 合計 12 -rw------- 1 postgres postgres 610 5月 25 15:16 authorized_keys -rw-r--r-- 1 postgres postgres 610 5月 25 15:11 id_dsa.pub -rw-r--r-- 1 postgres postgres 394 5月 25 15:14 known_hosts
公開鍵認証を許可する設定
OpenSSHサーバの設定を変更し、公開鍵認証を許可します。 併せて認証キーファイルのファイル名を設定します。
もしパスワード認証を停止したい場合は sshd_config ファイルの 『PasswordAuthentication』パラメータを yes から no に変更してください。 ただ急に変更すると設定変更している端末からもつながらなくなる可能性が ありますので、よく考えて設定を変更してください。 もしくはローカルコンソールから設定変更してください。
# cd /etc/ssh/ # vi sshd_config
※以下、該当箇所のみ変更※ #PubkeyAuthentication yes #AuthorizedKeysFile .ssh/authorized_keys ↓変更 PubkeyAuthentication yes ←コメントアウトを外す AuthorizedKeysFile .ssh/authorized_keys ←コメントアウトを外す
設定が終わったら sshd サービスを再起動して変更を反映させます。
# service sshd restart sshd を停止中: [ OK ] sshd を起動中: [ OK ]
動作テスト
SSHクライアント(192.168.0.77)からSSHサーバ(192.168.0.75)へ postgres ユーザでssh接続します。 パスワードを聞かれることなく接続できれば正しく設定されています。
-bash-3.2$ ssh 192.168.0.75 Last login: Sun May 25 16:13:15 2014 from 192.168.0.77 -bash-3.2$
参考までにパスワード認証の場合は以下のようにパスワード入力を求められていました。
-bash-3.2$ ssh 192.168.0.75
postgres@192.168.0.75's password: ←公開鍵認証でこれが表示されなくなった
Last login: Sat Jun 7 10:06:12 2014 from 192.168.0.77
-bash-3.2$