SEワンタンの独学備忘録

IT関連の独学した内容や資格試験に対する取り組みの備忘録

【Linux】パスワード入力なしでSSH接続する(公開鍵認証)


書いたときからいろいろと学んではいるので、シェルスクリプトで別サーバに接続する記事の続き。

www.wantanblog.com

まずはSSH接続の確認

まずはなにもしていない状態でサーバ間のSSH接続をするとどうなるのか確認します。
直接的な答えではないので飛ばしてしまってOK。

環境

一応環境の確認。
私は以下のような環境で試していますが、Linux系サーバが複数台存在するところが同じならえば他の違いはそこまで気にしなくてもよいと思います。

f:id:wantanBlog:20200625001030p:plain

ホストのWindows10にVirtualBoxをインストールし、そこに2台のCentOS7サーバを立てています。
以降は2台のCentOS7サーバに絞ってみていきます。

コマンドラインから

まずはコマンドラインからSSH接続の確認です。
ユーザ名やIPは適宜変えてください。

ssh wantan2@192.168.56.107

何も設定していない状態だと以下のようにパスワードが求められ、正しく入力を行うとSSHで接続ができるはずです。

[wantan@docker-host ~]$ ssh wantan2@192.168.56.107
wantan2@192.168.56.107's password:
Last failed login: Thu Jun 25 18:27:59 JST 2020 from 192.168.56.102 on ssh:notty
There were 2 failed login attempts since the last successful login.
[wantan2@localhost ~]$
シェルスクリプトから

シェルスクリプト内でSSH接続をしてコマンドを実行する場合。
以下のような複数回のSSH接続をスクリプト内で実行するもの。処理は別になんでもいい。

・testshell.sh

#!/bin/bash

ssh wantan2@192.168.56.107 date

ssh wantan2@192.168.56.107 ls -l /home

実行するとSSH接続を行った回数だけパスワードの入力を求められる
これは場合によってはしんどい。

[wantan@docker-host sstest]$ ./testshell.sh
wantan2@192.168.56.107's password:
2020年  6月 25日 木曜日 18:30:14 JST
wantan2@192.168.56.107's password:
合計 4
drwx------. 19 wantan  wantan  4096  9月  7  2019 wantan
drwx------.  5 wantan2 wantan2  128  6月 25 18:29 wantan2

サーバ間で公開鍵認証

パスワード入力をなしにSSH接続を行えるようにする方法はいくつかあると思いますが、今回は公開鍵認証による方法を紹介します。
接続先か接続元の作業かだけ注意してください。

f:id:wantanBlog:20200626225616p:plain

鍵ペアの作成

接続元(一号機)側で鍵ペアを生成します。
鍵ペアはユーザごとに作成する必要があるため、SSH接続を行いたいユーザで実施します。

■ホームに.「ssh/」ディレクトリが存在することを確認する

ls -a ~

「.ssh/」ディレクトリが存在すればOK。なければ作っておく。

 mkdir -m 700 .ssh

■鍵ペアを生成する

ssh-keygen -t rsa

・実行例

[wantan@docker-host .ssh]$ ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/home/wantan/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/wantan/.ssh/id_rsa.
Your public key has been saved in /home/wantan/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:oEjbohUlmKLVRAUwTBJNNC6StenJZ/Yle6uHXtgLE9o wantan@docker-host
The key's randomart image is:
+---[RSA 2048]----+
|oXX==o.          |
|+=+B.            |
|*.*   .          |
|o= * . .         |
|  O * o S        |
| o = + B         |
|.   . E.+        |
|      .=.o       |
|     .ooo        |
+----[SHA256]-----+

今回の場合はパスフレーズを入力せずに生成してます。

■鍵生成の確認

鍵が生成されていることを確認しておきます。

 ls ~/.ssh

・例

[wantan@docker-host .ssh]$ ll ~/.ssh
合計 12
-rw-------. 1 wantan wantan 1679  6月 25 23:15 id_rsa
-rw-r--r--. 1 wantan wantan  400  6月 25 23:15 id_rsa.pub
-rw-r--r--. 1 wantan wantan  699  6月 25 00:54 known_hosts

秘密鍵(id_rsa)と公開鍵(id_rsa.pub)が生成されていることを確認します。
後は公開鍵を配布するだけです。

公開鍵の配布

接続先サーバ(二号機)に先ほど生成した公開鍵を配布します。

■接続先にsshディレクトリが存在することを確認

接続先サーバ(二号機)にログインします。
以下では接続元のサーバからSSHでログインしていますが、別のターミナルからログインしなおしてもOK。

ssh wantan2@192.168.56.107

接続先サーバにも「.ssh/」ディレクトリが存在していることを確認しておきます。
なければ作る。

ls -a ~

■二号機に公開鍵を配布する

ざっくり言うと一号機の公開鍵の内容を二号機の.ssh/の「authorized_keys」ファイルに記述します。
今回は以下のコマンドを使用してsshdに「authorized_keys」に記述してもらいます。
※接続元(一号機)からの実行

ssh-copy-id -i ~/.ssh/id_rsa.pub wantan2@192.168.56.107

・出力結果例
この時点ではまだ公開鍵が登録できていないのでパスワード入力が必要です。

[wantan@docker-host .ssh]$ ssh-copy-id -i ~/.ssh/id_rsa.pub wantan2@192.168.56.107
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/home/wantan/.ssh/id_rsa.pub"
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
wantan2@192.168.56.107's password:

Number of key(s) added: 1

Now try logging into the machine, with:   "ssh 'wantan2@192.168.56.107'"
and check to make sure that only the key(s) you wanted were added.

同じことができればコピーやファイル生成などでもなんでも大丈夫です。
注意点としては手動で生成する場合にはフォルダとファイルの権限に気を付けること。

drwx------. 2 wantan2 wantan2   48  6月 25 23:22 .ssh

./.ssh:
合計 8
drwx------. 2 wantan2 wantan2  48  6月 25 23:22 .
drwx------. 6 wantan2 wantan2 156  6月 25 23:21 ..
-rw-------. 1 wantan2 wantan2 400  6月 25 23:22 authorized_keys
-rw-r--r--. 1 wantan2 wantan2 176  6月 25 18:38 known_hosts

.ssh/は700
authorized_keysは600
じゃないとだめみたいです。

以下のようなエラーが出たらパーミッションを要チェック。

Permission denied (publickey,gssapi-keyex,gssapi-with-mic).
sshdの設定確認

接続先(二号機)のsshdの設定確認を行います。
sshdの公開鍵認証が有効になっているか確認します。

/etc/ssh/sshd_config

上記のファイルから「PubkeyAuthentication」の行を探します。
コメントアウトされていたり、noになっている場合にはyesに書き換える。

PubkeyAuthentication yes

また、別に確認する必要もありませんが、「authorized_keys」というファイル名もこのファイルに記述されています。

sshdを再起動させる。

systemctl restart sshd

これで完了。

接続確認

一号機からSSH接続を行ってパスワード入力なしで接続できるか確認しておきます。

・コマンドラインから実行

[wantan@docker-host .ssh]$ ssh wantan2@192.168.56.107
Last login: Thu Jun 25 23:34:19 2020 from 192.168.56.102
[wantan2@localhost ~]$

・シェルスクリプトから実行

[wantan@docker-host sstest]$ ./testshell.sh
2020年  6月 25日 木曜日 23:43:20 JST
合計 4
drwx------. 19 wantan  wantan  4096  9月  7  2019 wantan
drwx------.  6 wantan2 wantan2  156  6月 25 23:40 wantan2
[wantan@docker-host sstest]$

シェルスクリプトからでもパスワード入力なしで連続してsshコマンドを使用できるようになっています。
今回の方法では接続元の特定ユーザから接続先の特定ユーザにSSH接続する際の方法なので、別のユーザでも有効にする場合は別途鍵の配布が必要になる。

一般ユーザからrootへのパスワードなしでのログインなどは権限上あまり推奨されないと思うので考えてからの方がよいでしょう。