ラッパーバイナリを使用する
この特定の使用例(以下の重要な注意を参照)の場合、1つの可能性はsupport-ssh
、これらの発信SSH接続専用のユーザーを(たとえば)作成し、実行する小さなラッパーバイナリをインストールすること/usr/bin/ssh
です。
ssh
セキュリティアップデートを適用するたびにバイナリを再コピーすることを覚えていないため、バイナリ自体をコピー+ chmodしないでください。
- そして
root
、私が信頼している理由が明白であるため、より特権的なユーザーとして使用しないでください。
これは、次のトレードオフを使用sudo
して、特権をsupport-ssh
アカウントの特権に昇格するのに使用する機能的に同等の代替手段です。
- これはよりも小さくてスリムなので
sudo
、意図したよりも多くの構成エラーが開くリスクが少なくなります。
- 正しくコーディングするのはあなたの責任です- 非常に注意深く、(理想的には)セキュリティ上重要なコーディングの経験がある場合にのみ、これを行ってください。
- これは、より具体的になるように調整できます
sudo
(ただし、作成するコードが増えるほど、セキュリティのために監査する必要が増えます)。
ラッパーバイナリはHOME
、support-ssh
ユーザーのホームディレクトリに設定するssh
必要がssh_config
あります。これにより、適切な秘密キーが取得されます。ただし、呼び出し元のユーザーは~support-ssh/.ssh/
、その内容の読み取りを許可されるべきではありません。
ラッパーは次のように単純にすることができます。
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main(int argc, char **argv)
{
setenv("HOME", "/home/support-ssh", 1);
/* allow only a single, non-option argument */
if (argc!=2 || *argv[1]=='-') {
fprintf(stderr, "Usage: %s <hostname>", argv[0]);
exit(EXIT_FAILURE);
}
execv("/usr/bin/ssh", argv);
return EXIT_FAILURE;
}
もっと制限したい場合は、引数argv[1]
が許可されたホスト名のセットに含まれていることを確認してください。または、制限が少なく、オプションの引数(のサブセット)を許可します。あなたは完全に環境変数を置き換えることもできます(ただし、のような重要なものを維持するTERM
、LC_*
など)。それを注意LD_LIBRARY_PATH
し、LD_PRELOAD
特に危険です。
scp
必要に応じて、同様のラッパープログラムを提供できます。
適用性に関する注意
この回答は、ユーザーが契約に従って手続きに従う義務があり、違反した場合の制裁措置(解雇など)がある質問の特定の状況に対処します。攻撃者が不正なアクセスを取得するのを防ぐのではなく、従業員が秘密鍵を何気なくコピーするのを防ぎたいと想定しています。
私は、セキュリティは技術的な防御と非技術的な防御の両方によって達成され、ここでまたは使用することによって達成されるバランスsudo
は、提示された状況に適切であると考えています。