サーバー管理の業務において、SSH(Secure Shell)はほぼ毎日使う基本ツールです。物理的にサーバーの前に座ることなく、ネットワーク経由で安全にリモート操作できるSSHの知識は、すべてのITエンジニアにとって必須スキルといえます。
本記事では、SSHの基本概念から接続手順、鍵認証の設定、セキュリティ強化策、便利な応用テクニックまでを実例付きで解説します。Linuxの基礎と基本コマンドを理解した方が、リモートサーバー管理の実務スキルを身につけるための実践ガイドです。
SSHとは?仕組みと基本概念
SSH(Secure Shell)は、ネットワーク上の通信を暗号化してリモートサーバーに安全にアクセスするためのプロトコルです。以前使われていたTelnetやrshは通信が平文(暗号化なし)で行われていたため、パスワードやコマンド内容が盗聴されるリスクがありました。SSHはこの問題を解決するために設計されています。
SSHの認証方式
SSHでは主に2つの認証方式が使われます。
| 認証方式 | 仕組み | セキュリティ |
|---|---|---|
| パスワード認証 | ユーザー名とパスワードで認証 | 中(ブルートフォース攻撃のリスクあり) |
| 公開鍵認証 | 秘密鍵と公開鍵のペアで認証 | 高(鍵がなければ接続不可) |
公開鍵認証が推奨される理由は明確です。パスワード認証は総当たり攻撃(ブルートフォース攻撃)に対して脆弱ですが、公開鍵認証では秘密鍵ファイルを持っていなければ認証できないため、はるかに強固なセキュリティを確保できます。
SSHの動作ポート
SSHのデフォルトポートは22番です。サーバー側ではSSHデーモン(sshd)がこのポートで接続を待ち受けています。セキュリティ強化のためにポート番号を変更する場合もありますが、これについては後述します。
SSHでリモートサーバーに接続する基本操作
まずはSSHの最も基本的な使い方から確認しましょう。
パスワード認証での接続
# 基本的な接続(ユーザー名@ホスト名)
$ ssh tanaka@192.168.1.100
# ドメイン名でも接続可能
$ ssh tanaka@server.example.com
# ポート番号を指定して接続
$ ssh -p 2222 tanaka@192.168.1.100
# 接続先でコマンドを1つだけ実行して切断
$ ssh tanaka@192.168.1.100 "df -h"
# 切断
$ exit
初回接続時には「このサーバーのフィンガープリントを信頼しますか?」という確認メッセージが表示されます。
The authenticity of host '192.168.1.100 (192.168.1.100)' can't be established.
ED25519 key fingerprint is SHA256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '192.168.1.100' (ED25519) to the list of known hosts.
この確認は中間者攻撃を防ぐための仕組みです。初回は「yes」と入力しますが、以降同じサーバーのフィンガープリントが変わった場合に警告が出たら、接続先サーバーが本物かどうかを慎重に確認してください。
公開鍵認証の設定手順
パスワード認証から公開鍵認証に切り替えることは、SSHセキュリティ強化の第一歩です。設定手順を順を追って解説します。
ステップ1:鍵ペアの生成(クライアント側)
# Ed25519鍵を生成(推奨)
$ ssh-keygen -t ed25519 -C "tanaka@example.com"
Generating public/private ed25519 key pair.
Enter file in which to save the key (/home/tanaka/.ssh/id_ed25519): # Enterでデフォルト
Enter passphrase (empty for no passphrase): # パスフレーズを設定(推奨)
Enter same passphrase again:
# RSA鍵を生成する場合(4096ビット)
$ ssh-keygen -t rsa -b 4096 -C "tanaka@example.com"
鍵のアルゴリズムはEd25519が現在のベストプラクティスです。RSAと比較してセキュリティが高く、鍵のサイズが小さく、処理も高速です。古いシステムとの互換性が必要な場合のみRSA 4096ビットを選択しましょう。
生成されるファイルは2つです。
~/.ssh/id_ed25519:秘密鍵(絶対に他人に渡さない・外部に公開しない)~/.ssh/id_ed25519.pub:公開鍵(接続先サーバーに登録する)
ステップ2:公開鍵をサーバーに転送する
# ssh-copy-idコマンドで転送(最も簡単な方法)
$ ssh-copy-id tanaka@192.168.1.100
# ポートを指定する場合
$ ssh-copy-id -p 2222 tanaka@192.168.1.100
# ssh-copy-idが使えない場合は手動で転送
$ cat ~/.ssh/id_ed25519.pub | ssh tanaka@192.168.1.100 "mkdir -p ~/.ssh && chmod 700 ~/.ssh && cat >> ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys"
ssh-copy-idは公開鍵の転送とパーミッション設定を自動で行ってくれる便利なツールです。手動で設定する場合は、ファイルパーミッションの設定を正確に行わないと認証が失敗します。
ステップ3:鍵認証での接続テスト
# 鍵認証で接続(パスフレーズの入力を求められる)
$ ssh tanaka@192.168.1.100
# 使用する鍵を明示的に指定する場合
$ ssh -i ~/.ssh/id_ed25519 tanaka@192.168.1.100
接続が成功したら、パスワード認証を無効化してセキュリティを強化します。
ステップ4:パスワード認証の無効化(サーバー側)
# SSHサーバーの設定ファイルを編集
$ sudo vim /etc/ssh/sshd_config
# 以下の設定を変更・追加
PasswordAuthentication no
PubkeyAuthentication yes
ChallengeResponseAuthentication no
# 設定の文法チェック
$ sudo sshd -t
# SSHサービスの再起動
$ sudo systemctl restart sshd
重要な注意点:パスワード認証を無効化する前に、鍵認証で確実にログインできることを確認してください。鍵認証が正しく設定されていない状態でパスワード認証を無効化すると、サーバーにアクセスできなくなります。必ず別のSSHセッションを開いたまま作業を行いましょう。
SSH設定ファイルで接続を効率化する
複数のサーバーを管理していると、毎回ユーザー名やIPアドレス、ポート番号を入力するのは手間がかかります。~/.ssh/configファイルを設定すると、接続先にエイリアス(別名)をつけて簡単にアクセスできるようになります。
SSH configの設定例
# ~/.ssh/config の内容
# Webサーバー
Host web-prod
HostName 203.0.113.10
User tanaka
Port 22
IdentityFile ~/.ssh/id_ed25519
# データベースサーバー
Host db-prod
HostName 203.0.113.20
User admin
Port 2222
IdentityFile ~/.ssh/id_rsa
# ステージング環境
Host staging
HostName 198.51.100.50
User deploy
IdentityFile ~/.ssh/id_ed25519_staging
# 全サーバー共通の設定
Host *
ServerAliveInterval 60
ServerAliveCountMax 3
AddKeysToAgent yes
この設定により、以下のように短いコマンドで接続できます。
# 設定前
$ ssh -p 2222 -i ~/.ssh/id_rsa admin@203.0.113.20
# 設定後
$ ssh db-prod
ServerAliveIntervalはサーバーに定期的にkeep-aliveパケットを送信する間隔(秒)です。これにより、一定時間操作がなくてもSSH接続が切断されるのを防げます。
SCPとSFTPでファイルを転送する
SSHを利用したファイル転送の手段として、scp(Secure Copy)とsftp(SSH File Transfer Protocol)があります。
scpコマンドでファイルを転送する
# ローカルからリモートにファイルをコピー
$ scp ./backup.tar.gz tanaka@192.168.1.100:/tmp/
# リモートからローカルにファイルをコピー
$ scp tanaka@192.168.1.100:/var/log/nginx/access.log ./
# ディレクトリを再帰的にコピー
$ scp -r ./project/ tanaka@192.168.1.100:/home/tanaka/
# SSH configのエイリアスを使用
$ scp ./file.txt web-prod:/tmp/
# ポートを指定
$ scp -P 2222 ./file.txt tanaka@192.168.1.100:/tmp/
sftpで対話的にファイル操作する
# SFTPセッションを開始
$ sftp tanaka@192.168.1.100
# SFTP内での操作
sftp> ls # リモートのファイル一覧
sftp> lls # ローカルのファイル一覧
sftp> cd /var/log # リモートのディレクトリ移動
sftp> lcd ~/downloads # ローカルのディレクトリ移動
sftp> get access.log # リモートからダウンロード
sftp> put backup.tar.gz # リモートにアップロード
sftp> exit # 終了
大量のファイルを定期的に転送する場合は、rsyncコマンドも検討してください。rsyncは差分のみを転送するため、バックアップにも広く活用されています。
# rsyncでリモートサーバーと同期(SSH経由)
$ rsync -avz -e ssh ./project/ tanaka@192.168.1.100:/home/tanaka/project/
# 削除も同期する場合(注意して使用)
$ rsync -avz --delete -e ssh ./project/ tanaka@192.168.1.100:/home/tanaka/project/
SSHのセキュリティ強化策
SSH自体は安全なプロトコルですが、設定を最適化することでさらにセキュリティを強化できます。Linuxセキュリティ強化の一環として、以下の設定を検討してください。
sshd_configの推奨設定
# /etc/ssh/sshd_config の推奨設定
# rootでの直接ログインを禁止
PermitRootLogin no
# パスワード認証を無効化(鍵認証のみ許可)
PasswordAuthentication no
# 空のパスワードを禁止
PermitEmptyPasswords no
# 公開鍵認証を有効化
PubkeyAuthentication yes
# SSHプロトコル2のみ使用(1は脆弱性がある)
Protocol 2
# ログイン試行の最大回数
MaxAuthTries 3
# 同時接続数の制限
MaxSessions 5
# X11フォワーディングを無効化(不要な場合)
X11Forwarding no
# 特定ユーザーのみSSHアクセスを許可
AllowUsers tanaka suzuki
# または特定グループのみ許可
AllowGroups ssh-users
# ログイン猶予時間(秒)
LoginGraceTime 30
設定変更後は必ず文法チェックと再起動を行います。
# 文法チェック
$ sudo sshd -t
# 再起動
$ sudo systemctl restart sshd
Fail2banで不正アクセスをブロックする
Fail2banは、ログを監視して一定回数ログインに失敗したIPアドレスを自動的にブロックするツールです。
# Fail2banのインストール
$ sudo apt install fail2ban # Ubuntu/Debian
$ sudo dnf install fail2ban # CentOS/Rocky Linux
# SSH用の設定ファイルを作成
$ sudo vim /etc/fail2ban/jail.local
# /etc/fail2ban/jail.local
[sshd]
enabled = true
port = ssh
filter = sshd
logpath = /var/log/auth.log
maxretry = 3
bantime = 3600
findtime = 600
# Fail2banの起動と自動起動設定
$ sudo systemctl enable --now fail2ban
# ブロック中のIPを確認
$ sudo fail2ban-client status sshd
Fail2banはファイアウォールと連携して動作し、ログを自動分析してブロックルールを適用します。
SSHの応用テクニック
SSHは単なるリモートログインだけでなく、さまざまな応用的な使い方ができます。
ポートフォワーディング(SSHトンネル)
ポートフォワーディングを使うと、SSH経由で安全にリモートサービスにアクセスできます。
# ローカルポートフォワーディング
# ローカルの3307番ポートをリモートのMySQL(3306)に転送
$ ssh -L 3307:localhost:3306 tanaka@db-server
# バックグラウンドで実行
$ ssh -fNL 3307:localhost:3306 tanaka@db-server
# 別のターミナルからローカルポート経由でMySQLに接続
$ mysql -h 127.0.0.1 -P 3307 -u dbuser -p
ポートフォワーディングは、ファイアウォールで外部からのアクセスが制限されているデータベースや管理画面に、SSH経由で安全にアクセスする場合に非常に有用です。
ssh-agentで鍵の管理を効率化する
パスフレーズ付きの秘密鍵を使っている場合、毎回パスフレーズの入力を求められます。ssh-agentを使うとパスフレーズをメモリにキャッシュし、セッション中は再入力不要になります。
# ssh-agentを起動
$ eval "$(ssh-agent -s)"
Agent pid 12345
# 秘密鍵を登録(パスフレーズを入力)
$ ssh-add ~/.ssh/id_ed25519
Enter passphrase for /home/tanaka/.ssh/id_ed25519:
Identity added: /home/tanaka/.ssh/id_ed25519
# 登録済みの鍵を確認
$ ssh-add -l
# 以降はパスフレーズなしでSSH接続可能
$ ssh web-prod
多段SSH接続(踏み台サーバー経由)
セキュリティ上の理由で、本番サーバーに直接SSHできず、踏み台サーバー(Bastion Host)を経由する必要がある場合の設定です。
# SSH configでProxyJumpを設定
Host bastion
HostName 203.0.113.1
User tanaka
Host internal-server
HostName 10.0.1.100
User admin
ProxyJump bastion
# 1コマンドで踏み台経由で接続
$ ssh internal-server
ProxyJumpを使えば、踏み台サーバーに一度ログインしてからさらにsshする手間を省けます。クラウド環境でのサーバー管理では特に頻繁に使われるテクニックです。
まとめ:SSHはサーバー管理の生命線
本記事では、SSHの基本概念から実務で使える応用テクニックまでを解説しました。重要なポイントを振り返ります。
- 公開鍵認証をデフォルトの認証方式にし、パスワード認証は無効化する
- SSH configを活用して複数サーバーへの接続を効率化する
- scp / sftp / rsyncでファイルを安全に転送する
- sshd_configでroot直接ログインの禁止やアクセス制限を設定する
- Fail2banでブルートフォース攻撃を自動防御する
- ポートフォワーディングで安全なトンネルを構築する
SSHの操作に慣れたら、次はユーザー管理でアクセス制御を整備し、ファイアウォール設定でネットワーク層のセキュリティを強化しましょう。ネットワークコマンドの知識と組み合わせることで、サーバー管理のスキルが総合的に向上します。
関連記事
AWS CloudFrontでサイト高速化|CDN設定からキャッシュ戦略まで実践解説
AWS CloudWatchで監視・アラート設定|運用担当者のための実践ガイド
AWS CodePipelineでCI/CD構築|コード変更から本番デプロイまでの自動化
AWS Cost Explorerでコスト可視化|ムダを見つけて月額費用を削減する実践術
AWS ECS/Fargateでコンテナ運用|Docker→本番デプロイの実践ガイド
AWS IAMのベストプラクティス|最小権限の原則を実務で実装する方法
AWS RDSの実務ガイド|データベース構築・バックアップ・パフォーマンスチューニング
AWS S3の実務活用ガイド|バケット設計・アクセス制御・コスト最適化の実践