2009-03-16 14 views
6

Para entender lo que estoy preguntando, es importante distinguir entre los diversos usos de SUID en Unix.¿Qué opciones tengo en las plataformas MS Windows para el equivalente de SUID desde plataformas basadas en Unix?

Tengo un proyecto que usa un ejecutable en la RUTA del usuario que es propiedad del proyecto y que tiene el bit SUID establecido. De esta forma, cuando se ejecuta, se ejecuta en el contexto del propietario del archivo, no del usuario llamante. De esta manera, tiene acceso a cosas que el usuario no tiene, y por lo tanto estas cosas están protegidas del usuario por las protecciones normales del sistema de archivos. Esto funciona razonablemente bien. Los planes son mover el proyecto a una arquitectura cliente-servidor, pero eso llevará tiempo. Mientras tanto, ¿cómo puedo replicar este tipo de comportamiento en los sistemas de Windows?

Tenga en cuenta que los ejecutables del proyecto no llaman a la llamada a la biblioteca SETUID aunque, francamente, sería una gran característica para agregar, en mi opinión, dado lo que hace el proyecto. El proyecto no necesita privilegios de administrador del sistema. La primera preocupación de seguridad es que necesita proteger sus propios archivos del usuario (que es simplemente cualquier usuario que no sea el propietario del archivo) y sería muy bueno si tuviera la capacidad de cambiar al "contexto del usuario" para acceder al archivo sistema como si fuera el usuario que llama. (De esta forma, podría determinar más fácilmente lo que está bien que el proyecto toque y lo que no).

El proyecto está escrito en una combinación de C y Java - un programa C con llamadas SUID establece el código Java ...

estoy interesado en saber todos estos mecanismos, y estoy especialmente centrado en aquellos que son:

  1. Adecuado para C y Java, y;
  2. Fácil de implementar para programadores que no sean de Windows, y;
  3. Requiere una codificación mínima exclusiva de Windows.

Si algunas soluciones son superiores, por favor, comparta sus ideas sobre lo que sea que tenga conocimiento al respecto.

NOTAS:

  1. LogonUser: Requiere una contraseña en texto plano. ¿Cómo puede ser eso una respuesta?
  2. RunAs: Requiere que se ingrese la contraseña a PRONTO! ... Al igual que con LogonUser, solo es peor; No veo cómo esta es una respuesta.
+0

La solución adecuada es instalar un servicio. –

Respuesta

3

No creo que exista un equivalente de SETUID en Windows, pero puede iniciar un proceso como otro usuario. Si está utilizando C, en realidad sólo hay dos principales funciones de Windows específicos que necesita para mirar en:

LogonUser

CreateProcessAsUser

la documentación para esas funciones son bastante buenos, por lo que shouldn' Es un gran desafío. Básicamente, usarás LogonUser para suplantar al usuario, luego CreateProcessAsUser para iniciar JVM como ese usuario.

También puede consultar el comando RUNAS, pero no estoy seguro si eso satisfaría sus necesidades o no.

+0

Gracias, mirándolos ... RT –

4

Cygwin tiene una excelente discusión sobre cómo hacen esto sin requerir la contraseña de usuario aquí: Using Windows security in Cygwin

Básicamente se instale un paquete de autenticación LSA personalizada que proporciona tokens de seguridad sin requerir una contraseña. Como alternativa, cuando el paquete de autenticación no está instalado, usan la API NtCreateToken no documentada.

Una aplicación que quiera suplantar podría hacer una llamada a cygwin setuid antes de llamar a Java.

+0

Sí, resulta que EXACTAMENTE es lo que hemos estado haciendo desde la mitad de las nadas. Pero, requiere que el usuario instale Cygwin, una bonificación en mi mente, pero los usuarios no están encantados de tener que instalar demasiados paquetes, especialmente cuando no los entienden/perciben el valor para ellos. Sin embargo, parece (dada la falta de otras respuestas) que esta es la única otra manera. –

+0

Ouch. Qué pesadilla desde el punto de vista de la seguridad. ¡Una razón más para alejarse de Cygwin, IMO! –

Cuestiones relacionadas