SSHサーバー、クライアント、およびキーとの作業のSSH Essentials

紹介

SSHは、Linuxサーバーにリモートで接続する主要な手段として使用される安全なプロトコルです。リモートシェルを生成することで、テキストベースのインターフェースを提供します。接続後、ローカル端末で入力したすべてのコマンドがリモートサーバーに送信され、そこで実行されます。

このチートシートスタイルのガイドでは、SSHを使用して目標を達成するための一般的な接続方法について説明します。これは、サーバーにどのように接続したり構成したりするかを素早く参照するためのものです。

DigitalOcean App Platformを使用してGitHubからフロントエンドアプリケーションをデプロイします。DigitalOceanにアプリのスケーリングに集中させましょう。

このガイドの使い方

  • SSHの概要セクションをまず最初に読んでください。SSHに詳しくない場合や初めての場合は、このセクションを読んでください。
  • 適切なセクションを使用してください。ほとんどのセクションは他のセクションに依存していないため、以下の例を独立して使用できます。
  • 左側のページの目次メニュー(幅の広いページ幅では)またはブラウザの検索機能を使用して、必要なセクションを見つけてください。
  • 指示されたコマンドラインの例をコピーして貼り付け、強調表示された値をご自分の値に置き換えてください。

SSHの概要

リモートLinuxサーバーに接続する最も一般的な方法はSSHを介してです。SSHはSecure Shellの略であり、リモートでコマンドを実行したり、変更を加えたり、サービスを構成したりする安全で安全な方法を提供します。SSHを介して接続すると、リモートサーバー上に存在するアカウントを使用してログインします。

SSHの動作

SSHを介して接続すると、シェルセッションに入ります。これは、テキストベースのインタフェースで、サーバーと対話できます。SSHセッションの間、ローカルのターミナルに入力したコマンドは、暗号化されたSSHトンネルを介して送信され、サーバーで実行されます。

SSH接続はクライアントサーバーモデルを使用して実装されています。これは、SSH接続を確立するには、リモートマシンでSSHデーモンと呼ばれるソフトウェアが実行されている必要があることを意味します。このソフトウェアは、特定のネットワークポートで接続を受け付け、接続要求を認証し、ユーザーが正しい資格情報を提供した場合に適切な環境を生成します。

ユーザーのコンピューターにはSSHクライアントが必要です。これは、SSHプロトコルを使用して通信する方法を知っており、接続先のリモートホスト、使用するユーザー名、および認証に渡す必要がある資格情報に関する情報を受け取ることができるソフトウェアです。クライアントは、確立する接続タイプに関する特定の詳細も指定できます。

SSHでのユーザー認証方法

クライアントは、一般的にパスワード(セキュリティが低くお勧めしません)または非常に安全なSSHキーを使用して認証します。

パスワードログインは暗号化されており、新しいユーザーには理解しやすいです。ただし、自動化されたボットや悪意のあるユーザーは、パスワードログインを許可するアカウントに繰り返し認証しようとすることがよくあり、これはセキュリティの侵害につながる可能性があります。このため、ほとんどの構成には常にSSHキーベースの認証を設定することをお勧めします。

SSHキーは、認証に使用される一致する暗号鍵のセットです。それぞれのセットには公開鍵と秘密鍵が含まれています。公開鍵は心配することなく自由に共有できますが、秘密鍵は厳重に保護し、誰にも露出させてはいけません。

SSHキーを使用して認証するには、ユーザーはローカルコンピューターにSSHキーペアを持っている必要があります。リモートサーバーでは、公開鍵をユーザーのホームディレクトリ内のファイル~/.ssh/authorized_keysにコピーする必要があります。このファイルには、このアカウントにログインすることが許可されている公開鍵の一覧が1行ごとに含まれています。

クライアントがSSHキー認証を使用することを希望してホストに接続すると、クライアントはこの意図をサーバーに通知し、どの公開鍵を使用するかをサーバーに伝えます。その後、サーバーは公開鍵を使用してランダムな文字列を生成し、その文字列を公開鍵を使って暗号化します。この暗号化されたメッセージは、関連付けられた秘密鍵でのみ復号化できます。サーバーは、クライアントが実際に関連付けられた秘密鍵を持っているかどうかをテストするために、この暗号化されたメッセージをクライアントに送信します。

このメッセージを受け取ったら、クライアントは秘密鍵を使用してそれを復号化し、明らかになったランダムな文字列を以前に交渉されたセッションIDと組み合わせます。その後、この値のMD5ハッシュを生成し、それをサーバーに送信します。サーバーはすでに元のメッセージとセッションIDを持っていたので、それらの値によって生成されたMD5ハッシュを比較し、クライアントが秘密鍵を持っているはずであることを確認できます。

SSHの動作原理を理解したので、SSHを使用したさまざまな方法をデモンストレーションするいくつかの例について議論を始めることができます。

SSHキーの生成と操作

このセクションでは、クライアントマシンでSSHキーを生成し、公開キーを使用すべきサーバーに配布する方法について説明します。これは、将来の接続に対する増加したセキュリティのため、以前にキーを生成していない場合に始めるのに適したセクションです。

SSHキーペアの生成

ローカルコンピューターで新しいSSH公開および秘密キーのペアを生成することは、パスワードなしでリモートサーバーと認証するための最初のステップです。良い理由がない限り、常にSSHキーを使用して認証する必要があります。

A number of cryptographic algorithms can be used to generate SSH keys, including RSA, DSA, and ECDSA. RSA keys are generally preferred and are the default key type.

ローカルコンピューターでRSAキーペアを生成するには、次のコマンドを入力します:

  1. ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/home/demo/.ssh/id_rsa):

このプロンプトでは、RSA秘密キーを保存する場所を選択できます。デフォルトのままにするには、ENTERキーを押します。これにより、ユーザーのホームディレクトリ内の.ssh隠しディレクトリに保存されます。デフォルトの場所を選択したままにすると、SSHクライアントがキーを自動的に見つけることができます。

Enter passphrase (empty for no passphrase):
Enter same passphrase again:

次のプロンプトでは、任意の長さのパスフレーズを入力して、秘密鍵を保護します。デフォルトでは、ここで設定したパスフレーズを、プライベートキーを使用するたびに入力する必要があります。これは追加のセキュリティ対策としてのものです。パスフレーズを入力しない場合は、空白のままにしてENTERを押してください。ただし、これにより、誰かがあなたのプライベートキーを制御すると、サーバーにログインできるようになります。

パスフレーズを入力する場合は、入力中に何も表示されません。これはセキュリティ上の注意です。

Output
Your identification has been saved in /root/.ssh/id_rsa. Your public key has been saved in /root/.ssh/id_rsa.pub. The key fingerprint is: 8c:e9:7c:fa:bf:c4:e5:9c:c9:b8:60:1f:fe:1c:d3:8a root@here The key's randomart image is: +--[ RSA 2048]----+ | | | | | | | + | | o S . | | o . * + | | o + = O . | | + = = + | | ....Eo+ | +-----------------+

この手順で RSA SSH キーペアが生成され、ユーザーのホームディレクトリ内の.ssh隠しディレクトリにあります。これらのファイルは次のとおりです:

  • ~/.ssh/id_rsa: プライベートキー。このファイルを共有しないでください!
  • ~/.ssh/id_rsa.pub: 関連する公開鍵。これは自由に共有できます。

より多くのビット数を持つ SSH キーペアを生成する

SSH キーはデフォルトで 2048 ビットです。これは一般的にはセキュリティ上十分だと考えられていますが、より強化されたキーを作成するためにより多くのビット数を指定することができます。

これを行うには、望むビット数を指定して-b引数を含めます。ほとんどのサーバーは、少なくとも 4096 ビットの長さのキーをサポートしています。より長いキーは、DDOS 保護目的で受け入れられない場合があります:

  1. ssh-keygen -b 4096

以前に異なるキーを作成していた場合、以前のキーを上書きするかどうかを尋ねられます:

Overwrite (y/n)?

「はい」を選択すると、以前のキーが上書きされ、そのキーを使用してサーバーにログインできなくなります。そのため、キーを慎重に上書きしてください。

プライベートキーのパスフレーズを削除または変更する

プライベートキーにパスフレーズを生成し、それを変更または削除したい場合は、簡単に行うことができます。

注意: パスフレーズを変更または削除するには、元のパスフレーズを知っている必要があります。 キーのパスフレーズを失った場合、救済措置はありません。新しいキーペアを生成する必要があります。

パスフレーズを変更または削除するには、単に次のように入力します:

  1. ssh-keygen -p
Enter file in which the key is (/root/.ssh/id_rsa):

変更したいキーの場所を入力するか、デフォルトの値を受け入れるにはENTERを押します:

Enter old passphrase:

変更したい古いパスフレーズを入力します。その後、新しいパスフレーズが求められます:

Enter new passphrase (empty for no passphrase):
Enter same passphrase again:

ここで、新しいパスフレーズを入力するか、パスフレーズを削除するにはENTERを押します。

SSHキーのフィンガープリントの表示

各SSHキーペアは、キーを一意に識別するために使用できる単一の暗号学的な「フィンガープリント」を共有しています。これはさまざまな状況で役立ちます。

SSHキーのフィンガープリントを見つけるには、次のように入力します:

  1. ssh-keygen -l
Enter file in which the key is (/root/.ssh/id_rsa):

キーの正しい場所であれば、ENTERを押すことができます。それ以外の場合は、修正された場所を入力します。キーのビット長、フィンガープリント、作成されたアカウントとホスト、使用されたアルゴリズムが含まれる文字列が表示されます。

Output
4096 8e:c4:82:47:87:c2:26:4b:68:ff:96:1a:39:62:9e:4e demo@test (RSA)

SSH-Copy-IDを使用して公開SSHキーをサーバーにコピーする

サーバーに公開鍵をコピーし、パスワードなしで認証できるようにするには、さまざまな方法があります。

現在、サーバーにパスワードベースのSSHアクセスが構成されており、ssh-copy-idユーティリティがインストールされている場合は、これは簡単なプロセスです。 ssh-copy-idツールは、多くのLinuxディストリビューションのOpenSSHパッケージに含まれているため、おそらくデフォルトでインストールされている可能性が非常に高いです。

このオプションがある場合は、次のように入力するだけで簡単に公開鍵を転送できます:

  1. ssh-copy-id username@remote_host

これにより、リモートシステムのユーザーアカウントのパスワードがプロンプトされます:

The authenticity of host '111.111.11.111 (111.111.11.111)' can't be established.
ECDSA key fingerprint is fd:fd:d4:f9:77:fe:73:84:e1:55:00:ad:d6:6d:22:fe.
Are you sure you want to continue connecting (yes/no)? yes
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
[email protected]'s password:

パスワードを入力した後、~/.ssh/id_rsa.pubキーの内容がユーザーアカウントの~/.ssh/authorized_keysファイルの末尾に追加されます。

Output
Number of key(s) added: 1 Now try logging into the machine, with: "ssh '[email protected]'" and check to make sure that only the key(s) you wanted were added.

そのアカウントにパスワードなしでログインできるようになりました:

  1. ssh username@remote_host

SSH-Copy-IDを使用せずにサーバーに公開SSHキーをコピーする方法

ssh-copy-idユーティリティが利用できない場合でも、リモートサーバーへのパスワードベースのSSHアクセスがある場合は、公開鍵の内容を異なる方法でコピーすることができます。

キーの内容を出力して、それをsshコマンドにパイプで渡すことができます。リモート側では、~/.sshディレクトリが存在することを確認し、その後、パイプで渡された内容を~/.ssh/authorized_keysファイルに追加します:

  1. cat ~/.ssh/id_rsa.pub | ssh username@remote_host "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys"

リモートアカウントのパスワードを入力するように求められます:

The authenticity of host '111.111.11.111 (111.111.11.111)' can't be established.
ECDSA key fingerprint is fd:fd:d4:f9:77:fe:73:84:e1:55:00:ad:d6:6d:22:fe.
Are you sure you want to continue connecting (yes/no)? yes
[email protected]'s password:

パスワードを入力すると、キーがコピーされ、パスワードなしでログインできるようになります:

  1. ssh username@remote_IP_host

公開SSHキーをサーバーに手動でコピーする方法

パスワードベースのSSHアクセスが利用できない場合は、公開鍵をリモートサーバーに手動で追加する必要があります。

ローカルマシンで、公開鍵ファイルの内容を次のように入力することで確認できます:

  1. cat ~/.ssh/id_rsa.pub
Output
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQCqql6MzstZYh1TmWWv11q5O3pISj2ZFl9HgH1JLknLLx44+tXfJ7mIrKNxOOwxIxvcBF8PXSYvobFYEZjGIVCEAjrUzLiIxbyCoxVyle7Q+bqgZ8SeeM8wzytsY+dVGcBxF6N4JS+zVk5eMcV385gG3Y6ON3EG112n6d+SMXY0OEBIcO6x+PnUSGHrSgpBgX7Ks1r7xqFa7heJLLt2wWwkARptX7udSq05paBhcpB0pHtA1Rfz3K2B+ZVIpSDfki9UVKzT8JUmwW6NNzSgxUfQHGwnW7kj4jp4AT0VZk3ADw497M2G/12N0PPB5CnhHf7ovgy6nL1ikrygTKRFmNZISvAcywB9GVqNAVE+ZHDSCuURNsAInVzgYo9xgJDW8wUw2o8U77+xiFxgI5QSZX3Iq7YLMgeksaO4rBJEa54k8m5wEiEE1nUhLuJ0X/vh2xPff6SQ1BL/zkOhvJCACK6Vb15mDOeCSq54Cr7kvS46itMosi/uS66+PujOO+xt/2FWYepz6ZlN70bRly57Q06J+ZJoc9FfBCbCyYH7U/ASsmY095ywPsBo1XQ9PqhnN1/YOorJ068foQDNVpm146mUpILVxmq41Cj55YKHEazXGsdBIbXWhcrRf4G2fJLRcGUr9q8/lERo9oxRm5JFX6TCmj6kmiFqv+Ow9gI0x8GvaQ== demo@test

この値をコピーして、適切な場所に手動でリモートサーバーに貼り付けることができます。 リモートサーバーには他の手段(たとえば、DigitalOcean Webコンソールなど)を使用してログインする必要があります。

リモートサーバー上で、~/.sshディレクトリが存在しない場合は、作成します。

  1. mkdir -p ~/.ssh

その後、次のように入力して、~/.ssh/authorized_keysファイルを作成または追記できます。

  1. echo public_key_string >> ~/.ssh/authorized_keys

これでパスワードなしでリモートサーバーにログインできるようになります。

基本的な接続手順

以下のセクションでは、SSHを使用してサーバーに接続する基本的な方法について説明します。

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

リモートサーバーに接続してそこでシェルセッションを開くには、sshコマンドを使用できます。

最も単純な形式では、ローカルマシン上のユーザー名がリモートサーバー上と同じであると仮定しています。 これが当てはまる場合は、次のように接続できます。

  1. ssh remote_host

リモートサーバー上のユーザー名が異なる場合は、次のようにリモートユーザーの名前を渡す必要があります。

  1. ssh username@remote_host

新しいホストに初めて接続する場合、次のようなメッセージが表示されます:

The authenticity of host '111.111.11.111 (111.111.11.111)' can't be established.
ECDSA key fingerprint is fd:fd:d4:f9:77:fe:73:84:e1:55:00:ad:d6:6d:22:fe.
Are you sure you want to continue connecting (yes/no)? yes

はいと入力して、リモートホストの信頼性を承認します。

パスワード認証を使用している場合は、ここでリモートアカウントのパスワードを入力するように求められます。SSHキーを使用している場合は、プライベートキーのパスフレーズが設定されている場合にそれを入力するように求められます。それ以外の場合は、自動的にログインされます。

リモートサーバーで単一のコマンドを実行する

シェルセッションを起動する代わりにリモートサーバーで単一のコマンドを実行するには、接続情報の後にコマンドを追加します。以下のように:

  1. ssh username@remote_host command_to_run

これにより、リモートホストに接続し、資格情報で認証し、指定したコマンドを実行します。接続はその後すぐに閉じられます。

異なるポートでサーバーにログインする

サーバー上のSSHデーモンはデフォルトでポート22で実行されます。SSHクライアントは、接続を試みるときにこれを前提とします。SSHサーバーが標準ポート以外でリスニングしている場合(後述のセクションでデモンストレーションされています)、クライアントで新しいポート番号を指定する必要があります。

ポート番号を指定してこれを行うことができます-pオプションを使用します。

  1. ssh -p port_num username@remote_host

毎回リモートサーバーにログインするたびにこれを行う必要がないようにするには、ローカルコンピューターのホームディレクトリ内の~/.sshディレクトリに構成ファイルを作成または編集できます。

次のように入力して、ファイルを編集または作成します:

  1. nano ~/.ssh/config

ここでは、ホスト固有の構成オプションを設定できます。新しいポートを指定するには、次のような形式を使用します:

~/.ssh/config
Host remote_alias
    HostName remote_host
    Port port_num

これにより、コマンドラインで特定のポート番号を指定せずにログインできるようになります。

SSHキーをSSHエージェントに追加してパスフレーズの入力を回避する

プライベートSSHキーにパスフレーズが設定されている場合、リモートホストに接続するたびにパスフレーズの入力を求められます。

これを繰り返し行う必要を回避するために、SSHエージェントを実行できます。この小さなユーティリティは、最初にパスフレーズを入力した後、プライベートキーを保存します。このため、ターミナルセッションの間は利用可能であり、将来的にパスフレーズを再入力せずに接続できます。

これは、SSH資格情報を転送する必要がある場合にも重要です(後で説明します)。

SSHエージェントを起動するには、ローカルのターミナルセッションに次のように入力します:

  1. eval $(ssh-agent)
Output
Agent pid 10891

エージェントプログラムを開始してバックグラウンドに配置します。次に、プライベートキーをエージェントに追加して、キーを管理できるようにします:

  1. ssh-add
Enter passphrase for /home/demo/.ssh/id_rsa:
Identity added: /home/demo/.ssh/id_rsa (/home/demo/.ssh/id_rsa)

パスフレーズを入力する必要があります(設定されている場合)。その後、あなたのアイデンティティファイルがエージェントに追加され、パスフレーズを再入力せずにキーを使用してサインインできるようになります。

サーバーで使用するためにSSH資格情報を転送する

別のサーバーから別のサーバーにパスワードなしで接続できるようにする場合、SSHキー情報を転送する必要があります。これにより、ローカルコンピューターの資格情報を使用して、接続されているサーバーを介して別のサーバーに認証できます。

まず、SSHエージェントを開始し、SSHキーをエージェントに追加しておく必要があります(前述参照)。これが完了したら、-Aオプションを使用して最初のサーバーに接続する必要があります。これにより、このセッションのために資格情報がサーバーに転送されます:

  1. ssh -A username@remote_host

ここから、SSHキーがアクセスを許可されている他のホストにSSHできます。プライベートSSHキーがこのサーバーにあるかのように接続されます。

サーバーサイドの構成オプション

このセクションには、サーバーが応答する方法や許可される接続の種類を形成することができる一般的なサーバーサイドの設定オプションが含まれています。

パスワード認証の無効化

SSHキーが構成され、テストされ、正常に動作している場合、パスワード認証を無効にするのは良い考えです。これにより、ユーザーがパスワードを使用してSSHにサインインすることが防止されます。

これを行うには、リモートサーバーに接続し、rootまたはsudo特権を持って/etc/ssh/sshd_configファイルを開きます:

  1. sudo nano /etc/ssh/sshd_config

ファイルの中で、PasswordAuthenticationディレクティブを検索します。コメントアウトされている場合は、コメントを外します。パスワードログインを無効にするには、noに設定します:

/etc/ssh/sshd_config
PasswordAuthentication no

変更を保存してファイルを閉じたら、SSHサービスを再起動して変更を実装する必要があります。

Ubuntu/Debianの場合:

  1. sudo service ssh restart

CentOS/Fedoraの場合:

  1. sudo service sshd restart

これで、システム上のすべてのアカウントはSSHを使用してパスワードでログインできなくなります。

SSHデーモンの実行ポートの変更

一部の管理者は、SSHが実行されるデフォルトのポートを変更することを提案しています。これにより、自動化されたボットからの認証試行の数を減らすのに役立つ場合があります。

SSHデーモンがリッスンするポートを変更するには、リモートサーバーにログインする必要があります。ルート特権を持つsshd_configファイルをリモートシステムで開きます。そのユーザーでログインするか、sudoを使用してください:

  1. sudo nano /etc/ssh/sshd_config

内部に入ると、SSHが実行されるポートを変更できます。 Port 22の指定を見つけて、使用したいポートを反映するように変更します。たとえば、ポートを4444に変更するには、次のようにファイルに入力します:

/etc/ssh/sshd_config
#Port 22
Port 4444

終了したら、ファイルを保存して閉じます。変更を実装するには、SSHデーモンを再起動する必要があります。

Ubuntu/Debianの場合:

  1. sudo service ssh restart

CentOS/Fedoraの場合:

  1. sudo service sshd restart

デーモンが再起動すると、ポート番号を指定して認証する必要があります(前述のセクションで示されています)。

SSHを介して接続できるユーザーの制限

SSHを介してログインできるユーザーアカウントを明示的に制限するには、いくつかの異なるアプローチを取ることができます。それぞれがSSHデーモン構成ファイルを編集することを含みます。

リモートサーバーで、ルートまたはsudo特権を使用してこのファイルを開いてください。

  1. sudo nano /etc/ssh/sshd_config

最初の方法は、ログインが許可されるアカウントを指定することです。これにはAllowUsersディレクティブを使用します。ファイル内でAllowUsersディレクティブを検索します。存在しない場合は、任意の場所に作成します。ディレクティブの後に、SSHを介してログインが許可されるユーザーアカウントをリストアップします:

/etc/ssh/sshd_config
AllowUsers user1 user2

ファイルを保存して閉じます。変更を実装するためにデーモンを再起動します。

Ubuntu/Debianの場合:

  1. sudo service ssh restart

CentOS/Fedoraの場合:

  1. sudo service sshd restart

グループ管理に慣れている場合は、代わりにAllowGroupsディレクティブを使用できます。その場合、単一のグループを追加してSSHアクセスを許可します(このグループを作成し、メンバーを追加します):

/etc/ssh/sshd_config
AllowGroups sshmembers

ファイルを保存して閉じます。

これで、指定したグループと一致するシステムグループ(ホームディレクトリなし)を作成できます。次のように入力してください:

  1. sudo groupadd -r sshmembers

必要なユーザーアカウントをこのグループに追加してください。次のように入力します:

  1. sudo usermod -a -G sshmembers user1
  2. sudo usermod -a -G sshmembers user2

変更を実装するためにSSHデーモンを再起動します。

Ubuntu/Debianの場合:

  1. sudo service ssh restart

CentOS/Fedoraの場合:

  1. sudo service sshd restart

ルートログインの無効化

SSHユーザーアカウントにsudo特権を持たせた後、SSHを介したルートログインを完全に無効にすることが良いことがよくあります。

これを行うには、リモートサーバーでルートまたはsudoでSSHデーモンの設定ファイルを開きます。

  1. sudo nano /etc/ssh/sshd_config

内部で、PermitRootLoginというディレクティブを検索します。コメントアウトされている場合は、コメントを外します。値を「no」に変更してください。

/etc/ssh/sshd_config
PermitRootLogin no

ファイルを保存して閉じます。変更を実装するには、SSHデーモンを再起動します。

Ubuntu/Debianの場合:

  1. sudo service ssh restart

CentOS/Fedoraの場合:

  1. sudo service sshd restart

特定のコマンドのルートアクセスを許可する

一般的にルートアクセスを無効にしたいが、特定のアプリケーションが正しく実行されるようにするためには、ルートアクセスを有効にしたい場合があります。これの例として、バックアップルーチンがあります。

これは、rootユーザーのauthorized_keysファイルを介して実行できます。このファイルには、アカウントを使用する許可が与えられたSSHキーが含まれています。

このプロセスに使用するローカルコンピュータのキー(自動プロセスごとに新しいキーを作成することをお勧めします)を、サーバーのrootユーザーのauthorized_keysファイルに追加します。ここではssh-copy-idコマンドを使用してデモを行いますが、他のセクションで説明するキーをコピーする方法のいずれでも使用できます。

  1. ssh-copy-id root@remote_host

次に、リモートサーバーにログインします。 authorized_keysファイルのエントリを調整する必要があるため、rootまたはsudoアクセスで開きます。

  1. sudo nano /root/.ssh/authorized_keys

最初の行に、アップロードしたキーに対して有効なコマンドを定義する command= リストを追加してください。これには、実行可能ファイルへの完全なパスと、任意の引数が含まれる必要があります:

/root/.ssh/authorized_keys
command="/path/to/command arg1 arg2" ssh-rsa ...

作業が完了したら、ファイルを保存して閉じてください。

次に、rootまたはsudo特権で sshd_config ファイルを開いてください:

  1. sudo nano /etc/ssh/sshd_config

PermitRootLogin ディレクティブを探し、値を forced-commands-only に変更してください。これにより、SSHキーログインがルートを使用する場合は、キーに対してコマンドが指定されているときのみ許可されます:

/etc/ssh/sshd_config
PermitRootLogin forced-commands-only

ファイルを保存して閉じてください。変更を実装するためにSSHデーモンを再起動してください。

Ubuntu/Debianの場合:

  1. sudo service ssh restart

CentOS/Fedoraの場合:

  1. sudo service sshd restart

Xアプリケーションの表示をクライアントに転送する

SSHデーモンは、サーバー上のXアプリケーションの表示をクライアントマシンに自動的に転送するように構成できます。これを正しく機能させるには、クライアントにXウィンドウシステムが構成されて有効にされている必要があります。

この機能を有効にするには、リモートサーバーにログインし、rootまたはsudo特権で sshd_config ファイルを編集してください:

  1. sudo nano /etc/ssh/sshd_config

X11Forwarding ディレクティブを検索してください。コメントアウトされている場合は、コメントを外してください。必要に応じて作成し、値を “yes” に設定してください。

/etc/ssh/sshd_config
X11Forwarding yes

ファイルを保存して閉じてください。これらの変更を実装するためにSSHデーモンを再起動します。

Ubuntu/Debianの場合:

  1. sudo service ssh restart

CentOS/Fedoraの場合:

  1. sudo service sshd restart

サーバーに接続してアプリケーションのディスプレイを転送するには、クライアントから接続時に-Xオプションを渡す必要があります:

  1. ssh -X username@remote_host

このセッションでサーバーで開始されたグラフィカルアプリケーションは、ローカルコンピューターに表示されます。パフォーマンスは少し遅いかもしれませんが、緊急時に非常に役立ちます。

クライアント側の構成オプション

次のセクションでは、接続のクライアント側で行うことができる調整に焦点を当てます。

サーバー固有の接続情報の定義

ローカルコンピューターでは、接続するサーバーのいくつかまたはすべての個別の構成を定義できます。これらは、SSHクライアントが呼び出されるたびに読み取られる~/.ssh/configファイルに保存できます。

このファイルをローカルコンピューターのテキストエディターで作成または開きます:

  1. nano ~/.ssh/config

内部では、Host キーワードで各構成オプションを定義し、それに続けてエイリアスを指定します。これに続いてインデントされた部分では、ssh_config マニュアルページで見つかる任意のディレクティブを定義できます。

  1. man ssh_config

構成例は次のとおりです:

~/.ssh/config
Host testhost
    HostName your_domain
    Port 4444
    User demo

次のようにして、単に入力することで、ポート 4444 を使用してユーザー名 demoyour_domain に接続できます:

  1. ssh testhost

複数のホストに一致させるにはワイルドカードも使用できます。ただし、後の一致が先行するものを上書きできることに注意してください。このため、最も一般的な一致をトップに配置する必要があります。たとえば、次のようにファイルにこれを記述することで、すべての接続を X フォワーディングを許可しないようにデフォルトにし、your_domain のオーバーライドを設定できます:

~/.ssh/config
Host *
    ForwardX11 no

Host testhost
    HostName your_domain
    ForwardX11 yes
    Port 4444
    User demo

編集が終了したら、ファイルを保存して閉じます。

タイムアウトを回避するために接続を維持する

SSH セッションから切断される前に準備ができていない場合は、接続がタイムアウトしている可能性があります。

この状況を回避するためにクライアントが定期的にサーバーにパケットを送信するように設定できます:

ローカルコンピューターで、すべての接続に対してこれを設定するには、~/.ssh/config ファイルを編集します。今すぐ開いてください。

  1. nano ~/.ssh/config

ファイルの先頭に存在しない場合は、すべてのホストに一致するセクションを定義します。 ServerAliveInterval を「120」に設定して、2分ごとにサーバーにパケットを送信します。 これでサーバーに接続を閉じないように通知するのに十分です。

~/.ssh/config
Host *
    ServerAliveInterval 120

作業が完了したら、ファイルを保存して閉じます。

ホストチェックの無効化

デフォルトでは、新しいサーバーに接続するたびに、リモートSSHデーモンのホストキーのフィンガープリントが表示されます。

The authenticity of host '111.111.11.111 (111.111.11.111)' can't be established.
ECDSA key fingerprint is fd:fd:d4:f9:77:fe:73:84:e1:55:00:ad:d6:6d:22:fe.
Are you sure you want to continue connecting (yes/no)? yes

これは、接続しようとしているホストの信頼性を確認し、悪意のあるユーザーがリモートホストを偽装しようとしている場合を見つけるために構成されています。

特定の状況では、この機能を無効にしたい場合があります。注意: これは大きなセキュリティリスクになる可能性があるため、システムをこのように設定する場合は注意してください。

変更を行うには、ローカルコンピューターの~/.ssh/configファイルを開きます。

  1. nano ~/.ssh/config

ファイルの先頭に存在しない場合は、すべてのホストに一致するセクションを定義します。 StrictHostKeyChecking ディレクティブを no に設定して、新しいホストを自動的に known_hosts ファイルに追加します。 UserKnownHostsFile/dev/null に設定して、新しいまたは変更されたホストに警告を表示しないようにします。

~/.ssh/config
Host *
    StrictHostKeyChecking no
    UserKnownHostsFile /dev/null

各ホストの場合によっては、オプションを逆にしてチェックを有効にすることができます。 StrictHostKeyChecking のデフォルトは ask です:

~/.ssh/config
Host *
    StrictHostKeyChecking no
    UserKnownHostsFile /dev/null

Host testhost
    HostName your_domain
    StrictHostKeyChecking ask
    UserKnownHostsFile /home/demo/.ssh/known_hosts

単一のTCP接続でSSHを多重化する

新しいTCP接続を確立するのにかかる時間が長すぎる場合があります。同じマシンに複数の接続を行う場合は、多重化を活用できます。

SSHの多重化は、複数のSSHセッションで同じTCP接続を再利用します。これにより、新しいセッションを確立するために必要な作業の一部が削減され、処理速度が向上する可能性があります。接続数を制限することも、他の理由で役立つ場合があります。

多重化を設定するには、接続を手動で設定するか、クライアントを使用可能な場合に自動的に多重化するように構成できます。ここでは、後者のオプションを示します。

多重化を構成するには、ローカルマシンのSSHクライアントの設定ファイルを編集します:

  1. nano ~/.ssh/config

ファイルの先頭にワイルドカードホスト定義がまだない場合は、今すぐ追加してください(Host * として)。ControlMasterControlPath、および ControlPersist の値を設定して、多重化構成を確立します。

ControlMasterを「auto」に設定すると、可能な場合に自動的に多重化が許可されます。 ControlPathは制御ソケットへのパスを確立します。 最初のセッションでこのソケットを作成し、以降のセッションはユーザー名、ホスト、およびポートでラベル付けされているため、それを見つけることができます。

ControlPersistオプションを1に設定すると、初期のマスター接続をバックグラウンドで実行できます。 1は、最後のSSHセッションが閉じられてから1秒後にTCP接続が自動的に終了することを指定します:

/.ssh/config
Host *
    ControlMaster auto
    ControlPath ~/.ssh/multiplex/%r@%h:%p
    ControlPersist 1

作業が完了したら、ファイルを保存して閉じます。 続いて、制御パスで指定したディレクトリを実際に作成する必要があります:

  1. mkdir ~/.ssh/multiplex

これで、同じマシンとのセッションが確立されると、既存のソケットとTCP接続を使用しようとします。 最後のセッションが終了すると、接続は1秒後に切断されます。

一時的に多重化構成をバイパスする必要がある場合は、-Sフラグとnoneを渡すことで行うことができます:

  1. ssh -S none username@remote_host

SSHトンネルの設定

セキュアなSSHトンネルを介して他のトラフィックをトンネリングすることは、制限されたファイアウォール設定を回避する優れた方法です。 それはまた、他の方法で暗号化されていないネットワークトラフィックを暗号化する素晴らしい方法です。

サーバーへのローカルトンネリングの設定

SSH接続を使用して、ローカルホストのポートからリモートホストのポートにトラフィックをトンネルすることができます。

A local connection is a way of accessing a network location from your local computer through your remote host. First, an SSH connection is established to your remote host. On the remote server, a connection is made to an external (or internal) network address provided by the user and traffic to this location is tunneled to your local computer on a specified port.

これは、ファイアウォールをバイパスして制限の少ないネットワーキング環境にトンネルするためによく使用されます。別の一般的な用途は、リモート場所から「localhost-only」ウェブインターフェースにアクセスすることです。

リモートサーバーへのローカルトンネルを確立するには、接続時に-Lパラメータを使用し、追加の3つの情報を提供する必要があります:

  • トンネル接続にアクセスしたいローカルポート。
  • リモートホストが接続するホスト。
  • リモートホストが接続するポート。

これらは、-Lフラグの引数として、上記の順序で(コロンで区切られた状態で)与えられます。また、-fフラグも使用します。これにより、SSHが実行前にバックグラウンドに移行し、-Nフラグも使用します。これにより、リモート側でシェルを開かず、プログラムを実行しません。

たとえば、リモートホストのポート80でyour_domainに接続し、接続をローカルマシンのポート8888で利用できるようにするには、次のように入力します:

  1. ssh -f -N -L 8888:your_domain:80 username@remote_host

これで、ローカルウェブブラウザを127.0.0.1:8888に向けると、ポート80your_domainの内容が表示されるはずです。

A more general guide to the syntax is:

  1. ssh -L your_port:site_or_IP_to_access:site_port username@host

接続はバックグラウンドで行われているため、それを終了させるにはそのPIDを見つける必要があります。ポートを転送した場合は、そのPIDを検索して見つけることができます。

  1. ps aux | grep 8888
Output
1001 5965 0.0 0.0 48168 1136 ? Ss 12:28 0:00 ssh -f -N -L 8888:your_domain:80 username@remote_host 1001 6113 0.0 0.0 13648 952 pts/2 S+ 12:37 0:00 grep --colour=auto 8888

次に、SSHコマンドに一致する行の2番目の列にある番号であるPIDを対象にプロセスを終了させることができます。

  1. kill 5965

別のオプションは、-fフラグを使用せずに接続を開始することです。これにより、接続は前景で保持され、転送の期間中にターミナルウィンドウを使用できなくなります。これの利点は、トンネルを簡単に終了できることです。CTRL-Cを入力することでトンネルを終了できます。

サーバーへのリモートトンネリングの設定

SSH接続は、ローカルホストのポートからリモートホストのポートへのトラフィックのトンネリングに使用できます。

リモートトンネルでは、リモートホストに接続が行われます。トンネルの作成中に、リモートポートが指定されます。このポートは、その後、リモートホスト上のポートであり、ローカルコンピューターから接続されるホストとポートの組み合わせにトンネリングされます。これにより、リモートコンピューターがローカルコンピューターを介してホストにアクセスできるようになります。

これは、外部接続にロックされた内部ネットワークへのアクセスを許可する必要がある場合に便利です。ファイアウォールがネットワークからの接続を許可する場合、これによりリモートマシンに接続して、そのマシンから内部ネットワークの場所にトラフィックをトンネリングすることができます。

リモートサーバーへのリモートトンネルを確立するには、接続時に-Rパラメータを使用し、さらに3つの追加情報を提供する必要があります:

  • リモートホストがトンネル接続にアクセスできるポート。
  • ローカルコンピューターが接続したいホスト。
  • ローカルコンピューターが接続したいポート。

これらは、-Rフラグの引数として、上記の順序で(コロンで区切られて)指定されます。 また、-fフラグと-Nフラグも使用します。これにより、SSHがバックグラウンドで実行され、シェルが開かれないか、リモート側でプログラムが実行されません。

たとえば、ローカルコンピューターのポート80でyour_domainに接続し、接続をリモートホストのポート8888で利用可能にするには、次のように入力します:

  1. ssh -f -N -R 8888:your_domain:80 username@remote_host

これで、リモートホストでウェブブラウザーを127.0.0.1:8888に開くと、ポート80your_domainのコンテンツが表示されます。

A more general guide to the syntax is:

  1. ssh -R remote_port:site_or_IP_to_access:site_port username@host

接続がバックグラウンドであるため、そのPIDを見つけて終了する必要があります。 これは、転送したポートを検索してPIDを見つけることで行うことができます:

  1. ps aux | grep 8888
Output
1001 5965 0.0 0.0 48168 1136 ? Ss 12:28 0:00 ssh -f -N -R 8888:your_domain:80 username@remote_host 1001 6113 0.0 0.0 13648 952 pts/2 S+ 12:37 0:00 grep --colour=auto 8888

その後、SSHコマンドに一致する行の2番目の列にあるPID(番号)をターゲットにしてプロセスを終了できます。

  1. kill 5965

別のオプションは、-fフラグを使用せずに接続を開始することです。これにより、接続が前面に保持され、転送の間はターミナルウィンドウを使用できなくなります。これの利点は、簡単にトンネルを終了できることです。 CTRL-Cを入力してトンネルを終了できます。

リモートサーバーへのダイナミックトンネリングの構成

SSH接続は、ローカルホストのポートからリモートホストのポートにトラフィックをトンネリングするために使用できます。

A dynamic tunnel is similar to a local tunnel in that it allows the local computer to connect to other resources through a remote host. A dynamic tunnel does this by simply specifying a single local port. Applications that wish to take advantage of this port for tunneling must be able to communicate using the SOCKS protocol so that the packets can be correctly redirected at the other side of the tunnel.

このローカルポートに送信されたトラフィックは、リモートホストに送信されます。そこから、SOCKSプロトコルが解釈され、所望のエンドロケーションへの接続が確立されます。このセットアップにより、SOCKS対応のアプリケーションが、複数の静的トンネルなしに、リモートサーバーを介して任意の数の場所に接続できます。

接続を確立するには、トンネルにアクセスしたいローカルポートとともに-Dフラグを渡します。また、SSHが実行される前にバックグラウンドに移行する-fフラグと、リモート側でシェルを開かず、プログラムを実行しない-Nフラグも使用します。

たとえば、ポート7777でトンネルを確立するには、次のように入力できます:

  1. ssh -f -N -D 7777 username@remote_host

ここから、SOCKS対応のアプリケーション(Webブラウザなど)を選択したポートに向けてポイントを始めることができます。アプリケーションは、ポートに関連付けられたソケットに情報を送信します。

トラフィックをSOCKSポートに向ける方法は、アプリケーションによって異なります。例えば、Firefoxでは、一般的な場所は「設定」>「詳細」>「設定」>「手動プロキシの設定」です。Chromeでは、アプリケーションを--proxy-server=フラグを設定して起動できます。localhost インターフェースと転送したポートを使用する必要があります。

接続がバックグラウンドで行われているため、それを終了させるにはそのPIDを見つける必要があります。転送したポートを検索して、そのプロセスを終了できます。

  1. ps aux | grep 8888
Output
1001 5965 0.0 0.0 48168 1136 ? Ss 12:28 0:00 ssh -f -N -D 7777 username@remote_host 1001 6113 0.0 0.0 13648 952 pts/2 S+ 12:37 0:00 grep --colour=auto 8888

その後、SSHコマンドに一致する行の2番目の列のPIDをターゲットにしてプロセスを終了できます。

  1. kill 5965

別のオプションは、-fフラグなしで接続を開始することです。これにより、接続が前景で維持され、転送の間、ターミナルウィンドウを使用できなくなります。これの利点は、トンネルを簡単にCTRL-Cで終了できることです。

SSHエスケープコードを使用した接続の制御

SSHセッションを確立した後も、ターミナル内から接続を制御することができます。これはSSHエスケープコードと呼ばれるものを使用して行います。これにより、セッション内からローカルのSSHソフトウェアとやり取りできます。

クライアント側からの切断(スタックまたはフリーズしたセッションからの退出方法)

OpenSSHの最も便利な機能の1つは、内部から特定のセッションの側面を制御できる能力です。

これらのコマンドは、SSHセッション内で~制御文字で開始して実行できます。 コントロールコマンドは、改行後に最初に入力されたものである場合にのみ解釈されますので、常に1回または2回ENTERキーを押してから使用してください。

最も便利なコントロールの1つは、クライアントからの切断を開始できる能力です。 SSH接続は通常、サーバーによって閉じられますが、サーバーに問題がある場合や接続が切断されている場合に問題が発生する可能性があります。 クライアント側の切断を使用することで、接続をクリーンにクライアントから閉じることができます。

クライアントからの接続を閉じるには、コントロール文字(~)に続けてドットを使用します。 接続に問題がある場合、スタックした端末セッションのように見えることがあります。 フィードバックがなくてもコマンドを入力して、クライアント側からの切断を実行します:

  1. [ENTER]
  2. ~.

接続が即座に閉じられ、ローカルのシェルセッションに戻ります。

SSHセッションをバックグラウンドに配置する

OpenSSHの中でほとんど気付かれていない便利な機能の1つは、接続内部からセッションの特定の側面を制御できる能力です。

これらのコマンドは、SSH接続内部から~制御文字で始まるように実行できます。制御コマンドは、改行後に入力される最初のものである場合にのみ解釈されるため、常に1回または2回ENTERキーを押してから使用してください。

これにより提供される機能の1つは、SSHセッションをバックグラウンドに配置することです。これを行うには、制御文字(~)を指定し、次に通常のキーボードショートカットでタスクをバックグラウンドに送ります(CTRL-z):

  1. [ENTER]
  2. ~[CTRL-z]

これにより、接続がバックグラウンドに配置され、ローカルのシェルセッションに戻ります。SSHセッションに戻るには、通常のジョブ制御メカニズムを使用できます。

最近バックグラウンドに配置されたタスクをすぐに再アクティブ化するには、次のように入力します:

  1. fg

複数のバックグラウンドに配置されたタスクがある場合、利用可能なジョブを確認するには次のように入力します:

  1. jobs
Output
[1]+ Stopped ssh username@some_host [2] Stopped ssh username@another_host

その後、最初の列のインデックスとパーセンテージ記号を使用して、任意のタスクをフォアグラウンドに持ってこれます:

  1. fg %2

既存のSSH接続でポート転送オプションを変更する方法

OpenSSHの最も便利な機能の1つは、接続内部からセッションの特定の側面を制御できる能力です。

これらのコマンドは、SSH接続内部から~制御文字を使って実行できます。 制御コマンドは、新しい行の直後に入力された場合のみ解釈されますので、使用する前に常に ENTER キーを1回または2回押してください。

これにより、接続がすでに確立された後でも、ユーザーがポート転送の構成を変更できるようになります。 これにより、ポート転送ルールをリアルタイムで作成または解除できます。

これらの機能はSSHコマンドラインインターフェースの一部であり、制御文字(~)と「C」を使用してセッション中にアクセスできます。

  1. [ENTER]
  2. ~C
ssh>

SSHコマンドプロンプトが表示されます。 有効なコマンドは非常に限られています。 使用可能なオプションを表示するには、このプロンプトから-hを入力します。 何も返されない場合は、~vを数回使用してSSH出力の詳細度を上げる必要があるかもしれません。

  1. [ENTER]
  2. ~v
  3. ~v
  4. ~v
  5. ~C
  6. -h
Commands:
      -L[bind_address:]port:host:hostport    Request local forward
      -R[bind_address:]port:host:hostport    Request remote forward
      -D[bind_address:]port                  Request dynamic forward
      -KL[bind_address:]port                 Cancel local forward
      -KR[bind_address:]port                 Cancel remote forward
      -KD[bind_address:]port                 Cancel dynamic forward

次のように、適切なオプションを使用して転送オプションを簡単に実装できます(詳細については転送セクションを参照してください)。関連付けられた「kill」コマンドを使用してトンネルを破棄することもできます。これは、転送タイプの文字の前に「K」が指定されたコマンドです。たとえば、ローカルフォワード(-L)を終了するには、-KLコマンドを使用できます。これにはポートのみを指定する必要があります。

したがって、ローカルポートフォワードを設定するには、次のように入力します:

  1. [ENTER]
  2. ~C
  3. -L 8888:127.0.0.1:80

ローカルコンピューターのポート8888は、接続先のホストのWebサーバーと通信できるようになります。終了時に、その転送を解除するには、次のように入力します:

  1. [ENTER]
  2. ~C
  3. -KL 8888

結論

上記の手順は、ほとんどのユーザーがSSHについて日常的に必要とする情報をカバーするはずです。他のヒントがある場合や、お気に入りの構成や方法を共有したい場合は、以下のコメントをご利用ください。

Source:
https://www.digitalocean.com/community/tutorials/ssh-essentials-working-with-ssh-servers-clients-and-keys