Rastreamento de Uso Avançado

O rastreamento de uso avançado permite que você obtenha insights sobre servidores Java em execução em instâncias gerenciadas e sobre bibliotecas usadas por seus aplicativos Java com foco na segurança, mostrando se as bibliotecas detectadas contêm algumas vulnerabilidades conhecidas.

O rastreamento de uso avançado inclui:

  • Verificar Servidores Java
  • Verificar Bibliotecas Java

Verificar Servidores Java

Esse recurso permite descobrir servidores Java em execução na sua frota. No momento, o JMS pode detectar servidores WebLogic, JBoss e Tomcat. Após a descoberta bem-sucedida, você poderá localizar todos os Servidores Java detectados na seção Servidores Java da Frota JMS.

Console do OCI Cloud

  1. Acesse a Console do OCI como administrador.
  2. Abra o menu de navegação, clique em Observabilidade e Gerenciamento e, em seguida, clique em Frota em Java Management.
  3. Selecione sua frota.
  4. Clique em Ações e, no menu, selecione Verificar servidores Java.
  5. Clique em Digitalizar.
  6. Quando a solicitação de serviço for concluída, clique na seção de servidores Java da frota. Todos os servidores Java detectados devem ser listados

CLI do OCI

  1. Execute o seguinte comando:
    oci jms java-server-usage scan --fleet-id $FLEET_OCID

    Observação:

    Você pode especificar uma lista JSON de instâncias gerenciadas em que a verificação deve ser executada com o parâmetro adicional --managed-instance-ids; caso contrário, todas as instâncias gerenciadas na frota serão selecionadas.

Payload JSON de amostra enviado pelo plug-in JMS para o objeto de log do inventário do OCI durante a verificação de servidores Java:

{
  "datetime": 1749559306604,
  "logContent": {
    "id": "ac26cc41-de6d-4f8a-994b-909a3705d0db",
    "time": "2025-06-10T12:41:46.604Z",
    "oracle": {
      "compartmentid": "ocid1.compartment.oc1..compartment-id",
      "ingestedtime": "2025-06-10T12:42:08.158306651Z",
      "instanceid": "ocid1.instance.oc1.eu-frankfurt-1.instance-id",
      "loggroupid": "ocid1.loggroup.oc1.eu-frankfurt-1.log-group-id",
      "logid": "ocid1.log.oc1.eu-frankfurt-1.log-id",
      "tenantid": "ocid1.tenancy.oc1..tenant-id"
    },
    "source": "ocid1.instance.oc1.eu-frankfurt-1.instance-id",
    "specversion": "1.0",
    "subject": "Oracle JMS Plugin",
    "type": "jms.javaserver.metadata.log",
    "data": {
      "data": {
        "clusterName": "",
        "committedHeap": 16252928,
        "deployments": [],
        "fleetId": "ocid1.jmsfleet.oc1.eu-frankfurt-1.fleet-id",
        "initHeap": 16777216,
        "javaDistribution": "Java(TM) SE Runtime Environment",
        "javaHome": "/usr/lib/jvm/jdk-17.0.15-oracle-x64",
        "javaMajorVersion": "17",
        "javaVendor": "Oracle Corporation",
        "javaVersion": "17.0.15",
        "managedInstanceId": "ocid1.instance.oc1.eu-frankfurt-1.instance-id",
        "maxHeap": 241303552,
        "osArch": "amd64",
        "osName": "Linux",
        "osVersion": "5.15.0-306.177.4.el9uek.x86_64",
        "productName": "Apache Tomcat",
        "productVersion": "11.0.8.0",
        "serverHome": "/home/opc/apache-tomcat-11.0.8",
        "serverName": "N/A",
        "serverPort": "8088",
        "usedHeap": 13224344
      },
      "datacontenttype": "application/json",
      "dataschema": "1.0",
      "id": "5d1178ee-f8e9-4cd4-a463-5bb309c02b99",
      "source": "ocid1.instance.oc1.eu-frankfurt-1.instance-id",
      "specversion": "1.0",
      "time": "2025-06-10T12:41:46.601Z",
      "type": "jms.javaserver.metadata.log"
    }
  },
  "regionId": "eu-frankfurt-1"
}

Verificar Bibliotecas Java

Esse recurso permite que você tenha um relatório de todas as bibliotecas usadas pelos seus aplicativos Java em uma única seção da sua frota chamada Bibliotecas Java.

Você pode usá-lo para verificar vulnerabilidades conhecidas em bibliotecas de terceiros Java e garantir que nenhuma biblioteca indesejada seja usada por seus aplicativos Java. Para entender melhor o que o JMS é capaz de detectar ou não, consulte a documentação oficial aqui: Scan for Java Libraries.

Console do OCI Cloud

  1. Acesse a Console do OCI como administrador.
  2. Abra o menu de navegação, clique em Observabilidade e Gerenciamento e, em seguida, clique em Frota em Java Management.
  3. Selecione sua frota.
  4. Clique em Ações e, no menu, selecione Verificar bibliotecas Java.
  5. Clique em Digitalizar.
  6. Quando a solicitação de serviço for concluída, clique na seção de bibliotecas Java da frota. Todas as bibliotecas Java detectadas devem ser listadas

CLI do OCI

  1. Execute o seguinte comando:
    oci jms library-usage scan --fleet-id $FLEET_OCID

    Observação:

    Você pode especificar uma lista JSON de instâncias gerenciadas em que a verificação deve ser executada com o parâmetro adicional --managed-instance-ids; caso contrário, todas as instâncias gerenciadas na frota serão selecionadas.

Payload de amostra JSON enviado pelo plug-in JMS ao objeto de log do inventário do OCI durante a verificação das bibliotecas Java:

{
  "datetime": 1749633185521,
  "logContent": {
    "id": "e7915f73-ac67-4ec7-9d4d-7798cb9e0ce0",
    "time": "2025-06-11T09:13:05.521Z",
    "oracle": {
      "compartmentid": "ocid1.compartment.oc1..compartment-id",
      "ingestedtime": "2025-06-11T09:14:53.129341509Z",
      "instanceid": "ocid1.instance.oc1.eu-frankfurt-1.instance-id",
      "loggroupid": "ocid1.loggroup.oc1.eu-frankfurt-1.log-group-id",
      "logid": "ocid1.log.oc1.eu-frankfurt-1.log-id",
      "tenantid": "ocid1.tenancy.oc1..tenant-id"
    },
    "source": "ocid1.instance.oc1.eu-frankfurt-1.instance-id",
    "specversion": "1.0",
    "subject": "Oracle JMS Plugin",
    "type": "jms.javaserver.libraries.log",
    "data": {
      "data": {
        "applicationSourcePath": "/var/lib/tomcat/webapps/java-webapp-demo-0.0.1-SNAPSHOT.war",
        "clusterName": "",
        "committedHeap": 25296896,
        "deploymentName": "java-webapp-demo-0.0.1-SNAPSHOT",
        "deploymentType": "war",
        "fleetId": "ocid1.jmsfleet.oc1.eu-frankfurt-1.fleet-id",
        "initHeap": 16777216,
        "javaDistribution": "Java(TM) SE Runtime Environment",
        "javaHome": "/opt/java/jdk-24.0.1",
        "javaMajorVersion": "24",
        "javaVendor": "Oracle Corporation",
        "javaVersion": "24.0.1",
        "libraries": [
          "google llc:error_prone_annotations:2.30.0:com.google.errorprone",
          "fasterxml:jackson-datatype-jsr310:2.19.0:com.fasterxml.jackson.datatype",
          "fasterxml:jackson-core:2.19.0:com.fasterxml.jackson.core",
          "the apache software foundation:log4j-to-slf4j:2.24.3:org.apache.logging.log4j",      
          "google gson project:gson:2.13.1:com.google.code.gson",
          "slf4j.org:slf4j-api:2.0.17:org.slf4j",
          "google llc:proto-google-common-protos:2.54.1:com.google.api.grpc",
          "the apache software foundation:log4j-api:2.24.3:org.apache.logging.log4j",
          "h2 group:h2:2.3.232:n/a",
          "slf4j.org:jul-to-slf4j:2.0.17:org.slf4j",
          "qos.ch:logback-classic:1.5.18:ch.qos.logback",
          "fasterxml:jackson-annotations:2.19.0:com.fasterxml.jackson.core",    
          "fasterxml:jackson-module-parameter-names:2.19.0:com.fasterxml.jackson.module",
          "fasterxml:jackson-databind:2.19.0:com.fasterxml.jackson.core",
          "eclipse foundation:jakarta.annotation-api:2.1.1:jakarta.annotation",
          "qos.ch:logback-core:1.5.18:ch.qos.logback"
        ],
        "managedInstanceId": "ocid1.instance.oc1.eu-frankfurt-1.instance-id",
        "maxHeap": 241303552,
        "osArch": "amd64",
        "osName": "Linux",
        "osVersion": "5.15.0-306.177.4.el9uek.x86_64",
        "productName": "Apache Tomcat",
        "productVersion": "9.0.87.0",
        "serverHome": "/usr/share/tomcat",
        "serverName": "N/A",
        "serverPort": "8080",
        "usedHeap": 23623336
      },
      "datacontenttype": "application/json",
      "dataschema": "1.0",
      "id": "f725e769-aea1-4c46-9125-9bec280b75c6",
      "source": "ocid1.instance.oc1.eu-frankfurt-1.instance-id",
      "specversion": "1.0",
      "time": "2025-06-11T09:13:05.518Z",
      "type": "jms.javaserver.libraries.log"
    }
  },
  "regionId": "eu-frankfurt-1"
}

Exemplo

Imagine que você tem um aplicativo Java desenvolvido pelo seu provedor de software favorito e o aplicativo é implantado em um servidor que reside dentro da sua infraestrutura. Para evitar qualquer possível problema de segurança, você gostaria de saber se o aplicativo não contém quaisquer vulnerabilidades de segurança conhecidas. No exemplo a seguir, temos um aplicativo Java Web implantado em um servidor Apache Tomcat e agora executaremos uma verificação de biblioteca Java com o seguinte script:
#!/usr/bin/env bash
 
# configuration variables
FLEET_OCID=ocid1.jmsfleet.oc1.eu-frankfurt-1.amaaaaaaptiaquqa2qxxkco6hrguz7nyug2hcpgikhe5gz4d7uy6j6ilbtta
MANAGED_INSTANCE_OCID=ocid1.instance.oc1.eu-frankfurt-1.antheljtptiaquqcrjmnu7mxbjthm2jm5qzryu7xy4w27rfo56nxf4uwv6pq
 
# execute library scan on specific managed instance within your fleet where example application is running
WORK_REQUEST_OCID=$(oci jms library-usage scan \
        --fleet-id "$FLEET_OCID" \
        --managed-instance-ids "[\"$MANAGED_INSTANCE_OCID\"]" | jq -r '."opc-work-request-id"')
 
echo $WORK_REQUEST_OCID
 
# additionally you can add your own logic to check if work request is finished
# sleep 600
# oci jms work-request get --work-request-id "$WORK_REQUEST_OCID" | jq .data.status

Assim que a solicitação de serviço for concluída e os dados estiverem presentes no JMS, poderemos verificar se nosso aplicativo contém algumas vulnerabilidades com o seguinte comando:

#!/usr/bin/env bash
 
# configuration variables
FLEET_OCID=ocid1.jmsfleet.oc1.eu-frankfurt-1.amaaaaaaptiaquqa2qxxkco6hrguz7nyug2hcpgikhe5gz4d7uy6j6ilbtta
MANAGED_INSTANCE_OCID=ocid1.instance.oc1.eu-frankfurt-1.antheljtptiaquqcrjmnu7mxbjthm2jm5qzryu7xy4w27rfo56nxf4uwv6pq
 
# show first 1000 libraries and print those where JMS is aware of some CVE
oci jms library-usage summarize \
        --fleet-id $FLEET_OCID \
        --managed-instance-id $MANAGED_INSTANCE_OCID \
        --limit 1000 \
        --sort-by timeFirstSeen \
        --sort-order desc | jq '.data.items|map(select(."cve-id" != null))'
 
[
  {
    "approximate-application-count": 0,
    "approximate-deployed-application-count": 1,
    "approximate-java-server-instance-count": 1,
    "approximate-managed-instance-count": 1,
    "cve-id": "CVE-2021-20190",
    "cvss-score": 8.3,
    "fleet-id": "ocid1.jmsfleet.oc1.eu-frankfurt-1.amaaaaaaptiaquqa2qxxkco6hrguz7nyug2hcpgikhe5gz4d7uy6j6ilbtta",
    "library-key": "425505b8076ceac87cc479168829bd75d6a9b2a9e9a1546989b87622da59af39",
    "library-name": "jackson-databind",
    "library-version": "2.8.11.6",
    "time-end": "2025-06-16T16:14:44.233000+00:00",
    "time-first-seen": "2025-06-16T13:09:00+00:00",
    "time-last-cve-refreshed": "2025-06-15T00:00:00+00:00",
    "time-last-seen": "2025-06-16T13:09:00+00:00",
    "time-start": "2025-06-09T00:00:00+00:00"
  },
  {
    "approximate-application-count": 0,
    "approximate-deployed-application-count": 1,
    "approximate-java-server-instance-count": 1,
    "approximate-managed-instance-count": 1,
    "cve-id": "CVE-2021-36090",
    "cvss-score": 5.0,
    "fleet-id": "ocid1.jmsfleet.oc1.eu-frankfurt-1.amaaaaaaptiaquqa2qxxkco6hrguz7nyug2hcpgikhe5gz4d7uy6j6ilbtta",
    "library-key": "6cdd56d2278eec9e4c31a9c50567821a06695341957496956d5a9defcfd3dd10",
    "library-name": "commons-compress",
    "library-version": "1.20",
    "time-end": "2025-06-16T16:14:44.233000+00:00",
    "time-first-seen": "2025-06-16T13:09:00+00:00",
    "time-last-cve-refreshed": "2025-06-15T00:00:00+00:00",
    "time-last-seen": "2025-06-16T13:09:00+00:00",
    "time-start": "2025-06-09T00:00:00+00:00"
  }
]

No exemplo acima, podemos ver que o aplicativo tem dependência da biblioteca jackson-databind da versão 2.8.11.6, que deve ser atualizada por causa do CVE-2021-20190. Uma descoberta semelhante é para a dependência commons-compress da versão 1.20, que reportou a vulnerabilidade CVE-2021-36090.