TL; DR-答えの一番下にある「制限の適用」
制限されたユーザーの追加は、2つの部分で構成されます。1.ユーザーの作成2. SSHデーモン(sshd)の構成
sshdの構成
SSHの可能性を知るのに最適な場所は、関連するマニュアルページを読むことです。
SSHクライアントはどこでアクションを実行できますか?
何かを制限する前に、SSHの機能を知る必要があります。マニュアルページを表示すると、
- シェルコマンドの実行
- sftpを介したファイルのアップロード
- ポート転送
- クライアントは、使用されていないポートをサーバーに転送します
- サーバーは自分のポートをクライアントに転送します
- サーバーは別のホストのポートをクライアントに転送します(プロキシー様)
- X11転送(ディスプレイ転送)
- 認証エージェントの転送
- トンネルデバイスの転送
sshd(8)のマニュアルページのAuthenticationセクションから:
クライアントが自身の認証に成功すると、セッションを準備するためのダイアログが表示されます。この時点で、クライアントは、疑似ttyの割り当て、X11接続の転送、TCP接続の転送、または安全なチャネルを介した認証エージェント接続の転送などを要求
できます。
この後、クライアントはシェルまたはコマンドの実行を要求します。その後、両サイドはセッションモードに入ります。このモードでは、どちらの側もいつでもデータを送信でき、そのようなデータはサーバー側のシェルまたはコマンド、およびクライアント側のユーザー端末との間で転送されます。
SSH機能を制限するためのオプション
動作を変更するファイルとそのオプションは次のとおりです。
~/.ssh/authorized_keys
-オプションを与えることができる接続を許可されているキーが含まれています:
command="command"
-ユーザーが提供したコマンド(ある場合)は無視されます。クライアントが明示的に禁止されていない限り、クライアントはTCPおよび/またはX11転送を指定することに注意してください。このオプションは、シェル、コマンド、またはサブシステムの実行に適用されることに注意してください。
no-agent-forwarding
-このキーが認証に使用される場合、認証エージェントの転送を禁止します。
no-port-forwarding
-このキーが認証に使用される場合、TCP転送を禁止します
no-X11-forwarding
-「このキーが認証に使用されている場合、X11転送を禁止します。」
permitopen="host:port"
-指定されたホストとポートにのみ接続できるように、ローカルの「ssh -L」ポート転送を制限します。
~/.ssh/environment
-このファイルは、ログイン時に環境に読み込まれます(存在する場合)。環境処理はデフォルトで無効になっており、PermitUserEnvironmentオプションを介して制御されます
~/.ssh/rc
-ユーザーのホームディレクトリにアクセス可能になる前に実行される初期化ルーチンが含まれています。
/etc/ssh/sshd_config
-システム全体の構成ファイル
AllowAgentForwarding
-ssh-agent(1)転送が許可されるかどうかを指定します。
AllowTcpForwarding
ForceCommand
-「クライアントおよび〜/ .ssh / rcが提供するコマンドを無視し、ForceCommandで指定されたコマンドの実行を強制します。コマンドは、ユーザーのログインシェルで-cオプションを使用して呼び出されます。」
GatewayPorts
-「クライアントに転送されるポートへのリモートホストの接続を許可するかどうかを指定します。デフォルトでは、sshd(8)はリモートポート転送をループバックアドレスにバインドします。そのsshdは、リモートポートフォワーディングが非ループバックアドレスにバインドできるようにして、他のホストが接続できるようにする必要があります。
PermitOpen
:
TCPポート転送が許可される宛先を指定します。転送仕様は、次のいずれかの形式である必要があります。
PermitOpen host:port
PermitOpen IPv4_addr:port
PermitOpen [IPv6_addr]:port
複数の転送は、空白で区切って指定できます。「any」の引数を使用して、すべての制限を削除し、転送要求を許可できます。デフォルトでは、すべてのポート転送要求が許可されています。
PermitTunnel
-tun(4)デバイス転送が許可されるかどうかを指定します。デフォルトは「no」です
X11Forwarding
-X11転送を許可するかどうかを指定します。デフォルトは「no」です
制限を適用する
システム全体の構成ファイルを変更すると、/etc/ssh/sshd_config
パスワードベースの認証が適用されたり、制限~/.ssh/authorized_keys
が誤って削除されたりした場合でも、構成を適用できます。グローバルデフォルトを変更した場合は、それに応じてオプションのコメントを解除する必要があります。
Match User limited-user
#AllowTcpForwarding yes
#X11Forwarding no
#PermitTunnel no
#GatewayPorts no
AllowAgentForwarding no
PermitOpen localhost:62222
ForceCommand echo 'This account can only be used for [reason]'
ユーザーを追加します:
sudo useradd -m limited-user
ForceCommand
シェルが/bin/false
(または/bin/true
)のような非シェルに設定されている場合、/bin/false -c [command]
何もしないので、オプションは省略できます。
これで、クライアントはSSH経由でサーバーのループバックアドレスのポート62222にのみ接続できます(パブリックIPアドレスでリッスンしません)
無効にAllowTcpForwarding
すると、の使用も禁止されるため-R
、そのような制限されたアカウントを使用して単一ポートを転送することはできなくなります。PermitOpen localhost:62222
クライアントは喜んでサーバーに接続してリッスンできるため、サーバーのポート62222は使用されないと想定しています。
システム全体の構成でTCP転送が許可され、パスワードベースの認証が無効になっている場合は、キーごとの設定も使用できます。~/.ssh/authorized_keys
次のオプションを編集して追加しますssh-
(オプションとの間にスペースを入れますssh-
):
command="echo 'This account can only be used for [reason]'",no-agent-forwarding,no-X11-forwarding,permitopen="localhost:62222"
確認する
期待どおりに機能することを確認するには、いくつかのテストケースを実行する必要があります。以下のコマンドでhost
は、で設定されていない場合、実際のログインに置き換える必要があります~/.ssh/config
。コマンドの背後に、クライアントまたはサーバー(指定どおり)で実行されるコマンドが表示されます。
# connection closed:
ssh host
# connection closed (/bin/date is not executed):
ssh host /bin/date
# administratively prohibited (2x):
ssh host -N -D 62222 # client: curl -I --socks5 localhost:62222 example.com
ssh host -N -L 8080:example.com:80 # client: curl -I localhost:8080
sftp host
# should be possible because the client should forward his SSH server
ssh host -N -R 8080:example.com:80 # server: curl -I localhost:8080
# This works, it forwards the client SSH to the server
ssh host -N -R 62222:localhost:22
# unfortunately, the client can listen on that port too. Not a big issue
ssh host -N -L 1234:localhost:62222
結論
チェックリスト:SSHユーザーは次のことができません。
- シェルコマンドの実行- 完了
- ファイルへのアクセスまたはサーバーへのファイルのアップロード- 完了
- サーバーをプロキシとして使用(例:webproxy)- 完了
- ファイアウォールが原因で一般にアクセスできないローカルサービスにアクセスする- 一部、クライアントは62222以外のポートにアクセスできませんが、サーバーのポート62222をリッスンして接続できます
- サーバーを強制終了- 完了
(これらのチェックはSSHサーバーに限定されていることに注意してください。マシン上に他の脆弱なサービスがある場合、攻撃者がコマンドを実行したり、サーバーを強制終了したりできます)