序章
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+ | +-----------------+
この手順により、ユーザーのホームディレクトリ内の.ssh
隠しディレクトリにあるRSASSHキーペアが生成されました。 これらのファイルは次のとおりです。
~/.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
ユーティリティがインストールされている場合、これは簡単なプロセスです。 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
ここでは、ホスト固有の構成オプションを設定できます。 新しいポートを指定するには、次のような形式を使用します。
〜/ .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でサインインできなくなります。
これを行うには、リモートサーバーに接続し、rootまたはsudo権限で/etc/ssh/sshd_config
ファイルを開きます。
sudo nano /etc/ssh/sshd_config
ファイル内で、PasswordAuthentication
ディレクティブを検索します。 コメントアウトされている場合は、コメントを外します。 パスワードログインを無効にするには、no
に設定します。
/ etc / ssh / sshd_config
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
に変更するには、次のファイルをファイルに追加します。
/ etc / ssh / sshd_config
#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経由でのログインを許可する必要があるユーザーアカウントをリストします。
/ etc / ssh / sshd_config
AllowUsers user1 user2
ファイルを保存して閉じます。 デーモンを再起動して、変更を実装します。
Ubuntu / Debianの場合:
sudo service ssh restart
CentOS / Fedoraの場合:
sudo service sshd restart
グループ管理に慣れている場合は、代わりにAllowGroups
ディレクティブを使用できます。 この場合は、SSHアクセスを許可する必要がある単一のグループを追加するだけです(このグループを作成し、メンバーを一時的に追加します)。
/ etc / ssh / sshd_config
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
ルートログインの無効化
sudo
権限を持つSSHユーザーアカウントを設定した後、SSHを介したルートログインを完全に無効にすることをお勧めします。
これを行うには、リモートサーバーでrootまたはsudoを使用してSSHデーモン構成ファイルを開きます。
sudo nano /etc/ssh/sshd_config
内部で、PermitRootLogin
というディレクティブを検索します。 コメントされている場合は、コメントを外します。 値を「no」に変更します。
/ etc / ssh / sshd_config
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=
リストを追加します。 これには、実行可能ファイルへのフルパスと引数が含まれている必要があります。
/root/.ssh/authorized_keys
command="/path/to/command arg1 arg2" ssh-rsa ...
終了したら、ファイルを保存して閉じます。
次に、rootまたはsudo権限でsshd_config
ファイルを開きます。
sudo nano /etc/ssh/sshd_config
ディレクティブPermitRootLogin
を見つけて、値をforced-commands-only
に変更します。 これにより、キーにコマンドが指定されている場合にのみ、SSHキーログインでrootを使用できるようになります。
/ etc / ssh / sshd_config
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」に設定します。
/ etc / ssh / sshd_config
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
構成例は次のとおりです。
〜/ .ssh / config
Host testhost HostName your_domain Port 4444 User demo
次に、次のように入力するだけで、ユーザー名demo
を使用して、ポート4444
のyour_domain
に接続できます。
ssh testhost
ワイルドカードを使用して、複数のホストを照合することもできます。 後の一致が前の一致を上書きする可能性があることに注意してください。 このため、最も一般的な試合を一番上に置く必要があります。 たとえば、ファイルにこれを含めることで、your_domain
をオーバーライドして、すべての接続をデフォルトでX転送を許可しないようにすることができます。
〜/ .ssh / config
Host * ForwardX11 no Host testhost HostName your_domain ForwardX11 yes Port 4444 User demo
終了したら、ファイルを保存して閉じます。
タイムアウトを回避するために接続を維持する
準備が整う前にSSHセッションから切断されていることに気付いた場合は、接続がタイムアウトしている可能性があります。
この状況を回避するために、サーバーにパケットを頻繁に送信するようにクライアントを構成できます。
ローカルコンピューターでは、~/.ssh/config
ファイルを編集することにより、接続ごとにこれを構成できます。 今すぐ開く:
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
ファイルを開きます。
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接続を再利用します。 これにより、新しいセッションを確立するために必要な作業の一部が削除され、場合によっては処理が高速化されます。 接続数を制限すると、他の理由でも役立つ場合があります。
多重化を設定するには、接続を手動で設定するか、使用可能な場合に多重化を自動的に使用するようにクライアントを構成できます。 ここでは、2番目のオプションを示します。
多重化を構成するには、ローカルマシンでSSHクライアントの構成ファイルを編集します。
nano ~/.ssh/config
ファイルの先頭にワイルドカードホスト定義がまだない場合は、ここで追加します(Host *
として)。 ControlMaster
、ControlPath
、およびControlPersist
の値を設定して、多重化構成を確立します。
ControlMaster
は、可能であれば自動的に多重化できるように「自動」に設定する必要があります。 ControlPath
は、制御ソケットへのパスを確立します。 最初のセッションでこのソケットが作成され、ユーザー名、ホスト、およびポートでラベル付けされているため、後続のセッションでソケットを見つけることができます。
ControlPersist
オプションを1
に設定すると、最初のマスター接続をバックグラウンドで実行できるようになります。 1
は、最後のSSHセッションが閉じられてから1秒後にTCP接続が自動的に終了するように指定しています。
/.ssh/config
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
フラグの引数として、上記の順序(コロンで区切られている)で指定されます。 また、SSHを実行する前にバックグラウンドに移行させる-f
フラグと、シェルを開いたりリモート側でプログラムを実行したりしない-N
フラグを使用します。
たとえば、リモートホストのポート80でyour_domain
に接続し、ポート8888のローカルマシンで接続を利用できるようにするには、次のように入力します。
ssh -f -N -L 8888:your_domain:80 username@remote_host
これで、ローカルWebブラウザで127.0.0.1:8888
を指定すると、ポート80
のyour_domain
にあるコンテンツが表示されます。
構文のより一般的なガイドは次のとおりです。
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
もう1つのオプションは、-f
フラグなしで接続を開始することです。 これにより、接続がフォアグラウンドに保たれ、転送中にターミナルウィンドウを使用できなくなります。 これの利点は、CTRL-C
と入力することでトンネルを簡単に強制終了できることです。
サーバーへのリモートトンネリングの構成
SSH接続を使用して、ローカルホストのポートからリモートホストのポートにトラフィックをトンネリングできます。
リモートトンネルでは、リモートホストへの接続が確立されます。 トンネルの作成中に、リモートポートが指定されます。 次に、リモートホスト上のこのポートは、ローカルコンピューターから接続されているホストとポートの組み合わせにトンネリングされます。 これにより、リモートコンピューターがローカルコンピューターを介してホストにアクセスできるようになります。
これは、外部接続にロックダウンされている内部ネットワークへのアクセスを許可する必要がある場合に役立ちます。 ファイアウォールがネットワークの接続outを許可している場合、これにより、リモートマシンに接続し、そのマシンから内部ネットワーク上の場所にトラフィックをトンネリングできます。
リモートサーバーへのリモートトンネルを確立するには、接続時に-R
パラメーターを使用する必要があり、次の3つの追加情報を提供する必要があります。
- リモートホストがトンネル接続にアクセスできるポート。
- ローカルコンピューターを接続するホスト。
- ローカルコンピューターを接続するポート。
これらは、-R
フラグの引数として、上記の順序(コロンで区切られている)で指定されます。 また、SSHを実行する前にバックグラウンドに移行させる-f
フラグと、シェルを開いたりリモート側でプログラムを実行したりしない-N
フラグを使用します。
たとえば、ローカルコンピューターのポート80でyour_domain
に接続し、ポート8888
のリモートホストで接続を利用できるようにするには、次のように入力します。
ssh -f -N -R 8888:your_domain:80 username@remote_host
これで、リモートホストで、Webブラウザを127.0.0.1:8888
に開くと、ポート80
のyour_domain
にあるコンテンツを確認できます。
構文のより一般的なガイドは次のとおりです。
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
もう1つのオプションは、-f
フラグなしで接続を開始することです。 これにより、接続がフォアグラウンドに保たれ、転送中にターミナルウィンドウを使用できなくなります。 これの利点は、CTRL-C
と入力することでトンネルを簡単に強制終了できることです。
リモートサーバーへの動的トンネリングの構成
SSH接続を使用して、ローカルホストのポートからリモートホストのポートにトラフィックをトンネリングできます。
動的トンネルは、ローカルコンピュータがリモートホストを介して他のリソースに接続できるという点でローカルトンネルに似ています。 動的トンネルは、単一のローカルポートを指定するだけでこれを実行します。 トンネリングにこのポートを利用したいアプリケーションは、パケットがトンネルの反対側で正しくリダイレクトされるように、SOCKSプロトコルを使用して通信できる必要があります。
このローカルポートに渡されるトラフィックは、リモートホストに送信されます。 そこから、SOCKSプロトコルが解釈され、目的の終了位置への接続が確立されます。 この設定により、SOCKS対応のアプリケーションは、複数の静的トンネルを使用せずに、リモートサーバーを介して任意の数の場所に接続できます。
接続を確立するために、トンネルにアクセスするローカルポートとともに-D
フラグを渡します。 また、SSHを実行する前にバックグラウンドに移行させる-f
フラグと、シェルを開いたりリモート側でプログラムを実行したりしない-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
もう1つのオプションは、-f
フラグなしで接続を開始することです。 これにより、接続がフォアグラウンドに保たれ、転送中にターミナルウィンドウを使用できなくなります。 これの利点は、CTRL-C
と入力することでトンネルを簡単に強制終了できることです。
SSHエスケープコードを使用した接続の制御
SSHセッションを確立した後でも、端末内から接続を制御することができます。 これは、SSHエスケープコードと呼ばれるものを使用して行うことができます。これにより、セッション内からローカルSSHソフトウェアと対話できます。
クライアント側からの強制的な切断(スタックまたはフリーズしたセッションを終了する方法)
ほとんど気付かれることのないOpenSSHの最も便利な機能の1つは、セッションの特定の側面を内部から制御する機能です。
これらのコマンドは、SSHセッション内の~
制御文字から実行できます。 制御コマンドは、改行の後に最初に入力されたものである場合にのみ解釈されるため、使用する前に必ずEnterキーを1回または2回押してください。
最も便利なコントロールの1つは、クライアントからの切断を開始する機能です。 SSH接続は通常、サーバーによって閉じられますが、サーバーで問題が発生している場合、または接続が切断されている場合は、これが問題になる可能性があります。 クライアント側の切断を使用することにより、接続をクライアントからきれいに閉じることができます。
クライアントからの接続を閉じるには、ドット付きの制御文字(~
)を使用します。 接続に問題がある場合は、ターミナルセッションがスタックしているように見える可能性があります。 クライアント側の切断を実行するためのフィードバックがないにもかかわらず、コマンドを入力します。
[ENTER] ~.
接続はすぐに閉じられ、ローカルシェルセッションに戻ります。
SSHセッションをバックグラウンドに配置する
ほとんど気付かれることのないOpenSSHの最も便利な機能の1つは、接続内からセッションの特定の側面を制御する機能です。
これらのコマンドは、SSH接続内から~
制御文字で開始して実行できます。 制御コマンドは、改行の後に最初に入力されたものである場合にのみ解釈されるため、使用する前に必ずENTER
を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
と入力します。 何も返されない場合は、~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に関して必要とする情報の大部分をカバーしているはずです。 他のヒントがある場合、またはお気に入りの構成と方法を共有したい場合は、以下のコメントを使用してください。