728x90
반응형

이번 데모 프로젝트는 Neo4j의 기능을 확장해서, IP 주소가 지정된 네트워크 세그먼트에 속하는지 확인하는 사용자 정의 함수(UDF)를 구현하는 방법을 보여주려고 해요. Neo4j Graph Database 내에 네트워크 검증을 통합하려는 개발자에게 아주 실용적인 예시가 될 거예요.

메모: 코드 예제는 에서 확인할 수 있어요. 이 스니펫은 데모용이고, Neo4j에서 공식적으로 지원하는 솔루션은 아니라는 점 참고해주세요!

Neo4j UDF에 대한 자세한 내용은 공식 를 참고하세요.

프로젝트 개요

네트워크 관리 팀은 서버가 특정 네트워크 세그먼트에 속하는지 확인해야 할 때가 많죠. Neo4j는 네트워크 엔터티 간의 복잡한 관계를 표현하는 데 아주 뛰어나지만, 현재 기본 기능으로는 Classless Inter-Domain Routing(CIDR) 검증이 부족해요.

바로 이럴 때 UDF가 필요한 거예요! UDF를 사용하면 사용자는 ip 속성을 가진 Node(특히 서버 Node)가 정의된 네트워크에 속하는지 확인할 수 있어요. 네트워크 관리 애플리케이션, 모니터링 시스템 또는 사전 정의된 서브넷에 대해 IP 할당을 확인해야 하는 모든 시나리오에서 특히 유용할 수 있겠죠?

사용 예

Neo4j 데이터베이스에 여러 Node가 포함되어 있다고 가정해볼게요 (:Server). 각각 ip 속성은 IP 주소를 나타내는데요, 다음 프로세스에서는 UDF를 사용하는 방법을 보여줄게요.

1. 데이터 모델 이해

Server Label이 할당된 데이터베이스의 Node를 시각화할 수 있어요. 다음 Cypher 문을 실행해서 네트워크의 다양한 서버를 나타내볼까요?

MATCH (s:Server) RETURN s;

2. IP 주소 Node 속성 표시

Node에 저장된 IP 주소를 보려면 위 단계에서 MATCH 쿼리를 실행하고 결과를 테이블 형식으로 보도록 선택하면 돼요. 그러면 일치하는 Node와 해당 속성이 포함된 테이블이 표시될 거예요.

UDF 사용

UDF는 example.ipBelongsToNetwork(ip, network)와 같은 간단한 기능을 제공해요. 아래에서 세 가지 실제 사례를 한번 살펴볼까요?

예 1: 이름 및 네트워크로 필터링

이 예에서는 특정 조건(예: 라벨 및 이름 일치)을 기반으로 `Node`를 필터링하는 `Query`를 수행하고, 연결된 IP 주소가 지정된 네트워크 세그먼트에 속하는지 확인해요.

`Label`이 :Server인 모든 `Node`를 찾고, `name` 속성에 web-server가 포함되어 있고, 해당 IP 주소가 네트워크 10.10.0.0/16에 속하는지 확인하려면 다음 `Query`를 실행하세요.

MATCH (s:Server)
WHERE s.name CONTAINS 'web-server'
RETURN s.ip, example.ipBelongsToNetwork(s.ip, '10.10.0.0/16') AS belongsToNetwork

예 2: 네트워크 기반 필터링

`Node` 속성 IP 값이 지정된 네트워크에 속하는지 여부를 기준으로 `Node`를 필터링합니다.

MATCH (s:Server) WHERE example.ipBelongsToNetwork(s.ip, '192.168.10.0/28') RETURN s

예 3: 복잡한 네트워크 토폴로지

이 예에서는 대규모 네트워크를 나타내는 보다 복잡한 그래프를 분석해요. 이 예시에 사용된 데이터세트는 기존 데이터세트에서 추출되었어요. GitHub 저장소에서 확인해볼 수 있습니다.

이 프로젝트에서는 데이터 세트를 가져오고 IP `Node` 속성 값을 기반으로 `Node`를 필터링하는 데 사용되는 UDF를 구성하기 위해 Docker 이미지가 생성되었어요.

이 이미지를 로컬에서 빌드하고 실행하려면 이 저장소를 확인하고 다음을 사용하여 .jar 파일을 빌드하세요. mvn clean 설치하다.

그런 다음 Docker 명령을 실행하여 리포지토리에 제공된 Dockerfile을 사용하여 Docker 이미지를 빌드하고 컨테이너를 시작합니다.

docker build -t neo-udf-ip-check:1.0 .

docker run -it -p 7474:7474 -p 7687:7687 --env=NEO4J_AUTH=neo4j/<> neo-udf-ip-check:1.0

Note: neo4j-enterprise Docker 이미지에서 이미지를 빌드하는 경우 변수를 추가해야 합니다.--env=NEO4J_ACCEPT_LICENSE_AGREEMENT=yes.

용기를 꺼내세요.저장소:

docker pull ghcr.io/looeejee/neo-udf-cidr-check:main

컨테이너를 실행합니다.

docker run -it -p 7474:7474 -p 7687:7687 --env=NEO4J_AUTH=neo4j/<PASSWORD> ghcr.io/looeejee/neo-udf-cidr-check:main

컨테이너가 실행되면 브라우저를 열고 다음을 통해 Neo4j 브라우저에 액세스하여 컨테이너에 연결합니다..

위 단계에서 정의한 사용자 인증 정보를 사용하여 로그인하세요.

로그인한 후에는 Cypher 명령을 사용하여 그래프에 포함된 `Node`와 `Relationship`을 검토하고 익숙해질 수 있어요.

CALL db.schema.visualization();

그런 다음 UDF를 테스트하여 `Node` 속성 IP가 특정 네트워크에 속하는지 여부에 따라 인터페이스를 필터링할 수 있어요.

MATCH (i:Interface)-[r]-(d) WHERE example.ipBelongsToNetwork(i.ip,"10.4.1.0/28") RETURN i AS InterfaceIP, r as REL, d AS Device

네트워크 분석 수행

정의한 UDF를 통합하고 이를 Neo4j MCP 서버와 함께 사용해서, LLM의 도움을 받아 상세한 네트워크 분석을 수행함으로써 이 프로젝트를 한 단계 더 발전시킬 수 있어요.

이 테스트에서는 Claude Desktop과 Neo4j MCP 서버를 사용해요. UDF 및 데모 네트워크 데이터가 포함된 컨테이너가 실행 중인지 확인하세요.

docker run -it -p 7474:7474 -p 7687:7687 --env=NEO4J_AUTH=neo4j/<> neo-udf-ip-check:1.0
  • 1단계: 다음에 설명된 예제에 따라 MCP 서버를 설치합니다. neo4j-mcp: 설치.
  • 2단계: Neo4j 서버에 저장된 네트워크 그래프에서 Cypher `쿼리`를 실행하기 위해 neo4j-mcp를 사용하여 MCP 서버에 의해 노출된 도구에 액세스하도록 Claude Desktop을 구성합니다.
  • 3단계: Neo4j MCP 서버 구성을 포함하도록 claude_desktop_config.json 파일을 업데이트합니다.
{
  "mcpServers": {
    "neo4j-mcp": {
      "type": "stdio",
      "command": "neo4j-mcp",
      "args": [],
      "env": {
        "NEO4J_URI": "bolt://localhost:7687",
        "NEO4J_USERNAME": "neo4j",
        "NEO4J_PASSWORD": "password",
        "NEO4J_DATABASE": "neo4j",
        "NEO4J_READ_ONLY": "true",
        "NEO4J_TELEMETRY": "false",
        "NEO4J_LOG_LEVEL": "info",
        "NEO4J_LOG_FORMAT": "text",
        "NEO4J_SCHEMA_SAMPLE_SIZE": "100"
      }
    }
  }
}

claude_desktop_config.json 파일이 MCP 서버 구성으로 업데이트되면 저장하고 Claude Desktop을 다시 시작하세요.

이제 MCP 서버에서 제공되는 도구에 액세스하는 Claude Desktop으로 새로운 채팅 세션을 시작할 수 있어요.

LLM 질문하기

이제 설정이 완료되었으니, Claude에게 다음을 요청하면 돼요.

"example.ipBelongsToNetwork UDF를 사용하여 네트워크 10.1.10.0/24에 속하는 모든 `노드`를 검색합니다."

LLM은 다음을 수행하죠.

  • UDF를 사용하여 Neo4j 데이터베이스 `쿼리`
  • 네트워크 토폴로지 분석
  • 연결된 장치 식별
  • 잠재적인 보안 문제 강조
  • 실행 가능한 권장 사항 제공

MCP 통합을 통한 네트워크 분석 결과

Neo4j MCP 읽기 암호 도구를 통해 그래프의 데이터에 액세스하고 우리가 만든 UDF 기능을 활용함으로써, LLM은 관심 있는 네트워크 세그먼트에 대한 자세한 분석을 제공하는 데 필요한 모든 정보를 갖게 돼요.

Claude가 생성한 전체 분석은 다음에서 확인할 수 있습니다. 프로젝트 저장소.

요약

이 데모 프로젝트의 목표는 Neo4j, LLM, 그리고 UDF를 결합해서 네트워크 분석에 필요한 자세한 정보를 검색하는 방법을 보여주는 거예요. 이런 접근 방식은 네트워크에 연결된 장치 추적을 쉽게 해주고, 사용되지 않거나 불필요하게 열려 있는 포트를 식별해주며, 복잡한 IT 환경에서 연결 문제를 해결하는 데 도움을 줄 수 있죠. 궁극적으로 이 통합의 목표는 Neo4j를 활용해서 네트워크 관리 기능을 향상시키고, 팀이 포괄적인 데이터 분석을 기반으로 정보에 입각한 결정을 내릴 수 있도록 지원하는 방법을 보여주는 것이랍니다.

좀 더 자세히 알아보고 싶다면 GraphAcademy에서 데이터 분석에 대한 무료 강좌를 확인해 보세요!


  • mcp 서버
  • udf

에이치시스템즈의 LogTree는 Neo4j 기반 GraphRAG 플랫폼으로, 데이터를 자동으로 지식그래프화하고 자연어 질의로 즉시 답을 제공합니다.

👉 에이치시스템즈 홈페이지

728x90
반응형

+ Recent posts