1)新しいユーザーが管理者権限を付与せずにアカウントを作成できるようにする安全な方法を見つけようとしています。自分のシステムにすでにアカウントがあり、UNIXコマンドラインにアクセスできる場合は、puTTYなどのプログラムを使用してアクセスできます。私は現在、ドロップボックスに似たレイアウトで視覚的にファイルを送受信できるプログラムを作成しています。しかし、「新しいユーザーを作成」機能を追加したいのですが、これを安全に行う方法がわかりません。
もちろん、プログラムが「sudo adduser jim」のようなことを行い、sudoパスワードを提供するようにすることもできますが、そのためにはjarファイルに管理パスワードを含める必要があります。難読化プログラムがあることを知っていますが、これは必ずしも安全ではありません。私はユーザーを作成するためにSSHを使用することを好みますが、動作し安全なすべての方法で開いています。
2) 今思ったことがあります。 sudo機能が新しいユーザー作成に制限された管理ユーザーを作成した場合はどうなりますか?これは合理的に安全なソリューションのように聞こえますか?それでは、どうすればいいですか?そうでなければ、このアプローチの欠点は何ですか?
編集:これまでの解決策は次のとおりです。入力を削除したとし、最初の引数をユーザー名、2番目の引数をパスワードとして使用し、権限(setuidビット)を次に設定するスクリプトを作成します。書き込みはできません。rootではなくアカウントで実行すると、root権限でのみ実行できます。これはこれまでで最も基本的なコードです。
adduser --disabled-password --gecos "" "$1"
echo "$1":"$2" | chpasswd
どう思いますか?どうすれば改善できると思いますか?
答え1
唯一の問題がsudo
パスワードを使用する必要がある場合は、ファイルにタグを追加できますNOPASSWD
。sudoers
欲しい
some_user ALL = (ALL) NOPASSWD:/path/to/adduser
答え2
この問題を解決する方法はいくつかありますが、私はユーザー情報を取得して実行する小さなプログラムまたはスクリプトを作成しますadduser
。プログラムはルートが所有し、setuid ビットがセットされます。
できるだけ簡単にしてください。入力内容を正しく削除しないと、セキュリティの脆弱性が発生する可能性があります。それにもかかわらず、システムにユーザーを追加するのは危険です。ただし、この戦略の利点は、実行可能ファイル全体をrootとして実行する必要がなく、ユーザーのスクリプト/プログラムのみが追加されることです。
編集する:
入力を削除する方法は、プログラムの実装方法によって異なります。 Cで書く場合は、system()の代わりにexecve()関数を使用してください。持つCERTで利用可能なクリーンアップ失敗の例を含む優れた文書。 Pythonで書く場合は好みサブプロセスモジュールsystem() と同様の理由です。
特別な要件がない限り、文字や数字以外のすべての文字を削除して整理します。ユーザーはパスワードを生成しますか?だとしたらもっと難しいです。要点は、呼び出すシェルやプログラムに特別な意味を持つ特殊文字を渡したくないことです。 Bashの場合、いくつかの明らかなのは$
、、、;
です&&
。 mysqlの場合、少なくとも、'
および"
を防止しようとします;
。
残念ながら、消毒は困難な作業になる可能性があります。ユーザーが使用する必要があるすべての値を列挙できる場合は、ホワイトリストを使用することをお勧めします。