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

前書き

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

この虎の巻スタイルのガイドでは、目的を達成するためにSSHと接続するいくつかの一般的な方法について説明します。 これは、さまざまな方法でサーバーに接続または構成する方法を知る必要がある場合のクイックリファレンスとして使用できます。

このガイドの使用方法

  • 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行に1つずつ含まれています。

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

このメッセージを受信すると、クライアントは秘密鍵を使用してメッセージを復号化し、公開されたランダムな文字列と以前にネゴシエートされたセッションIDを結合します。 次に、この値のMD5ハッシュを生成し、サーバーに送り返します。 サーバーはすでに元のメッセージとセッションIDを持っているため、これらの値によって生成されたMD5ハッシュを比較し、クライアントが秘密キーを持っている必要があると判断できます。

SSHの仕組みがわかったので、SSHのさまざまな操作方法を示すためにいくつかの例を説明し始めます。

SSHキーの生成と操作

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

SSHキーペアの生成

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

RSA、DSA、およびECDSAなど、多数の暗号化アルゴリズムを使用してSSHキーを生成できます。 RSAキーは一般的に優先され、デフォルトのキータイプです。

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

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キーを押してこの空白のままにしてください。 ただし、これにより、秘密鍵の制御を取得したすべてのユーザーがサーバーにログインできることに注意してください。

パスフレーズの入力を選択した場合、入力しても何も表示されません。 これはセキュリティ上の予防措置です。

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 [email protected]
The key's randomart image is:
+--[ RSA 2048]----+
|                 |
|                 |
|                 |
|       +         |
|      o S   .    |
|     o   . * +   |
|      o + = O .  |
|       + = = +   |
|      ....Eo+    |
+-----------------+

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

  • +〜/ .ssh / id_rsa +:秘密鍵。 このファイルを共有しないでください!

  • +〜/ .ssh / id_rsa.pub +:関連する公開鍵。 これは結果なしで自由に共有できます。

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

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

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

ssh-keygen -b 4096

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

Overwrite (y/n)?

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

秘密鍵のパスフレーズの削除または変更

秘密鍵のパスフレーズを生成し、それを変更または削除する場合、簡単に行うことができます。

注意:パスフレーズを変更または削除するには、元のパスフレーズを知っている必要があります。 キーのパスフレーズを紛失した場合、頼りになる手段はなく、新しいキーペアを生成する必要があります。

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

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キーのフィンガープリントを見つけるには、次のように入力します。

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

キーの正しい場所である場合はEnterキーを押し、そうでない場合は修正された場所を入力します。 キーのビット長、フィンガープリント、アカウントとそれが作成されたホスト、および使用されるアルゴリズムを含む文字列が与えられます:

4096 8e:c4:82:47:87:c2:26:4b:68:ff:96:1a:39:62:9e:4e  [email protected] (RSA)

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

パスワードを使用せずに認証できるように公開キーをサーバーにコピーするには、いくつかの方法があります。

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

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

ssh-copy-id @

これにより、リモートシステム上のユーザーアカウントのパスワードの入力が求められます。

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`ファイルの末尾に追加されます:

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.

これで、パスワードなしでそのアカウントにログインできます。

ssh @

SSH-Copy-IDなしで公開SSHキーをサーバーにコピーする

`+ ssh-copy-id +`ユーティリティを使用できない場合でも、リモートサーバーへのパスワードベースのSSHアクセスが可能であれば、公開キーの内容を別の方法でコピーできます。

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

cat ~/.ssh/id_rsa.pub | ssh @ "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:

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

ssh @

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

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

ローカルマシンでは、次のように入力して公開キーファイルの内容を見つけることができます。

cat ~/.ssh/id_rsa.pub
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQCqql6MzstZYh1TmWWv11q5O3pISj2ZFl9HgH1JLknLLx44+tXfJ7mIrKNxOOwxIxvcBF8PXSYvobFYEZjGIVCEAjrUzLiIxbyCoxVyle7Q+bqgZ8SeeM8wzytsY+dVGcBxF6N4JS+zVk5eMcV385gG3Y6ON3EG112n6d+SMXY0OEBIcO6x+PnUSGHrSgpBgX7Ks1r7xqFa7heJLLt2wWwkARptX7udSq05paBhcpB0pHtA1Rfz3K2B+ZVIpSDfki9UVKzT8JUmwW6NNzSgxUfQHGwnW7kj4jp4AT0VZk3ADw497M2G/12N0PPB5CnhHf7ovgy6nL1ikrygTKRFmNZISvAcywB9GVqNAVE+ZHDSCuURNsAInVzgYo9xgJDW8wUw2o8U77+xiFxgI5QSZX3Iq7YLMgeksaO4rBJEa54k8m5wEiEE1nUhLuJ0X/vh2xPff6SQ1BL/zkOhvJCACK6Vb15mDOeCSq54Cr7kvS46itMosi/uS66+PujOO+xt/2FWYepz6ZlN70bRly57Q06J+ZJoc9FfBCbCyYH7U/ASsmY095ywPsBo1XQ9PqhnN1/YOorJ068foQDNVpm146mUpILVxmq41Cj55YKHEazXGsdBIbXWhcrRf4G2fJLRcGUr9q8/lERo9oxRm5JFX6TCmj6kmiFqv+Ow9gI0x8GvaQ== [email protected]

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

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

mkdir -p ~/.ssh

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

echo  >> ~/.ssh/authorized_keys

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

基本的な接続手順

次のセクションでは、SSHを使用してサーバーに接続する方法に関する基本事項の一部を説明します。

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

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

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

ssh

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

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

「yes」と入力して、リモートホストの信頼性を受け入れます。

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

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

シェルセッションを生成するのではなく、リモートサーバーで単一のコマンドを実行するには、次のように接続情報の後にコマンドを追加できます。

ssh @

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

別のポートでサーバーにログインする

デフォルトでは、サーバー上のSSHデーモンはポート22で実行されます。 SSHクライアントは、接続しようとするとこれが当てはまると想定します。 SSHサーバーが非標準ポートでリッスンしている場合(これについては後のセクションで説明します)、クライアントと接続するときに新しいポート番号を指定する必要があります。

`+ -p +`オプションでポート番号を指定することでこれを行うことができます:

ssh -p  @

リモートサーバーにログインするたびにこれを行わなくても済むように、ローカルコンピューターのホームディレクトリ内の `+〜/ .ssh +`ディレクトリで設定ファイルを作成または編集できます。

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

nano ~/.ssh/config

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

Host
   HostName
   Port

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

パスフレーズの入力を避けるためにSSHキーをSSHエージェントに追加する

プライベートSSHキーにパスフレーズがある場合、パスフレーズを使用してリモートホストに接続するたびにパスフレーズを入力するように求められます。

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

これは、SSH資格情報を転送する必要がある場合にも重要です(以下を参照)。

SSHエージェントを開始するには、ローカルターミナルセッションに次を入力します。

eval $(ssh-agent)
Agent pid 10891

これにより、エージェントプログラムが起動し、バックグラウンドに配置されます。 次に、秘密鍵をエージェントに追加して、鍵を管理できるようにする必要があります。

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

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

サーバーで使用するSSH資格情報の転送

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

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

ssh -A @

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

サーバー側の構成オプション

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

パスワード認証を無効にする

SSHキーを構成、テスト、および正常に動作させている場合は、パスワード認証を無効にすることをお勧めします。 これにより、ユーザーはパスワードを使用してSSHでサインインできなくなります。

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

sudo nano /etc/ssh/sshd_config

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

PasswordAuthentication no

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

Ubuntu / Debianについて

sudo service ssh restart

CentOS / Fedoraの場合:

sudo service sshd restart

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

SSHデーモンが実行されるポートの変更

一部の管理者は、SSHを実行するデフォルトのポートを変更することを提案しています。 これにより、サーバーが自動ボットから受ける認証試行の回数を減らすことができます。

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

sudo nano /etc/ssh/sshd_config

内部に入ったら、「+ Port 22+」仕様を見つけて、使用するポートを反映するように変更することにより、SSHが実行されるポートを変更できます。 たとえば、ポートを4444に変更するには、これをファイルに追加します。

Port 22
Port

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

Ubuntu / Debianについて

sudo service ssh restart

CentOS / Fedoraの場合:

sudo service sshd restart

デーモンの再起動後、ポート番号を指定して認証する必要があります(前のセクションで説明しました)。

SSH経由で接続できるユーザーを制限する

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

リモートサーバーで、ルートまたはsudo権限でこのファイルを開きます。

sudo nano /etc/ssh/sshd_config

ログインを許可するアカウントを指定する最初の方法は、 `+ AllowUsers `ディレクティブを使用することです。 ファイルで ` AllowUsers +`ディレクティブを検索します。 存在しない場合は、どこでも作成します。 ディレクティブの後に、SSHを介したログインを許可する必要があるユーザーアカウントをリストします。

AllowUsers

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

Ubuntu / Debianについて

sudo service ssh restart

CentOS / Fedoraの場合:

sudo service sshd restart

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

AllowGroups

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

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

sudo groupadd -r

このグループに必要なユーザーアカウントを追加してください。 これは、次のように入力することで実行できます。

sudo usermod -a -G
sudo usermod -a -G

次に、SSHデーモンを再起動して、変更を実装します。

Ubuntu / Debianについて

sudo service ssh restart

CentOS / Fedoraの場合:

sudo service sshd restart

ルートログインを無効にする

`+ sudo +`権限を持つSSHユーザーアカウントを設定した後、SSHを介したルートログインを完全に無効にすることをお勧めします。

これを行うには、リモートサーバーでrootまたはsudoを使用してSSHデーモン構成ファイルを開きます。

sudo nano /etc/ssh/sshd_config

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

PermitRootLogin no

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

Ubuntu / Debianについて

sudo service ssh restart

CentOS / Fedoraの場合:

sudo service sshd restart

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

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

これは、rootユーザーの `+ authorized_keys +`ファイルを使用して実現できます。このファイルには、アカウントの使用が許可されているSSHキーが含まれています。

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

ssh-copy-id [email protected]

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

sudo nano /root/.ssh/authorized_keys

アップロードしたキーを含む行の先頭に、このキーが有効なコマンドを定義する `+ command = +`リストを追加します。 これには、実行可能ファイルへのフルパスと引数が含まれている必要があります。

command="" ssh-rsa ...

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

ここで、ルートまたはsudo権限で `+ sshd_config +`ファイルを開きます:

sudo nano /etc/ssh/sshd_config

ディレクティブ + PermitRootLogin`を見つけ、値を + forced-commands-only`に変更します。 これにより、キーにコマンドが指定されている場合にのみ、SSHキーログインでルートを使用できます。

PermitRootLogin forced-commands-only

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

Ubuntu / Debianについて

sudo service ssh restart

CentOS / Fedoraの場合:

sudo service sshd restart

Xアプリケーション画面をクライアントに転送する

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

この機能を有効にするには、リモートサーバーにログインし、ルートとしてまたはsudo権限で `+ sshd_config +`ファイルを編集します:

sudo nano /etc/ssh/sshd_config

`+ X11Forwarding +`ディレクティブを検索します。 コメントアウトされている場合は、コメントを外します。 必要に応じて作成し、値を「yes」に設定します。

X11Forwarding yes

ファイルを保存して閉じます。 SSHデーモンを再起動して、これらの変更を実装します。

Ubuntu / Debianについて

sudo service ssh restart

CentOS / Fedoraの場合:

sudo service sshd restart

サーバーに接続してアプリケーションの表示を転送するには、接続時にクライアントから「+ -X +」オプションを渡す必要があります。

ssh -X @

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

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

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

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

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

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

nano ~/.ssh/config

内部では、各オプションに `+ Host `キーワードとそれに続くエイリアスを導入することにより、個々の設定オプションを定義できます。 これの下でインデントされた、 ` ssh_config +`のマニュアルページにあるディレクティブのいずれかを定義できます:

man ssh_config

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

Host testhost
   HostName
   Port
   User

次のように入力するだけで、ユーザー名「demo」を使用してポート4444で「+ example.com +」に接続できます。

ssh testhost

ワイルドカードを使用して、複数のホストに一致させることもできます。 後のマッチが前のマッチを上書きする可能性があることに留意してください。 このため、最も一般的な試合を一番上に置く必要があります。 たとえば、ファイルにこれを含めることで、 `+ example.com +`をオーバーライドして、すべての接続をデフォルトでX転送を許可しないようにすることができます。

Host *
   ForwardX11 no

Host testhost
   HostName
   ForwardX11 yes
   Port
   User

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

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

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

この状況を回避するために、頻繁にサーバーにパケットを送信するようにクライアントを構成できます。

ローカルコンピューターでは、 `+〜/ .ssh / config +`ファイルを編集することにより、すべての接続に対してこれを設定できます。 今すぐ開く:

nano ~/.ssh/config

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

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`ファイルを開きます:

nano ~/.ssh/config

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

Host *
   StrictHostKeyChecking no
   UserKnownHostsFile /dev/null

他のホストのオプションを逆にすることにより、ケースバイケースでチェックを有効にできます。 `+ StrictHostKeyChecking +`のデフォルトは「ask」です:

Host *
   StrictHostKeyChecking no
   UserKnownHostsFile /dev/null

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

単一のTCP接続でのSSHの多重化

新しいTCP接続の確立には、予想よりも長い時間がかかる場合があります。 同じマシンに複数の接続を作成している場合、多重化を利用できます。

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

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

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

nano ~/.ssh/config

ファイルの先頭にワイルドカードホスト定義がまだない場合は、ここで追加します( + Host * +`として)。 多重化設定を確立するために、 `+ ControlMaster ++ ControlPath +、および `+ ControlPersist +`の値を設定します。

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

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

Host *
   ControlMaster auto
   ControlPath ~/.ssh/multiplex/%[email protected]%h:%p
   ControlPersist 1

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

mkdir ~/.ssh/multiplex

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

何らかの理由で一時的に多重化設定をバイパスする必要がある場合は、「+-S +」フラグに「none」を指定して渡すことができます。

ssh -S none @

SSHトンネルのセットアップ

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

サーバーへのローカルトンネリングの構成

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

ローカル接続は、リモートホストを介してローカルコンピューターからネットワークの場所にアクセスする方法です。 最初に、リモートホストへのSSH接続が確立されます。 リモートサーバーでは、ユーザーが提供する外部(または内部)ネットワークアドレスに接続され、この場所へのトラフィックは指定されたポートでローカルコンピューターにトンネリングされます。

これは、ファイアウォールをバイパスして、制限の少ないネットワーク環境にトンネリングするためによく使用されます。 もう1つの一般的な使用法は、リモートロケーションから「localhost専用」Webインターフェースにアクセスすることです。

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

  • トンネル接続にアクセスするローカルポート。

  • リモートホストに接続するホスト。

  • リモートホストが接続するポート。

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

たとえば、リモートホストのポート80で「+ example.com +」に接続し、ポート8888のローカルマシンで接続を使用可能にするには、次のように入力します。

ssh -f -N -L 8888:example.com:80 @

これで、ローカルWebブラウザで `127.0.0.1:8888 +`を指定すると、ポート80の ` example.com +`にあるコンテンツが表示されます。

構文のより一般的なガイドは次のとおりです。

ssh -L :: @

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

ps aux | grep
1001        0.0  0.0  48168  1136 ?        Ss   12:28   0:00 ssh -f -N -L 8888:example.com:80 [email protected]_host
1001      6113  0.0  0.0  13648   952 pts/2    S+   12:37   0:00 grep --colour=auto 8888

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

kill

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

サーバーへのリモートトンネリングの構成

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

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

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

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

  • リモートホストがトンネル接続にアクセスできるポート。

  • ローカルコンピューターを接続するホスト。

  • ローカルコンピューターを接続するポート。

これらは、 `+ -R `フラグの引数として、上記の順序で(コロンで区切られて)与えられます。 また、実行する前にSSHをバックグラウンドにする「 -f 」フラグと、シェルを開いたりリモート側でプログラムを実行したりしない「 -N +」フラグも使用します。

たとえば、ローカルコンピューターのポート80で「+ example.com +」に接続し、ポート8888のリモートホストで接続できるようにするには、次のように入力します。

ssh -f -N -R 8888:example.com:80 @

これで、リモートホストで、Webブラウザーを「127.0.0.1:8888」に開くと、ポート80の「+ example.com +」にあるコンテンツを表示できます。

構文のより一般的なガイドは次のとおりです。

ssh -R :: @

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

ps aux | grep
1001        0.0  0.0  48168  1136 ?        Ss   12:28   0:00 ssh -f -N -R 8888:example.com:80 [email protected]_host
1001      6113  0.0  0.0  13648   952 pts/2    S+   12:37   0:00 grep --colour=auto 8888

次に、SSHコマンドに一致する行の2番目の列の番号であるPIDをターゲットにすることにより、プロセスを強制終了できます。

kill

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

リモートサーバーへの動的トンネリングの構成

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

動的トンネルは、ローカルコンピューターがリモートホストを介して他のリソースに接続できるという点で、ローカルトンネルに似ています。 動的トンネルは、単一のローカルポートを指定するだけでこれを行います。 このポートをトンネリングに利用したいアプリケーションは、パケットをトンネルの反対側で正しくリダイレ​​クトできるように、SOCKSプロトコルを使用して通信できる必要があります。

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

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

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

ssh -f -N -D  @

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

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

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

ps aux | grep
1001        0.0  0.0  48168  1136 ?        Ss   12:28   0:00 ssh -f -N -D 7777 [email protected]_host
1001      6113  0.0  0.0  13648   952 pts/2    S+   12:37   0:00 grep --colour=auto 8888

次に、SSHコマンドに一致する行の2番目の列の番号であるPIDをターゲットにすることにより、プロセスを強制終了できます。

kill

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

SSHエスケープコードを使用して接続を制御する

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

クライアント側から強制的に切断する(スタックまたはフリーズしたセッションを終了する方法)

OpenSSHの最も有用な機能の1つは、ほとんど気付かれずに、セッションの特定の側面を内部から制御できることです。

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

最も有用な制御の1つは、クライアントからの切断を開始する機能です。 通常、SSH接続はサーバーによって閉じられますが、サーバーに問題がある場合、または接続が切断された場合、これは問題になる可能性があります。 クライアント側の切断を使用することにより、クライアントから接続をきれいに閉じることができます。

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

[ENTER]
~.

接続はすぐに閉じられ、ローカルシェルセッションに戻ります。

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

OpenSSHの最も有用な機能の1つは、ほとんど気付かれずに、接続内からセッションの特定の側面を制御する機能です。

これらのコマンドは、SSH接続内から「〜」制御文字で開始して実行できます。 制御コマンドは、改行の後に最初に入力されるものである場合にのみ解釈されるため、1つを使用する前に必ず1回または2回Enterキーを押してください。

これが提供する機能の1つは、SSHセッションをバックグラウンドにすることです。 これを行うには、制御文字(〜)を指定し、従来のキーボードショートカットを実行してタスクをバックグラウンドにする(CTRL-z)必要があります。

[ENTER]
~[CTRL-z]

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

次のように入力することにより、最新のバックグラウンドタスクをすぐに再アクティブ化できます。

fg

複数のバックグラウンドタスクがある場合は、次のように入力して使用可能なジョブを確認できます。

jobs
[1]+  Stopped                 ssh @
[2]   Stopped                 ssh @

次に、最初の列のインデックスにパーセント記号を付けて使用することにより、任意のタスクを前面に表示できます。

fg %2

既存のSSH接続のポート転送オプションの変更

OpenSSHの最も有用な機能の1つは、ほとんど気付かれずに、接続内からセッションの特定の側面を制御する機能です。

これらのコマンドは、SSH接続内から「〜」制御文字で開始して実行できます。 制御コマンドは、改行の後に最初に入力されるものである場合にのみ解釈されるため、1つを使用する前に必ず1回または2回Enterキーを押してください。

これが許可することの1つは、ユーザーが接続が既に確立された後にポート転送構成を変更することです。 これにより、オンザフライでポート転送ルールを作成または破棄できます。

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

[ENTER]
~C
ssh>

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

[ENTER]
~v
~v
~v
~C
-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

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

したがって、ローカルポート転送をセットアップするには、次のように入力します。

[ENTER]
~C
-L 8888:127.0.0.1:80

これで、ローカルコンピューターのポート8888が、接続しているホスト上のWebサーバーと通信できるようになります。 終了したら、次のように入力して、それを前方に分解できます。

[ENTER]
~C
-KL 8888

結論

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

前の投稿:Ubuntu 14.04でシングルユースSSHパスワードにOTPWをインストールして使用する方法
次の投稿:Ubuntu 16.04でRancherおよびDocker Machineを使用してマルチノード展開を管理する方法