
秘密を含むファイルとファイルを読み取り、ライセンスなどを生成するジェネレータアプリケーションがあります。
このLinuxコンピュータのユーザーはアプリケーションを使用できます。
アプリケーションは秘密ファイルを読み取るため、これらのユーザーはファイルに対する読み取り権限を持っている必要があります。
これらのユーザーに対する読み取り権限を削除し、そのユーザーがアプリケーションを実行しているときにアプリケーションがアプリケーションを介してのみファイルを読み取るようにする方法はありますか?
私は、アプリケーションを実行している人がファイルを介してのみファイルを読み取ることができるようにしたいと思います。それだけでなく、cat
それが何であるかを見てください。
- 解決策を見ました
chmod 400 secret_file
chmod 110 generator
chmod u+s generator
このようにして、同じグループのユーザーはgenerator
実行できますが、generator
読み取ることはできませんsecret_file
。
しかし、generator
私にはそれがあるsetuid
のでgenerator
読むことができますsecret_file
。
これは良いソリューションですが、ユーザー名を含めたいので、generator
このソリューションを使用すると常に所有者名を取得できます。
これがc / cppアプリケーションからユーザー名を取得する方法です。
#include <pwd.h>
uid_t uid = geteuid();
struct passwd *pw = getpwuid(uid);
std::string user_name = pw->pw_name;
この問題を解決する他の方法はありますか?助ける
ことができますかapparmor
? (私が理解できない)
次の質問 - 特定のスクリプトによってのみファイルを実行可能にする方法はありますか?generator
シェルで実行したくないという意味です。私はまっすぐなランナーが失敗し、まっすぐなランナーが成功したいので、generator.sh
呼び出される他のスクリプトでのみ実行したいと思います。generator
generator.sh
generator
generator.sh
答え1
使用getuid()
変えるgeteuid()
。
~からexecve()
マニュアルページ:
set-user-ID ビットがパス名で参照されるプログラムファイルに設定されている場合有効なユーザーID呼び出しプロセスの名前はプログラムファイルの所有者の名前に変更されます。
返された「実際の」ユーザーIDはgetuid()
変更されません。つまり、プロセスを開始したユーザーのUIDです。
もう一つのこと:
シェルでジェネレータを実行したくありません。私はGenerator.shでより多くのことを行うので、Generatorを呼び出す他のスクリプトGenerator.shでのみ実行したいと思います。
setuidスクリプトを持つことができないので、さらに難しいです。ただし、スクリプトのみを実行するsetuidラッパーがある可能性があり、その後、最終バイナリを実行できます。またはsudoを使用してスクリプトを実行します。しかし、シェルがsetuidが好きではないという問題が発生する可能性があります。setuid ビットは bash に影響を与えないようです。そしてシェルスクリプトでsetuid設定を許可する。
また参考にしてくださいシェルを含めると追加のセキュリティ問題が発生する可能性があり、他のsetuidプログラムと同様に実行環境がクリーンであることを確認する必要があります。これには環境変数とファイル記述子が含まれますが、他の継承可能な機能も含めることができます。 sudoを使用する1つの理由は、少なくともそのような問題を処理しようとするためです。
別のより良い方法これにより、特権プロセスをネットワークサービスとして実装し、ユーザーが単純な愚かなクライアントプログラムのみを実行できるようにします。