2013-03-27 1 views
1

우분투에서 가상 호스트 웹 서버를 관리하는 데 사용할 수있는 도구를 쓰고 있습니다. 특권의 권리가 필요한 많은 기능들에 관해서, 나는 이것을 성취 할 수있는 방법을 모색합니다.Ubuntu 리눅스에서 C#으로 권한있는 권리를 요청하고 이것을 유지하십시오.

현재 저는 "gksu"또는 "gksudo"로 알고 있습니다. 이것은 또한 작동합니다. 문제는 사용자가 암호를 입력 할 수있는 권한이 필요한 작업을 묻는 것입니다. 이 암호는 한 번만 검색 할 수 있으며 나머지 프로그램 기간 동안 기억할 수 있습니까? 이것을 구현할 다른 방법이 있습니까?

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(); 
    } 

답변

0

유용한 접근 방식을 제공해 주셔서 감사합니다. 어제 저는 정적 클래스에 포함 된 문제의 해결책에 도달했습니다. 첫째, 일반 및 privilligierten 프로세스간에 구분됩니다.

프로세스를 높은 권한으로 실행해야 할 때마다 사용자의 암호를 이미 알고 있는지 확인합니다. 그렇지 않으면, 나는 그것을 얻고 (gksudo -p) 그것을 메모리에 저장합니다. 이제 privilligierten 권한으로 명령을 실행할 수 있습니다. 저장된 암호는 표준 입력 (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; 
     } 
    } 
} 
+2

필자는 단 한가지 우려 사항이 있습니다. 암호를 메모리에 일반 텍스트로 유지하면 다른 프로세스가 RAM에서 추출 할 수 있습니다 (예 : ptrace 사용). – fog

+0

@fog와 동의합니다. 이 문제를 해결하기 위해 Linux에 도구/라이브러리가 있다고 생각했습니다. 예를 들어, PolicyKit? 만약 내가 옳다면, 당신은 바인드 할 수 있습니다. (PolicyKitSharp가 이미 존재하는지 확실하지 않습니다 ...) – knocte

+0

@knocte 위의 대답에서 언급했듯이, PolicyKit은 "올바른"옵션 인 것 같습니다. DBUS를 사용하기 때문에 (또한 DBUS/C# 바인딩을 이미 가지고 있기 때문에) C# 바인딩이 필요하지 않지만 DBUS 서비스를 작성해야하고 SLOC 카운트가 상당히 증가하게됩니다. – fog

1

AFAIK, 그것의 보안 기능입니다 '스와'몇 초 이상을 암호 (더 제대로 인증 티켓)를 캐시하는, 따라서이가되지 우회하도록 설계되지.

중간 프로세스를 gksu하고 하위 프로세스가 권한을 상속 받도록 할 수는 있지만 IPC (도구 프론트 엔드와 중간 프로세스 간의 통신 채널)를 보호해야합니다.

그래서 내 조언은 전체 솔루션의 보안을 줄이기 위해 시도하므로 사용자가 필요한만큼 여러 번 요청받을 수 있도록 ...

여러 가지가 있습니다
+0

기본적으로 동의합니다. 하지만 이는 사용자에게 친숙하지 않습니다. 예를 들어 가상 호스트를 편집하려면 변경 사항을 저장 한 다음 Apache를 다시로드해야합니다. 사용자는 암호를 두 번 입력해야합니다. – PaulRoth

1

(적어도 3) "보안"솔루션을하지 않는 것입니다 이 문제 :

  1. "sudo"를 사용하면 암호 캐싱이 가능합니다. 시스템에 sudo를 설치하고 구성 할 수 있으면이 방법을 사용하는 것이 좋습니다. 장점 : sudo는 암호를 캐싱합니다. 단점 : 외부 종속성 (sudo)이 올바르게 구성되어 있어야합니다.
  2. 다른 헬퍼 실행 파일 (예 : "구성 수정 및 아파치 다시 시작"프로그램)을 작성하고 gksu를 사용하여 인증하도록 사용자에게 요청한 다음 실행하십시오. 장점 : 사용자는 모든 작업 그룹에 대해 암호를 한 번만 묻습니다. 단점 : 사용자가 여전히 암호를 여러 번 묻는다면 여러 부분으로 프로그램을 분할해야합니다.
  3. 루트 권한으로 실행되는 별도의 서비스를 작성하고 polkit/DBUS를 사용하여 사용자를 인증하고 서비스에 연결하도록 요청하십시오 (예 : "restart apache please"). 장점 : 자격 증명 캐싱 및 인증 대화 상자는 dekstop/polkit으로 관리됩니다. 단점 : 더 많은 코드를 작성하면 DBUS 서비스를 실행해야합니다.

실행 코드 (특히 Mono와 같은 대형 응용 프로그램에 의존하는 관리 코드)는 항상 보안과 관련되어 있으므로 "secure"가 인용됩니다.

0

당신은, 나는이 중 어떤 gksu 또는 sudo를 사용하지 거라고, 알 대신 userv보고 싶지 같은 소리.

기본적으로 서로 다른 사용자가 다른 프로그램을 실행할 수 있도록 허용 할 수 있습니다.

관련 문제