ターミナルからパスワード入力無しでssh接続する3つの方法

sshコマンドでログインをする際、通常であればログインするユーザのパスワードを求められる。
セキュリティ上致し方ないものではあるのだが、時には煩わしいのも事実。スクリプトの中でssh接続をさせたい時には厄介だ。

という訳で、今回はこのパスワード入力無しでssh接続を行う方法について記述する。

1.鍵認証方式に切り替える

そもそも、ssh接続の認証方式はパスワード認証だけではない。
認証方式はいくつかあるが、そのうちの一つである鍵認証方式にすることで、パスワードを入力せずにログインすることが可能となる。

サーバ/クライアント側でそれぞれ設定が必要となるが、今回紹介する3つの方法の中でもセキュリティ的には一番高い方法だ。

1-1.サーバ側のsshd_configの設定を変更する

まずは、サーバ側の/etc/ssh/sshd_configの設定を変更する。

■サーバ側の設定 /etc/ssh/sshd_config(設定前)

…
RSAAuthentication yes
PubkeyAuthentication yes
AuthorizedKeysFile     .ssh/authorized_keys
…

この設定を、以下のようにする。

■サーバ側の設定 /etc/ssh/sshd_config(設定後)

…
#RSAAuthentication yes
#PubkeyAuthentication yes
#AuthorizedKeysFile     .ssh/authorized_keys
…

viエディタか、もしくはsedなどで書き換えると良いだろう。

sed -i -e 's|^#RSAAuthentication yes|RSAAuthentication yes|g' \
       -e 's|^#PubkeyAuthentication yes|PubkeyAuthentication yes|g' \
       -e 's|^#AuthorizedKeysFile     .ssh/authorized_keys|AuthorizedKeysFile     .ssh/authorized_keys|g' \
       /etc/ssh/sshd_config

その後、サーバ側でsshdを再起動する。

service sshd restart

最後に、事前にログインするユーザのホームディレクトリ配下に「.ssh」というディレクトリを生成する。

mkdir -p /root/.ssh

1-2.クライアント側で公開鍵の生成

次に、サーバ側で"このクライアントは接続しにきてもOK"という識別をするための公開鍵の生成をクライアント側で作成する。
クライアント側のマシンで、以下のコマンドを実行する。
なお、この時公開鍵のパスフレーズの入力を求められるが、これを入力してしまうと接続時にパスワード入力を求められてしまうので注意。

ssh-keygen -t rsa

実行例がこちら。

$ ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/home/test/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):<span style="color: #008000;"><strong>←入力せずにEnter</strong></span>
Enter same passphrase again:<span style="color: #008000;"><strong>←入力せずにEnter</strong></span>
Your identification has been saved in /home/test/.ssh/id_rsa.
Your public key has been saved in /home/test/.ssh/id_rsa.pub.
The key fingerprint is:
10:XX:d6:XX:d1:a9:fb:XX:d2:19:28:d7:XX:8a:50:XX test@test-vm-ubuntu
The key's randomart image is:
…

1-3.クライアント側で生成した公開鍵をサーバ側に登録する

最後に、1-2でクライアント側で生成した公開鍵を、サーバ側のディレクトリにコピーするだけだ。
コピー先は、sshでログインするユーザーのホームディレクトリ配下の「.ssh」フォルダの下に、「authorized_keys」というファイル名でコピーする。

以下のコマンドでは、クライアント側からscpでコピーを行っている。

scp -p /home/test/.ssh/id_rsa.pub root@192.168.0.20X:/root/.ssh/authorized_keys

1-4.クライアント側からログイン

これで、クライアント側から鍵認証でのログインを行えるようになった。
最初の一回だけ、どの鍵でログインするかを定めるためにクライアント側で以下のコマンドでログインを行う。

ssh -i .ssh/id_rsa root@192.168.0.20X

以降は、上記オプションなしでも自動的にログインが可能となる。
なお、この公開鍵は他のクライアントでも使いまわせるので、扱いには注意したい。
つまり、クライアントからこの公開鍵をコピーして、別のクライアントでログイン時に使用すれば、サーバにパスワード無しでログイン出来てしまうということだ。

2.sshpassコマンドを用いる

以前こちらでも紹介したコマンドなのだが、sshで入力を要求されるパスワードをオプションとして事前に入力できる『sshpass』というコマンドがある。
これをクライアント側にインストールして利用することで、パスワードの入力を省略するという方法もある。

2-1.インストール

まずはインストール。以下のコマンドを実行する。

●RHEL系の場合

sudo yum install sshpass --enablerepo=epel

●Debian/Ubuntu系の場合

sudo apt-get install sshpass

これで、sshpassのインストールが完了する。

2-2.使い方

使い方は簡単。以下のようにsshコマンドと組み合わせて利用する。

sshpass -p パスワード ssh ホスト名 -l ユーザ名

なお、初めてログインするホストの場合は、以下のようにすると良いだろう。

sshpass -p パスワード ssh ホスト名 -l ユーザ名 -o 'StrictHostKeyChecking no'

3.expectを用いる

3つ目は、最近のLinuxであればOSインストール時に指定すれば最初から含まれているコンソールの対話プログラム『expect』コマンドを用いた方法だ。
このコマンドを利用した方法は古くから使われているので、知っている人も多いだろう。基本的には、スクリプトを作成する必要があるため、あまり手軽な利用には向いていない。

expect内でsshログインをする上で、以下のコマンドがよく利用される。

  • expect:
    指定された文字列がコンソール上に出力されるのを待機する
  • spawn:
    実行されるコマンドを指定する
  • send:
    指定された文字列をコンソール上に送付する
  • interact:
    文字列を画面上に出力させる
  • set timeout:
    指定した秒数の間、処理が進まない場合はexpectを終了する。

expectでは、最初に「expect -c」と宣言した後の「"(ダブルクォーテーション)」内で全ての処理が行われていく。
以下に、サンプルスクリプトを記述する。

HOST_NAME=$1
HOST_USER=$2
HOST_PASS=$3

# expect コマンドを実行
expect -c "
    # タイムアウト値を指定する
    set timeout 30
    # spawnでsshコマンドを実行する
    spawn ssh $HOST_USER@$HOST_NAME

    # パスワード入力時に表示される「:(コロン)」の出力を待つ
    expect ":"

    # 「:(コロン)」が出力されたら、パスワードを送信する
    send \"$HOST_PASS\n\"

    # spawnの出力先を画面にする
    interact
    "