Seguridad JMX (Java Management Extensions)

Puede proteger las invocaciones de beans gestionados (MBean) en un entorno distribuido.

Para obtener más información sobre los MBeans, consulte Administración con beans gestionados (MBeans).

En la topología de despliegue distribuido, los MBeans se alojan directamente en los servidores de catálogo y servidores de contenedor. En general, la seguridad JMX en una topología distribuida sigue la especificación de seguridad JMX tal como se indica en la especificación Java Management Extensions (JMX). Consta de las tres partes siguientes:
  1. Autenticación: el cliente remoto debe autenticarse en el servidor conector.
  2. Control de accesos: el control de accesos de MBean limita quién puede acceder a la información de MBean y quién puede realizar las operaciones de MBean.
  3. Transporte seguro: el transporte entre el cliente y el servidor JMX se puede proteger utilizando TLS/SSL.

Autenticación

JMX proporciona métodos para que los servidores de tipo conector autentiquen los clientes remotos. Para el conector RMI, la autenticación se completa proporcionando un objeto que implementa la interfaz JMXAuthenticator cuando se crea el servidor de conector. Así, eXtreme Scale implementa esta interfaz JMXAuthenticator para utilizar el plug-in Authenticator de ObjectGrid para autenticar los clientes remotos. Consulte Guía de aprendizaje de seguridad de Java SE - Paso 2 para obtener información detallada sobre cómo eXtreme Scale autentica un cliente.

El cliente JMX sigue las API de JMX para proporcionar credenciales y establecer conexión con el servidor conector. La infraestructura JMX pasa la credencial al servidor conector, y después llama a la implementación de JMXAuthenticator para obtener la autenticación. Como se ha descrito anteriormente, la implementación de JMXAuthenticator delega la autenticación a la implementación de ObjectGrid Authenticator.

Observe el ejemplo siguiente que describe cómo establecer conexión con un servidor conector mediante una credencial:

javax.management.remote.JMXServiceURL jmxUrl = new JMXServiceURL(
        "service:jmx:rmi:///jndi/rmi://localhost:1099/objectgrid/MBeanServer");

    environment.put(JMXConnector.CREDENTIALS, new UserPasswordCredential("admin", "xxxxxx"));

    // Crear JMXCconnectorServer
    JMXConnector cntor = JMXConnectorFactory.newJMXConnector(jmxUrl, null);

    // Conectar e invocar una operación en MBeanServer remoto
    cntor.connect(environment);

En el ejemplo anterior, se proporciona un objeto UserPasswordCredential con el ID de usuario establecido en admin y la contraseña establecida en xxxxx. Este objeto UserPasswordCredential se establece en la correlación de entorno, que se utiliza en el método JMXConnector.connect(Map). A continuación, este objeto UserPasswordCredential lo pasa al servidor la infraestructura JMX y, finalmente, se pasa a la infraestructura de autenticación de ObjectGrid para la autenticación.

El modelo de programación de cliente cumple la especificación JMX de manera estricta.

Control de acceso

Un servidor MBean JMX puede tener acceso a información confidencial y realizar operaciones confidenciales. JMX ofrece el control de acceso necesario que identifica qué clientes pueden acceder a la información y qué clientes pueden llevar a cabo las operaciones. El control de accesos se crea en el modelo de seguridad Java estándar definiendo los permisos que controlan el acceso al servidor MBean y sus operaciones.

Para el control de accesos o la autorización de la operación JMX, eXtreme Scale se basa en el soporte JAAS proporcionado por la implementación de JMX. En cualquier punto de la ejecución de un programa, hay un conjunto de permisos actuales contenido por una hebra de ejecución. Cuando dicha hebra llama a una operación de la especificación JMX, estos permisos se denominan permisos mantenidos. Cuando se realiza una operación JMX, se realiza una comprobación de seguridad para verificar que el permiso necesario está implicado en el permiso mantenido.

La definición de política MBean sigue el formato de la política Java. Por ejemplo, la política siguiente otorga a todos los firmantes y a todas las bases de código el derecho a recuperar la dirección JMX del servidor para PlacementServiceMBean. Sin embargo, los firmantes y las bases de código están restringidos al dominio com.ibm.websphere.objectgrid.

grant {
    permission javax.management.MBeanPermission
        "com.ibm.websphere.objectgrid.management.PlacementServiceMBean#retrieveServerJMXAddress 
					[com.ibm.websphere.objectgrid:*,type=PlacementService]",
        "invoke";
}

Puede utilizar el siguiente ejemplo de política para completar la autorización basada en la identidad de cliente remoto. La política otorga el mismo permiso MBean que se muestra en el ejemplo anterior, salvo que sólo para los usuarios con el nombre X500Principal como: CN=Administrator,OU=software,O=IBM,L=Rochester,ST=MN,C=US.

grant principal javax.security.auth.x500.X500Principal "CN=Administrator,OU=software,O=IBM,
				L=Rochester,ST=MN,C=US" {permission javax.management.MBeanPermission
        "com.ibm.websphere.objectgrid.management.PlacementServiceMBean#retrieveServerJMXAddress 
				[com.ibm.websphere.objectgrid:*,type=PlacementService]",
        "invoke";
}

Las políticas Java sólo se comprueban si el gestor de seguridad está activo. Inicie los servidores de catálogo y los servidores de contenedor con el argumento JVM -Djava.security.manager para aplicar el control de acceso de operaciones MBean.

Transporte seguro

El transporte entre el cliente y el servidor JMX se puede proteger con TLS/SSL. Si el valor transportType del servidor de catálogo o servidor de contenedor está establecido en SSL_Required o SSL_Supported, utilice SSL para conectarse al servidor JMX.

Para utilizar SSL, debe configurar el almacén de confianza, el tipo de almacén de confianza y la contraseña de almacén de confianza en el cliente MBean con las propiedades del sistema -D:
  1. -Djavax.net.ssl.trustStore=TRUST_STORE_LOCATION
  2. -Djavax.net.ssl.trustStorePassword=TRUST_STORE_PASSWORD
  3. -Djavax.net.ssl.trustStoreType=TRUST_STORE_TYPE
Si utiliza com.ibm.websphere.ssl.protocol.SSLSocketFactory como la fábrica de sockets SSL en el archivo inicio_java/jre/lib/security/java.security, utilice las propiedades siguientes:
  1. -Dcom.ibm.ssl.trustStore=TRUST_STORE_LOCATION
  2. -Dcom.ibm.ssl.trustStorePassword=TRUST_STORE_PASSWORD
  3. -Dcom.ibm.ssl.trustStoreType=TRUST_STORE_TYPE
Para obtener esta información cuando Transport Layer Security/Secure Sockets Layer (TLS/SSL) está habilitado en configuraciones autónomas, debe iniciar los servidores de catálogo y de contenedor con el puerto de servicio JMX establecido. Utilice uno de los métodos siguientes para establecer el puerto de servicio JMX:
  • Utilice la opción -JMXServicePort en el script startOgServer.
  • Si utiliza un servidor incorporado, llame al método setJMXServicePort en la interfaz ServerProperties para establecer el puerto de servicio JMX.
El valor predeterminado para el puerto de servicio JMX en los servidores de catálogo es 1099. Debe utilizar un número de puerto distinto para cada JVM de la configuración. Si desea utilizar JMX/RMI, especifique explícitamente la opción -JMXServicePort y el número de puerto, incluso si desea utilizar el valor de puerto predeterminado.

Es necesario establecer el puerto de servicio JMX si desea visualizar información del servidor de contenedor desde el servidor de catálogo. Por ejemplo, es necesario el puerto cuando se utiliza el mandato xscmd -c showMapSizes.

Establezca el puerto de conector JMX para evitar la creación de puertos efímeros. Utilice uno de los métodos siguientes para establecer el puerto de conector JMX.
  • Utilice la opción -JMXConnectorPort en el script startOgServer.
  • Si utiliza un servidor incorporado, llame al método setJMVConnectorPort en la interfaz ServerProperties.