Descripción General

En Windows, el acceso a los recursos del sistema y a las tareas relacionadas con el mismo se puede controlar mediante privilegios contenidos en un objeto denominado token de acceso (access token). Cuando el Wrapper se ejecuta en nombre de un usuario, el proceso recibe una copia del token de acceso que contiene los privilegios de dicho usuario.

La edición Professional del Wrapper permite ajustar estos privilegios a diferentes niveles:

  • Al instalar el Wrapper como servicio con credenciales de Administrador (o al actualizar el servicio con los permisos adecuados), es posible redefinir por completo su lista de privilegios requeridos. Más adelante, cuando el Administrador de control de servicios (SCM) inicie el servicio, actualizará el token del proceso con los privilegios especificados.

  • En tiempo de ejecución, cualquiera de los privilegios existentes en el token del proceso del Wrapper se puede habilitar o deshabilitar. Además, es posible eliminar por completo un privilegio. Sin embargo, esta acción no es reversible durante el tiempo de vida del proceso del Wrapper. Un privilegio que no esté presente en el token de acceso no se puede añadir.

  • Por defecto, un proceso iniciado desde una sesión de usuario y todos sus procesos secundarios comparten el mismo token de acceso. Por lo tanto, si un privilegio es modificado por un proceso, el cambio se aplicará a todos los procesos de la jerarquía padre-hijo.

    El Wrapper, sin embargo, permite configurar los privilegios de algunos de sus procesos secundarios de forma independiente. Este es el caso del proceso de Java y de los Comandos de Eventos. Para que esto funcione, se creará un duplicado del token de acceso del Wrapper exclusivamente para el proceso secundario. Esto permite que el proceso secundario se ejecute en un nuevo contexto de seguridad, cuyos privilegios se pueden ajustar posteriormente sin afectar a otros procesos.

Por seguridad, se recomienda que una aplicación habilite únicamente los privilegios que necesite. Si un privilegio pudiera usarse de forma ocasional, o si debe ser utilizado por alguno de sus procesos secundarios, se puede deshabilitar para conservar la capacidad de volver a habilitarlo en una etapa posterior. Sin embargo, para evitar que la aplicación o cualquiera de sus procesos secundarios vuelva a habilitar un privilegio, la medida más segura es eliminarlo por completo.

Si no se especifican privilegios requeridos para un Servicio de Windows, el SCM no modificará el token de acceso del servicio al iniciar, dejándolo con los privilegios asignados por defecto, es decir, aquellos que poseen el usuario y los grupos a los que pertenece la cuenta del servicio.

Los siguientes privilegios se asignan comúnmente a los usuarios que ejecutan servicios:

  • Los privilegios SeCreateGlobalPrivilege y SeImpersonatePrivilege se conceden a través del grupo SERVICE, al cual deberían pertenecer todos los usuarios que ejecutan servicios.

  • SeIncreaseWorkingSetPrivilegese concede a través del grupo Users.

  • SeChangeNotifyPrivilege está habilitado de manera predeterminada para todos los usuarios.

En general, los privilegios anteriores son adecuados (y a veces necesarios) para el proceso del Wrapper, por lo que en la mayoría de las situaciones no debería necesitar cambiarlos. Sin embargo, dependiendo del uso de su aplicación, puede ser mejor para la seguridad eliminar algunos privilegios del token de acceso del proceso de Java o de los procesos secundarios que se ejecutan en respuesta a eventos.

NOTA

Desde la versión 3.7.0, se utiliza la suplantación de identidad (impersonation), cuando está disponible, para verificar el SID del proceso Java entrante cuando el tipo de backend es PIPE (el predeterminado). Esto permite una confirmación rigurosa de la identidad del proceso Java, proporcionando el nivel más robusto de autenticación para la comunicación entre procesos en Windows. Si bien la verificación de SID ofrece la máxima seguridad, no es estrictamente necesaria para una comunicación segura con la JVM; el sistema permanece protegido por múltiples capas independientes, incluidas la autenticación por clave criptográfica y la verificación de PID.

ADVERTENCIA

Se debe prestar especial atención al privilegio SeImpersonatePrivilege. Aunque está habilitado de manera predeterminada para los servicios de Windows, este privilegio puede ser aprovechado para escalar desde una cuenta local a NT AUTHORITY\SYSTEM si la aplicación Java otorga al usuario la capacidad de ejecutar comandos arbitrarios. En tales casos, se recomienda enfáticamente eliminar SeImpersonatePrivilege del proceso de Java.

Lo mismo se aplica a los Comandos de eventos. Siempre se deben tomar precauciones para garantizar que el programa o script de destino tenga los permisos de archivo adecuados para que no pueda ser modificado ni reemplazado. Pero, adicionalmente, si el comando configurado otorga al usuario la capacidad de ejecutar sus propios comandos o abrir una consola, también se debería eliminar SeImpersonatePrivilege.

NT AUTHORITY\SYSTEM es una cuenta potente que tiene incluso más privilegios que un Administrador en Windows. Obtener acceso a ella representa un problema real de seguridad, ya que permitiría un control casi total sobre el equipo.

Consulte la descripción del privilegio wrapper.ntservice.impersonation para obtener detalles sobre cómo controlar la suplantación de identidad para el proceso del Wrapper.


Las siguientes propiedades están disponibles para configurar los privilegios:

Privilegios requeridos para un Servicio de Windows

wrapper.ntservice.required_privileges

Compatibilidad :3.5.57
Ediciones :Edición ProfesionaEdición Estándar (No Compatible)Edición de la Comunidad (No Compatible)
Plataformas :WindowsMac OSX (No Compatible)Linux (No Compatible)Alpine Linux (No Compatible)FreeBSD (No Compatible)Solaris (No Compatible)IBM z/Linux (No Compatible)

Esta propiedad se utiliza al instalar el Wrapper como un servicio de Windows o al actualizar un servicio existente. Especifica una lista de privilegios requeridos que se insertará en la configuración del servicio. Posteriormente, el Administrador de control de servicios (SCM) utiliza esta lista para determinar qué privilegios son compatibles y, si corresponde, asignarlos al servicio cada vez que se inicie. Los privilegios del token de acceso del servicio que no estén presentes en la lista de privilegios requeridos serán eliminados por el SCM. Existe, sin embargo, una excepción: el privilegio SeChangeNotifyPrivilege, que nunca se elimina por razones de compatibilidad.

El valor NONE, o un valor vacío, se puede utilizar para especificar que no se debe usar ningún privilegio requerido para el servicio. Si no se especifican privilegios requeridos, el SCM no modificará el token de acceso del servicio al iniciar, dejándolo con los privilegios asignados por defecto, es decir, aquellos que poseen el usuario y los grupos a los que pertenece el servicio.

El valor predeterminado es UNCHANGED. Al instalar un servicio, esto significa que no se utilizará ningún privilegio requerido para el servicio. Al actualizar un servicio, significa que los privilegios requeridos configurados no se actualizarán.

NOTA

Utilizar wrapper.ntservice.required_privileges=SeChangeNotifyPrivilege restringirá los privilegios del servicio al mínimo. Esto provocará que todos los privilegios sean eliminados al iniciar, excepto SeChangeNotifyPrivilege.

La propiedad debe definirse con una lista de nombres de privilegios separados por comas, comenzando cada uno con 'Se' y terminando con 'Privilege'.

Ejemplo:
wrapper.ntservice.required_privileges=SeChangeNotifyPrivilege, SeIncreaseWorkingSetPrivilege

El comando "whoami /priv" se puede utilizar para ver los nombres de los privilegios del usuario actual.

En un Símbolo del sistema ejecutado como NT AUTHORITY\SYSTEM, "whoami /priv" devolverá la siguiente salida:
whoami /priv

PRIVILEGES INFORMATION
----------------------

Privilege Name                            Description                                                        State
========================================= ================================================================== ========
SeAssignPrimaryTokenPrivilege             Asignar el token principal de un proceso                                      Deshabilitado
SeLockMemoryPrivilege                     Bloquear páginas en la memoria                                               Habilitado
SeIncreaseQuotaPrivilege                  Ajustar la memoria asignada para un proceso                                 Deshabilitado
SeTcbPrivilege                            Actuar como parte del sistema operativo                                Habilitado
SeSecurityPrivilege                       Administrar la auditoría y el registro de seguridad                                   Deshabilitado
SeTakeOwnershipPrivilege                  Adoptar la propiedad de archivos u otros objetos                           Deshabilitado
SeLoadDriverPrivilege                     Cargar y descargar controladores de dispositivos                                     Deshabilitado
SeSystemProfilePrivilege                  Cargar perfiles de sistema                                         Habilitado
SeSystemtimePrivilege                     Cambiar la hora del sistema                                             Deshabilitado
SeProfileSingleProcessPrivilege           Generar perfiles de un solo proceso                                             Habilitado
SeIncreaseBasePriorityPrivilege           Aumentar la prioridad de programación                                       Habilitado
SeCreatePagefilePrivilege                 Crear un archivo de paginación                                                  Habilitado
SeCreatePermanentPrivilege                Crear objetos compartidos permanentes                                    Habilitado
SeBackupPrivilege                         Hacer copia de seguridad de archivos y directorios                                      Deshabilitado
SeRestorePrivilege                        Restaurar archivos y directorios                                      Deshabilitado
SeShutdownPrivilege                       Apagar el sistema                                               Deshabilitado
SeDebugPrivilege                          Depurar programas                                                     Habilitado
SeAuditPrivilege                          Generar auditorías de seguridad                                           Habilitado
SeSystemEnvironmentPrivilege              Modificar valores de entorno de firmware                                 Deshabilitado
SeChangeNotifyPrivilege                   Omitir comprobación de recorrido                                           Habilitado
SeUndockPrivilege                         Quitar equipo de la estación de acoplamiento                               Deshabilitado
SeManageVolumePrivilege                   Realizar tareas de mantenimiento de volumen                                   Deshabilitado
SeImpersonatePrivilege                    Suplantar a un cliente tras la autenticación                          Habilitado
SeCreateGlobalPrivilege                   Crear objetos globales                                              Habilitado
SeIncreaseWorkingSetPrivilege             Aumentar el conjunto de trabajo de un proceso                                     Habilitado
SeTimeZonePrivilege                       Cambiar la zona horaria                                               Habilitado
SeCreateSymbolicLinkPrivilege             Crear vínculos simbólicos                                              Habilitado
SeDelegateSessionUserImpersonatePrivilege Obtener un token de suplantación de identidad para otro usuario en la misma sesión Habilitado

Consulte la página de Microsoft MSDN para obtener la lista completa de privilegios (solo se pueden utilizar constantes que terminen con "Privilege").

Privilegios en tiempo de ejecución para el proceso del Wrapper

Las siguientes propiedades se utilizan para ajustar los privilegios del proceso del Wrapper. Solo se pueden ajustar los privilegios que existan en el token de acceso del proceso del Wrapper.

De manera predeterminada, el token de acceso contiene los privilegios del usuario bajo el cual se ejecuta el Wrapper y los privilegios de los grupos a los que pertenece este usuario.

Para los servicios de Windows, los privilegios predeterminados se pueden sobrescribir estableciendo una lista de privilegios requeridos. Si falta un privilegio, es posible añadirlo a la lista wrapper.ntservice.required_privileges y reinstalar o actualizar el servicio. En el siguiente inicio, el token de acceso del Wrapper debería contener dicho privilegio.

Tenga en cuenta que estas propiedades solo surtirán efecto en la primera carga de la configuración y se ignorarán si se recarga la configuración.

wrapper.privileges.enable

Compatibilidad :3.5.57
Ediciones :Edición ProfesionaEdición Estándar (No Compatible)Edición de la Comunidad (No Compatible)
Plataformas :WindowsMac OSX (No Compatible)Linux (No Compatible)Alpine Linux (No Compatible)FreeBSD (No Compatible)Solaris (No Compatible)IBM z/Linux (No Compatible)

Esta propiedad se utiliza para especificar una lista de privilegios a habilitar cuando el Wrapper se inicia como consola o como servicio. Los privilegios enumerados deben estar separados por comas.

Ejemplo (habilitar SeIncreaseWorkingSetPrivilege y SeCreateGlobalPrivilege):
wrapper.privileges.enable=SeIncreaseWorkingSetPrivilege, SeCreateGlobalPrivilege

El valor "ALL" se puede utilizar para habilitar todos los privilegios presentes en el token de acceso del proceso del Wrapper.

wrapper.privileges.enable=ALL también se puede usar en combinación con wrapper.privileges.disable para habilitar todos los privilegios excepto algunos.

Ejemplo (habilitar todos los privilegios excepto SeIncreaseWorkingSetPrivilege):
wrapper.privileges.enable=ALL
wrapper.privileges.disable=SeIncreaseWorkingSetPrivilege

wrapper.privileges.disable

Compatibilidad :3.5.57
Ediciones :Edición ProfesionaEdición Estándar (No Compatible)Edición de la Comunidad (No Compatible)
Plataformas :WindowsMac OSX (No Compatible)Linux (No Compatible)Alpine Linux (No Compatible)FreeBSD (No Compatible)Solaris (No Compatible)IBM z/Linux (No Compatible)

Esta propiedad se utiliza para especificar una lista de privilegios a deshabilitar cuando el Wrapper se inicia como consola o como servicio. Los privilegios enumerados deben estar separados por comas.

Ejemplo (deshabilitar SeIncreaseWorkingSetPrivilege y SeCreateGlobalPrivilege):
wrapper.privileges.disable=SeIncreaseWorkingSetPrivilege, SeCreateGlobalPrivilege

El valor "ALL" se puede utilizar para deshabilitar todos los privilegios presentes en el token de acceso del proceso del Wrapper.

wrapper.privileges.disable=ALL también se puede usar en combinación con wrapper.privileges.enable para deshabilitar todos los privilegios excepto algunos.

Ejemplo (deshabilitar todos los privilegios excepto SeIncreaseWorkingSetPrivilege):
wrapper.privileges.disable=ALL
wrapper.privileges.enable=SeIncreaseWorkingSetPrivilege

ADVERTENCIA

  • Si un privilegio está presente tanto en la lista wrapper.privileges.enable como en wrapper.privileges.disable, se registrará una advertencia y el privilegio quedará deshabilitado (excepto en los casos en que una de las propiedades se configure como ALL).

  • Utilizar tanto wrapper.privileges.enable=ALL como wrapper.privileges.disable=ALL no es válido.

wrapper.privileges.remove

Compatibilidad :3.5.57
Ediciones :Edición ProfesionaEdición Estándar (No Compatible)Edición de la Comunidad (No Compatible)
Plataformas :WindowsMac OSX (No Compatible)Linux (No Compatible)Alpine Linux (No Compatible)FreeBSD (No Compatible)Solaris (No Compatible)IBM z/Linux (No Compatible)

Esta propiedad se utiliza para especificar una lista de privilegios a eliminar cuando el Wrapper se inicia como consola o como servicio. Los privilegios enumerados deben estar separados por comas.

Ejemplo (eliminar SeIncreaseWorkingSetPrivilege y SeCreateGlobalPrivilege):
wrapper.privileges.remove=SeIncreaseWorkingSetPrivilege, SeCreateGlobalPrivilege

El valor "ALL" se puede utilizar para eliminar todos los privilegios presentes en el token de acceso del proceso del Wrapper.

Ejemplo (eliminar todos los privilegios):
wrapper.privileges.remove=ALL

ADVERTENCIA

Una vez que un privilegio se ha eliminado del token de acceso de un proceso, no se puede volver a añadir durante el tiempo de vida del proceso. Eliminar un privilegio también hace que no esté disponible para todos los procesos secundarios que compartan el mismo token de acceso o para futuros procesos secundarios que se lancen duplicando el token de acceso del Wrapper.

Si el Wrapper se lanza desde otro proceso y ambos procesos comparten el mismo token de acceso, editar el token de acceso del Wrapper también afectaría al proceso primario (padre). Sin embargo, al iniciar en una consola o como un servicio de Windows, que son los escenarios más comunes, esto no representa un problema porque Windows asignará un nuevo token al proceso del Wrapper.

NOTA

wrapper.privileges.remove se puede utilizar en tiempo de ejecución para eliminar uno o más privilegios. Sin embargo, suele ser mejor eliminar el privilegio (o privilegios) del valor de wrapper.ntservice.required_privileges y reinstalar o actualizar el servicio.

wrapper.ntservice.impersonation

Compatibilidad :3.5.58
Ediciones :Edición ProfesionaEdición EstándarEdición de la Comunidad
Plataformas :WindowsMac OSX (No Compatible)Linux (No Compatible)Alpine Linux (No Compatible)FreeBSD (No Compatible)Solaris (No Compatible)IBM z/Linux (No Compatible)

Esta propiedad controla si se debe eliminar la suplantación de identidad (impersonation) para el proceso del Wrapper y todos sus procesos secundarios (incluidos los procesos de la aplicación Java).

Cuando se inicia un servicio de Windows, el Administrador de control de servicios (SCM) añade automáticamente el grupo SERVICE a la cuenta utilizada por el servicio. Este es el caso de la mayoría de las cuentas que se pueden utilizar para los servicios de Windows, incluidas las cuentas integradas y las cuentas locales personalizadas. De manera predeterminada, el grupo SERVICE tiene el privilegio SeImpersonatePrivilege, que es un derecho de usuario para "Suplantar a un cliente tras la autenticación". Si bien este privilegio es necesario para muchos servicios del sistema por razones de compatibilidad, la mayoría de las aplicaciones Java no lo necesitan realmente.

Es un problema de seguridad conocido que código malicioso puede abusar de SeImpersonatePrivilege para escalar privilegios a la cuenta LocalSystem, la cual posee el nivel de privilegios más alto en un sistema Windows. Nadie puede garantizar que su programa nunca se verá afectado por vulnerabilidades que permitan la ejecución de código no deseado, por lo que la forma más segura es simplemente no permitir este privilegio cuando no sea necesario.

Siguiendo el principio de menor privilegio, se decidió que el Wrapper eliminará este privilegio de manera predeterminada para los servicios que se ejecuten con cualquier cuenta distinta de NT AUTHORITY\SYSTEM (al ejecutarse con la cuenta SYSTEM, los procesos de Java ya tendrían los privilegios más altos posibles, por lo que no hay riesgo de una mayor escalada). Esto se aplica a todas las versiones del Wrapper posteriores a la 3.5.58. Solo los servicios que necesiten SeImpersonatePrivilege deberían habilitarlo.

La propiedad wrapper.ntservice.impersonation se puede configurar con los siguientes valores:

  • UNCHANGED :

    para no eliminar nunca SeImpersonatePrivilege del proceso del Wrapper.

  • DEFAULT :

    para eliminar SeImpersonatePrivilege al ejecutarse como servicio con una cuenta distinta de NT AUTHORITY\SYSTEM.

  • REMOVE :

    para eliminar siempre SeImpersonatePrivilege del proceso del Wrapper.

El valor predeterminado es DEFAULT.

NOTA

SeImpersonatePrivilege no se eliminará si se especifican privilegios requeridos para el servicio. Esto se debe a que si SeImpersonatePrivilege no está presente en la lista de privilegios requeridos, será eliminado por el SCM. Pero, por el contrario, si está presente, significa que se debe conservar. El control preciso de los privilegios requeridos se puede realizar con la edición Professional.

La edición Professional también puede sobrescribir wrapper.ntservice.impersonation especificando SeImpersonatePrivilege con la propiedad wrapper.privileges.remove.

Si se requiere SeImpersonatePrivilege para un Comando de evento (edición Professional), para la aplicación Java o para cualquiera de sus procesos secundarios, wrapper.ntservice.impersonation debe configurarse en UNCHANGED. A continuación, la edición Professional del Wrapper puede ajustar con precisión qué procesos deben eliminar este privilegio y qué procesos deben conservarlo.

Ejemplo:
# Do not remove impersonation for services
wrapper.ntservice.impersonation=UNCHANGED

# Remove impersonation for the Java process
wrapper.java.privileges.remove=SeImpersonatePrivilege

# Remove impersonation for all event commands by default
wrapper.event.default.command.privileges.remove=SeImpersonatePrivilege

# Enable SeImpersonatePrivilege for only one specific command
wrapper.event.user1.command.argv.1=./myscript.bat
wrapper.event.user1.command.privileges.enable=SeImpersonatePrivilege

NOTA

wrapper.ntservice.impersonation solo se utiliza cuando el Wrapper se ejecuta como un servicio de Windows. Sin embargo, para las demás propiedades de privilegios, si necesita aplicar configuraciones diferentes según se ejecute como servicio o como aplicación de consola, puede considerar utilizar un archivo de inclusión cuya ruta haga referencia a la variable %WRAPPER_RUN_MODE%. Puede tener así dos archivos de configuración distintos, con rutas (o nombres de archivo) que contengan la palabra "service" o "console" según el modo al que deba aplicarse la configuración.

Ejemplo (configuraciones diferentes para los modos servicio y consola):
@include ../conf/wrapper-privileges-%WRAPPER_RUN_MODE%.conf

Privilegios en tiempo de ejecución para el proceso de Java

Las siguientes propiedades se utilizan para ajustar los privilegios del proceso de Java. Si se configura cualquiera de estas propiedades, el token de acceso del proceso del Wrapper se duplicará y los privilegios especificados se me ajustarán en la copia del token. Posteriormente, el proceso de Java se lanzará en el contexto de seguridad representado por este nuevo token.

Solo se pueden ajustar los privilegios que existan en el token de acceso del proceso de Java (y que, por lo tanto, también existan en el token del proceso del Wrapper).

Tenga en cuenta que la lista de privilegios se puede cambiar a dos niveles antes de lanzar el proceso de Java: al instalar un servicio de Windows si se especificaron privilegios requeridos, o si uno o más privilegios se han eliminado al iniciar el Wrapper.

Los privilegios se reajustarán cada vez que se lance una nueva JVM. Si se permite recargar el archivo de configuración, estas propiedades se pueden cambiar para utilizar diferentes configuraciones de privilegios en la siguiente invocación de la JVM.

wrapper.java.privileges.enable

Compatibilidad :3.5.57
Ediciones :Edición ProfesionaEdición Estándar (No Compatible)Edición de la Comunidad (No Compatible)
Plataformas :WindowsMac OSX (No Compatible)Linux (No Compatible)Alpine Linux (No Compatible)FreeBSD (No Compatible)Solaris (No Compatible)IBM z/Linux (No Compatible)

Esta propiedad se utiliza para especificar una lista de privilegios a habilitar cuando se lanza el proceso de Java. Los privilegios enumerados deben estar separados por comas.

Ejemplo (habilitar SeIncreaseWorkingSetPrivilege y SeCreateGlobalPrivilege):
wrapper.java.privileges.enable=SeIncreaseWorkingSetPrivilege, SeCreateGlobalPrivilege

El valor "ALL" se puede utilizar para habilitar todos los privilegios presentes en el token de acceso del proceso del Wrapper.

"wrapper.java.privileges.enable=ALL" también se puede usar en combinación con wrapper.java.privileges.disable para habilitar todos los privilegios excepto algunos.

Ejemplo (habilitar todos los privilegios excepto SeIncreaseWorkingSetPrivilege):
wrapper.java.privileges.enable=ALL
wrapper.java.privileges.disable=SeIncreaseWorkingSetPrivilege

wrapper.java.privileges.disable

Compatibilidad :3.5.57
Ediciones :Edición ProfesionaEdición Estándar (No Compatible)Edición de la Comunidad (No Compatible)
Plataformas :WindowsMac OSX (No Compatible)Linux (No Compatible)Alpine Linux (No Compatible)FreeBSD (No Compatible)Solaris (No Compatible)IBM z/Linux (No Compatible)

Esta propiedad se utiliza para especificar una lista de privilegios a deshabilitar cuando se lanza el proceso de Java. Los privilegios enumerados deben estar separados por comas.

Example (disable SeIncreaseWorkingSetPrivilege and SeCreateGlobalPrivilege):
wrapper.java.privileges.disable=SeIncreaseWorkingSetPrivilege, SeCreateGlobalPrivilege

El valor "ALL" se puede utilizar para deshabilitar todos los privilegios presentes en el token de acceso del proceso del Wrapper.

wrapper.java.privileges.disable=ALL también se puede usar en combinación con wrapper.java.privileges.enable para deshabilitar todos los privilegios excepto algunos.

Ejemplo (deshabilitar todos los privilegios excepto SeIncreaseWorkingSetPrivilege):
wrapper.java.privileges.disable=ALL
wrapper.java.privileges.enable=SeIncreaseWorkingSetPrivilege

ADVERTENCIA

  • Si un privilegio está presente tanto en la lista wrapper.java.privileges.enable como en wrapper.java.privileges.disable, se registrará una advertencia y el privilegio quedará deshabilitado (excepto en los casos en que una de las propiedades se configure como ALL).

  • Utilizar tanto wrapper.java.privileges.enable=ALL como wrapper.java.privileges.disable=ALL no es válido.

wrapper.java.privileges.remove

Compatibilidad :3.5.57
Ediciones :Edición ProfesionaEdición Estándar (No Compatible)Edición de la Comunidad (No Compatible)
Plataformas :WindowsMac OSX (No Compatible)Linux (No Compatible)Alpine Linux (No Compatible)FreeBSD (No Compatible)Solaris (No Compatible)IBM z/Linux (No Compatible)

Esta propiedad se utiliza para especificar una lista de privilegios a eliminar cuando se lanza el proceso de Java. Los privilegios enumerados deben estar separados por comas.

Ejemplo (eliminar SeIncreaseWorkingSetPrivilege y SeCreateGlobalPrivilege):
wrapper.java.privileges.remove=SeIncreaseWorkingSetPrivilege, SeCreateGlobalPrivilege

El valor "ALL" se puede utilizar para eliminar todos los privilegios presentes en el token de acceso del proceso del Wrapper.

Ejemplo (eliminar todos los privilegios):
wrapper.java.privileges.remove=ALL

ADVERTENCIA

Una vez que un privilegio se ha eliminado del token de acceso de un proceso, no se puede volver a añadir durante el tiempo de vida del proceso. Eliminar un privilegio también hace que no esté disponible para todos los procesos secundarios lanzados por Java.

NOTA

wrapper.privileges.remove se puede utilizar para ejecutar el proceso de Java con privilegios inferiores a los del proceso del Wrapper.

Privilegios en tiempo de ejecución para Comandos de eventos

Las siguientes propiedades se utilizan para ajustar privilegios en comandos lanzados en respuesta a determinados eventos. Si se configura cualquiera de estas propiedades, el token de acceso del proceso del Wrapper se duplicará y los privilegios especificados se ajustarán en la copia del token. Posteriormente, el comando de evento se lanzará en el contexto de seguridad representado por este nuevo token.

Solo se pueden ajustar los privilegios que existan en el token de acceso del Comando de evento (y que, por lo tanto, también existan en el token del proceso del Wrapper).

Tenga en cuenta que la lista de privilegios se puede cambiar a dos niveles antes de lanzar un comando de evento: al instalar un servicio de Windows si se especificaron privilegios requeridos, o si uno o más privilegios se han eliminado al iniciar el Wrapper.

NOTA

La capacidad de controlar los privilegios a diferentes niveles al lanzar procesos permite configuraciones como la siguiente: Para habilitar un determinado privilegio para un Comando de evento, este también debe existir para el proceso del Wrapper. Sin embargo, el proceso de Java puede eliminar por completo este privilegio, garantizando así que no lo utilicen ni la aplicación Java ni ninguno de sus procesos secundarios.

Ejemplo:
# instalar el servicio con los siguientes privilegios
wrapper.ntservice.required_privileges=SeChangeNotifyPrivilege, SeImpersonatePrivilege, SeIncreaseWorkingSetPrivilege

# deshabilitar el privilegio SeImpersonatePrivilege ya que no se necesita para el propio Wrapper
# (pero conservarlo en el token de acceso para que los comandos de eventos aún puedan habilitarlo)
wrapper.privileges.disable=SeImpersonatePrivilege

# eliminar SeImpersonatePrivilege para la aplicación Java y todos sus procesos secundarios
wrapper.java.privileges.remove=SeImpersonatePrivilege

# de manera predeterminada, eliminar también SeImpersonatePrivilege para todos los comandos de eventos
wrapper.event.default.command.privileges.remove=SeImpersonatePrivilege

# sobrescribir la propiedad predeterminada anterior para un comando de evento específico
wrapper.event.user1.command.privileges.remove=NONE

# habilitar SeImpersonatePrivilege para un comando de evento específico
wrapper.event.user1.command.privileges.enable=SeImpersonatePrivilege

wrapper.event.<event_name>.command.privileges.enable

Compatibilidad :3.5.57
Ediciones :Edición ProfesionaEdición Estándar (No Compatible)Edición de la Comunidad (No Compatible)
Plataformas :WindowsMac OSX (No Compatible)Linux (No Compatible)Alpine Linux (No Compatible)FreeBSD (No Compatible)Solaris (No Compatible)IBM z/Linux (No Compatible)

Esta propiedad se utiliza para especificar una lista de privilegios a habilitar cuando se lanza el comando de evento. Los privilegios enumerados deben estar separados por comas.

Al igual que varias de las propiedades de comandos de eventos, se puede definir:

  • De forma global para todos los eventos: propiedad wrapper.event.default.command.privileges.enable, o
  • Para un evento específico: propiedad wrapper.event.<event_name>.command.privileges.enable.

Ejemplo (habilitar SeIncreaseWorkingSetPrivilege y SeCreateGlobalPrivilege):
wrapper.event.user1.command.privileges.enable=SeIncreaseWorkingSetPrivilege, SeCreateGlobalPrivilege

El valor "ALL" se puede utilizar para habilitar todos los privilegios presentes en el token de acceso del proceso del Wrapper.

wrapper.event.<event_name>.command.privileges.enable=ALL también se puede usar en combinación con wrapper.event.<event_name>.command.privileges.disable para habilitar todos los privilegios excepto algunos.

Ejemplo (habilitar todos los privilegios excepto SeIncreaseWorkingSetPrivilege):
wrapper.event.user1.command.privileges.enable=ALL
wrapper.event.user1.command.privileges.disable=SeIncreaseWorkingSetPrivilege

El valor predeterminado NONE resulta útil para que wrapper.event.<event_name>.command.privileges.enable sobrescriba el valor de wrapper.event.default.command.privileges.enable.

Ejemplo (SeTimeZonePrivilege se habilita para comandos de todos los eventos excepto para el evento user1):
wrapper.event.default.command.privileges.enable=SeTimeZonePrivilege
wrapper.event.user1.command.privileges.enable=NONE

wrapper.event.<event_name>.command.privileges.disable

Compatibilidad :3.5.57
Ediciones :Edición ProfesionaEdición Estándar (No Compatible)Edición de la Comunidad (No Compatible)
Plataformas :WindowsMac OSX (No Compatible)Linux (No Compatible)Alpine Linux (No Compatible)FreeBSD (No Compatible)Solaris (No Compatible)IBM z/Linux (No Compatible)

sta propiedad se utiliza para especificar una lista de privilegios a deshabilitar cuando el Wrapper se inicia como consola o como servicio. Los privilegios enumerados deben estar separados por comas.

Al igual que varias de las propiedades de comandos de eventos, se puede definir:

  • De forma global para todos los eventos: propiedad wrapper.event.default.command.privileges.disable, o
  • Para un evento específico: propiedad wrapper.event.<event_name>.command.privileges.disable.

Ejemplo (deshabilitar SeIncreaseWorkingSetPrivilege y SeCreateGlobalPrivilege):
wrapper.event.user1.command.privileges.disable=SeIncreaseWorkingSetPrivilege, SeCreateGlobalPrivilege

El valor "ALL" se puede utilizar para deshabilitar todos los privilegios presentes en el token de acceso del proceso del Wrapper.

wrapper.event.<event_name>.command.privileges.disable=ALL también se puede usar en combinación con wrapper.event.<event_name>.command.privileges.enable para deshabilitar todos los privilegios excepto algunos.

Ejemplo (deshabilitar todos los privilegios excepto SeIncreaseWorkingSetPrivilege):
wrapper.event.user1.command.privileges.disable=ALL
wrapper.event.user1.command.privileges.enable=SeIncreaseWorkingSetPrivilege

El valor predeterminado NONE resulta útil para que wrapper.event.<event_name>.command.privileges.disable sobrescriba el valor de wrapper.event.default.command.privileges.disable.

Ejemplo (SeImpersonatePrivilege se deshabilita para comandos de todos los eventos excepto para el evento user1):
wrapper.event.default.command.privileges.disable=SeImpersonatePrivilege
wrapper.event.user1.command.privileges.disable=NONE

ADVERTENCIA

  • Si un privilegio está presente tanto en la lista wrapper.event.<event_name>.command.privileges.enable como en wrapper.event.<event_name>.command.privileges.disable, se registrará una advertencia y el privilegio quedará deshabilitado (excepto en los casos en que una de las propiedades se configure como ALL).

  • Utilizar tanto wrapper.event.<event_name>.command.privileges.enable=ALL como wrapper.event.<event_name>.command.privileges.disable=ALL no es válido.

wrapper.event.<event_name>.command.privileges.remove

Compatibilidad :3.5.57
Ediciones :Edición ProfesionaEdición Estándar (No Compatible)Edición de la Comunidad (No Compatible)
Plataformas :WindowsMac OSX (No Compatible)Linux (No Compatible)Alpine Linux (No Compatible)FreeBSD (No Compatible)Solaris (No Compatible)IBM z/Linux (No Compatible)

Esta propiedad se utiliza para especificar una lista de privilegios a eliminar cuando el Wrapper se inicia como consola o como servicio. Los privilegios enumerados deben estar separados por comas.

Al igual que varias de las propiedades de comandos de eventos, se puede definir:

  • De forma global para todos los eventos: propiedad wrapper.event.default.command.privileges.remove, o
  • Para un evento específico: propiedad wrapper.event.<event_name>.command.privileges.remove.

Ejemplo (eliminar SeIncreaseWorkingSetPrivilege y SeCreateGlobalPrivilege):
wrapper.event.user1.command.privileges.remove=SeIncreaseWorkingSetPrivilege, SeCreateGlobalPrivilege

El valor "ALL" se puede utilizar para eliminar todos los privilegios presentes en el token de acceso del proceso del Wrapper.

Ejemplo (eliminar todos los privilegios):
wrapper.event.user1.command.privileges.remove=ALL

El valor predeterminado NONE resulta útil para que wrapper.event.<event_name>.command.privileges.remove sobrescriba el valor de wrapper.event.default.command.privileges.remove.

Ejemplo (SeImpersonatePrivilege se elimina para comandos de todos los eventos excepto para el evento user1):
wrapper.event.default.command.privileges.remove=SeImpersonatePrivilege
wrapper.event.user1.command.privileges.remove=NONE

ADVERTENCIA

Una vez que un privilegio se ha eliminado del token de acceso de un proceso, no se puede volver a añadir durante el tiempo de vida del proceso. Eliminar un privilegio también hace que no esté disponible para todos los procesos secundarios que compartan el mismo token de acceso o para futuros procesos secundarios que se lancen duplicando el token de acceso del Wrapper.

NOTA

wrapper.event.<event_name>.command.privileges.remove se puede utilizar en tiempo de ejecución para eliminar uno o más privilegios. Sin embargo, suele ser mejor eliminar el privilegio (o privilegios) del valor de wrapper.ntservice.required_privileges y luego reinstalar o actualizar el servicio.

Registro de Eventos (Logging)

wrapper.privileges.status.loglevel

Compatibilidad :3.5.57
Ediciones :Edición ProfesionaEdición Estándar (No Compatible)Edición de la Comunidad (No Compatible)
Plataformas :WindowsMac OSX (No Compatible)Linux (No Compatible)Alpine Linux (No Compatible)FreeBSD (No Compatible)Solaris (No Compatible)IBM z/Linux (No Compatible)

Esta propiedad se utiliza para controlar el nivel de registro en el que se imprime información sobre privilegios en los registros del Wrapper.

Cambiar el nivel de registro puede ser útil con fines de depuración para visualizar cómo se modifican los privilegios. Para cada proceso, también se imprimirá la lista de privilegios efectivos, así como su estado.

El valor predeterminado es NONE, lo que significa que no se imprime información en el registro. En entornos de producción, se recomienda utilizar NONE para no dejar información sobre el estado de los privilegios en los registros.

Ejemplo (cambiar el nivel de registro del estado de privilegios):
wrapper.privileges.status.loglevel=STATUS

La salida del registro se verá así:

Ejemplo (salida del estado de privilegios del proceso de Java):
...
STATUS | wrapper  | Launching a JVM...
STATUS | wrapper  | Java process: Privilege 'SeUndockPrivilege' was changed from DISABLED to ENABLED.
STATUS | wrapper  | Java process: Privilege 'SeTimeZonePrivilege' was removed.
STATUS | wrapper  | Java process: Effective privileges:
STATUS | wrapper  | Java process:   SeShutdownPrivilege (DISABLED)
STATUS | wrapper  | Java process:   SeUndockPrivilege (ENABLED)
STATUS | wrapper  | Java process:   SeIncreaseWorkingSetPrivilege (DISABLED)
...

Consultar los privilegios de un Servicio de Windows

Compatibilidad :3.5.57
Ediciones :Edición ProfesionaEdición Estándar (No Compatible)Edición de la Comunidad (No Compatible)
Plataformas :WindowsMac OSX (No Compatible)Linux (No Compatible)Alpine Linux (No Compatible)FreeBSD (No Compatible)Solaris (No Compatible)IBM z/Linux (No Compatible)

Es posible consultar los privilegios requeridos de un servicio de Windows, así como los privilegios en tiempo de ejecución del proceso del Wrapper y de sus procesos secundarios, con un solo comando: .\wrapper.exe -qr ../conf/wrapper.conf

Ejemplo (configuración):
wrapper.ntservice.required_privileges=SeIncreaseWorkingSetPrivilege, SeUndockPrivilege, SeImpersonatePrivilege

wrapper.event.jvm_prelaunch.command.privileges.disable=ALL
wrapper.event.jvm_prelaunch.command.privileges.remove=SeIncreaseWorkingSetPrivilege

wrapper.java.privileges.enable=SeUndockPrivilege, SeTimeZonePrivilege
wrapper.java.privileges.remove=SeImpersonatePrivilege

Ejemplo (salida):
.\wrapper.exe -qr ..\conf\wrapper.conf
STATUS | wrapperm | Required privileges for the testwrapper3 service:
STATUS | wrapperm |   SeChangeNotifyPrivilege (DEFAULT, ENABLED)
STATUS | wrapperm |   SeIncreaseWorkingSetPrivilege (DISABLED)
STATUS | wrapperm |   SeUndockPrivilege (DISABLED)
STATUS | wrapperm |   SeImpersonatePrivilege (DEFAULT, ENABLED)
STATUS | wrapperm |
STATUS | wrapperm | Child processes:
STATUS | wrapperm |   myscript.bat: Effective privileges:
STATUS | wrapperm |   myscript.bat:   SeChangeNotifyPrivilege (DISABLED)
STATUS | wrapperm |   myscript.bat:   SeUndockPrivilege (DISABLED)
STATUS | wrapperm |   myscript.bat:   SeImpersonatePrivilege (DISABLED)
STATUS | wrapperm |
STATUS | wrapperm |   java.exe: Effective privileges:
STATUS | wrapperm |   java.exe:   SeChangeNotifyPrivilege (DEFAULT, ENABLED)
STATUS | wrapperm |   java.exe:   SeUndockPrivilege (ENABLED)
STATUS | wrapperm |   java.exe:   SeIncreaseWorkingSetPrivilege (DISABLED)


También es posible consultar los privilegios de un servicio diferente añadiendo '=', seguido del nombre del servicio, a la opción -qr ('-qr=nombreServicio').

Consultar los privilegios utilizando el nombre del servicio:
.\wrapper.exe -qr=myservice ../conf/wrapper-license.conf