システム管理者向けの必須SSHコマンド

リモートログイン、鍵、設定ファイル、ファイル転送、トンネリング、エージェント、トラブルシューティングに必要な必須SSHコマンドを学びます。

システム管理者のための必須SSHコマンド

Secure Shell(SSH)は、サーバーやネットワークデバイスへの日常的なリモートアクセスツールです。Linuxシステムを管理する場合、ログイン、ファイルコピー、単発コマンドの実行、トンネルの開設、接続障害のデバッグにSSHコマンドを使用します。

このガイドでは、実際の管理作業で最も必要となるコマンドとオプションに焦点を当てます。

基本的なSSH接続の確立

SSHの最も基本的な使い方は、リモートサーバーとの安全なインタラクティブシェルセッションを確立することです。基本的な構文はシンプルで、ユーザーとターゲットホストを指定できます。

リモートサーバーへの接続

現在のローカルユーザー名を使用してリモートサーバーに接続するには:

ssh ホスト名_または_IPアドレス

リモートサーバー上のユーザー名がローカルユーザー名と異なる場合は、それを指定する必要があります:

ssh ユーザー名@ホスト名_または_IPアドレス

例:

ssh [email protected]
ssh [email protected]

カスタムポートの指定

デフォルトでは、SSHはポート22を使用します。ただし、セキュリティ上の理由や特定のネットワーク設定により、サーバーが別のポートで待ち受けることがよくあります。-pフラグを使用してカスタムポートを指定できます:

ssh -p 2222 ユーザー名@ホスト名_または_IPアドレス

ヒント: デフォルトのSSHポート(ポート22)を変更することは、自動化された攻撃試行を減らすための一般的なセキュリティ対策ですが、強力な認証の代わりにはなりません。

SSH鍵ベース認証

パスワード認証も一般的ですが、鍵ベース認証はSSHの推奨されるより安全な方法です。これは、一対の暗号鍵(ローカルマシンで秘密に保つ秘密鍵とリモートサーバーに配置する公開鍵)を使用します。

SSH鍵ペアの生成

ssh-keygenを使用して新しい鍵ペアを生成します。最新のOpenSSHセットアップでは、Ed25519鍵が適切なデフォルトです。古いシステムやポリシーで互換性が必要な場合のみRSAを使用してください。

ssh-keygen -t ed25519 -a 100

このコマンドはEd25519鍵ペアを生成し、秘密鍵のパスフレーズを保護するための鍵導出ラウンドを増やします。秘密鍵(id_ed25519)と公開鍵(id_ed25519.pub)は通常~/.ssh/に保存されます。

公開鍵をリモートサーバーにコピーする

鍵ベース認証を有効にするには、公開鍵をリモートサーバーの~/.ssh/authorized_keysファイルに配置する必要があります。ssh-copy-idユーティリティがこのプロセスを自動化します:

ssh-copy-id ユーザー名@ホスト名_または_IPアドレス

このコマンドは、リモートユーザーのパスワードを一度要求し、公開鍵をコピーして正しいパーミッションを設定します。その後、パスワードなしで接続できるようになります(ただし、パスフレーズを設定した場合は秘密鍵のパスフレーズを求められます)。

警告: 秘密鍵を他人と共有しないでください。chmod 600 ~/.ssh/id_ed25519のような厳格なファイルパーミッションが必要です。

SSH接続と設定の管理

リモートでの単一コマンドの実行

SSHはインタラクティブシェルだけではありません。リモートサーバーで単一のコマンドを直接実行し、その出力をローカル端末に返すことができます。

ssh ユーザー名@ホスト名_または_IPアドレス '実行するコマンド'

例:

ssh [email protected] 'ls -l /var/log/'
ssh [email protected] 'sudo apt update && sudo apt upgrade -y'

SSH設定ファイル(~/.ssh/config)の使用

頻繁に接続する場合、~/.ssh/configでホストを定義すると時間を節約し、コマンドを簡略化できます。このファイルでは、エイリアス、ユーザー、ポート、秘密鍵、その他の接続オプションを設定できます。

~/.ssh/configの例:

Host webserver
    Hostname 192.168.1.100
    User admin
    Port 2222
    IdentityFile ~/.ssh/id_rsa_web
    IdentitiesOnly yes

Host devbox
    Hostname dev.mydomain.com
    User developer
    Port 22
    IdentityFile ~/.ssh/id_rsa_dev

設定後は、エイリアスを使用して簡単に接続できます:

ssh webserver
ssh devbox

ベストプラクティス: 繰り返し接続には~/.ssh/configファイルを使用してください。可読性が向上し、タイプミスが減り、接続オプションを一箇所にまとめられます。エージェント転送をグローバルに有効にせず、本当に必要なホストに対してのみ有効にしてください。

SSHによる安全なファイル転送

SSHは、安全なファイル転送のための2つの主要なツールを提供します:scpsftpです。

scp(セキュアコピープロトコル)

scpは、ローカルとリモートホスト間でファイルやディレクトリをコピーするために使用されます。SSHと同じ認証とセキュリティメカニズムを使用します。

ローカルからリモートへのファイルコピー

scp /ローカル/ファイル/パス ユーザー名@ホスト名_または_IPアドレス:/リモート/ディレクトリ/パス/

例:

scp my_app.tar.gz admin@webserver:/var/www/html/

リモートからローカルへのファイルコピー

scp ユーザー名@ホスト名_または_IPアドレス:/リモート/ファイル/パス /ローカル/ディレクトリ/パス/

例:

scp admin@webserver:/var/log/nginx/access.log ~/logs/

ディレクトリの再帰的コピー

ディレクトリには-rフラグを使用します:

scp -r /ローカル/ディレクトリ/パス ユーザー名@ホスト名_または_IPアドレス:/リモート/親ディレクトリ/パス/

ファイル属性の保持

変更時刻、アクセス時刻、モードを保持するには、-pフラグを使用します:

scp -p ローカルファイル ユーザー名@リモートホスト:/リモートパス/

sftp(SSHファイル転送プロトコル)

sftpは、FTPと似ていますがSSHで保護されたインタラクティブなファイル転送プログラムを提供します。複数のファイルの管理や複雑なディレクトリ操作に最適です。

SFTPサーバーへの接続

sftp ユーザー名@ホスト名_または_IPアドレス

接続すると、sftp>プロンプトが表示されます。一般的なコマンドは次のとおりです:

  • ls:リモートディレクトリの内容を一覧表示
  • lls:ローカルディレクトリの内容を一覧表示
  • cd リモートディレクトリ:リモートディレクトリを変更
  • lcd ローカルディレクトリ:ローカルディレクトリを変更
  • get リモートファイル:ファイルをダウンロード
  • put ローカルファイル:ファイルをアップロード
  • mget リモートファイル:複数のファイルをダウンロード(ワイルドカード対応)
  • mput ローカルファイル:複数のファイルをアップロード(ワイルドカード対応)
  • exit または bye:SFTPセッションを終了

SFTPセッションの例:

sftp [email protected]
Connected to 192.168.1.100.
sftp> ls
config.ini  data/  logs/  public_html/
sftp> cd public_html
sftp> get index.html
Fetching /public_html/index.html to index.html
sftp> put new_page.html
Uploading new_page.html to /public_html/new_page.html
sftp> bye

SSHトンネリングとポートフォワーディング

SSHトンネリング(ポートフォワーディング)を使用すると、ローカルポートとリモートポートの間に安全な接続を作成し、ファイアウォールでブロックされたり直接アクセスできないサービスにアクセスできるようになります。

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

ローカルフォワーディングを使用すると、リモートネットワーク(またはリモートサーバー自体)上のサービスに、ローカルマシンからローカルで実行されているかのようにアクセスできます。

ssh -L [ローカルポート]:[リモートホスト]:[リモートポート] ユーザー名@SSHサーバー

例: ジャンプホストssh_serverを経由して、プライベートネットワーク上のデータベースサーバー(ポート3306)に、ローカルマシンのポート9000からアクセスします。

ssh -L 9000:db.private.net:3306 [email protected]

これで、ローカルマシンのlocalhost:9000に接続すると、その接続はjumphost.comを介してdb.private.net:3306に安全に転送されます。

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

リモートフォワーディングを使用すると、ローカルマシン(またはローカルネットワーク)上のサービスをリモートサーバーからアクセス可能にし、さらにリモートサーバーのネットワーク上のクライアントからもアクセス可能にできます。

ssh -R [リモートポート]:[ローカルホスト]:[ローカルポート] ユーザー名@SSHサーバー

例: ローカルのWebサーバー(ポート8000)を、ssh_serverのポート8080からアクセス可能にします。

ssh -R 8080:localhost:8000 admin@remote_server.com

これで、remote_server.com上の誰でも、remote_server.comlocalhost:8080に接続することでローカルのWebサーバーにアクセスできます。

ダイナミックポートフォワーディング(-D

ダイナミックポートフォワーディングはSOCKSプロキシを作成し、すべてのトラフィック(またはアプリケーション固有のトラフィック)をSSHトンネル経由でルーティングできます。これはファイアウォールの回避やブラウジングの保護に便利です。

ssh -D [ローカルポート] ユーザー名@SSHサーバー

例: ssh_serverを経由して、ローカルマシンのポート1080にSOCKSプロキシを作成します。

ssh -D 1080 [email protected]

ブラウザやアプリケーションをlocalhost:1080をSOCKS5プロキシとして使用するように設定すると、そのネットワークトラフィックはすべてjumphost.comを経由してトンネリングされます。

高度なSSHの使用とヒント

バックグラウンドでのコマンド実行

実行後にデタッチする非インタラクティブなコマンドには、-fフラグ(コマンド実行前にバックグラウンドに移行)と-N(リモートコマンドを実行しない)を使用できます。

ssh -f -N -L 9000:db.private.net:3306 [email protected]

これにより、ローカルポートフォワードがバックグラウンドで設定されます。

SSHエージェントとssh-add

ssh-agentは秘密鍵をメモリに保持するプログラムで、セッションごとに一度だけパスフレーズを入力すれば済みます。ssh-addはエージェントに鍵を追加します。

# エージェントを起動(まだ実行されていない場合)
eval "$(ssh-agent -s)"
# エージェントに鍵を追加
ssh-add ~/.ssh/id_ed25519
ssh-add ~/.ssh/id_ed25519_web # 特定の鍵用

エージェント転送を使用すると、秘密鍵をジャンプホストにコピーせずに、ジャンプホストから別のサーバーに認証できます。控えめに使用してください:ジャンプホストが侵害された場合、セッションがアクティブな間、転送されたエージェントが使用される可能性があります。踏み台を通過するだけの場合は、ProxyJumpを優先してください。

ssh -J [email protected] [email protected]

永続的SSH接続(ControlMaster)

より高速な接続とオーバーヘッドの削減のために、~/.ssh/configControlMasterを使用すると、複数のSSHセッションが単一のネットワーク接続を共有できます。

Host *
    ControlMaster auto
    ControlPath ~/.ssh/control/%C
    ControlPersist 4h

この設定は、最初の接続用に制御ソケットを作成し(ControlMaster auto)、同じホストへの後続の接続は最大4時間このソケットを再利用します(ControlPersist 4h)。

SSH問題のトラブルシューティング

  • Permission Denied(アクセス拒否):秘密鍵(chmod 600 ~/.ssh/id_ed25519)、公開鍵(chmod 644 ~/.ssh/id_ed25519.pub)、.sshディレクトリ(chmod 700 ~/.ssh)のファイルパーミッションを確認してください。サーバー上では、~/.ssh/authorized_keyschmod 600~/.sshchmod 700であることを確認してください。
  • Connection Timed Out(接続タイムアウト):サーバーがダウンしている、ファイアウォールがポート22(またはカスタムポート)をブロックしている、またはIPアドレスが間違っている可能性があります。
  • Verbose Output(詳細出力)ssh-v-vv、または-vvvフラグを使用して、詳細なデバッグ情報を取得します。
    ssh -vvv [email protected]
    

まとめ

日々のSSHワークフローをシンプルに保ちましょう:鍵ベース認証を使用し、繰り返しのオプションは~/.ssh/configに保存し、ファイルはscpまたはsftpでコピーし、プライベートサービスには必要に応じて-L-R-D、または-Jを使用してアクセスします。接続が失敗した場合、ssh -vvvが問題がDNS、ルーティング、認証、サーバーポリシーのいずれにあるかを確認する最も速い方法です。