ラズパイbookworm対応 – ログインパスワードにさようなら、パスワードレスsshのすすめ。リモート作業の自動化にも最適

ターミナルへパスワード入力するのが憂鬱で死にそう…な人は流石にいないと思いますが、日に何度もパスワードを打ち込むとなると本当に憂鬱でしょう。今日はsshでログインする時のパスワード入力を安全に省略する方法を解説します。

sshの使い道はログインだけではありません。リモートにコマンドを送って、実行結果を返すという使い方も出来ます。パスワードレスsshを使ってスクリプトを組めば、今までリモートにログインして手作業で行っていたタスクをローカルスクリプト一発で行って、日常作業の効率を飛躍的に高めることができます。例えばcronなどと組み合わせれば、夜中のうちに自動的にリモートのデーターをバックアップしておく(sshによる rsync)、といったことが簡単にこなせます。

vscodeをリモートサーバーに接続して作業する時も、パスワードレスsshがあるととても快適です。需要が多いと思われるwindowsからlinuxにログインする場合のパスワードレス化も後半で解説します。

次のようなsshログインをパスワードレス化します

マシン構成は次のとおりです。ラズパイからラズパイへのログインで検証しましたが、unix系OS(linux, macOS, etc.)全般で適用可能な設定かと思います。

  • ローカル: ラズパイにユーザーpiとしてログイン中。
  • リモート: remotehost(ラズパイ)にユーザーアカウントremoteuserを保有。
  • remotehostはsshログインを受け付けており、パスワードでssh remoteuser@remotehostが可能。
  • このログインの手続きをパスワードレスにしたい。

また、後半では、windowsからのログインのパスワードレス化についても解説します。

なお、remotehostは、IPアドレス(192.168.1.23などの数の並び)もしくはホスト名(hostname.yourcompany.co.jpのようなアドレス)を表します。

まずはリモートにパスワードでログインできることを確認

パスワードレスの話をする前に、まずは普通のsshログインができなければ始まりません。 ターミナルから

ssh remoteuser@remotehost 

その後パスワードをタイプ

で、通常のログイン(パスワード認証)ができることを確認ください。

初めてのログインではfingerprintの登録が要求されますので、その場合yesをタイプしてください。

ssh-keygenで秘密鍵、公開鍵を作成

リモートにログインできることを確認しましたら、ログアウトして、もともと居たローカルホストに戻ってください。

ローカルホストで秘密鍵・公開鍵のペアを作成します。次のコマンドをターミナルで実行してください。

ssh-keygen -t ed25519 -C "pi@raspberry"

すべての質問に、入力なし+リターンで進行。

これによりsshの設定ディレクトリ~/.ssh内に二つのファイルが作成されます。

  • ~/.ssh/id_ed25519 秘密鍵、絶対に外部に公開しないでください!
  • ~/.ssh/id_ed25519.pub 公開鍵、これは公開用の鍵で、リモートホストに登録して使います。

が作成されます。

“-C”以下は単なるコメントです。ただの数の並びで区別がつきにくい鍵を区別するためのコメントで、メールアドレスである必要はありません(@がないコメントでもいいのですが、日本語はトラブルの元なのでやめましょう)。

完全なパスワードレスではなく、暗号鍵+パスフレーズでの認証で設定するにはssh-keygenの質問時にパスフレーズを入力する必要があります。今回は完全なパスワードレスを目指しますので、パスフレーズなしで進行します。

オプションの -t ed25519については、比較的新しいssh-keygenであれば、オプションなしで作成されるrsaキーを使ってもよいのではないかと思う(openssh 8.8でsha-1廃止の話はどうやら鍵側の話ではないようだ)のですが、githubの推奨がed25519のようですので、長いものに巻かれることにします。

新しい SSH キーを生成して ssh-agent に追加する - GitHub Docs
既存の SSH キーをチェックした後、新しい SSH キーを生成して認証に使用し、ssh-agent に追加できます。

公開鍵をリモートホストに登録する (ローカルがwindowsでない場合)

最近のsshには便利なコマンドがありまして、ローカルのターミナルで以下のコマンドを実行するだけで、公開鍵を登録してくれるようです。

ssh-copy-id remoteuser@remotehost

でパスワードを入力。

これでパスワードレスのリモートログインの準備は終了です! (windowsについては後で説明しますので、ご安心を)

実際にパスワードレスでリモートログインしてみよう

最初に確認した時と同じように、ログインしてみましょう。

ssh remoteuser@remotehost

今回はパスワード入力なしでログインできたはずです。

ssh-copy-idで何が起こっているのか?

興味がある方はお読みください。

ローカル側のターミナルで

cat ~/.ssh/id_ed25519.pub

を実行してください。これが公開鍵の中身です。

次にリモートにログインして

cat ~/.ssh/authorized_keys

を実行してください。ローカルで確認したid_ed25519.pubの内容がリモートのauthorized_keysに追加されているはずです。

authorized_keysには一行ごとに公開鍵が追加される仕組みです。ssh-copy-idはこの追加の手続きを自動的にやってくれるコマンドですが、このssh-copy-idを使わずに、手動で登録することも可能です。

# ローカルからリモートホストに公開鍵をscp等でコピー

# リモートに移動
ssh remoteuser@remotehost

# リモートで公開鍵を追加
cat コピーした公開鍵 >>~/.ssh/authorized_keys
# .sshの設定ファイルはパーミッションが600(持ち主以外読めない)である必要があります。
chmod 600 ~/.ssh/authorized_keys

~/.ssh/authorized_keysをエディタで編集することも可能で、不要になった公開鍵をエディタで削除してもかまいません。

ローカルがwindowsの場合の公開鍵の登録

windowsでターミナル(powershell、すなわちcmdではない方)を開きます。ssh-keygenまでの手続きは、linuxの場合と同様に実行できます。

問題はwindowsにはssh-copy-idがないことです。

ネットを探すとssh-copy-idと同じことを実行できるpowershellコマンドの例がいろいろ転がっているのですが、意外と失敗も多いそうで、私なりにアレンジしたものを載せておきます。

cat $env:USERPROFILE/.ssh/id_ed25519.pub | ssh remoteuser@remotehost "umask 077; mkdir -p ~/.ssh ; cat >> .ssh/authorized_keys"

先に書きましたように、失敗することもあるようなので、その場合は下に書いた方法で、id_ed25519.pubをリモートに転送して、先に書いた方法で手動でauthorized_keysに追加してください。

# windowsの公開鍵をリモートにコピーする方法(上の方法でうまくいかなかったときに実行)
scp $env:USERPROFILE/.ssh/id_ed25519.pub remoteuser@remotehost:tmpkey.pub

パスワードレスsshはスクリプト処理で大活躍

これまでパスワードレスのsshを体験したことがなかった人は、そのログインのすがすがしさに驚いたのではないでしょうか。開放されてみて初めて気付ける地味なストレスといった感じでしょう。

パスワードレスsshの利点はログインの快適さだけではありません。sshを利用すれば、ログインせずに、リモートでコマンド実行して結果を確認することができます。このテクニックとパスワードレスsshを組み合わせて使えば、バックアップやリモートホストの状況確認を自動化するスクリプトを簡単に作成できます。最後にsshによるリモートコマンドの実行例をまとめておきます。

リモートでdf(ストレージの利用状況を確認するコマンド)を実行して結果をみる。

ssh remoteuser@remotehost df -m

ローカルディレクトリを圧縮した結果を、パイプでリモートホストに送って保存(ローカルとリモートをつなぐパイプを作ることができるのです!)

tar czf - directory | ssh remoteuser@remoteserver "cat >output.tgz"

local_directoryをremote_directoryにsshでミラーする(rsync内部でsshが利用されています)

rsync -avz --delete -e ssh local_directory remoteuser@remotehost:remote_directory

コメント

タイトルとURLをコピーしました