고급 사용량 추적
고급 사용 추적 기능을 사용하면 관리 인스턴스에서 실행되는 Java 서버 및 감지된 라이브러리에 알려진 취약점이 포함되어 있는지 여부를 표시하여 보안에 중점을 둔 Java 애플리케이션에서 사용되는 라이브러리에 대한 통찰력을 얻을 수 있습니다.
고급 사용 추적에는 다음이 포함됩니다.
- Java 서버 스캔
- Java 라이브러리 스캔
Java 서버 스캔
이 기능을 사용하면 플리트에서 실행 중인 Java 서버를 검색할 수 있습니다. JMS는 현재 WebLogic, JBoss 및 Tomcat 서버를 감지할 수 있습니다. 검색에 성공하면 JMS 플리트의 섹션 Java 서버에서 감지된 모든 Java 서버를 찾을 수 있습니다.
OCI 클라우드 콘솔
- OCI 콘솔에 관리자로 사인인합니다.
- 탐색 메뉴를 열고 관찰 가능성 및 관리를 누른 다음 Java 관리에서 플리트를 누릅니다.
- 플리트를 선택합니다.
- 작업을 누르고 메뉴에서 Java 서버 스캔을 선택합니다.
- 스캔을 누릅니다.
- 작업 요청이 완료되면 플리트의 Java 서버 섹션을 누릅니다. 감지된 모든 Java 서버가 나열되어야 합니다.
OCI CLI
- 다음 명령을 실행합니다.
oci jms java-server-usage scan --fleet-id $FLEET_OCID
주:
추가 매개변수--managed-instance-ids
를 사용하여 스캔을 실행해야 하는 관리 인스턴스의 JSON 목록을 지정할 수 있습니다. 그렇지 않으면 플리트의 모든 관리 인스턴스가 선택됩니다.
Java 서버 스캔 중 JMS 플러그인이 OCI 인벤토리 로그 객체로 전송한 샘플 JSON 페이로드:
{
"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"
}
Java 라이브러리 스캔
이 기능을 사용하면 Java 애플리케이션에서 사용하는 모든 라이브러리에 대한 보고서를 플리트의 단일 섹션에서 Java 라이브러리라고 할 수 있습니다.
Java 타사 라이브러리에서 알려진 취약성을 스캔하고 Java 애플리케이션에서 원치 않는 라이브러리를 사용하지 않도록 보장하는 데 사용할 수 있습니다. JMS가 감지할 수 있거나 감지할 수 없는 사항에 대한 자세한 내용은 Java 라이브러리 스캔에서 공식 설명서를 참조하십시오.
OCI 클라우드 콘솔
- OCI 콘솔에 관리자로 사인인합니다.
- 탐색 메뉴를 열고 관찰 가능성 및 관리를 누른 다음 Java 관리에서 플리트를 누릅니다.
- 플리트를 선택합니다.
- 작업을 누르고 메뉴에서 Java 라이브러리 스캔을 선택합니다.
- 스캔을 누릅니다.
- 작업 요청이 완료되면 플리트의 Java 라이브러리 섹션을 누릅니다. 감지된 모든 Java 라이브러리가 나열되어야 합니다.
OCI CLI
- 다음 명령을 실행합니다.
oci jms library-usage scan --fleet-id $FLEET_OCID
주:
추가 매개변수--managed-instance-ids
를 사용하여 스캔을 실행해야 하는 관리 인스턴스의 JSON 목록을 지정할 수 있습니다. 그렇지 않으면 플리트의 모든 관리 인스턴스가 선택됩니다.
Java 라이브러리 스캔 중 JMS 플러그인이 OCI 인벤토리 로그 객체로 전송한 샘플 JSON 페이로드:
{
"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"
}
예
#!/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
작업 요청이 완료되고 JMS에 데이터가 있으면 다음 명령을 사용하여 애플리케이션에 몇 가지 취약점이 있는지 확인할 수 있습니다.
#!/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"
}
]
위 예제에서는 응용 프로그램이 CVE-2021-20190로 인해 업데이트되어야 하는 2.8.11.6 버전의 jackson-databind
라이브러리에 종속되어 있음을 확인할 수 있습니다. 유사한 결과는 취약성 CVE-2021-36090을 보고한 버전 1.20의 종속성 commons-compress
에 대한 것입니다.