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

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

はじめに

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

この実験では、リモートホストとして localhost 上の隔離された remoteuser アカウントを使用します。2 つのアカウントは同じトレーニング用仮想マシン上にありますが、SSH プロトコル、認証プロンプト、リモートホームディレクトリ、ファイル転送は、基本的な 2 ホスト構成と同じように動作します。既定の labex 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! と入力します。1 回だけ実行する 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 ホストキーを検証し、リモートシェルへの接続と終了を行い、1 回限りのリモートコマンドを実行しました。また、ローカルのリダイレクトとリモート実行の違いも確認しました。さらに、SCP でファイルをアップロードおよびダウンロードし、ディレクトリを再帰的にコピーしました。

専用の ED25519 キーペアも生成し、秘密鍵を保護したうえで公開鍵だけを登録し、その認証情報をパスワードなしの SSH と SCP に再利用しました。これらは、安全なリモート管理を始めるうえで必要となる基本的なスキルです。