Bashプログラミング
 Computer >> コンピューター >  >> プログラミング >> Bashプログラミング

パスワードなしでSSHログインを実現する方法:ssh-keygenとssh-copy-idを使った3つの簡単ステップ

パスワードなしでSSHログインを実現する方法:ssh-keygenとssh-copy-idを使った3つの簡単ステップリモートのLinuxサーバーにパスワードを入力せずにログインしたいと思ったことはありませんか?実は、ssh-keygenとssh-copy-idという2つのコマンドを使えば、わずか3つのステップでパスワードレスSSH環境を構築できます。本記事では、その具体的な手順をわかりやすく解説します。

ssh-keygenは、公開鍵と秘密鍵のペアを生成するコマンドです。ssh-copy-idは、ローカルホストの公開鍵をリモートホストのauthorized_keysファイルにコピーするコマンドで、あわせてリモートホストのホームディレクトリ、~/.ssh、~/.ssh/authorized_keysにも適切なパーミッションを自動的に設定してくれます。

さらに本記事では、ssh-copy-idを使う際に知っておきたい3つの注意点と、ssh-agentと組み合わせる便利な使い方についてもご紹介します。

ステップ1:ローカルホストでssh-keygenを使って鍵ペアを作成する

まず、接続元となるローカルホストでssh-keygenコマンドを実行し、RSA方式の鍵ペアを生成します。

jsmith@local-host$ [注:ここはローカルホスト上です]
jsmith@local-host$ ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/home/jsmith/.ssh/id_rsa):[そのままEnterキーを押す]
Enter passphrase (empty for no passphrase): [そのままEnterキーを押す]
Enter same passphrase again: [そのままEnterキーを押す]
Your identification has been saved in /home/jsmith/.ssh/id_rsa.
Your public key has been saved in /home/jsmith/.ssh/id_rsa.pub.
The key fingerprint is:
33:b3:fe:af:95:95:18:11:31:d5:de:96:2f:f2:35:f9 jsmith@local-host

保存先やパスフレーズをすべてデフォルトのまま進めると、秘密鍵(~/.ssh/id_rsa)と公開鍵(~/.ssh/id_rsa.pub)が生成されます。セキュリティを強化したい場合はパスフレーズを設定し、後述のssh-agentと併用するのがおすすめです。

ステップ2:ssh-copy-idで公開鍵をリモートホストにコピーする

次に、ssh-copy-idコマンドを使って、ローカルホストの公開鍵をリモートホストに転送します。-iオプションでコピーする公開鍵ファイルを明示的に指定しましょう。

jsmith@local-host$ ssh-copy-id -i ~/.ssh/id_rsa.pub remote-host
jsmith@remote-host's password:
Now try logging into the machine, with "ssh 'remote-host'", and check in:
.ssh/authorized_keys
to make sure we haven't added extra keys that you weren't expecting.

注意: ssh-copy-idは、リモートホストの.ssh/authorized_keysにある既存の鍵を上書きせず、追記(append)する仕様になっています。そのため、他の端末からの接続設定を壊す心配はありません。

ステップ3:パスワードなしでリモートホストにログインする

最後に、通常どおりsshコマンドでリモートホストに接続してみましょう。パスワードを聞かれることなくログインできれば成功です。

jsmith@local-host$ ssh remote-host
Last login: Sun Nov 16 17:22:33 2008 from 192.168.1.2
[注:SSHはパスワードを要求しません]
jsmith@remote-host$ [注:ここはリモートホスト上です]

以上の3つのシンプルなステップで、多くの場合は問題なくパスワードレスログインの設定が完了します。

なお、以前の記事ではopenSSH同士でパスワードなしのSSH・SCPを行う詳細な手順を解説しています。また、SSH2をご利用の場合は、SSH2同士、OpenSSHからSSH2、SSH2からOpenSSHといった各組み合わせでのパスワードなし接続の方法も過去に紹介しているので、あわせて参考にしてください。

ssh-add/ssh-agentと組み合わせてssh-copy-idを使う

-iオプションに値を指定せず、かつ~/.ssh/identity.pubが存在しない場合、ssh-copy-idは以下のようなエラーメッセージを表示します。

jsmith@local-host$ ssh-copy-id -i remote-host
/usr/bin/ssh-copy-id: ERROR: No identities found

しかし、事前にssh-addコマンドで鍵をssh-agentに登録しておけば話は別です。-iオプションを省略しても、ssh-copy-idが自動的にssh-agentから鍵を取得し、リモートホストへコピーしてくれます。つまり、「ssh-add -L」の出力内容がそのままコピーされる仕組みです。

jsmith@local-host$ ssh-agent $SHELL

jsmith@local-host$ ssh-add -L
The agent has no identities.
jsmith@local-host$ ssh-add
Identity added: /home/jsmith/.ssh/id_rsa (/home/jsmith/.ssh/id_rsa)
jsmith@local-host$ ssh-add -L
ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAsJIEILxftj8aSxMa3d8t6JvM79DyBV
aHrtPhTYpq7kIEMUNzApnyxsHpH1tQ/Ow== /home/jsmith/.ssh/id_rsa
jsmith@local-host$ ssh-copy-id -i remote-host
jsmith@remote-host's password:
Now try logging into the machine, with "ssh 'remote-host'", and check in:
.ssh/authorized_keys
to make sure we haven't added extra keys that you weren't expecting.
[注:ssh-add -Lで表示された鍵が追加されました]

パスフレーズ付きの鍵を運用している場合でも、ssh-agentを経由することで毎回のパスフレーズ入力を省略できるため、セキュリティと利便性を両立できます。

ssh-copy-idの3つのちょっとした不便な点

非常に便利なssh-copy-idですが、知っておくべき小さな課題がいくつかあります。

  1. デフォルトの公開鍵の挙動: -iオプションに値を渡さない場合、ssh-copy-idは~/.ssh/identity.pubのみをデフォルトの公開鍵として扱います。id_dsa.pubやid_rsa.pubなどが存在しても自動的には選択されません。これらのうちいずれかがあれば優先的に利用し、複数ある場合はidentity.pubを採用する、といった挙動が理想的と言えます。
  2. エージェント未登録時の誤動作: ssh-agentが起動していても、ssh-add -Lが「The agent has no identities」を返す状態(=鍵が未登録)だと、ssh-copy-idがこのメッセージ文字列自体をリモートホストのauthorized_keysに書き込んでしまうことがあります。実行前には必ず鍵が登録されているか確認しましょう。
  3. authorized_keysの重複エントリー: ssh-copy-idには重複チェック機能がないため、ローカルホストで何度も実行すると、同じ鍵がリモートホストのauthorized_keysに繰り返し追記されます。重複があっても動作上の問題はありませんが、管理性を考えるとファイルはすっきりさせておきたいものです。気になる場合は、定期的にauthorized_keysの中身を見直して整理するとよいでしょう。

以上の点に留意すれば、ssh-copy-idは安全かつ効率的なパスワードレスSSH環境の構築に役立つ強力なツールです。ぜひ日々のサーバー運用に取り入れてみてください。

  1. Linux初心者・管理者必見!無料で読めるシェルスクリプト電子書籍4選

    システム管理とは何か システム管理(System Administration)は情報技術(IT)の一分野であり、マルチユーザーのコンピュータシステムやサーバーを安定的に稼働させ続けることを担います。この安定稼働に責任を持つ人物をシステム管理者(System Administrator)と呼びます。 専門分野がLinuxであるシステム管理者は「Linuxシステム管理者」と呼ばれます。その役割は非常に多岐にわたり、ハードウェアの保守、システムメンテナンス、ユーザー管理、ネットワーク管理、システムパフォーマンスの監視、リソース使用状況のモニタリング、バックアップ、セキュリティの確保、システム更新、

  2. Bashスクリプトをマスターしてワークフローを強化:開発者と管理者のための初心者向け入門講座

    Bashスクリプトは、反復的なタスクを自動化し、日々の作業効率を高めたいと考えているすべての開発者、システム管理者、パワーユーザーにとって欠かせないスキルです。 このたび、無料で学べるプログラミング学習プラットフォーム「freeCodeCamp.org」のYouTubeチャンネルで、初心者向けのBashスクリプト講座が公開されました。講座を担当するのは、HerbertechのHerbert氏です。 この講座で学べること 本講座では、Bashスクリプティングの基礎を段階的に習得できます。主な学習内容は以下のとおりです。 基本的なコマンドの使い方と最初のBashスクリプトの書き方 変数と位置引