書いたときからいろいろと学んではいるので、シェルスクリプトで別サーバに接続する記事の続き。
まずはSSH接続の確認
まずはなにもしていない状態でサーバ間のSSH接続をするとどうなるのか確認します。
直接的な答えではないので飛ばしてしまってOK。
環境
一応環境の確認。
私は以下のような環境で試していますが、Linux系サーバが複数台存在するところが同じならえば他の違いはそこまで気にしなくてもよいと思います。
ホストの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接続を行えるようにする方法はいくつかあると思いますが、今回は公開鍵認証による方法を紹介します。
接続先か接続元の作業かだけ注意してください。
鍵ペアの作成
接続元(一号機)側で鍵ペアを生成します。
鍵ペアはユーザごとに作成する必要があるため、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へのパスワードなしでのログインなどは権限上あまり推奨されないと思うので考えてからの方がよいでしょう。