ユーザーに SSH トンネルのセットアップを許可しますが、それ以外は許可しません
質問
ユーザーが特定のポート (たとえば 5000) 上の特定のマシンへの SSH トンネルをセットアップできるようにしたいのですが、このユーザーを可能な限り制限したいと考えています。(認証は公開鍵と秘密鍵のペアで行われます)。
関連する ~/.ssh/authorized_keys ファイルを編集する必要があることはわかっていますが、そこに (公開キー以外の) どのようなコンテンツを入れるべきか正確にはわかりません。
解決
Ubuntu 11.10 では、ポート転送の通過を許可しながら、-T の有無にかかわらず送信された ssh コマンドをブロックし、scp のコピーをブロックできることがわかりました。
具体的には、localhost:6379にバインドされた「somehost」上のredisサーバーがあり、キーファイルを持ち、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 ポートです。
誰かまたは何かが ssh -T などを介してホストにコマンドを送信できた場合、command="/bin/echo do-not-send-commands" は "do-not-send-commands" をエコー バックします。
最近の Ubuntu から man sshd
, 、authorized_keys /コマンドは次のように記述されます。
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オプションの他に、実際にあなたが求めているものがあります:許可オープン = "ホスト: ポート"。このオプションを使用すると、ユーザーは指定されたホストとポートへのトンネルのみを設定できます。
AUTHORIZED_KEYS ファイル形式の詳細については、man sshd を参照してください。
私の解決策は、トンネリングのみを行うことができるユーザーを提供することです。 インタラクティブシェルを使用しない場合, 、そのシェルを設定するには /etc/パスワード に /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
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 環境変数を編集します。 /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
- 公開キーブロックをauthorized-keysに追加します
ユーザーが使用している SSH クライアントを介して、ユーザーのマシン上でキーを生成します。たとえば、pUTTY には、まさにこれを行うユーティリティがあります。秘密鍵と公開鍵の両方が生成されます。
生成された公開キー ファイルの内容は、authorized_keys ファイルに配置されます。
次に、公開キーを生成した秘密キーを使用するように ssh クライアントが設定されていることを確認する必要があります。これは非常に簡単ですが、使用されているクライアントによって多少異なります。