【ITニュース解説】How to Connect to Remote Servers Without Typing a Password
2026年10月28日に「Dev.to」が公開したITニュース「How to Connect to Remote Servers Without Typing a Password」について初心者にもわかりやすく解説しています。
ITニュース概要
リモートサーバーにパスワード不要で安全に接続できるSSHキー認証の導入方法を解説。鍵の生成、公開鍵のサーバーへのコピー、サーバー設定の3ステップで5分以内に設定可能だ。パスワード入力の手間をなくし、セキュリティを大幅に向上させる方法として推奨される。
ITニュース解説
システムエンジニアとして仕事を進める上で、リモート(遠隔地)にあるサーバーに接続する機会は非常に多い。ウェブサイトやアプリケーションを動かしているサーバー、データベースサーバー、あるいはテスト用のサーバーなど、その種類は様々だ。これらのサーバーに安全に接続するための主要な手段がSSH(Secure Shell)という技術である。
SSHは、暗号化された安全な通信路を提供し、遠く離れたサーバーにコマンドを送信したり、ファイルを転送したりすることを可能にする。しかし、SSHでサーバーに接続するたびにパスワードを入力する方法は、いくつかの課題を抱えている。まず、頻繁に接続する場合、何度もパスワードを入力するのは手間がかかり、非常に面倒だ。次に、セキュリティの面でも問題がある。パスワードは推測されたり、ブルートフォース攻撃(総当たり攻撃といって、考えられるすべてのパスワードを試す攻撃)によって破られたりするリスクがある。また、パスワードは記憶に頼りがちで、複数のサーバーで使い回すと、一つが漏洩した際に他のサーバーも危険にさらされる可能性がある。このような課題を解決し、より安全で便利な方法が「SSHキー認証」だ。
SSHキー認証は、公開鍵暗号方式という技術を利用している。これは、公開鍵と秘密鍵というペアになった2つの鍵を使う仕組みで、片方の鍵で暗号化したものはもう片方の鍵でしか復号できない、という特性を持つ。SSHキー認証では、ユーザーのコンピュータに秘密鍵を、接続先のサーバーに公開鍵を配置する。接続を試みると、サーバーは公開鍵を使って、接続元が本物の秘密鍵を持っているかを検証し、パスワードなしでログインを許可するという流れになる。この仕組みにより、秘密鍵が外部に漏洩しない限り、パスワードを直接知られなくても安全な接続が保証される。
SSHキー認証には、パスワード認証に比べて多くのメリットがある。第一に、セキュリティが格段に向上する。一般的な4096ビットのRSA鍵のような長い鍵は、その組み合わせが宇宙に存在する原子の数よりも多いと言われるほど複雑で、ブルートフォース攻撃によって破られる可能性は事実上ゼロに近い。第二に、利便性が飛躍的に向上する。一度設定すれば、ユーザー名とサーバーのIPアドレス(またはホスト名)を指定するだけで、パスワードを入力することなく瞬時にサーバーへログインできるようになる。これは、日々の作業効率を大幅に改善する。第三に、監査(だれがいつアクセスしたかなどを記録・確認すること)の面でも優れている。それぞれの鍵は特定の個人やマシンに紐付けられるため、誰がどの鍵でサーバーにアクセスしたかを明確に追跡できる。最後に、自動化との相性が非常に良い。スクリプトやCI/CDパイプライン(ソフトウェア開発の自動化システム)、Ansibleのような自動化ツールは、パスワードの入力なしでサーバーにアクセスできるSSHキー認証を前提としていることが多い。一時的なアクセスや共有のマシンではパスワード認証も有効な場合があるが、日常的に利用するサーバーにはSSHキー認証が最適な選択肢となる。
SSHキー認証を設定する最初のステップは、自身のコンピュータ上で鍵のペア(秘密鍵と公開鍵)を生成することだ。この作業は、コマンドライン(文字を入力してコンピュータを操作する画面)を開いてssh-keygenというコマンドを実行することで行える。例えば、ssh-keygen -t ed25519 -C "あなたのメールアドレス"というコマンドを使うと良い。ここで-t ed25519は、Ed25519という種類の鍵を生成することを指定している。これは、従来のRSAという種類の鍵よりも高速でセキュリティが高いとされているため推奨される。もし、古いシステムでEd25519がサポートされていない場合は、-t rsa -b 4096(4096ビットのRSA鍵)で代替できる。コマンドを実行すると、いくつか質問される。鍵ファイルを保存する場所は、特に理由がなければデフォルトの~/.ssh/id_ed25519(ホームディレクトリ直下の隠しディレクトリ.sshの中にid_ed25519というファイル名で保存)で良いので、そのままEnterキーを押す。次に「パスフレーズ」の入力を求められる。これは、生成される秘密鍵をさらに暗号化するためのパスワードのようなもので、秘密鍵が不正に入手されたとしても、このパスフレーズがなければ使えないため、設定することを強く推奨する。パスワードマネージャーなどを利用して、忘れないように管理するのが良い。パスフレーズを2回入力して完了すると、~/.ssh/id_ed25519という秘密鍵ファイルと、~/.ssh/id_ed25519.pubという公開鍵ファイルが生成される。秘密鍵は絶対に他人に知られないように厳重に保管し、公開鍵は共有しても問題ない。
次に、生成した公開鍵をリモートサーバーにコピーする作業が必要だ。最も簡単で推奨される方法は、ssh-copy-idというコマンドを使用することだ。例えば、ssh-copy-id ユーザー名@サーバーのIPアドレスと入力して実行する。このコマンドを実行すると、最後に一度だけサーバーのパスワードを尋ねられるので、入力する。これにより、あなたの公開鍵がサーバー側のユーザーのホームディレクトリにある~/.ssh/authorized_keysというファイルに自動的に追加される。このauthorized_keysファイルは、そのサーバーへのアクセスを許可する公開鍵の一覧を管理するためのものだ。もし、ssh-copy-idコマンドが利用できない場合は、手動でコピーすることもできる。まず、自分のコンピュータでcat ~/.ssh/id_ed25519.pubと入力し、公開鍵の中身を表示させてコピーする。次に、サーバーにパスワードでSSH接続し、mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keysというコマンドを実行した後に、先ほどコピーした公開鍵の文字列を貼り付けてEnterキーを押し、Ctrl+Dで入力を完了させる。これにより、手動で公開鍵をauthorized_keysファイルに追記できる。
公開鍵のコピーが完了したら、新しいキー認証が正しく機能するかを必ずテストする。ssh ユーザー名@サーバーのIPアドレスと入力して実行し、パスワードを求められずにログインできれば成功だ。もしログインできない場合は、いくつか確認すべき点がある。まず、鍵ファイルのパーミッション(ファイルへのアクセス権限)が正しいかを確認する。自分のコンピュータの~/.sshディレクトリは所有者のみが読み書き実行可能(chmod 700 ~/.ssh)、秘密鍵ファイルは所有者のみが読み書き可能(chmod 600 ~/.ssh/id_ed25519)になっている必要がある。サーバー側の~/.sshディレクトリも同様にchmod 700 ~/.ssh、~/.ssh/authorized_keysファイルはchmod 600 ~/.ssh/authorized_keysになっているかを確認する。また、authorized_keysファイルにコピーした公開鍵が途中で改行されずに、すべて一行で記述されているかも重要だ。特定の秘密鍵を使って接続したい場合は、ssh -i ~/.ssh/id_ed25519 ユーザー名@サーバーのIPアドレスのように-iオプションで秘密鍵のパスを指定する。
キー認証のテストが成功したら、セキュリティをさらに強化するためにサーバー側のSSH設定を変更する。これは、サーバー上のsudo nano /etc/ssh/sshd_configコマンドで設定ファイルを開き、以下の2行を探して設定を変更することで行える。PasswordAuthentication noと設定することで、パスワード認証を完全に無効化し、PubkeyAuthentication yesと設定することで、公開鍵認証を有効化する。設定ファイルを保存したら、sudo systemctl restart sshdコマンドでSSHサービスを再起動する。この際、非常に重要な注意点がある。設定変更後、新しいSSHセッションを確立してキー認証でログインできることを確認するまで、現在開いているセッションは絶対に閉じないことだ。もし設定ミスでログインできなくなった場合でも、開いているセッションから修正作業が行えるため、自分自身をサーバーから締め出すリスクを回避できる。
システムエンジニアとして多くのサーバーを管理するようになると、複数のSSHキーを使い分ける場面が出てくる。このような状況に対応するためには、~/.ssh/configファイルを活用すると便利だ。このファイルに、サーバーごとに接続設定を記述できる。例えば、本番環境のサーバーにはHost productionという名前で、そのIPアドレス、使用するユーザー名、そして対応する秘密鍵ファイル(IdentityFile ~/.ssh/id_production)を設定できる。同様に、開発環境のサーバーにはHost stagingという別の名前で設定を記述する。一度設定しておけば、ssh productionやssh stagingといった簡潔なコマンドで、それぞれのサーバーに適切な鍵を使って接続できるようになる。また、セキュリティ運用の一環として「キーローテーション」を検討することも重要だ。これは、例えば90日ごとに新しい鍵ペアを生成し、古い鍵をサーバーから削除して新しい鍵に入れ替える作業を指す。古い鍵は、もしもの時のために無効化された鍵を記録するファイルに保管しておくと良い。
SSHキー認証を利用する上で発生しがちなトラブルと、その対処法についても知っておくと良いだろう。「Permission denied (publickey)」というエラーが表示された場合は、先述の通り、自身のコンピュータやサーバー上の.sshディレクトリ、および鍵ファイルのパーミッションが正しく設定されているかを確認する(chmod 700 ~/.sshとchmod 600 ~/.ssh/authorized_keys)。「Agent admitted failure to sign」というエラーが出た場合は、ssh-add ~/.ssh/id_ed25519コマンドで秘密鍵をSSHエージェント(SSHの秘密鍵をメモリに一時的に保持し、認証時に自動的に利用するためのプログラム)に追加することで解決できることが多い。スクリプトからキー認証が機能しない場合は、ssh-agentを適切に利用するか、~/.ssh/configファイルでIdentityFileを明示的に指定しているか確認する。「Too many authentication failures」というメッセージが表示された場合は、SSHクライアントが多くの鍵を同時に試行しすぎている可能性がある。この場合は、ssh -o IdentitiesOnly=yesフラグを付けて、設定で指定された鍵のみを試すように制限すると良い。
SSHキー認証は、初期設定にわずか数分かかるだけだが、その恩恵は何年にもわたって続く。パスワードの入力によるストレスや、ブルートフォース攻撃に対するセキュリティ上の懸念から解放され、クリーンで安全なサーバーアクセスを実現できるのだ。システムエンジニアを目指す上で、この技術は確実に身につけておくべき基礎的かつ重要なスキルの一つである。