1

Ubuntuで仮想ホストとWebサーバーを管理するために使用できるツールを書いています。特権権限が必要な機能の多くについては、これを実現する方法を探しています。

現在、「gksu」または「gksudo」でそれを認識しています。これも機能します。問題は、ユーザーが自分のパスワードを入力するための特権権限を必要とするアクティビティの入力を求められることです。 このパスワードを1回だけ取得し、プログラムの残りの期間は覚えておくことができますか?これを実装する別の方法はありますか?

    public void OnToogledVirtualHost(object o, ToggledArgs args)
    {
        VirtualHost host = (VirtualHost)store.GetNode(new TreePath(args.Path));
        host.Enabled = !host.Enabled;
        Process process = new Process();
        process.StartInfo.UseShellExecute = false;

        if (host.Enabled)
        {
            process.StartInfo.FileName = "gksu";
            process.StartInfo.Arguments = "a2ensite " + System.IO.Path.GetFileName(host.FilePath);
        }
        else
        {
            process.StartInfo.FileName = "gksu";
            process.StartInfo.Arguments = "a2dissite " + System.IO.Path.GetFileName(host.FilePath);
        }
        process.Start();
    }
4

4 に答える 4

1

AFAIK、これは「su」のセキュリティ機能であり、パスワード(より適切には認証チケット)を数秒以上キャッシュしないため、これはバイパスされないように設計されています。

いつでも中間プロセスをgksuして、サブプロセスにその承認を継承させることができますが、IPC(ツールフロントエンドと中間プロセス間の通信チャネル)を保護する必要があります。

したがって、私のアドバイスは、ソリューション全体のセキュリティを低下させようとしないことです。そのため、ユーザーに必要な回数だけ質問させてください...

于 2013-03-27T11:56:57.580 に答える
1

この問題には、いくつか(少なくとも3つ)の「安全な」解決策があります。

  1. パスワードのキャッシュを可能にする「sudo」を使用します。マシンにsudoをインストールして構成できる場合、これが私の推奨されるソリューションです。長所:sudoはパスワードをキャッシュします。短所:外部依存関係(sudo)が正しく構成されているかどうかに依存します。
  2. さまざまなヘルパー実行可能ファイル(たとえば、「構成を変更してApacheを再起動する」プログラム)を作成し、必要に応じて、ユーザーにgksuを使用して認証するように依頼し、それらを起動します。長所:ユーザーは、アクションのグループごとに1回だけパスワードの入力を求められます。短所:ユーザーは引き続きパスワードの入力を何度も求められ、プログラムを複数の部分に分割する必要があります。
  3. root権限で実行される別のサービスを作成し、polkit / DBUSを使用してユーザーを認証し、それに接続してサービスを要求します(「apacheを再起動してください」など)。長所:クレデンシャルのキャッシュと認証ダイアログは、dekstop/polkitによって管理されます。短所:書くコードが増え、DBUSサービスを実行する必要があります。

ルートとして実行中のコード(特にMonoなどの大規模なアプリケーションに依存するマネージコード)は常にセキュリティに影響するため、「安全」と呼ばれます。

于 2013-04-08T12:31:11.597 に答える
0

便利なアプローチをありがとう。昨日、私は静的クラスに同封した問題の解決策に到達しました。まず、通常のプロセスと特権プロセスが区別されます。

昇格された特権でプロセスを実行する必要があるときはいつでも、ユーザーのパスワードをすでに知っているかどうかを確認します。そうでない場合は、それを取得して(gksudo -p)、メモリに保存します。これで、特権権限を持つコマンドを実行できます。保存されたパスワードは、標準入力(sudo -S)を介して転送されます。

どう思いますか?安全上の懸念はありますか?

public static class SystemProcess
{
    private static string output;
    private static string error;
    private static string password;

    public static void Start (string filename, string arguments)
    {
        ProcessStartInfo startInfo = SystemProcess.Prepare(filename, arguments);

        using (Process process = Process.Start(startInfo)) {
            SystemProcess.output = process.StandardOutput.ReadToEnd();
            SystemProcess.error = process.StandardError.ReadToEnd();

            process.WaitForExit();
        }
    }

    public static void StartPrivileged (string filename, string arguments)
    {
        ProcessStartInfo startInfo;

        if (SystemProcess.password == default(string))
        {
            startInfo = SystemProcess.Prepare("gksudo", "-p true -D 'MyApplication'");

            using (Process process = Process.Start(startInfo)) {
                SystemProcess.password = process.StandardOutput.ReadToEnd();
                process.WaitForExit();
            }
        }

        startInfo = SystemProcess.Prepare("sudo", "-S " + filename + " " + arguments);

        using (Process process = Process.Start(startInfo)) {
            process.StandardInput.WriteLine(SystemProcess.password);
            SystemProcess.output = process.StandardOutput.ReadToEnd();
            SystemProcess.error = process.StandardError.ReadToEnd();

            process.WaitForExit();
        }
    }

    private static ProcessStartInfo Prepare (string filename, string arguments)
    {
        ProcessStartInfo startInfo = new ProcessStartInfo (filename, arguments);

        startInfo.RedirectStandardError = true;
        startInfo.RedirectStandardOutput = true;
        startInfo.RedirectStandardInput = true;
        startInfo.UseShellExecute = false;

        return startInfo;
    }

    public static string Output {
        get {
            return SystemProcess.output;
        }
    }

    public static string Error {
        get {
            return SystemProcess.error;
        }
    }
}
于 2013-04-10T07:26:28.053 に答える
0

ご存知のとおり、これにはgksuやsudoは使用しませんが、代わりにuservを確認したいようです。

基本的に、さまざまなユーザーにさまざまなプログラムの実行を許可できます。

于 2013-05-01T14:00:57.560 に答える