大規模アプリケーションでは、root権限を必要とするファイルに対して特定の時間に少数の書き込みを実行する必要があります。実際にはファイルではなく、ファイルの形でLinuxに公開されるハードウェアインターフェイスです。
アプリケーション全体にroot権限を付与しないように、重要なタスクを実行するbashスクリプトを作成しました。たとえば、次のスクリプトはハードウェア インターフェイスのポート 17 を出力としてイネーブルにします。
echo "17" > /sys/class/gpio/export
echo "out" > /sys/class/gpio/gpio17/direction
しかし、suid
私のシステムではbashスクリプトが無効になっているので、これを達成するための最良の方法が何であるかを知りたいです。
提供されている回避策のいくつかを使用してください。ここ
基本アプリケーションでスクリプトを呼び出し、
sudo
それに応じてsudoersリストを編集して、スクリプトを呼び出すときにパスワードが必要ないようにします。 sudo権限を付与するのは少し不便ですecho
。Cプログラムを作成して使用
fprintf
し、suid rootに設定するだけです。文字列とファイル名をハードコードして、ルートのみを編集できることを確認してください。または、テキストファイルから文字列を読み取って誰もファイルを編集できないようにもう一度確認してください。上記の提案よりも安全または簡単ですが、私が考えていなかった他の解決策はありますか?
ベストアンサー1
sudo
アクセス権を付与する必要はありませんecho
。実際、これは、例えば、sudo echo foo > bar
リダイレクトがルートではなく元のユーザーとして実行されるため、意味がありません。
コレットを使用して、アクセスが必要なユーザーのみがそのスクリプト(および他の同様のスクリプト)へのアクセスを許可しますsudo
。NOPASSWD:
これが常に最高で安全な使用方法ですsudo
。 root権限を必要とするいくつかのコマンドを別々のスクリプトに分割し、信頼できないユーザーまたは部分的に信頼できるユーザーがrootとしてのみスクリプトを実行できるようにします。
スクリプトレットはsudo
ユーザーからパラメータ(または入力)を受け取ってはいけません(つまり、呼び出す他のプログラムにはハードコードされたオプションとパラメータが必要です)。または、ユーザーから受け取る必要があるパラメータ/入力を非常に慎重に検証する必要があります。
検証時に編集証を持ってください。除外する「既知の悪い」項目を探すのではなく、「既知の良い」項目のみを許可し、不一致、エラー、または少しでも疑わしい項目がある場合は中止してください。
検証は、スクリプトでできるだけ早く(好ましくは実行前に)行う必要があります。何もないそうでなければルートとして)。
私本物この回答を初めて作成するときに言及したはずですが、スクリプトがシェルスクリプトの場合〜しなければならない正しい引用みんな変わりやすい。ユーザー提供の入力を含む変数を参照するときは特に注意してください。どのしかし、特定の変数が安全であると仮定しないでください。すべて引用。
これには、ユーザーが制御できる環境変数が含まれます(例:"$PATH"
CGIスクリプトなども含まれます)。実際、ちょうど引用してみてください。複数の引数を含むコマンドラインを作成する必要がある場合は、配列を使用して引数リストを作成し、-を引用符で囲みます。"$HOME"
"$USER"
"$QUERY_STRING"
"HTTP_USER_AGENT"
"${myarray[@]}"
私はいつも「すべてを引用しなさい」と言いますか?覚えています。します。