ユーザーが特定のポート(たとえば5000)の特定のマシンへのSSHトンネルを設定できるようにしたいのですが、このユーザーを可能な限り制限したいと思います。(認証はパブリック/プライベートキーペアで行われます)。
関連する〜/ .ssh / authorized_keysファイルを編集する必要があることはわかっていますが、そこに入れるコンテンツ(公開鍵以外)が正確にわかりません。
Ubuntu 11.10では、-Tの有無にかかわらず送信されたsshコマンドをブロックし、ポート転送を許可しながらscpコピーをブロックできることがわかりました。
具体的には、localhost:6379 にバインドされた「somehost」に redis-server があり、ssh トンネルを介して、キーファイルを持ち、ssh で接続する他のホストに安全に共有したいと考えています。
$ ssh -i keyfile.rsa -T -N -L 16379:localhost:6379 someuser@somehost
これにより、redis-server、「somehost」の「localhost」ポート 6379 が、ssh コマンドを実行しているホスト上でローカルに表示され、「localhost」ポート 16379 に再マップされます。
リモートの「somehost」では、authorized_keys に使用したものを次に示します。
cat .ssh/authorized_keys (portions redacted)
no-pty,no-X11-forwarding,permitopen="localhost:6379",command="/bin/echo do-not-send-commands" ssh-rsa rsa-public-key-code-goes-here keyuser@keyhost
no-pty は、ターミナルを開こうとするほとんどの ssh 試行を失敗させます。
permitopen は、転送が許可されているポートを説明します。この場合、ポート 6379 は、転送したい redis-server ポートです。
command="/bin/echo do-not-send-commands" は、誰かまたは何かが ssh -T などを介してホストにコマンドを送信できた場合、「do-not-send-commands」をエコー バックします。
最近の Ubuntu からman sshd
、authorized_keys / command は次のように記述されています。
command="command" このキーが認証に使用されるたびにコマンドが実行されることを指定します。ユーザーが指定したコマンド (存在する場合) は無視されます。
scp の安全なファイル コピーを使用しようとすると、「do-not-send-commands」のエコーで失敗し、sftp もこの構成で失敗することがわかりました。
以前の回答で行われた制限付きシェルの提案も良い考えだと思います。また、ここで詳述されているすべてのことは、「man sshd」を読んで「authorized_keys」を検索することで判断できることに同意します。
ユーザーのシェルを制限付きシェルに設定することをお勧めします。ユーザーの〜/ .bashrcまたは〜/ .bash_profileでPATH変数の設定を解除すると、ユーザーはコマンドを実行できなくなります。less
後で、またはなどの限られたコマンドセットの実行をユーザーに許可する場合はtail
、許可されたコマンドを別のディレクトリ(など/home/restricted-commands
)にコピーし、PATHを更新してポイントすることができます。そのディレクトリ。
no-X11-forwardingのようなauthorized_keysオプションの他に、実際にあなたが求めているのはまさにpermitopen="host:port"です。このオプションを使用すると、ユーザーは指定されたホストとポートへのトンネルのみを設定できます。
AUTHORIZED_KEYS ファイル形式の詳細については、man sshd を参照してください。
私の解決策は、対話型シェルなしでトンネリングのみを行っているユーザーに、 /etc/passwdのシェルを/usr/bin/tunnel_shellに設定することです。
実行可能ファイル/usr/bin/tunnel_shellを無限ループで作成するだけです。
#!/bin/bash
trap '' 2 20 24
clear
echo -e "\r\n\033[32mSSH tunnel started, shell disabled by the system administrator\r\n"
while [ true ] ; do
sleep 1000
done
exit 0
ここで完全に説明されています: http://blog.flowl.info/2011/ssh-tunnel-group-only-and-no-shell-please/
ログインするための公開鍵を使用して、authorized_keys ファイルを設定できました。よくわからないのは、そのアカウントに許可されている操作を制限するために必要な追加情報です。たとえば、次のようなコマンドを入力できることを知っています。
no-pty,no-port-forwarding,no-X11-forwarding,no-agent-forwarding
次のような authorized_keys ファイルの行が必要です。
permitopen="host.domain.tld:443",no-pty,no-agent-forwarding,no-X11-forwardi
ng,command="/bin/noshell.sh" ssh-rsa AAAAB3NzaC.......wCUw== zoredache
次のような C プログラムを作成しました。
#include <stdio.h>
#include <unistd.h>
#include <signal.h>
#include <stdlib.h>
void sig_handler(int signo)
{
if (signo == SIGHUP)
exit(0);
}
int main()
{
signal(SIGINT, &sig_handler);
signal(SIGTSTP, &sig_handler);
printf("OK\n");
while(1)
sleep(1);
exit(0);
}
制限付きユーザーのシェルをこのプログラムに設定しました。
ssh server command
コマンドはシェルを使用して実行され、このシェルは何も実行しないため、制限されたユーザーは何も実行できないと思います。
ユーザーが使用しているsshクライアントを介して、ユーザーのマシンでキーを生成します。たとえば、pUTTYには、これを正確に実行するためのユーティリティがあります。秘密鍵と公開鍵の両方を生成します。
生成された公開鍵ファイルの内容は、authorized_keysファイルに配置されます。
次に、公開鍵を生成した秘密鍵を使用するようにsshクライアントが構成されていることを確認する必要があります。かなり簡単ですが、使用しているクライアントによって少し異なります。