SSHEssentials:SSHサーバー、クライアント、およびキーの操作
序章
SSHは、Linuxサーバーにリモートで接続するための主要な手段として使用される安全なプロトコルです。 リモートシェルを生成することにより、テキストベースのインターフェイスを提供します。 接続後、ローカル端末に入力したすべてのコマンドがリモートサーバーに送信され、そこで実行されます。
このチートシートスタイルガイドでは、SSHに接続して目的を達成するための一般的な方法をいくつか取り上げます。 これは、さまざまな方法でサーバーに接続または構成する方法を知る必要がある場合のクイックリファレンスとして使用できます。
このガイドの使用方法
- SSH全般に慣れていない場合、または始めたばかりの場合は、最初にSSHの概要セクションをお読みください。
- 達成しようとしていることに該当する後続のセクションを使用してください。 ほとんどのセクションは他のセクションを前提としていないため、次の例を個別に使用できます。
- このページの左側にある[コンテンツ]メニュー(ページ幅が広い場合)またはブラウザの検索機能を使用して、必要なセクションを見つけます。
- 与えられたコマンドラインの例をコピーして貼り付け、
highlighted
あなた自身の値を持つ値。
SSHの概要
リモートLinuxサーバーに接続する最も一般的な方法は、SSHを使用することです。 SSHはSecureShellの略で、コマンドを実行し、変更を加え、サービスをリモートで構成するための安全で安全な方法を提供します。 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
パスフレーズが必要ない場合は、これを空白のままにします。 ただし、これにより、秘密鍵を制御できる人は誰でもサーバーにログインできるようになることに注意してください。
パスフレーズの入力を選択した場合、入力時に何も表示されません。 これはセキュリティ上の予防措置です。
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+ |
+-----------------+
この手順により、RSASSHキーペアが生成されました。 .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
それがキーの正しい場所である場合は、修正された場所を入力します。 キーのビット長、フィンガープリント、およびキーが作成されたアカウントとホスト、および使用されたアルゴリズムを含む文字列が提供されます。
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
ユーティリティがインストールされている場合、これは簡単なプロセスです。 The ssh-copy-id
ツールは多くのLinuxディストリビューションのOpenSSHパッケージに含まれているため、デフォルトでインストールされる可能性が非常に高くなります。
このオプションがある場合は、次のように入力して公開鍵を簡単に転送できます。
- 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
ファイル:
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 username@remote_host
SSH-Copy-IDを使用せずに公開SSHキーをサーバーにコピーする
お持ちでない場合 ssh-copy-id
ユーティリティは利用可能ですが、リモートサーバーへのパスワードベースのSSHアクセスがあり、公開鍵の内容を別の方法でコピーできます。
キーの内容を出力して、パイプにパイプすることができます ssh
指図。 リモート側では、次のことを確認できます ~/.ssh
ディレクトリが存在し、パイプされたコンテンツをに追加します ~/.ssh/authorized_keys
ファイル:
- 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:
パスワードを入力すると、キーがコピーされ、パスワードなしでログインできるようになります。
- ssh username@remote_IP_host
パブリックSSHキーをサーバーに手動でコピーする
パスワードベースのSSHアクセスを利用できない場合は、公開鍵をリモートサーバーに手動で追加する必要があります。
ローカルマシンで、次のように入力して公開鍵ファイルの内容を見つけることができます。
- cat ~/.ssh/id_rsa.pub
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
ディレクトリがまだ存在しない場合:
- mkdir -p ~/.ssh
その後、作成または追加できます ~/.ssh/authorized_keys
次のように入力してファイルを作成します。
- echo public_key_string >> ~/.ssh/authorized_keys
これで、パスワードなしでリモートサーバーにログインできるようになります。
基本的な接続手順
次のセクションでは、SSHを使用してサーバーに接続する方法に関する基本事項について説明します。
リモートサーバーへの接続
リモートサーバーに接続してそこでシェルセッションを開くには、 ssh
指図。
最も単純な形式は、ローカルマシンのユーザー名がリモートサーバーのユーザー名と同じであることを前提としています。 これが当てはまる場合は、次を使用して接続できます。
- ssh remote_host
リモートサーバーでユーザー名が異なる場合は、次のようにリモートユーザーの名前を渡す必要があります。
- 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
タイプ yes
リモートホストの信頼性を受け入れるため。
パスワード認証を使用している場合は、ここでリモートアカウントのパスワードの入力を求められます。 SSHキーを使用している場合、秘密キーのパスフレーズが設定されている場合はそのパスフレーズの入力を求められます。設定されていない場合は、自動的にログインします。
リモートサーバーでの単一コマンドの実行
シェルセッションを生成する代わりに、リモートサーバーで単一のコマンドを実行するには、次のように接続情報の後にコマンドを追加します。
- ssh username@remote_host command_to_run
これにより、リモートホストに接続し、資格情報で認証され、指定したコマンドが実行されます。 その後、接続はすぐに閉じられます。
別のポートでサーバーにログインする
デフォルトでは、サーバー上のSSHデーモンはポートで実行されます 22
. SSHクライアントは、接続を試みるときにこれが当てはまると想定します。 SSHサーバーが非標準ポートでリッスンしている場合(これについては後のセクションで説明します)、クライアントに接続するときに新しいポート番号を指定する必要があります。
これを行うには、ポート番号を -p
オプション:
- ssh -p port_num username@remote_host
リモートサーバーにログインするたびにこれを行う必要がないように、で構成ファイルを作成または編集できます。 ~/.ssh
ローカルコンピュータのホームディレクトリ内のディレクトリ。
次のように入力して、ファイルを編集または作成します。
- nano ~/.ssh/config
ここでは、ホスト固有の構成オプションを設定できます。 新しいポートを指定するには、次のような形式を使用します。
Host remote_alias
HostName remote_host
Port port_num
これにより、コマンドラインで特定のポート番号を指定せずにログインできるようになります。
パスフレーズの入力を回避するためのSSHエージェントへのSSHキーの追加
SSH秘密鍵にパスフレーズがある場合、リモートホストに接続するためにパスフレーズを使用するたびに、パスフレーズを入力するように求められます。
これを繰り返し行う必要がないように、SSHエージェントを実行できます。 この小さなユーティリティは、パスフレーズを初めて入力した後に秘密鍵を保存します。 ターミナルセッション中は利用可能であり、将来、パスフレーズを再入力せずに接続できます。
これは、SSHクレデンシャル(後で表示)を転送する必要がある場合にも重要です。
SSH Agentを起動するには、ローカルターミナルセッションに次のように入力します。
- eval $(ssh-agent)
OutputAgent 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 username@remote_host
ここから、SSHキーがアクセスを許可されている他のホストにSSHで接続できます。 秘密のSSHキーがこのサーバーにあるかのように接続します。
サーバー側の構成オプション
このセクションには、サーバーの応答方法と許可される接続の種類を形作ることができる、いくつかの一般的なサーバー側の構成オプションが含まれています。
パスワード認証の無効化
SSHキーが構成され、テストされ、正しく機能している場合は、パスワード認証を無効にすることをお勧めします。 これにより、ユーザーがパスワードを使用してSSHでサインインできなくなります。
これを行うには、リモートサーバーに接続し、 /etc/ssh/sshd_config
rootまたはsudo権限を持つファイル:
- 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デーモンがリッスンするポートを変更するには、リモートサーバーにログインする必要があります。 を開きます sshd_config
そのユーザーでログインするか、を使用して、root権限を持つリモートシステム上のファイル sudo
:
- sudo nano /etc/ssh/sshd_config
中に入ると、SSHが実行されているポートを変更できます。 Port 22
仕様を変更し、使用するポートを反映するように変更します。 たとえば、ポートをに変更するには 4444
、これをファイルに入れます:
#Port 22
Port 4444
終了したら、ファイルを保存して閉じます。 変更を実装するには、SSHデーモンを再起動する必要があります。
Ubuntu / Debianの場合:
- sudo service ssh restart
CentOS / Fedoraの場合:
- sudo service sshd restart
デーモンが再起動した後、ポート番号を指定して認証する必要があります(前のセクションで説明しました)。
SSH経由で接続できるユーザーの制限
SSHを介してログインできるユーザーアカウントを明示的に制限するには、いくつかの異なるアプローチをとることができます。それぞれのアプローチには、SSHデーモン構成ファイルの編集が含まれます。
リモートサーバーで、rootまたはsudo権限でこのファイルを今すぐ開きます。
- sudo nano /etc/ssh/sshd_config
ログインを許可するアカウントを指定する最初の方法は、 AllowUsers
指令。 を検索します AllowUsers
ファイル内のディレクティブ。 存在しない場合は、どこかに作成してください。 ディレクティブの後に、SSH経由でのログインを許可する必要があるユーザーアカウントをリストします。
AllowUsers user1 user2
ファイルを保存して閉じます。 デーモンを再起動して、変更を実装します。
Ubuntu / Debianの場合:
- sudo service ssh restart
CentOS / Fedoraの場合:
- sudo service sshd restart
グループ管理に慣れている場合は、 AllowGroups
代わりにディレクティブ。 この場合は、SSHアクセスを許可する必要がある単一のグループを追加するだけです(このグループを作成し、メンバーを一時的に追加します)。
AllowGroups sshmembers
ファイルを保存して閉じます。
これで、次のように入力して、指定したグループに一致するシステムグループ(ホームディレクトリなし)を作成できます。
- sudo groupadd -r sshmembers
このグループには、必要なユーザーアカウントを必ず追加してください。 これは、次のように入力することで実行できます。
- sudo usermod -a -G sshmembers user1
- sudo usermod -a -G sshmembers user2
ここで、SSHデーモンを再起動して変更を実装します。
Ubuntu / Debianの場合:
- sudo service ssh restart
CentOS / Fedoraの場合:
- sudo service sshd restart
ルートログインの無効化
多くの場合、次のようなSSHユーザーアカウントを設定した後、SSHを介したrootログインを完全に無効にすることをお勧めします。 sudo
特権。
これを行うには、リモートサーバーで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キーを含むファイル。
このプロセスに使用するローカルコンピューターのキーをrootユーザーに追加します(自動プロセスごとに新しいキーを作成することをお勧めします)。 authorized_keys
サーバー上のファイル。 でデモンストレーションします ssh-copy-id
ここでコマンドを実行しますが、他のセクションで説明するキーをコピーする方法のいずれかを使用できます。
- ssh-copy-id root@remote_host
次に、リモートサーバーにログインします。 のエントリを調整する必要があります authorized_keys
ファイルなので、rootまたはsudoアクセスで開きます。
- sudo nano /root/.ssh/authorized_keys
アップロードしたキーの行の先頭に、 command=
このキーが有効なコマンドを定義するリスト。 これには、実行可能ファイルへのフルパスと引数が含まれている必要があります。
command="/path/to/command arg1 arg2" ssh-rsa ...
終了したら、ファイルを保存して閉じます。
今、開きます sshd_config
rootまたはsudo権限を持つファイル:
- sudo nano /etc/ssh/sshd_config
ディレクティブを探す PermitRootLogin
、および値をに変更します forced-commands-only
. これにより、キーにコマンドが指定されている場合にのみ、SSHキーログインでrootを使用できるようになります。
PermitRootLogin forced-commands-only
ファイルを保存して閉じます。 SSHデーモンを再起動して、変更を実装します。
Ubuntu / Debianの場合:
- sudo service ssh restart
CentOS / Fedoraの場合:
- sudo service sshd restart
Xアプリケーションディスプレイをクライアントに転送する
SSHデーモンは、サーバー上のXアプリケーションの表示をクライアントマシンに自動的に転送するように構成できます。 これが正しく機能するには、クライアントでXWindowsシステムが構成および有効化されている必要があります。
この機能を有効にするには、リモートサーバーにログインして、 sshd_config
rootまたはsudo権限を持つファイル:
- 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 username@remote_host
このセッションを通じてサーバー上で開始されたグラフィカルアプリケーションは、ローカルコンピューターに表示される必要があります。 パフォーマンスは少し遅いかもしれませんが、ピンチで非常に役立ちます。
クライアント側の構成オプション
次のセクションでは、接続のクライアント側で実行できるいくつかの調整に焦点を当てます。
サーバー固有の接続情報の定義
ローカルコンピューターでは、接続するサーバーの一部またはすべてに対して個別の構成を定義できます。 これらはに保存することができます ~/.ssh/config
ファイル。SSHクライアントが呼び出されるたびに読み取られます。
このファイルを作成するか、ローカルコンピューターのテキストエディターで開きます。
- nano ~/.ssh/config
内部では、それぞれに導入することにより、個々の構成オプションを定義できます。 Host
キーワードの後にエイリアスが続きます。 この下にインデントされて、で見つかったディレクティブのいずれかを定義できます。 ssh_config
マニュアルページ:
- man ssh_config
構成例は次のとおりです。
Host testhost
HostName your_domain
Port 4444
User demo
その後、に接続できます your_domain
ポートで 4444
ユーザー名を使用する demo
次のように入力するだけです。
- ssh testhost
ワイルドカードを使用して、複数のホストを照合することもできます。 後の一致が前の一致を上書きする可能性があることに注意してください。 このため、最も一般的な試合を一番上に置く必要があります。 たとえば、すべての接続をデフォルトでX転送を許可しないようにするには、 your_domain
これをファイルに含めることによって:
Host *
ForwardX11 no
Host testhost
HostName your_domain
ForwardX11 yes
Port 4444
User demo
終了したら、ファイルを保存して閉じます。
タイムアウトを回避するために接続を維持する
準備が整う前にSSHセッションから切断されていることに気付いた場合は、接続がタイムアウトしている可能性があります。
この状況を回避するために、サーバーにパケットを頻繁に送信するようにクライアントを構成できます。
ローカルコンピューターでは、編集することにより、すべての接続に対してこれを構成できます。 ~/.ssh/config
ファイル。 今すぐ開く:
- nano ~/.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
ローカルコンピュータ上のファイル:
- nano ~/.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接続を再利用します。 これにより、新しいセッションを確立するために必要な作業の一部が削除され、場合によっては処理が高速化されます。 接続数を制限すると、他の理由でも役立つ場合があります。
多重化を設定するには、接続を手動で設定するか、使用可能な場合に多重化を自動的に使用するようにクライアントを構成できます。 ここでは、2番目のオプションを示します。
多重化を構成するには、ローカルマシンでSSHクライアントの構成ファイルを編集します。
- nano ~/.ssh/config
ファイルの先頭にワイルドカードホスト定義がまだない場合は、ここでワイルドカードホスト定義を追加します( Host *
). 設定します ControlMaster
, ControlPath
、 と ControlPersist
多重化構成を確立するための値。
The ControlMaster
可能であれば、多重化を自動的に許可できるように、「自動」に設定する必要があります。 The ControlPath
制御ソケットへのパスを確立します。 最初のセッションでこのソケットが作成され、ユーザー名、ホスト、およびポートでラベル付けされているため、後続のセッションでソケットを見つけることができます。
の設定 ControlPersist
オプション 1
最初のマスター接続をバックグラウンドで実行できるようになります。 The 1
最後のSSHセッションが閉じられてから1秒後にTCP接続が自動的に終了するように指定します。
Host *
ControlMaster auto
ControlPath ~/.ssh/multiplex/%r@%h:%p
ControlPersist 1
終了したら、ファイルを保存して閉じます。 次に、制御パスで指定したディレクトリを実際に作成する必要があります。
- mkdir ~/.ssh/multiplex
これで、同じマシンで確立されたセッションはすべて、既存のソケットとTCP接続を使用しようとします。 最後のセッションが存在する場合、接続は1秒後に切断されます。
何らかの理由で多重化構成を一時的にバイパスする必要がある場合は、 -S
フラグ none
:
- ssh -S none username@remote_host
SSHトンネルの設定
安全なSSHトンネルを介して他のトラフィックをトンネリングすることは、制限のあるファイアウォール設定を回避するための優れた方法です。 また、暗号化されていないネットワークトラフィックを暗号化するための優れた方法でもあります。
サーバーへのローカルトンネリングの構成
SSH接続を使用して、ローカルホストのポートからリモートホストのポートにトラフィックをトンネリングできます。
ローカル接続は、ローカルコンピューターからリモートホストを介してネットワークの場所にアクセスする方法です。 まず、リモートホストへのSSH接続が確立されます。 リモートサーバーでは、ユーザーが指定した外部(または内部)ネットワークアドレスに接続され、この場所へのトラフィックは、指定されたポートでローカルコンピューターにトンネリングされます。
これは、ファイアウォールをバイパスすることにより、制限の少ないネットワーク環境にトンネリングするためによく使用されます。 もう1つの一般的な使用法は、リモートロケーションから「ローカルホストのみ」のWebインターフェイスにアクセスすることです。
リモートサーバーへのローカルトンネルを確立するには、 -L
接続時のパラメータであり、3つの追加情報を提供する必要があります。
- トンネル接続にアクセスするローカルポート。
- リモートホストを接続するホスト。
- リモートホストを接続するポート。
これらは、上記の順序で(コロンで区切られて)、引数として与えられます。 -L
国旗。 また、 -f
フラグ。これにより、SSHは実行前にバックグラウンドに移行します。 -N
フラグ。シェルを開いたり、リモート側でプログラムを実行したりしません。
たとえば、に接続するには your_domain
リモートホストのポート80で、ポート8888のローカルマシンで接続を利用できるようにするには、次のように入力します。
- ssh -f -N -L 8888:your_domain:80 username@remote_host
ここで、ローカルWebブラウザをポイントすると 127.0.0.1:8888
、コンテンツが何であれ表示されます your_domain
ポートで 80
.
構文のより一般的なガイドは次のとおりです。
- ssh -L your_port:site_or_IP_to_access:site_port username@host
接続はバックグラウンドで行われるため、接続を切断するにはPIDを見つける必要があります。 転送したポートを検索することで、これを行うことができます。
- ps aux | grep 8888
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をターゲットにして、プロセスを強制終了できます。
- kill 5965
別のオプションは、なしで接続を開始することです。 -f
国旗。 これにより、接続がフォアグラウンドに保たれ、転送中にターミナルウィンドウを使用できなくなります。 これの利点は、入力することでトンネルを簡単に殺すことができることです CTRL-C
.
サーバーへのリモートトンネリングの構成
SSH接続を使用して、ローカルホストのポートからリモートホストのポートにトラフィックをトンネリングできます。
リモートトンネルでは、リモートホストへの接続が確立されます。 トンネルの作成中に、リモートポートが指定されます。 次に、リモートホスト上のこのポートは、ローカルコンピューターから接続されているホストとポートの組み合わせにトンネリングされます。 これにより、リモートコンピューターがローカルコンピューターを介してホストにアクセスできるようになります。
これは、外部接続にロックダウンされている内部ネットワークへのアクセスを許可する必要がある場合に役立ちます。 ファイアウォールがネットワークの接続outを許可している場合、これにより、リモートマシンに接続し、そのマシンから内部ネットワーク上の場所にトラフィックをトンネリングできます。
リモートサーバーへのリモートトンネルを確立するには、 -R
接続時のパラメータであり、3つの追加情報を提供する必要があります。
- リモートホストがトンネル接続にアクセスできるポート。
- ローカルコンピューターを接続するホスト。
- ローカルコンピューターを接続するポート。
これらは、上記の順序で(コロンで区切られて)、引数として与えられます。 -R
国旗。 また、 -f
フラグ。これにより、SSHは実行前にバックグラウンドに移行します。 -N
フラグ。シェルを開いたり、リモート側でプログラムを実行したりしません。
たとえば、に接続するには your_domain
ローカルコンピュータのポート80で、ポートのリモートホストで接続を利用できるようにします 8888
、次のように入力できます。
- ssh -f -N -R 8888:your_domain:80 username@remote_host
次に、リモートホストで、Webブラウザを開いて 127.0.0.1:8888
どんなコンテンツでも見ることができます your_domain
ポートで 80
.
構文のより一般的なガイドは次のとおりです。
- ssh -R remote_port:site_or_IP_to_access:site_port username@host
接続はバックグラウンドで行われるため、接続を切断するにはPIDを見つける必要があります。 転送したポートを検索することで、これを行うことができます。
- ps aux | grep 8888
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をターゲットにして、プロセスを強制終了できます。
- kill 5965
別のオプションは、なしで接続を開始することです。 -f
国旗。 これにより、接続がフォアグラウンドに保たれ、転送中にターミナルウィンドウを使用できなくなります。 これの利点は、入力することでトンネルを簡単に殺すことができることです CTRL-C
.
リモートサーバーへの動的トンネリングの構成
SSH接続を使用して、ローカルホストのポートからリモートホストのポートにトラフィックをトンネリングできます。
動的トンネルは、ローカルコンピュータがリモートホストを介して
このローカルポートに渡されるトラフィックは、リモートホストに送信されます。 そこから、SOCKSプロトコルが解釈され、目的の終了位置への接続が確立されます。 この設定により、SOCKS対応のアプリケーションは、複数の静的トンネルを使用せずに、リモートサーバーを介して任意の数の場所に接続できます。
接続を確立するために、 -D
トンネルにアクセスしたいローカルポートと一緒にフラグを立てます。 また、 -f
フラグ。これにより、SSHは実行前にバックグラウンドに移行します。 -N
フラグ。シェルを開いたり、リモート側でプログラムを実行したりしません。
たとえば、ポートにトンネルを確立するには 7777
、次のように入力できます。
- ssh -f -N -D 7777 username@remote_host
ここから、SOCKS対応アプリケーション(Webブラウザーなど)を選択したポートにポイントすることができます。 アプリケーションは、その情報をポートに関連付けられたソケットに送信します。
トラフィックをSOCKSポートに転送する方法は、アプリケーションによって異なります。 たとえば、Firefoxでは、一般的な場所は[設定]>[詳細]>[設定]>[手動プロキシ構成]です。 Chromeでは、次のコマンドでアプリケーションを起動できます --proxy-server=
フラグが設定されました。 転送したローカルホストインターフェイスとポートを使用することをお勧めします。
接続はバックグラウンドで行われるため、接続を切断するにはPIDを見つける必要があります。 転送したポートを検索することで、これを行うことができます。
- ps aux | grep 8888
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をターゲットにして、プロセスを強制終了できます。
- kill 5965
別のオプションは、なしで接続を開始することです。 -f
国旗。 これにより、接続がフォアグラウンドに保たれ、転送中にターミナルウィンドウを使用できなくなります。 これの利点は、入力することでトンネルを簡単に殺すことができることです CTRL-C
.
SSHエスケープコードを使用した接続の制御
SSHセッションを確立した後でも、端末内から接続を制御することができます。 これは、SSHエスケープコードと呼ばれるものを使用して行うことができます。これにより、セッション内からローカルSSHソフトウェアと対話できます。
クライアント側からの強制的な切断(スタックまたはフリーズしたセッションを終了する方法)
ほとんど気付かれることのないOpenSSHの最も便利な機能の1つは、セッションの特定の側面を内部から制御する機能です。
これらのコマンドは、 ~
SSHセッション内の制御文字。 制御コマンドは、改行の後に最初に入力されたものである場合にのみ解釈されるため、使用する前に必ずEnterキーを1回または2回押してください。
最も便利なコントロールの1つは、クライアントからの切断を開始する機能です。 SSH接続は通常、サーバーによって閉じられますが、サーバーで問題が発生している場合、または接続が切断されている場合は、これが問題になる可能性があります。 クライアント側の切断を使用することにより、接続をクライアントからきれいに閉じることができます。
クライアントからの接続を閉じるには、制御文字(~
)、ドット付き。 接続に問題がある場合は、ターミナルセッションがスタックしているように見える可能性があります。 クライアント側の切断を実行するためのフィードバックがないにもかかわらず、コマンドを入力します。
- [ENTER]
- ~.
接続はすぐに閉じられ、ローカルシェルセッションに戻ります。
SSHセッションをバックグラウンドに配置する
ほとんど気付かれることのないOpenSSHの最も便利な機能の1つは、接続内からセッションの特定の側面を制御する機能です。
これらのコマンドは、 ~
SSH接続内からの制御文字。 制御コマンドは、改行の後に最初に入力されたものである場合にのみ解釈されるため、常にを押します。 ENTER
1つを使用する前に1〜2回。
これが提供する機能の1つは、SSHセッションをバックグラウンドに置くことです。 これを行うには、制御文字を指定する必要があります(~
)次に、従来のキーボードショートカットを実行して、タスクをバックグラウンドで実行します(CTRL-z)。
- [ENTER]
- ~[CTRL-z]
これにより、接続がバックグラウンドに配置され、ローカルシェルセッションに戻ります。 SSHセッションに戻るには、従来のジョブ制御メカニズムを使用できます。
次のように入力すると、最新のバックグラウンドタスクをすぐに再度アクティブにできます。
- fg
バックグラウンドタスクが複数ある場合は、次のように入力して利用可能なジョブを確認できます。
- jobs
Output[1]+ Stopped ssh username@some_host
[2] Stopped ssh username@another_host
次に、パーセント記号の付いた最初の列のインデックスを使用して、任意のタスクを前面に表示できます。
- fg %2
既存のSSH接続でのポート転送オプションの変更
ほとんど気付かれることのないOpenSSHの最も便利な機能の1つは、接続内からセッションの特定の側面を制御する機能です。
これらのコマンドは、 ~
SSH接続内からの制御文字。 制御コマンドは、改行の後に最初に入力されたものである場合にのみ解釈されるため、使用する前に必ずEnterキーを1回または2回押してください。
これにより、接続がすでに確立された後でユーザーがポート転送構成を変更できるようになります。 これにより、ポート転送ルールをオンザフライで作成または破棄できます。
これらの機能はSSHコマンドラインインターフェイスの一部であり、セッション中に制御文字を使用してアクセスできます(~
)および「C」:
- [ENTER]
- ~C
ssh>
有効なコマンドのセットが非常に限られているSSHコマンドプロンプトが表示されます。 利用可能なオプションを表示するには、次のように入力します -h
このプロンプトから。 何も返されない場合は、次を使用してSSH出力の詳細度を上げる必要があります。 ~v
何回か:
- [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に関して必要とする情報の大部分をカバーしているはずです。 他のヒントがある場合、またはお気に入りの構成と方法を共有したい場合は、以下のコメントを使用してください。