開発

SSHとは?基本的な使い方とセキュリティ対策を徹底解説

SSH(Secure Shell)はリモートサーバーへの安全な接続を実現するプロトコルです。基本コマンドから鍵認証、セキュリティ対策まで網羅的に解説します。

16分で読める

SSHとは?基本的な使い方とセキュリティ対策を徹底解説
Photo by Stefano Intintoli on Unsplash

SSHとは?基本概念をわかりやすく解説

SSH(Secure Shell)は、ネットワーク上のコンピューター間で暗号化された安全な通信を確立するためのプロトコルです。主にリモートサーバーへのログインやコマンド実行、ファイル転送などに使用され、現代のサーバー管理において欠かせない技術となっています。

従来のリモート接続プロトコルであるTelnetやrloginは、通信内容が平文(暗号化されていない状態)で送受信されるため、パケットを傍受された際にユーザー名やパスワードが漏洩する重大なセキュリティリスクがありました。SSHは1995年にヘルシンキ工科大学のオフィ・ヤルヴィネン氏によって開発され、通信データを暗号化することでこれらの問題を根本的に解決しました。

現在では、LinuxやUnix系サーバーだけでなく、Windowsサーバーの管理においても標準的なツールとして採用されており、クラウド環境やコンテナ環境でも広く利用されています。

SSHの仕組み:暗号化と認証の基本

通信の暗号化

SSHは、クライアントとサーバー間の通信を複数の暗号技術を使って保護します。接続確立時に以下のステップが行われます。

まず、クライアントとサーバーは暗号化アルゴリズムや鍵交換方式について合意します(ネゴシエーション)。次に、Diffie-Hellman鍵交換やエリプティックカーブ Diffie-Hellman(ECDH)などの方式を使って共通鍵を安全に共有します。この共通鍵を使って、それ以降のすべての通信データが暗号化されます。

SSHで使用される暗号化アルゴリズムには、AES(Advanced Encryption Standard)、ChaCha20-Poly1305などがあります。また、データの完全性を保証するためのHMAC(Hash-based Message Authentication Code)も併用されます。

認証方式

SSHには主に3つの認証方式があります。

パスワード認証は最も一般的で、ユーザー名とパスワードを入力してサーバーにログインする方式です。設定が簡単ですが、強力なパスワードを設定しないとブルートフォース攻撃の対象になる可能性があります。

公開鍵認証は、非対称暗号技術を利用したより安全な認証方式です。クライアント側に秘密鍵、サーバー側に公開鍵を配置し、接続時にチャレンジ・レスポンス方式で本人確認を行います。パスワードを网络上に送信しないため、セキュリティが大幅に向上します。

Kerberos認証は、組織内の集中認証基盤と連携する方式で、大規模な企業環境で採用されることが多いです。

SSHの基本的な使い方:コマンドと接続方法

SSHでサーバーに接続する

最も基本的なSSH接続コマンドは以下の通りです。

ssh ユーザー名@サーバーIPアドレス

たとえば、ユーザー名がtaroでサーバーのIPアドレスが192.168.1.100の場合、以下のように入力します。

ssh [email protected]

初回接続時に、サーバーのフィンガープリント(公開鍵の指紋)が表示され、「Are you sure you want to continue connecting (yes/no)?」と確認が求められます。yesと入力すると、サーバーの公開鍵がクライアントのknown_hostsファイルに保存され、次回以降はこの確認がスキップされます。

接続時に默认のポート22以外のポートを使用したい場合は、-pオプションを指定します。

ssh -p 2222 [email protected]

リモートコマンドの実行

SSHでは、サーバーにログインせずにコマンドを直接実行することもできます。

ssh [email protected] “df -h”

このコマンドは、サーバーに接続してディスク使用量を確認し、結果をローカルに表示して自動的に切断します。スクリプトからSSHを利用する場合に非常に便利です。

SCPによるファイル転送

SCP(Secure Copy Protocol)は、SSHの暗号化通道を利用してファイルを安全に転送するツールです。

ローカルファイルをサーバーにアップロードする場合:

scp ローカルファイルパス ユーザー名@サーバーIP:リモートパス

サーバーからローカルにファイルをダウンロードする場合:

scp ユーザー名@サーバーIP:リモートファイルパス ローカルパス

ディレクトリごと転送する場合は-rオプションを追加します。

rsyncによる同期転送

大量のファイルや定期的なバックアップには、rsyncが適しています。rsyncはSSHをトンネルとして利用し、差分のみを転送するため、効率的です。

rsync -avz -e ssh ローカルパス ユーザー名@サーバーIP:リモートパス

-aオプションはアーカイブモード(権限やタイムスタンプを保持)、-vは詳細表示、-zは転送時の圕縮を指定します。

SSH鍵認証の設定手順

鍵ペアの生成

公開鍵認証を設定する最初のステップは、クライアント側で鍵ペアを生成することです。ターミナルで以下のコマンドを実行します。

ssh-keygen -t ed25519 -C “[email protected]

-tオプションで鍵のタイプを指定します。Ed25519は現在推奨される鍵タイプで、RSAよりも短い鍵長で高いセキュリティを実現します。RSA鍵が必要な場合は-t rsa -b 4096と指定します。

実行すると、鍵の保存先やパスフレーズの入力が求められます。パスフレーズを設定すると、秘密鍵が漏洩した場合でもパスフレーズを知っている本人だけが利用できるため、セキュリティがさらに向上します。

公開鍵のサーバーへの配置

鍵ペアを生成すると、~/.ssh/ディレクトリにid_ed25519(秘密鍵)とid_ed25519.pub(公開鍵)が作成されます。公開鍵をサーバーに配置するには、ssh-copy-idコマンドが最も簡単です。

ssh-copy-id [email protected]

このコマンドを実行すると、パスワードを入力しただけで公開鍵がサーバーの~/.ssh/authorized_keysファイルに自動的に追加されます。

手動で設定する場合は、クライアントの公開鍵の内容をコピーし、サーバーの~/.ssh/authorized_keysファイルに貼り付けます。このファイルの権限は600に設定する必要があります。

接続テストとパスワード認証の無ワード認証の無効化

鍵認証を設定した後、まず接続テストを行います。正常に接続できたら、セキュリティ強化のためにサーバー側でパスワード認証を無効化できます。

/etc/ssh/sshd_configファイルを編集し、以下の設定を行います。

PasswordAuthentication no PubkeyAuthentication yes

設定変更後はsystemctl restart sshdコマンドでSSHサービスを再起動してください。パスワード認証を無効化する前に、鍵認証での接続が確実にできることを確認してください。設定ミスでログインできなくなる可能性があるため注意が必要です。

SSHの主要な設定ファイル

クライアント側の設定

クライアント側のSSH設定は、~/.ssh/configファイルに記述します。頻繁に接続するサーバーがある場合、このファイルを設定することで接続を大幅に簡素化できます。

Host myserver HostName 192.168.1.100 User taro Port 22 IdentityFile ~/.ssh/id_ed25519

この設定を記述すると、ssh myserverと入力するだけで、IPアドレス、ユーザー名、ポート、鍵ファイルの指定がすべて自動で適用されます。

サーバー側の設定

SSHサーバーの設定は、/etc/ssh/sshd_configファイルで行います。主要な設定項目を紹介します。

PortはSSHの待ち受けポートを指定します。默认値は22ですが、セキュリティ強化の観点から変更することが推奨されます。

PermitRootLoginはrootユーザーのSSH接続を許可するかどうかを設定します。セキュリティ上、noに設定することが推奨されます。

MaxAuthTriesは1回の接続試行で許可される認証回数を制限します。默认値は6ですが、3程度に設定するとブルートフォース攻撃の効果を減らせます。

AllowUsersとAllowGroupsで、SSH接続を許可するユーザーまたはグループを明示的に指定できます。

ClientAliveIntervalとClientAliveCountMaxで、アイドル状態のセッションを自動的に切断する設定が可能です。

SSHセキュリティ対策:実践的な強化方法

ポート番号の変更

SSHの默认ポートである22は、自動スキャンやブルートフォース攻撃の主要なターゲットになります。sshd_configのPort設定を変更して、一般的でないポート番号に変更することで、不正アクセス試験の大幅な削減が期待できます。

ただし、ポート変更は根本的なセキュリティ対策ではなく、攻撃者の手間を増やす効果のみです。他の対策と組み合わせて使用してください。

fail2banの導入

fail2banは、ログファイルを監視して不正なアクセス試行を検知し、自動的にIPアドレスをブロックするツールです。SSHのブルートフォース攻撃に対する効果的な対策として広く利用されています。

fail2banをインストール後、/etc/fail2ban/jail.confのSSH設定で、最大試行回数や banned期間を調整します。默认設定でも一定の保護効果がありますが、環境に合わせてカスタマイズすることが推奨されます。

SSHエージェントフォワーディングの注意点

ssh-agentは、秘密鍵をメモリに保持し、パスフレーズの入力を1回だけで済ませるツールです。複数のサーバーに同じ鍵で接続する場合に便利です。

ただし、SSHエージェントフォワーディング(ssh -A)は、フォワーディング先のサーバーから鍵を悪用されるリスクがあるため、信頼できるサーバーでのみ使用してください。AgentForwarding設定をsshd_configで無効にすることも推奨されます。

SSHのバージョン管理

SSHソフトウェアには、OpenSSH(フリーで広く採用)と、SSH Communications Security社の商用SSHがあります。多くのLinuxディストリビューションではOpenSSHが默认でインストールされており、セキュリティパッチが定期的にリリースされています。

セキュリティを維持するために、常に最新のバージョンに更新することが重要です。重大な脆弱性が発見された場合、速やかなアップデートが必要になります。

SSHの応用:ポートフォワーディングとトンネル

ローカルポートフォワーディング

ローカルポートフォワーディングは、ローカルマシンのポートとリモートサーバー上のポートを接続する技術です。

ssh -L 8080:localhost:80 [email protected]

このコマンドは、ローカルの8080ポートから接続すると、SSH経由でリモートサーバーの80ポートに転送されます。リモートサーバー上のデータベースやWeb管理画面に、安全にアクセスできるようになります。

リモートポートフォワーディング

リモートポートフォワーディングは、逆の方向の転送を行います。

ssh -R 9090:localhost:3000 [email protected]

ローカルマシンで動作しているアプリケーション(ポート3000)を、リモートサーバーのポート9090からアクセスできるようにします。開発中のアプリケーションを外部に一時的に公開する場合などに活用されます。

ダイナミックポートフォワーディング(SOCKSプロキシ)

ダイナミックポートフォワーディングは、SSH接続をSOCKSプロキシサーバーとして利用する技術です。

ssh -D 1080 [email protected]

ブラウザのプロキシ設定をSOCKS5(localhost:1080)に変更すると、すべてのトラフィックがSSH経由で転送されます。公共Wi-Fi環境での安全なインターネット接続や、制限されたネットワーク環境でのアクセスに利用できます。

SSHの主なユースケース

サーバー管理と運用

SSHは最も一般的に、Webサーバー、データベースサーバー、アプリケーションサーバーの管理に使用されます。システム管理者はSSHを使って、ログの確認、設定ファイルの編集、パッケージのインストール、サービスの再起動などの運用作業を行います。

CI/CDパイプライン

継続的インテグレーション・継続的デプロイメント(CI/CD)のパイプラインにおいて、SSHはデプロイメントステップで広く利用されます。GitHub Actions、GitLab CI、JenkinsなどのCI/CDツールからSSH経由でサーバーに接続し、アプリケーションのデプロイやマイグレーションを自動化します。

リモート開発環境

Visual Studio CodeのRemote SSH拡張機能やJetBrains Gatewayなどのツールにより、SSH接続先のサーバー上で直接開発環境を構築できるようになりました。ローカルマシンの性能に依存せず、高性能なリモートサーバーのリソースを活用した開発が可能です。

データベース接続のセキュア化

SSHトンネルを活用することで、直接アクセスできないデータベースへの安全な接続が可能になります。MySQL WorkbenchやDBeaverなどのデータベースクライアントには、SSHトンネル接続機能が标准で搭載されているものが多くあります。

SSHと似た技術との比較

SSH vs Telnet

TelnetはSSHと同じくリモート接続プロトコルですが、通信が暗号化されないため、現在ではセキュリティ上の理由から使用が推奨されていません。SSHはTelnetの後継技術として広く採用されています。

SSH vs VPN

VPNはネットワーク全体を暗号化するトンネル技術であり、SSHは個別の接続を保護するプロトコルです。VPNは組織全体の通信を保護する場合に、SSHは特定のサーバーへの接続に適しています。両者は補完的な関係にあり、併用されることが多いです。

SSH vs HTTPS

HTTPSはWebブラウザとWebサーバー間の通信を暗号化するプロトコルです。SSHはシステム管理者や開発者によるサーバー管理に使用されるのに対し、HTTPSはエンドユーザー向けのWeb通信に使用されます。

まとめ

SSHは、リモートサーバーへの安全な接続を実現するための基盤技術です。基本的な使い方を理解し、適切なセキュリティ対策を講じることで、安全かつ効率的なサーバー管理が可能になります。

鍵認証の導入、ポート番号の変更、fail2banなどの侵入検知ツールの導入など、段階的にセキュリティ対策を強化していくことが重要です。SSHの設定や管理は、システム管理者や開発者にとって必須のスキルであり、この記事で紹介した知識を実践に活かしていただければ幸いです。

よくある質問

SSHとSCPの違いは何ですか?
SSHはリモートサーバーへの安全な接続プロトコル全体を指し、SCPはSSHの暗号化通道を使ってファイルを転送するためのサブプロトコルです。SCPはSSHの機能の一部として利用され、ファイル転送に特化しています。近年ではSCPに代わり、rsync over SSHがより効率的なファイル転送方法として推奨される傾向があります。
SSHのポート番号を変更する必要がありますか?
默认ポート22の変更は推奨されますが、必須ではありません。ポート変更は自動スキャンによる攻撃を減らす効果がありますが、決定的なセキュリティ対策ではありません。鍵認証の導入やfail2banの設定と組み合わせることで、より効果的なセキュリティ体制を構築できます。
SSH鍵のフィンガープリントが变了是什么意思?
フィンガープリントの変更は、サーバーの再インストールや鍵の再生成、中間者攻撃の可能性を示しています。初回接続時に保存されたknown_hostsファイルのフィンガープリントと異なる場合、ssh-keygen -Rコマンドで古いフィンガープリントを削除し、改めて正しいフィンガープリントを確認する必要があります。
WindowsからSSH接続する方法はありますか?
Windows 10以降では、PowerShellやコマンドプロンプトにOpenSSHクライアントが标准搭載されています。ターミナルからsshコマンドを直接実行可能です。GUIで操作したい場合は、PuTTYやMobaXtermなどのSSHクライアントツールが無料で利用できます。Windows Serverでは、OpenSSHサーバー機能を有効化することでSSH接続の受け付けが可能になります。

コメント

← トップへ戻る