LinuxVPSでSSHデーモン構成を調整する方法
序章
SSHは、コマンドラインを介してリモートのLinuxおよびUnixライクなサーバーに接続するための主要な方法です。 これは、コマンドの実行、システムとの対話、さらには無関係のトラフィックのトンネリングに使用できる安全な接続を提供します。
ほとんどのユーザーは、開始方法の基本と、次のようなコマンドを使用してリモートサーバーに接続する方法を知っています。
ssh username @ remote_server
ただし、SSHデーモンの構成には、セキュリティの強化、ユーザー接続の管理などに役立つオプションが他にもたくさんあります。 SSHアクセスをよりきめ細かく制御するために利用できるいくつかのオプションについて説明します。
これらの概念をUbuntu12.04VPSインスタンスでデモしますが、最新のLinuxディストリビューションも同様に機能するはずです。
SSHD構成ファイルの調査
SSHデーモン自体の主な構成ソースは、/etc/ssh/sshd_config
ファイルにあります。 これは、クライアント側のデフォルトを指定するssh_config
ファイルとは異なることに注意してください。
管理者権限で今すぐファイルを開きます。
sudo nano /etc/ssh/sshd_config
かなりの数のオプションと、うまくいけば(ディストリビューションによっては)多くのコメントが含まれたファイルが表示されます。 ほとんどのディストリビューションは、適切なデフォルトを確立するのにかなり良い仕事をしていますが、改善とカスタマイズの余地があります。
Ubuntu12.04のファイルにすでに設定されているオプションのいくつかを見てみましょう。
ポートとプロトコル
- ポート22:これはSSHデーモンが接続を探すポートを指定します。 デフォルトでは、ほとんどのクライアントとサーバーはポート22で動作しますが、これを別のポートに変更すると、悪意のあるユーザーによる「ドライブバイ」SSHログイン試行の量を減らすことができる可能性があります。
- プロトコル2:SSHは2つのプロトコルバージョンを使用しています。 プロトコル1でのみ動作できるクライアントを特にサポートする必要がない限り、これはそのままにしておくことをお勧めします。
キーと分離
- HostKey / etc / ssh / ssh_host…:これらの行は、サーバーのホストキーを指定します。 これらのキーは、接続しているクライアントに対してサーバーを識別するために使用されます。 クライアントが過去にサーバーとすでに通信している場合は、このキーを使用して新しい接続を検証できます。
- UsePrivilegeSeparation yes :このオプションを使用すると、SSHは、タスクに必要な特権のみを持つ子プロセスを生成できます。 これは、セキュリティが悪用された場合にプロセスを分離するための安全機能です。
- KeyRegenerationIntervalおよびServerKeyBits:これらのオプションは、SSHプロトコル1用に生成されるサーバーキーに影響します。 接続がプロトコル2に準拠することを要求する場合は、これについて心配する必要はありません。
ロギングと制限
- SyslogFacilityおよびLogLevel:これらのオプションは、アクティビティのログ記録方法を指定します。 最初のオプションはメッセージをログに記録するためのファシリティコード用であり、2番目のオプションはログレベルまたは詳細の量をログに記録するように指示します。
- LoginGraceTime 120 :これは、ログインが成功しなかった場合にサーバーがクライアントから切断するまで待機する秒数を示します。
- PermitRootLogin yes :このオプションは、rootアカウントを使用したSSH機能を許可または拒否します。 ルートアカウントは、攻撃者がサーバーマシンに存在することを知っているアカウントであり、マシンへの無制限のアクセスを提供するため、多くの場合、標的を絞ったアカウントです。 sudo権限で通常のユーザーアカウントを構成したら、これを「no」に設定することをお勧めします。
- StrictModes yes :これはSSHに、正しい権限を持たないユーザーレベルの構成ファイルを無視するように指示します。 ユーザーが構成ファイルを誰でも読み取り可能に設定した場合、これにはセキュリティ上の影響があります。 これが修正されるまで、アクセスを拒否する方が安全です。
- IgnoreRhostsおよびRhostsRSAAuthentication:これらは、rhostスタイルの認証を受け入れるかどうかを指定します。 これはプロトコル1の構文であり、プロトコル2には適用されません。
- HostbasedAuthentication no :これは上記のプロトコル2バージョンです。 基本的に、これにより、接続しているクライアントのホストに基づく認証が可能になります。 ソース情報をスプーフィングする可能性があるため、これは通常、隔離された環境でのみ受け入れられます。 ホスト情報は、
/etc/ssh/shosts.equiv
ファイルまたは/etc/hosts.equiv
ファイルのいずれかで指定できます。 これは、このガイドの範囲外です。 - PermitEmptyPasswords no :このオプションは、パスワード認証が許可されている場合に、パスワードを持たないアカウントのSSHアクセスを制限します。 これは大きなセキュリティリスクになる可能性があり、ほとんど変更しないでください。
- ChallengeResponseAuthentication :この行は、PAMを介して構成できるチャレンジ/レスポンス認証タイプを有効または無効にします。 これは、このガイドの範囲外です。
画面
- X11Forwarding yes :これにより、サーバー上のアプリケーションのX11グラフィカルユーザーインターフェイスをクライアントマシンに転送できます。 これは、サーバー上でグラフィカルプログラムを起動し、クライアント上でそれと対話できることを意味します。 クライアントには、Xウィンドウシステムが利用可能である必要があります。 これらはOSXにインストールでき、デスクトップLinuxにはこの機能があります。
- X11DisplayOffset 10 :これはX11転送のsshd表示番号のオフセットです。 このオフセットにより、SSHによって生成されたX11ウィンドウが既存のXサーバーとの衝突を回避できます。
- PrintMotd no :これは、SSHデーモン自体がその日のメッセージファイルを読み取って表示してはならないことを指定します。 ただし、これはシェル自体によって読み取られることがあるため、シェル設定ファイルも変更する必要がある場合があります。
- PrintLastLog yes :これはSSHデーモンに最後にログインしたときの情報を出力するように指示します。
接続と環境
- TCPKeepAlive yes :これはTCPキープアライブメッセージをクライアントマシンに送信するかどうかを指定します。 これは、サーバーが問題が発生したときに接続が切断されることを認識するのに役立ちます。 このオプションを無効にすると、ネットワークに短時間の問題が発生しても接続が切断されません。これは良いことですが、ユーザーが切断されてリソースをロックし続ける可能性もあります。
- AcceptEnv LANG LC * _:このオプションを使用すると、クライアントマシンから特定の環境変数を受け入れることができます。 この特定の例では、言語変数を受け入れています。これは、シェルセッションがクライアントに対して適切に表示されるのに役立ちます。
- サブシステムsftp/usr / lib / openssh / sftp-server :これはSSHで使用できる外部サブシステムを構成します。 この例では、SFTPサーバーとそれを実行するためのパスを指定します。
- UsePAM yes :これは、ユーザーの認証を支援するためにPAM(Pluggable Authentication Modules)が使用可能になることを指定します。
これにより、Ubuntu12.04マシンでデフォルトで有効になっているオプションが処理されます。 次に、設定または変更するのに役立つ可能性のある他のいくつかのオプションについて説明しましょう。
その他のSSHDオプション
SSHデーモンに設定できるオプションは他にもたくさんあります。 これらの中には、すぐに役立つものもあれば、特定の状況でのみ役立つものもあります。 ここではすべてのオプションについて説明するわけではありませんが、有用なオプションのいくつかについて説明します。
ユーザーとグループのフィルタリング
一部のオプションでは、SSHを介してログインできるユーザーを正確に制御できます。 これらのオプションは、相互に排他的であると見なす必要があります。 たとえば、AllowUsers
オプションは、他のすべてのユーザーがアクセスを拒否されることを意味します。
- AllowGroups :このオプションを使用すると、サーバー上のグループの名前を指定できます。 これらのグループのいずれかのメンバーであるユーザーのみがログインできます。 これにより、アクセスが必要なグループのホワイトリストが作成されます。
- AllowUsers :これは上記のオプションに似ていますが、ログインを許可される特定のユーザーを指定します。 このリストにないユーザーはログインできなくなります。 これは、ユーザーのホワイトリストとして機能します。
- DenyGroups :このオプションは、システムへのログインを許可されるべきではないグループのブラックリストを設定します。 これらのグループに属するユーザーはアクセスを許可されません。
- DenyUsers :これはユーザーのブラックリストです。 SSH経由でログインするためのアクセス権をどのユーザーに付与してはならないかを具体的に指定します。
さらに、利用可能な他のいくつかの制限オプションがあります。 これらは、上記のオプションのいずれかと組み合わせて使用できます。
- Match :このオプションを使用すると、誰がどのような状況で認証できるかをよりきめ細かく制御できます。 特定のユーザーまたはグループが接続するときに使用する必要があるさまざまなオプションのセットを指定します。 これについては後で詳しく説明します。
- RevokedKeys :これにより、取り消された公開鍵のリストを指定できます。 これにより、リストされたキーがシステムへのログインに使用されなくなります。
その他のオプション
SSHデーモンが注意を払うネットワークトラフィックを構成するために使用できるオプションがいくつかあります。
- AddressFamily :このオプションは、接続を受け入れるアドレスの種類を指定します。 デフォルトでは、値は「any」ですが、IPv4アドレスの場合は「inet」、IPv6アドレスの場合は「inet6」を配置できます。
- ListenAddress :このオプションを使用すると、SSHデーモンに特定のアドレスとポートでリッスンするように指示できます。 デフォルトでは、デーモンはこのマシン用に構成されているすべてのアドレスをリッスンします。
使用可能な他のタイプのオプションは、証明書ベースの認証のセットアップに使用されるオプション、ClientAliveCountMax
やClientAliveInterval
などの接続制限オプション、およびChrootDirectory
などのオプションです。 ]。これを使用して、ログインしているユーザーを特定の事前構成されたchroot環境にロックできます。
ユーザーログインの制限
ユーザーとグループへのアクセスを制限するために必要なツールのいくつかについては、上記で説明しました。 ここでもう少し詳しく見ていきましょう。
これらを使用するための最も基本的な構文は次のようなものです。
AllowUsers demouser fakeuser madeupuser
ご覧のとおり、これらの各ディレクティブで、スペースで区切られた複数のユーザーを指定できます。
ワイルドカードを使用してエントリを無効にすることもできます。 たとえば、ユーザー「john」以外のすべてのユーザーにログインを許可したい場合は、次のように試すことができます。
AllowUsers * !john
この特定の例は、おそらくDenyUsers
行でより適切に表現されます。
DenyUsers john
?
文字を使用して、1つの文字と完全に一致させることもできます。 たとえば、次のように使用できます。
AllowUsers ?im
これにより、「tim」、「jim」、「vim」などのアカウントからのログインが可能になります。
ただし、より具体的にすることができます。 どちらのユーザー仕様でも、ログインを特定のクライアントソースの場所に制限するために、フォームuser@hostname
を使用できます。 たとえば、次のようにすることができます。
AllowUsers [email protected] fakeuser
これにより、「fakeuser」はどこからでもログインできますが、「demouser」は特定のホストからのみログインできます。
TCPラッパーを介して、sshd_config
ファイルの外部でホストごとにアクセスを制限することもできます。 これは、/etc/hosts.allow
および/etc/hosts.deny
ファイルを介して構成されます。
たとえば、hosts.allow
ファイルに次のような行を追加することで、SSHトラフィックに特に基づいてアクセスを制限できます。
sshd: .example.com
hosts.deny
ファイルに次のようなコンパニオン行があると仮定します。
sshd: ALL
これにより、ログインはexample.com
またはサブドメインからのログインに制限されます。
一致オプションを使用して例外を追加する
「一致」オプションを使用すると、オプションをさらに制御できます。 一致オプションは、次のオプションを適用するかどうかを決定する基準パターンを指定することで機能します。
Match
オプションを使用して一致を開始し、基準のキーと値のペアを指定します。 使用可能なキーは、「ユーザー」、「グループ」、「ホスト」、および「アドレス」です。 条件はスペースで区切り、パターン(user1、user2)はコンマで区切ることができます。 ワイルドカードと否定を使用することもできます。
Match User !demouser,!fakeuser Group sshusers Host *.example.com
上記の行は、ユーザーがdemouser
またはfakeuser
でない場合、ユーザーがグループsshusers
のメンバーである場合、およびそれらがexample.com
またはサブドメインから接続しています。
「アドレス」基準では、CIDRネットマスク表記を使用できます。
Match
仕様に従うオプションが条件付きで適用されます。 これらの条件付きオプションの範囲は、ファイルの終わりまで、または次の一致する仕様までです。 このため、デフォルト値をファイルの上部に配置し、例外を下部に配置することをお勧めします。
この条件付きブロックのため、一致の下のオプションは、上記の一致でのみ適用されることを示すためにインデントされることがよくあります。 たとえば、上記の条件では、次のようにその下にブロックを含めることができます。
Match User !demouser,!fakeuser Group sshusers Host *.example.com AuthorizedKeysFile /sshusers/keys/%u PasswordAuthentication yes X11Forwarding X11DisplayOffset 15
一致仕様を処理する場合は、オプションのサブセットにのみアクセスできます。 完全なリストを表示するには、sshd_config
のマニュアルページを確認してください。
man sshd_config
「一致」セクションを検索して、使用可能なオプションのリストを確認してください。
結論
ご覧のとおり、SSHのサーバー側で多くの値を調整して、ユーザーのログイン機能とエクスペリエンスの品質に影響を与えることができます。 エラーをキャッチし、制限が誤って少なすぎたり多すぎたりするユーザーに影響を与えていないことを確認するために、大規模な実装の前に変更を注意深くテストしてください。
/etc/ssh/sshd_config
ファイルに精通することは、サーバーへのアクセスを注意深く制御する方法を理解するための優れた最初のステップです。 これは、Linuxシステム管理者にとって重要なスキルです。