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

この包括的なガイドで、システム管理者向けの必須SSHコマンドを習得しましょう。リモートサーバーへ安全に接続し、設定を管理し、`scp`と`sftp`を使用した効率的なファイル転送を実行する方法を学びます。ネットワークアクセスを安全かつ効率化するためのローカル、リモート、ダイナミックポートフォワーディング(SSHトンネリング)のような高度なトピックを深く掘り下げます。実践的な例、鍵認証のヒント、`ssh-agent`、およびトラブルシューティングの手順が、自信を持ってインフラストラクチャを管理し、リモート管理の効率を向上させる力となるでしょう。

40 ビュー

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

はじめに

Secure Shell (SSH) は、サーバーやネットワークデバイスの安全なリモート管理の基盤です。システム管理者にとって、SSHを習得することは単なるスキルではなく、インフラストラクチャを効率的かつ安全に管理するための基本的な必要不可欠なものです。SSHは、強力な暗号化を使用して安全でないネットワーク上にも安全なチャネルを提供し、パスワード、コマンド、ファイル転送を含むすべての通信が傍受から保護され、機密性が保たれることを保証します。

この記事は、すべてのシステム管理者が知っておくべき最も重要なSSHコマンドと概念を網羅した包括的なガイドです。基本的な接続方法から安全なファイル転送、ポートフォワーディングや永続的な接続などの高度なテクニックまで、すべてを掘り下げていきます。これらのコマンドとベストプラクティスを理解し実装することで、リモートサーバー管理能力を大幅に向上させ、ワークフローを合理化し、環境全体で堅牢なセキュリティ体制を維持することができます。

基本的なSSH接続の確立

SSHの最も基本的な用途は、リモートサーバーとの安全な対話型シェルセッションを確立することです。基本的な構文は簡単で、ユーザーとターゲットホストを指定できます。

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

現在のローカルユーザー名を使用してリモートサーバーに接続するには、次のようにします。

ssh hostname_or_IP_address

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

ssh username@hostname_or_IP_address

例:

ssh [email protected]
ssh [email protected]

カスタムポートの指定

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

ssh -p 2222 username@hostname_or_IP_address

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

SSHキーベース認証

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

SSHキーペアの生成

新しいキーペアを生成するにはssh-keygenを使用します。秘密鍵には強力なパスフレーズを使用することが推奨されます。

ssh-keygen -t rsa -b 4096

このコマンドは、4096ビット長のRSAキーペアを生成します。秘密鍵(id_rsa)と公開鍵(id_rsa.pub)は通常、~/.ssh/に保存されます。

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

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

ssh-copy-id username@hostname_or_IP_address

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

警告: 秘密鍵を誰とも共有しないでください。厳密なファイルパーミッション(chmod 600 ~/.ssh/id_rsa)を設定する必要があります。

SSH接続と設定の管理

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

SSHは対話型シェルだけのものではありません。リモートサーバー上で単一のコマンドを直接実行し、その出力をローカルターミナルに返すことができます。

ssh username@hostname_or_IP_address 'command_to_execute'

例:

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
    ForwardAgent yes

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

設定が完了すると、エイリアスを使用して簡単に接続できます。

ssh webserver
ssh devbox

ベストプラクティス: 複雑なSSH接続を管理する場合は、必ず~/.ssh/configファイルを使用してください。可読性が向上し、タイピングミスが減り、設定を一元化できます。

SSHを使用した安全なファイル転送

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

scp (Secure Copy Protocol)

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

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

scp /path/to/local/file username@hostname_or_IP_address:/path/to/remote/directory/

例:

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

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

scp username@hostname_or_IP_address:/path/to/remote/file /path/to/local/directory/

例:

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

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

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

rscp -r /path/to/local/dir username@hostname_or_IP_address:/path/to/remote/parent_dir/

ファイル属性の保持

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

scp -p localfile user@remotehost:/remotepath/

sftp (SSH File Transfer Protocol)

sftpは、FTPに似ていますがSSHによって保護された、対話型のファイル転送プログラムを提供します。複数のファイルを管理したり、複雑なディレクトリ操作を実行したりする場合に最適です。

SFTPサーバーへの接続

sftp username@hostname_or_IP_address

接続すると、sftp>プロンプトが表示されます。一般的なコマンドには以下が含まれます。

  • ls: リモートディレクトリの内容を一覧表示
  • lls: ローカルディレクトリの内容を一覧表示
  • cd remote_directory: リモートディレクトリを変更
  • lcd local_directory: ローカルディレクトリを変更
  • get remote_file: ファイルをダウンロード
  • put local_file: ファイルをアップロード
  • mget remote_files: 複数のファイルをダウンロード(ワイルドカード対応)
  • mput local_files: 複数のファイルをアップロード(ワイルドカード対応)
  • 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 [local_port]:[remote_host]:[remote_port] username@ssh_server

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

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

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

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

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

ssh -R [remote_port]:[local_host]:[local_port] username@ssh_server

例: ローカルのWebサーバー(ポート8000)を、リモートサーバー上のポート8080でssh_serverからアクセスできるようにします。

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

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

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

ダイナミックポートフォワーディングはSOCKSプロキシを作成し、すべてのトラフィック(またはアプリケーション固有のトラフィック)をSSHトンネル経由でルーティングできるようにします。これは、ファイアウォールをバイパスしたり、ブラウジングを保護したりする場合に役立ちます。

ssh -D [local_port] username@ssh_server

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

ssh -D 1080 [email protected]

ブラウザまたはアプリケーションを設定して、ローカルマシンのポート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_rsa
ssh-add ~/.ssh/id_rsa_web # 特定のキーの場合

ssh-addは、~/.ssh/configForwardAgent yesを使用する場合に不可欠であり、秘密鍵をジャンプホストに配置することなく、ローカルキーを使用してジャンプホストから次のサーバーへの認証を可能にします。

永続的なSSH接続(ControlMaster)

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

Host *
    ControlMaster auto
    ControlPath ~/.ssh/control/%r@%h:%p
    ControlPersist 4h

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

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

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

結論

SSHは、システム管理者にとって不可欠なツールであり、安全で効率的なリモートアクセス、コマンド実行、ファイル転送機能を提供します。この記事で説明したコマンドとテクニック(基本的な接続とキーベース認証から、高度なトンネリングと設定管理まで)を習得することで、生産性を大幅に向上させ、サーバーインフラストラクチャのセキュリティを維持することができます。

SSH設定を定期的に確認し、キーベース認証を活用し、~/.ssh/configssh-agentなどの強力な機能を活用して日々のタスクを合理化してください。これらの必須SSHコマンドを使いこなすことで、自信を持って正確にリモートシステムを管理するための十分な準備が整います。管理業務におけるさらなる効率を引き出すために、継続的に練習し、その広範な機能を探索し続けてください。