SSH によるリモートアクセスとファイル転送

LinuxBeginner
オンラインで実践に進む

はじめに

SSH を使うと、暗号化されたコマンドライン接続で別の Linux アカウントにアクセスできます。SCP は、同じ認証方式と通信経路を使ってファイルをコピーします。初回接続では、サーバーのホストキーを検証することが安全な手順です。その後は、アカウントのパスワードを毎回送信する代わりに、個人用のキーを使って接続できます。

この実験では、localhost をリモートホストとして、分離された remoteuser アカウントを使用します。2 つのアカウントは同じトレーニング VM 上にありますが、SSH プロトコル、認証プロンプト、リモートのホームディレクトリ、ファイル転送は、基本的な 2 ホスト構成と同じように動作します。デフォルトの labex SSH アクセス経路は変更しません。

SSH 接続先を確認する

このステップでは、SSH クライアントを確認し、接続先の名前を解決し、待ち受け中の SSH サーバーを確認して、公開ホストキーを確認します。

ローカルの作業ディレクトリに移動します。

cd /home/labex/project/ssh-lab

OpenSSH クライアントのバージョンを表示します。このプログラムはバージョン情報を標準エラー出力に書き込むため、2>&1 で標準出力とまとめています。

ssh -V 2>&1

システムの名前解決設定を使って、ローカルの接続先を解決します。

getent hosts localhost

SSH サーバーが TCP ポート 22 で待ち受けていることを確認します。

sudo ss -ltnp | grep ':22'

ssh-keyscan は、ログインせずに公開ホストキーを取得します。ED25519 キーを ssh-keygen -lf - に渡して、フィンガープリントを表示します。

ssh-keyscan -t ed25519 localhost 2>/dev/null | ssh-keygen -lf -

実際の環境では、このフィンガープリントを管理者から入手した信頼できる値と比較してから受け入れてください。接続先の概要を簡潔に保存します。

printf 'target=localhost\nport=22\nuser=remoteuser\n' > ssh-target.txt
cat ssh-target.txt

初めてリモートシェルを開く

このステップでは、ホストキーを確認し、パスワードで認証し、リモートアカウントを調べてから、リモートシェルを終了します。

user@host 形式で接続します。

ssh remoteuser@localhost

セットアップによって localhost の以前のホストキーレコードが削除されているため、SSH は表示されたフィンガープリントを信頼するかどうかを尋ねます。ステップ 1 で確認したフィンガープリントと比較してから、次のように入力します。

yes

パスワードの入力を求められたら、次を入力します。

RemoteLab123!

入力中、パスワードは画面に表示されません。ログインすると、プロンプトは labex ではなく remoteuser のものになります。リモート側のユーザー、ホスト、現在のディレクトリを確認します。

whoami
hostname
pwd

リモートアカウントのホームディレクトリに、接続を示すマーカーを作成します。

mkdir -p ~/ssh-lab
printf 'connected as %s\n' "$(whoami)" > ~/ssh-lab/connected.txt

リモートシェルを終了して、ローカルの labex プロンプトに戻ります。

exit

exit コマンドが終了させるのはリモートシェルだけです。ローカルのターミナルは開いたままです。

リモートコマンドを実行する

このステップでは、長時間動作する対話型シェルを開かずにリモートでコマンドを実行し、その出力をローカルに保存します。

必要に応じて、ローカルの作業ディレクトリに戻ります。

cd /home/labex/project/ssh-lab

ホスト名の後ろに、引用符で囲んだコマンドを指定します。SSH はそのコマンドをリモートで実行し、出力をローカルのターミナルに返します。

ssh remoteuser@localhost 'whoami; uname -srm; uptime'

パスワードの入力を求められたら、RemoteLab123! を入力します。セミコロンは、リモートシェルが解釈するコマンドの区切りです。

次のリモートコマンドを実行し、返された出力をローカルファイルにリダイレクトします。

ssh remoteuser@localhost 'printf "remote_user=%s\nremote_home=%s\n" "$(whoami)" "$HOME"' > remote-context.txt

もう一度パスワードを入力します。> によるリダイレクトはローカルシェルが処理するため、remote-context.txt はローカルの作業ディレクトリに作成されます。

cat remote-context.txt

ファイルには、remoteuser/home/remoteuser が表示されます。

SCP でファイルを転送する

このステップでは、ローカルファイルをアップロードし、リモート側で内容を確認してから、新しいローカル名でダウンロードします。

ローカルの設定サンプルを作成します。

cd /home/labex/project/ssh-lab
printf 'mode=training\nport=8080\n' > app.conf

SCP では、リモートパスに user@host:path 形式を使います。用意されているリモートの incoming ディレクトリにファイルをアップロードします。

scp app.conf remoteuser@localhost:/home/remoteuser/incoming/app.conf

パスワードの入力を求められたら、RemoteLab123! を入力します。SSH でリモートファイルの内容を確認します。

ssh remoteuser@localhost 'cat /home/remoteuser/incoming/app.conf'

もう一度パスワードを入力します。次に、コピー元とコピー先を逆にしてファイルをダウンロードします。

scp remoteuser@localhost:/home/remoteuser/incoming/app.conf downloaded-app.conf

パスワードを入力してから、ローカルの元ファイルとダウンロードしたコピーを比較します。

cmp app.conf downloaded-app.conf && echo "The files match"

ディレクトリを再帰的に転送する

このステップでは、SCP の再帰モードを使って、ディレクトリツリーをリモートアカウントにコピーします。

ローカルに小さなプロジェクトツリーを作成します。

cd /home/labex/project/ssh-lab
mkdir -p site/assets
printf '<h1>SSH transfer practice</h1>\n' > site/index.html
printf 'body { color: navy; }\n' > site/assets/style.css

-r オプションは、ディレクトリとその内容を再帰的にコピーします。

scp -r site remoteuser@localhost:/home/remoteuser/incoming/

パスワードの入力を求められたら、RemoteLab123! を入力します。単発の SSH コマンドで、リモート側のツリーを一覧表示します。

ssh remoteuser@localhost 'find /home/remoteuser/incoming/site -type f -printf "%P\n" | sort'

もう一度パスワードを入力します。assets/style.cssindex.html が表示されます。

個人用 SSH キーを生成する

このステップでは、専用の ED25519 キーペアを作成し、アクセス権とフィンガープリントを確認します。

キーペアには、自分で保持する秘密鍵と、リモートアカウントに登録できる公開鍵が含まれます。自動検証で使用できるように、パスフレーズなしの練習用専用キーを生成します。

mkdir -p ~/.ssh
chmod 700 ~/.ssh
ssh-keygen -t ed25519 -f ~/.ssh/labex_remote_ed25519 -N '' -C 'labex-remote-practice'

-t オプションはアルゴリズム、-f はファイル、-N '' は空の練習用パスフレーズ、-C はラベルを指定します。自動化の制約で禁止されていない限り、本番用のキーには通常、強力なパスフレーズを設定してください。

2 つのファイルとそのアクセス権を確認します。

ls -l ~/.ssh/labex_remote_ed25519 ~/.ssh/labex_remote_ed25519.pub

秘密鍵は labex だけが読み取れる状態になっているはずです。.pub ファイルは共有するためのファイルです。公開鍵のフィンガープリントを表示します。

ssh-keygen -lf ~/.ssh/labex_remote_ed25519.pub

秘密鍵をコピーしたり、公開したりしないでください。

公開鍵を登録して使用する

このステップでは、remoteuser 用に公開鍵を登録し、パスワード入力なしで接続し、キー認証によるファイル転送を確認します。

ssh-copy-id は、適切なアクセス権を設定したうえで、公開鍵をリモートアカウントの ~/.ssh/authorized_keys に追加します。

ssh-copy-id -i ~/.ssh/labex_remote_ed25519.pub remoteuser@localhost

この最後のパスワード認証による操作では、RemoteLab123! を入力します。-i で専用の秘密鍵を指定してテストします。

ssh -i ~/.ssh/labex_remote_ed25519 remoteuser@localhost 'printf "key authentication works\n" > ~/ssh-lab/key-authenticated.txt; cat ~/ssh-lab/key-authenticated.txt'

このコマンドでは、リモートアカウントのパスワードを求められないはずです。同じ鍵を SCP でも使用します。

scp -i ~/.ssh/labex_remote_ed25519 remoteuser@localhost:~/ssh-lab/key-authenticated.txt key-authenticated.txt
cat key-authenticated.txt

ダウンロードしたファイルには key authentication works と表示されます。ホストキーはサーバーを認証し、秘密鍵はリモートアカウントに対して自分を認証します。両者は異なる信頼上の問題を解決します。

まとめ

SSH ホストキーを確認し、リモートシェルを開いて終了しました。また、単発のリモートコマンドを実行し、ローカルのリダイレクトとリモートでのコマンド実行を区別しました。SCP でファイルをアップロードおよびダウンロードし、ディレクトリを再帰的にコピーしました。

さらに、専用の ED25519 キーペアを生成して秘密鍵を保護し、公開鍵だけを登録して、同じキーをパスワードなしの SSH と SCP で再利用しました。これらは、安全なリモート管理に必要な初心者向けの基本スキルです。