紹介
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キーペアを生成するには、次のコマンドを入力します:
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
を押してください。ただし、これにより、誰かがあなたのプライベートキーを制御すると、サーバーにログインできるようになります。
パスフレーズを入力する場合は、入力中に何も表示されません。これはセキュリティ上の注意です。
OutputYour 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 保護目的で受け入れられない場合があります:
以前に異なるキーを作成していた場合、以前のキーを上書きするかどうかを尋ねられます:
Overwrite (y/n)?
「はい」を選択すると、以前のキーが上書きされ、そのキーを使用してサーバーにログインできなくなります。そのため、キーを慎重に上書きしてください。
プライベートキーのパスフレーズを削除または変更する
プライベートキーにパスフレーズを生成し、それを変更または削除したい場合は、簡単に行うことができます。
注意: パスフレーズを変更または削除するには、元のパスフレーズを知っている必要があります。 キーのパスフレーズを失った場合、救済措置はありません。新しいキーペアを生成する必要があります。
パスフレーズを変更または削除するには、単に次のように入力します:
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キーのフィンガープリントを見つけるには、次のように入力します:
Enter file in which the key is (/root/.ssh/id_rsa):
キーの正しい場所であれば、ENTER
を押すことができます。それ以外の場合は、修正された場所を入力します。キーのビット長、フィンガープリント、作成されたアカウントとホスト、使用されたアルゴリズムが含まれる文字列が表示されます。
Output4096 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パッケージに含まれているため、おそらくデフォルトでインストールされている可能性が非常に高いです。
このオプションがある場合は、次のように入力するだけで簡単に公開鍵を転送できます:
これにより、リモートシステムのユーザーアカウントのパスワードがプロンプトされます:
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
ファイルの末尾に追加されます。
OutputNumber 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-Copy-IDを使用せずにサーバーに公開SSHキーをコピーする方法
ssh-copy-id
ユーティリティが利用できない場合でも、リモートサーバーへのパスワードベースのSSHアクセスがある場合は、公開鍵の内容を異なる方法でコピーすることができます。
キーの内容を出力して、それをssh
コマンドにパイプで渡すことができます。リモート側では、~/.ssh
ディレクトリが存在することを確認し、その後、パイプで渡された内容を~/.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アクセスが利用できない場合は、公開鍵をリモートサーバーに手動で追加する必要があります。
ローカルマシンで、公開鍵ファイルの内容を次のように入力することで確認できます:
Outputssh-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
ディレクトリが存在しない場合は、作成します。
その後、次のように入力して、~/.ssh/authorized_keys
ファイルを作成または追記できます。
これでパスワードなしでリモートサーバーにログインできるようになります。
基本的な接続手順
以下のセクションでは、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
はい
と入力して、リモートホストの信頼性を承認します。
パスワード認証を使用している場合は、ここでリモートアカウントのパスワードを入力するように求められます。SSHキーを使用している場合は、プライベートキーのパスフレーズが設定されている場合にそれを入力するように求められます。それ以外の場合は、自動的にログインされます。
リモートサーバーで単一のコマンドを実行する
シェルセッションを起動する代わりにリモートサーバーで単一のコマンドを実行するには、接続情報の後にコマンドを追加します。以下のように:
これにより、リモートホストに接続し、資格情報で認証し、指定したコマンドを実行します。接続はその後すぐに閉じられます。
異なるポートでサーバーにログインする
サーバー上のSSHデーモンはデフォルトでポート22
で実行されます。SSHクライアントは、接続を試みるときにこれを前提とします。SSHサーバーが標準ポート以外でリスニングしている場合(後述のセクションでデモンストレーションされています)、クライアントで新しいポート番号を指定する必要があります。
ポート番号を指定してこれを行うことができます-p
オプションを使用します。
毎回リモートサーバーにログインするたびにこれを行う必要がないようにするには、ローカルコンピューターのホームディレクトリ内の~/.ssh
ディレクトリに構成ファイルを作成または編集できます。
次のように入力して、ファイルを編集または作成します:
ここでは、ホスト固有の構成オプションを設定できます。新しいポートを指定するには、次のような形式を使用します:
Host remote_alias
HostName remote_host
Port port_num
これにより、コマンドラインで特定のポート番号を指定せずにログインできるようになります。
SSHキーをSSHエージェントに追加してパスフレーズの入力を回避する
プライベートSSHキーにパスフレーズが設定されている場合、リモートホストに接続するたびにパスフレーズの入力を求められます。
これを繰り返し行う必要を回避するために、SSHエージェントを実行できます。この小さなユーティリティは、最初にパスフレーズを入力した後、プライベートキーを保存します。このため、ターミナルセッションの間は利用可能であり、将来的にパスフレーズを再入力せずに接続できます。
これは、SSH資格情報を転送する必要がある場合にも重要です(後で説明します)。
SSHエージェントを起動するには、ローカルのターミナルセッションに次のように入力します:
OutputAgent pid 10891
エージェントプログラムを開始してバックグラウンドに配置します。次に、プライベートキーをエージェントに追加して、キーを管理できるようにします:
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
オプションを使用して最初のサーバーに接続する必要があります。これにより、このセッションのために資格情報がサーバーに転送されます:
ここから、SSHキーがアクセスを許可されている他のホストにSSHできます。プライベートSSHキーがこのサーバーにあるかのように接続されます。
サーバーサイドの構成オプション
このセクションには、サーバーが応答する方法や許可される接続の種類を形成することができる一般的なサーバーサイドの設定オプションが含まれています。
パスワード認証の無効化
SSHキーが構成され、テストされ、正常に動作している場合、パスワード認証を無効にするのは良い考えです。これにより、ユーザーがパスワードを使用してSSHにサインインすることが防止されます。
これを行うには、リモートサーバーに接続し、rootまたはsudo特権を持って/etc/ssh/sshd_config
ファイルを開きます:
ファイルの中で、PasswordAuthentication
ディレクティブを検索します。コメントアウトされている場合は、コメントを外します。パスワードログインを無効にするには、no
に設定します:
PasswordAuthentication no
変更を保存してファイルを閉じたら、SSHサービスを再起動して変更を実装する必要があります。
Ubuntu/Debianの場合:
CentOS/Fedoraの場合:
これで、システム上のすべてのアカウントはSSHを使用してパスワードでログインできなくなります。
SSHデーモンの実行ポートの変更
一部の管理者は、SSHが実行されるデフォルトのポートを変更することを提案しています。これにより、自動化されたボットからの認証試行の数を減らすのに役立つ場合があります。
SSHデーモンがリッスンするポートを変更するには、リモートサーバーにログインする必要があります。ルート特権を持つsshd_config
ファイルをリモートシステムで開きます。そのユーザーでログインするか、sudo
を使用してください:
内部に入ると、SSHが実行されるポートを変更できます。 Port 22
の指定を見つけて、使用したいポートを反映するように変更します。たとえば、ポートを4444
に変更するには、次のようにファイルに入力します:
#Port 22
Port 4444
終了したら、ファイルを保存して閉じます。変更を実装するには、SSHデーモンを再起動する必要があります。
Ubuntu/Debianの場合:
CentOS/Fedoraの場合:
デーモンが再起動すると、ポート番号を指定して認証する必要があります(前述のセクションで示されています)。
SSHを介して接続できるユーザーの制限
SSHを介してログインできるユーザーアカウントを明示的に制限するには、いくつかの異なるアプローチを取ることができます。それぞれがSSHデーモン構成ファイルを編集することを含みます。
リモートサーバーで、ルートまたはsudo特権を使用してこのファイルを開いてください。
最初の方法は、ログインが許可されるアカウントを指定することです。これにはAllowUsers
ディレクティブを使用します。ファイル内でAllowUsers
ディレクティブを検索します。存在しない場合は、任意の場所に作成します。ディレクティブの後に、SSHを介してログインが許可されるユーザーアカウントをリストアップします:
AllowUsers user1 user2
ファイルを保存して閉じます。変更を実装するためにデーモンを再起動します。
Ubuntu/Debianの場合:
CentOS/Fedoraの場合:
グループ管理に慣れている場合は、代わりにAllowGroups
ディレクティブを使用できます。その場合、単一のグループを追加してSSHアクセスを許可します(このグループを作成し、メンバーを追加します):
AllowGroups sshmembers
ファイルを保存して閉じます。
これで、指定したグループと一致するシステムグループ(ホームディレクトリなし)を作成できます。次のように入力してください:
必要なユーザーアカウントをこのグループに追加してください。次のように入力します:
変更を実装するためにSSHデーモンを再起動します。
Ubuntu/Debianの場合:
CentOS/Fedoraの場合:
ルートログインの無効化
SSHユーザーアカウントにsudo
特権を持たせた後、SSHを介したルートログインを完全に無効にすることが良いことがよくあります。
これを行うには、リモートサーバーでルートまたはsudoでSSHデーモンの設定ファイルを開きます。
内部で、PermitRootLogin
というディレクティブを検索します。コメントアウトされている場合は、コメントを外します。値を「no」に変更してください。
PermitRootLogin no
ファイルを保存して閉じます。変更を実装するには、SSHデーモンを再起動します。
Ubuntu/Debianの場合:
CentOS/Fedoraの場合:
特定のコマンドのルートアクセスを許可する
一般的にルートアクセスを無効にしたいが、特定のアプリケーションが正しく実行されるようにするためには、ルートアクセスを有効にしたい場合があります。これの例として、バックアップルーチンがあります。
これは、rootユーザーのauthorized_keys
ファイルを介して実行できます。このファイルには、アカウントを使用する許可が与えられたSSHキーが含まれています。
このプロセスに使用するローカルコンピュータのキー(自動プロセスごとに新しいキーを作成することをお勧めします)を、サーバーのrootユーザーのauthorized_keys
ファイルに追加します。ここではssh-copy-id
コマンドを使用してデモを行いますが、他のセクションで説明するキーをコピーする方法のいずれでも使用できます。
次に、リモートサーバーにログインします。 authorized_keys
ファイルのエントリを調整する必要があるため、rootまたはsudoアクセスで開きます。
最初の行に、アップロードしたキーに対して有効なコマンドを定義する command=
リストを追加してください。これには、実行可能ファイルへの完全なパスと、任意の引数が含まれる必要があります:
command="/path/to/command arg1 arg2" ssh-rsa ...
作業が完了したら、ファイルを保存して閉じてください。
次に、rootまたはsudo特権で sshd_config
ファイルを開いてください:
PermitRootLogin
ディレクティブを探し、値を forced-commands-only
に変更してください。これにより、SSHキーログインがルートを使用する場合は、キーに対してコマンドが指定されているときのみ許可されます:
PermitRootLogin forced-commands-only
ファイルを保存して閉じてください。変更を実装するためにSSHデーモンを再起動してください。
Ubuntu/Debianの場合:
CentOS/Fedoraの場合:
Xアプリケーションの表示をクライアントに転送する
SSHデーモンは、サーバー上のXアプリケーションの表示をクライアントマシンに自動的に転送するように構成できます。これを正しく機能させるには、クライアントにXウィンドウシステムが構成されて有効にされている必要があります。
この機能を有効にするには、リモートサーバーにログインし、rootまたはsudo特権で sshd_config
ファイルを編集してください:
X11Forwarding
ディレクティブを検索してください。コメントアウトされている場合は、コメントを外してください。必要に応じて作成し、値を “yes” に設定してください。
X11Forwarding yes
ファイルを保存して閉じてください。これらの変更を実装するためにSSHデーモンを再起動します。
Ubuntu/Debianの場合:
CentOS/Fedoraの場合:
サーバーに接続してアプリケーションのディスプレイを転送するには、クライアントから接続時に-X
オプションを渡す必要があります:
このセッションでサーバーで開始されたグラフィカルアプリケーションは、ローカルコンピューターに表示されます。パフォーマンスは少し遅いかもしれませんが、緊急時に非常に役立ちます。
クライアント側の構成オプション
次のセクションでは、接続のクライアント側で行うことができる調整に焦点を当てます。
サーバー固有の接続情報の定義
ローカルコンピューターでは、接続するサーバーのいくつかまたはすべての個別の構成を定義できます。これらは、SSHクライアントが呼び出されるたびに読み取られる~/.ssh/config
ファイルに保存できます。
このファイルをローカルコンピューターのテキストエディターで作成または開きます:
内部では、Host
キーワードで各構成オプションを定義し、それに続けてエイリアスを指定します。これに続いてインデントされた部分では、ssh_config
マニュアルページで見つかる任意のディレクティブを定義できます。
構成例は次のとおりです:
Host testhost
HostName your_domain
Port 4444
User demo
次のようにして、単に入力することで、ポート 4444
を使用してユーザー名 demo
で your_domain
に接続できます:
複数のホストに一致させるにはワイルドカードも使用できます。ただし、後の一致が先行するものを上書きできることに注意してください。このため、最も一般的な一致をトップに配置する必要があります。たとえば、次のようにファイルにこれを記述することで、すべての接続を X フォワーディングを許可しないようにデフォルトにし、your_domain
のオーバーライドを設定できます:
Host *
ForwardX11 no
Host testhost
HostName your_domain
ForwardX11 yes
Port 4444
User demo
編集が終了したら、ファイルを保存して閉じます。
タイムアウトを回避するために接続を維持する
SSH セッションから切断される前に準備ができていない場合は、接続がタイムアウトしている可能性があります。
この状況を回避するためにクライアントが定期的にサーバーにパケットを送信するように設定できます:
ローカルコンピューターで、すべての接続に対してこれを設定するには、~/.ssh/config
ファイルを編集します。今すぐ開いてください。
ファイルの先頭に存在しない場合は、すべてのホストに一致するセクションを定義します。 ServerAliveInterval
を「120」に設定して、2分ごとにサーバーにパケットを送信します。 これでサーバーに接続を閉じないように通知するのに十分です。
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
ファイルを開きます。
ファイルの先頭に存在しない場合は、すべてのホストに一致するセクションを定義します。 StrictHostKeyChecking
ディレクティブを no
に設定して、新しいホストを自動的に known_hosts
ファイルに追加します。 UserKnownHostsFile
を /dev/null
に設定して、新しいまたは変更されたホストに警告を表示しないようにします。
Host *
StrictHostKeyChecking no
UserKnownHostsFile /dev/null
各ホストの場合によっては、オプションを逆にしてチェックを有効にすることができます。 StrictHostKeyChecking
のデフォルトは ask
です:
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クライアントの設定ファイルを編集します:
ファイルの先頭にワイルドカードホスト定義がまだない場合は、今すぐ追加してください(Host *
として)。ControlMaster
、ControlPath
、および ControlPersist
の値を設定して、多重化構成を確立します。
ControlMaster
を「auto」に設定すると、可能な場合に自動的に多重化が許可されます。 ControlPath
は制御ソケットへのパスを確立します。 最初のセッションでこのソケットを作成し、以降のセッションはユーザー名、ホスト、およびポートでラベル付けされているため、それを見つけることができます。
ControlPersist
オプションを1
に設定すると、初期のマスター接続をバックグラウンドで実行できます。 1
は、最後のSSHセッションが閉じられてから1秒後にTCP接続が自動的に終了することを指定します:
Host *
ControlMaster auto
ControlPath ~/.ssh/multiplex/%r@%h:%p
ControlPersist 1
作業が完了したら、ファイルを保存して閉じます。 続いて、制御パスで指定したディレクトリを実際に作成する必要があります:
これで、同じマシンとのセッションが確立されると、既存のソケットとTCP接続を使用しようとします。 最後のセッションが終了すると、接続は1秒後に切断されます。
一時的に多重化構成をバイパスする必要がある場合は、-S
フラグとnone
を渡すことで行うことができます:
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で利用できるようにするには、次のように入力します:
これで、ローカルウェブブラウザを127.0.0.1:8888
に向けると、ポート80
のyour_domain
の内容が表示されるはずです。
A more general guide to the syntax is:
接続はバックグラウンドで行われているため、それを終了させるにはそのPIDを見つける必要があります。ポートを転送した場合は、そのPIDを検索して見つけることができます。
Output1001 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を対象にプロセスを終了させることができます。
別のオプションは、-f
フラグを使用せずに接続を開始することです。これにより、接続は前景で保持され、転送の期間中にターミナルウィンドウを使用できなくなります。これの利点は、トンネルを簡単に終了できることです。CTRL-C
を入力することでトンネルを終了できます。
サーバーへのリモートトンネリングの設定
SSH接続は、ローカルホストのポートからリモートホストのポートへのトラフィックのトンネリングに使用できます。
リモートトンネルでは、リモートホストに接続が行われます。トンネルの作成中に、リモートポートが指定されます。このポートは、その後、リモートホスト上のポートであり、ローカルコンピューターから接続されるホストとポートの組み合わせにトンネリングされます。これにより、リモートコンピューターがローカルコンピューターを介してホストにアクセスできるようになります。
これは、外部接続にロックされた内部ネットワークへのアクセスを許可する必要がある場合に便利です。ファイアウォールがネットワークからの接続を許可する場合、これによりリモートマシンに接続して、そのマシンから内部ネットワークの場所にトラフィックをトンネリングすることができます。
リモートサーバーへのリモートトンネルを確立するには、接続時に-R
パラメータを使用し、さらに3つの追加情報を提供する必要があります:
- リモートホストがトンネル接続にアクセスできるポート。
- ローカルコンピューターが接続したいホスト。
- ローカルコンピューターが接続したいポート。
これらは、-R
フラグの引数として、上記の順序で(コロンで区切られて)指定されます。 また、-f
フラグと-N
フラグも使用します。これにより、SSHがバックグラウンドで実行され、シェルが開かれないか、リモート側でプログラムが実行されません。
たとえば、ローカルコンピューターのポート80でyour_domain
に接続し、接続をリモートホストのポート8888
で利用可能にするには、次のように入力します:
これで、リモートホストでウェブブラウザーを127.0.0.1:8888
に開くと、ポート80
のyour_domain
のコンテンツが表示されます。
A more general guide to the syntax is:
接続がバックグラウンドであるため、そのPIDを見つけて終了する必要があります。 これは、転送したポートを検索してPIDを見つけることで行うことができます:
Output1001 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(番号)をターゲットにしてプロセスを終了できます。
別のオプションは、-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
でトンネルを確立するには、次のように入力できます:
ここから、SOCKS対応のアプリケーション(Webブラウザなど)を選択したポートに向けてポイントを始めることができます。アプリケーションは、ポートに関連付けられたソケットに情報を送信します。
トラフィックをSOCKSポートに向ける方法は、アプリケーションによって異なります。例えば、Firefoxでは、一般的な場所は「設定」>「詳細」>「設定」>「手動プロキシの設定」です。Chromeでは、アプリケーションを--proxy-server=
フラグを設定して起動できます。localhost インターフェースと転送したポートを使用する必要があります。
接続がバックグラウンドで行われているため、それを終了させるにはそのPIDを見つける必要があります。転送したポートを検索して、そのプロセスを終了できます。
Output1001 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をターゲットにしてプロセスを終了できます。
別のオプションは、-f
フラグなしで接続を開始することです。これにより、接続が前景で維持され、転送の間、ターミナルウィンドウを使用できなくなります。これの利点は、トンネルを簡単にCTRL-C
で終了できることです。
SSHエスケープコードを使用した接続の制御
SSHセッションを確立した後も、ターミナル内から接続を制御することができます。これはSSHエスケープコードと呼ばれるものを使用して行います。これにより、セッション内からローカルのSSHソフトウェアとやり取りできます。
クライアント側からの切断(スタックまたはフリーズしたセッションからの退出方法)
OpenSSHの最も便利な機能の1つは、内部から特定のセッションの側面を制御できる能力です。
これらのコマンドは、SSHセッション内で~
制御文字で開始して実行できます。 コントロールコマンドは、改行後に最初に入力されたものである場合にのみ解釈されますので、常に1回または2回ENTERキーを押してから使用してください。
最も便利なコントロールの1つは、クライアントからの切断を開始できる能力です。 SSH接続は通常、サーバーによって閉じられますが、サーバーに問題がある場合や接続が切断されている場合に問題が発生する可能性があります。 クライアント側の切断を使用することで、接続をクリーンにクライアントから閉じることができます。
クライアントからの接続を閉じるには、コントロール文字(~
)に続けてドットを使用します。 接続に問題がある場合、スタックした端末セッションのように見えることがあります。 フィードバックがなくてもコマンドを入力して、クライアント側からの切断を実行します:
接続が即座に閉じられ、ローカルのシェルセッションに戻ります。
SSHセッションをバックグラウンドに配置する
OpenSSHの中でほとんど気付かれていない便利な機能の1つは、接続内部からセッションの特定の側面を制御できる能力です。
これらのコマンドは、SSH接続内部から~
制御文字で始まるように実行できます。制御コマンドは、改行後に入力される最初のものである場合にのみ解釈されるため、常に1回または2回ENTER
キーを押してから使用してください。
これにより提供される機能の1つは、SSHセッションをバックグラウンドに配置することです。これを行うには、制御文字(~
)を指定し、次に通常のキーボードショートカットでタスクをバックグラウンドに送ります(CTRL-z):
これにより、接続がバックグラウンドに配置され、ローカルのシェルセッションに戻ります。SSHセッションに戻るには、通常のジョブ制御メカニズムを使用できます。
最近バックグラウンドに配置されたタスクをすぐに再アクティブ化するには、次のように入力します:
複数のバックグラウンドに配置されたタスクがある場合、利用可能なジョブを確認するには次のように入力します:
Output[1]+ Stopped ssh username@some_host
[2] Stopped ssh username@another_host
その後、最初の列のインデックスとパーセンテージ記号を使用して、任意のタスクをフォアグラウンドに持ってこれます:
既存のSSH接続でポート転送オプションを変更する方法
OpenSSHの最も便利な機能の1つは、接続内部からセッションの特定の側面を制御できる能力です。
これらのコマンドは、SSH接続内部から~
制御文字を使って実行できます。 制御コマンドは、新しい行の直後に入力された場合のみ解釈されますので、使用する前に常に ENTER キーを1回または2回押してください。
これにより、接続がすでに確立された後でも、ユーザーがポート転送の構成を変更できるようになります。 これにより、ポート転送ルールをリアルタイムで作成または解除できます。
これらの機能はSSHコマンドラインインターフェースの一部であり、制御文字(~
)と「C」を使用してセッション中にアクセスできます。
ssh>
SSHコマンドプロンプトが表示されます。 有効なコマンドは非常に限られています。 使用可能なオプションを表示するには、このプロンプトから-h
を入力します。 何も返されない場合は、~v
を数回使用してSSH出力の詳細度を上げる必要があるかもしれません。
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
コマンドを使用できます。これにはポートのみを指定する必要があります。
したがって、ローカルポートフォワードを設定するには、次のように入力します:
ローカルコンピューターのポート8888
は、接続先のホストのWebサーバーと通信できるようになります。終了時に、その転送を解除するには、次のように入力します:
結論
上記の手順は、ほとんどのユーザーがSSHについて日常的に必要とする情報をカバーするはずです。他のヒントがある場合や、お気に入りの構成や方法を共有したい場合は、以下のコメントをご利用ください。