ユーザーが特定のポート(たとえば5000)の特定のマシンへのSSHトンネルを設定できるようにしたいのですが、このユーザーをできるだけ制限したいと思います。(認証は公開/秘密鍵ペアで行われます)。
関連する〜/ .ssh / authorized_keysファイルを編集する必要があることはわかっていますが、そこにどのコンテンツ(公開キー以外)を入れるか正確にはわかりません。
ユーザーが特定のポート(たとえば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
これにより、「somehost」上のredis-serverの「localhost」ポート6379が、「localhost」ポート16379に再マッピングされたsshコマンドを実行するホスト上にローカルに表示されます。
リモートの「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"このキーが認証に使用されるときはいつでもコマンドが実行されることを指定します。ユーザーが指定したコマンド(存在する場合)は無視されます。
scpセキュアファイルコピーを使用しようとすると、「do-not-send-commands」のエコーで失敗します。sftpもこの構成で失敗することがわかりました。
以前の回答で行われた制限付きシェルの提案も良い考えだと思います。また、ここで詳しく説明されているすべては、「man sshd」を読んで「authorized_keys」を検索することで決定できることに同意します
~user/.ssh/authorized_keys
によって所有されuser
、user
アカウントへのアクセスに使用される承認済みキーを管理します。SSHはアクセス許可についてはうるさく~/.ssh/
、その内容に期待を課す可能性があります。実行したところsudo chown root: .ssh/authorized_keys
、ログインできなくなったようですが、過去の経験から、ユーザーがそのファイルを所有する必要がないことがわかっていますroot
。必要に応じて管理できます。
ユーザーのシェルを制限付きシェルに設定することをお勧めします。ユーザーの〜/ .bashrcまたは〜/ .bash_profileでPATH変数の設定を解除すると、ユーザーはコマンドを実行できなくなります。その後、あなたはのように、コマンドの限定セットを実行するユーザー(複数可)を許可することにした場合less
やtail
、インスタンスのために、そして、あなたは(のような別のディレクトリに許可されるコマンドをコピーすることができます/home/restricted-commands
)とのポイントへのパスを更新しますそのディレクトリ。
ssh use@host "/bin/bash"
か?
/bin/bash
ため、スラッシュが含まれているため実行に失敗します。
less
はおそらく悪い考えですが、そこから無制限のシェルにエスケープできるため!/bin/bash
です。他の例については、pen-testing.sans.org / blog / 2012/06/06 /…を参照してください。したがって、個々のコマンドを許可することは、たとえあったとしても、非常に慎重に行う必要があります。
no-X11-forwardingのようなauthorized_keysオプションに加えて、実際に求めているのは、permitopen = "host:port"だけです。このオプションを使用すると、ユーザーは指定されたホストとポートへのトンネルのみをセットアップできます。
AUTHORIZED_KEYSファイル形式の詳細については、man sshdを参照してください。
no-pty
シェルのアクセスも制限しません。シェルにアクセスできますが、プロンプトは表示されません。あなたはまだコマンドを与えて、出力をうまく見ることができます。command="..."
からのシェルアクセスを制限する場合は、このオプションが必要です.ssh/authorized_keys
。
私の解決策は、対話型シェルなしでトンネリングしているだけのユーザーに、/ 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/
tunnel_shell
、shell -> /bin/bash tunnel_shell
もちろんシェルに戻ることができますが、ユーザーのシェルtunnel_shell
として設定した場合は、/bin/bash tunnel_shell
実行するだけで、シェルはエスケープできません。 、私が見る限りでは。私はそれをテストし、ctrl-zでエスケープできませんでした。あなたがいる場合やったセットアップを投稿することができ、それを試してみて、逃れることができますか?同様に、それがそのように機能するはずであると述べているドキュメントを知っているなら、それを投稿できますか?
ログイン用の公開鍵を使用して、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
svnのような特定のコマンドに対してのみアクセスを許可したい場合は、承認済みのキーファイルでそのコマンドを指定することもできます。
command="svnserve -t",no-port-forwarding,no-pty,no-agent-forwarding,no-X11-forwarding [KEY TYPE] [KEY] [KEY COMMENT]
http://svn.apache.org/repos/asf/subversion/trunk/notes/ssh-tricksから
ここに私が便利だと思った素晴らしい記事があります:http : //www.ab-weblog.com/en/creating-a-restricted-ssh-user-for-ssh-tunneling-only/
アイデアは次のとおりです(新しい制限されたユーザー名を "sshtunnel"として)
useradd sshtunnel -m -d /home/sshtunnel -s /bin/rbash
passwd sshtunnel
rbash(restricted-bash)を使用して、ユーザーが実行できることを制限していることに注意してください。ユーザーはcd(ディレクトリの変更)も環境変数の設定もできません。
次に、ユーザーのPATH env変数/home/sshtunnel/.profile
を何もないように編集します。これにより、bashが実行するコマンドを見つけられなくなります。
PATH=""
最後に、次の権限を設定して、ユーザーがファイルを編集できないようにします。
chmod 555 /home/sshtunnel/
cd /home/sshtunnel/
chmod 444 .bash_logout .bashrc .profile
次のような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
コマンドはシェルを使用して実行され、このシェルは何も実行しないため、制限されたユーザーは実行しても何も実行できないと思います。
公開鍵の認証に関するこの投稿を参照してください。
覚えておく必要のある2つの主な事項は次のとおりです。
chmod 700 ~/.ssh
no-pty
ユーザが編集して、それがコマンドの実行を防ぐために何もしないインタラクティブseesionを開くことはできませんauthorized_keys
、彼はのようなものとのアクセスを持っているファイルの場合ssh server 'sed -i -e s/no-pty// ~/.ssh/authorized_keys'
。