Segurança do Java Management Extensions (JMX)

É possível proteger chamadas de beans gerenciados (MBean) em um ambiente distribuído.

Para obter informações adicionais sobre os MBeans que estão disponíveis, consulte Administrando com Beans Gerenciados (MBeans).

Na topologia de implementação distribuída, MBeans são hospedados diretamente nos servidores de catálogos e nos servidores de contêiner. Em geral, a segurança de JMX em uma topologia distribuída segue a especificação de segurança do JMX conforme especificado na Especificação da Java Management Extensions (JMX). Ela consiste nas três partes a seguir:
  1. Autenticação: O cliente remoto precisa ser autenticado no servidor do conector.
  2. Controle de acesso: O controle de acesso do MBean limita quem pode acessar as informações do MBean e quem pode executar as operações do MBean.
  3. Transporte seguro: O transporte entre o cliente JMX e o servidor pode ser protegido com TLS/SSL.

Autenticação

O JMX fornece métodos para os servidores conectores para autenticar os clientes remotos. Para o conector RMI, a autenticação é concluída ao fornecer um objeto que implementa a interface JMXAuthenticator quando o servidor conector é criado. Assim, o eXtreme Scale implementa essa interface JMXAuthenticator para usar o plug-in do Autenticador do ObjectGrid para autenticar os clientes remotos. Consulte Tutorial de Segurança do Java SE - Etapa 2 para obter detalhes sobre como o eXtreme Scale autentica um cliente.

O cliente JMX segue as APIs do JMX para fornecer credenciais para conectar-se com o servidor conector. . A estrutura JMX passa a credencial para o servidor do conector e, em seguida, chama a implementação do JMXAuthenticator para autenticação. Conforme descrito anteriormente, a implementação do JMXAuthenticator então delega a autenticação para a implementação do Autenticador do ObjectGrid.

Revise o exemplo a seguir que descreve como conectar-se a um servidor conector com uma 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"));

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

    // Connect and invoke an operation on the remote MBeanServer
    cntor.connect(environment);

No exemplo anterior, um objeto UserPasswordCredential é fornecido com o ID do usuário configurado para admin e a senha configurada para xxxxx. Este objeto UserPasswordCredential é configurado no mapa do ambiente, que é usado no método JMXConnector.connect(Map). Este objeto UserPasswordCredential é então passado para o servidor pela estrutura JMX e finalmente passado para a estrutura de autenticação do ObjectGrid para a autenticação.

O modelo de programação do cliente segue estritamente a especificação JMX.

Controle de Acesso

Um servidor MBean JMX pode ter acesso a informações sensitivas e pode executar operações sensitivas. O JMX fornece o controle de acesso necessário que identifica quais clientes podem acessar tais informações e quem pode executar tais operações. o controle de acesso é integrado no modelo de segurança Java padrão por meio da definição de permissões que controlam o acesso ao servidor MBean e às suas operações.

Para controle de acesso de operação ou autorização do JMX, oeXtreme Scale conta com o suporte de JAAS fornecido pela implementação JMX. Em qualquer ponto na execução de um programa, há um conjunto atual de permissões que um encadeamento de execuções retém. Quando um destes encadeamentos chama uma operação de especificação JMX, estas permissões são conhecidas como permissões retidas. Quando uma operação JMX é executada, uma verificação de segurança é feita para verificar se a permissão necessária é incluída pela permissão contida.

A definição de política do MBean segue o formato da política Java. Por exemplo, a política a seguir concede a todos os assinantes e a todas as bases de código o direito de recuperar o endereço JMX do servidor para o PlacementServiceMBean. Entretanto, os assinantes e as bases de código ficam restritos ao domínio com.ibm.websphere.objectgrid.

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

O exemplo de política a seguir pode ser utilizado para concluir a autorização baseada na identidade do cliente remoto. A política concede a mesma permissão MBean, conforme mostrado no exemplo anterior, exceto apenas para usuários com o nome 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";
}

As políticas do Java são verificadas somente se o gerenciador de segurança estiver ativado. Inicie os servidores de catálogos e servidores de contêineres com o argumento JVM -Djava.security.manager para forçar o controle de acesso da operação MBean.

Transporte Seguro

O transporte entre o cliente e o servidor JMX pode ser assegurado com o TLS/SSL. Se o transportType do servidor de catálogos ou servidor de contêiner for configurado como SSL_Required ou SSL_Supported, você deverá usar o SSL para conectar-se ao servidor JMX.

Para usar o SSL, você deve configurar o armazenamento confiável, o tipo de armazenamento confiável e a senha do armazenamento confiável no cliente MBean com as propriedades do 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
Se com.ibm.websphere.ssl.protocol.SSLSocketFactory for usado como seu factory de soquete SSL em seu arquivo java_home/jre/lib/security/java.security, use as seguintes propriedades:
  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 obter essas informações quando o protocolo Segurança da Camada de Transporte/Secure Sockets Layer (TLS/SSL) estiver ativado nas configurações independentes, você deve iniciar os servidores de catálogos e de contêiner com o conjunto de portas de serviço JMX. Use um dos seguintes métodos para configurar a porta de serviço JMX:
  • Use a opção -JMXServicePort no script startOgServer.
  • Se você estiver usando um servidor integrado, chame o método setJMXServicePort na interface ServerProperties para configurar a porta de serviço JMX.
O valor padrão para a porta de serviço JMX nos servidores de catálogos é 1099. Você deve usar um número da porta diferente para cada JVM na configuração. Se desejar usar o JMX/RMI, especifique explicitamente a opção -JMXServicePort e o número da porta, mesmo se desejar usar o valor da porta padrão.

A configuração da porta de serviço JMX é requerida quando você deseja exibir informações do servidor de contêiner a partir do servidor de catálogos. Por exemplo, a porta é necessária quando estiver usando o comando xscmd -c showMapSizes.

Configure a porta do conector JMX para evitar a criação de porta efêmera. Use um dos métodos a seguir para configurar a porta do conector JMX.
  • Use a opção -JMXConnectorPort no script startOgServer.
  • Se estiver usando um servidor integrado, chame o método setJMVConnectorPort na interface ServerProperties.