서버구축 (WEB,DB)

n8n API 통한 Audit & Execution Log 수집 모니터링 분석

날으는물고기 2024. 8. 28. 00:34

n8n에서 자체 로그인 내역 및 작업 로그를 수집하고 알람하는 워크플로우를 작성하려면 다음 단계를 따를 수 있습니다. 이 예시는 로그를 수집하고 알람을 트리거하는 기본적인 워크플로우입니다.

  1. HTTP Request (로그 수집)
    • n8n에서 HTTP Request 노드를 사용하여 n8n의 로그 파일 또는 로그 API에 접근합니다.
    • HTTP Request 노드의 설정
      • Method: GET
      • URL: http://<n8n_instance>/api/logs (n8n 인스턴스의 로그 API URL)
      • Authentication: Basic Auth 또는 Token Auth (필요한 경우)
  2. Function Node (로그 분석)
    • HTTP Request 노드의 출력을 받아 로그 데이터를 분석합니다.
    • Function 노드의 설정
      const logs = items[0].json;
      const loginAttempts = logs.filter(log => log.message.includes('login attempt'));
      const recentLoginAttempts = loginAttempts.filter(log => new Date(log.timestamp) > new Date(Date.now() - 3600000)); // 지난 1시간 동안의 로그인 시도
      return recentLoginAttempts.map(log => ({ json: log }));
  3. IF Node (조건 분기)
    • Function 노드의 출력을 받아 조건에 따라 분기합니다.
    • IF 노드의 설정
      • 조건: items.length > 0 (로그인 시도가 있을 경우)
  4. Email Node (알람 전송)
    • IF 노드의 true 브랜치에서 Email 노드를 사용하여 알람을 전송합니다.
    • Email 노드의 설정
      • SMTP 설정: 회사의 SMTP 서버 정보
      • Sender: 보낸 사람 이메일 주소
      • Recipient: 받을 사람 이메일 주소
      • Subject: n8n Login Alert
      • Message: Login attempts detected: {{JSON.stringify($json["message"])}}
  5. Slack Node (슬랙 알람)
    • IF 노드의 true 브랜치에서 Slack 노드를 사용하여 슬랙 알람을 보냅니다.
    • Slack 노드의 설정
      • Authentication: 슬랙 API 토큰
      • Channel: 알람을 보낼 슬랙 채널
      • Message: Login attempts detected: {{JSON.stringify($json["message"])}}

워크플로우의 각 노드 설정이 완료되면, 이를 실행하여 n8n 로그인 내역을 수집하고, 조건에 따라 이메일 및 슬랙 알람을 전송할 수 있습니다.

예시 워크플로우 구성도

  1. HTTP Request (로그 수집)
  2. Function (로그 분석)
  3. IF (조건 분기)
    • True 브랜치
      • Email (알람 전송)
      • Slack (슬랙 알람)
    • False 브랜치
      • 아무 동작도 하지 않음

이 워크플로우는 n8n의 보안 로그를 지속적으로 모니터링하고, 의심스러운 활동이 감지되었을 때 즉시 알림을 받을 수 있도록 도와줍니다.

n8n Public API 개요

n8n Public API는 다양한 작업을 수행할 수 있는 여러 엔드포인트를 제공합니다. 주요 엔드포인트는 사용자, 보안 감사, 실행, 워크플로우, 자격 증명, 태그, 소스 제어 관련 작업을 다룹니다.

API 정보

  • 타이틀: n8n Public API
  • 설명: n8n Public API
  • 버전: 1.1.1
  • 베이스 URL: /api/v1

보안

  • 인증 방식: ApiKeyAuth (헤더에 X-N8N-API-KEY 포함)

주요 엔드포인트

1. User (사용자 관련 작업)

  • GET /users
    • 설명: 인스턴스의 모든 사용자 조회
    • 파라미터: limit, cursor, includeRole
  • GET /users/{id}
    • 설명: 사용자 ID 또는 이메일로 사용자 조회
    • 파라미터: userIdentifier, includeRole

2. Audit (보안 감사 관련 작업)

  • POST /audit
    • 설명: n8n 인스턴스에 대한 보안 감사 생성
    • 바디 파라미터: additionalOptions (객체)

3. Execution (실행 관련 작업)

  • GET /executions
    • 설명: 인스턴스의 모든 실행 조회
    • 파라미터: includeData, status, workflowId, limit, cursor
  • GET /executions/{id}
    • 설명: 실행 ID로 실행 조회
    • 파라미터: executionId, includeData
  • DELETE /executions/{id}
    • 설명: 실행 ID로 실행 삭제
    • 파라미터: executionId

4. Workflow (워크플로우 관련 작업)

  • POST /workflows
    • 설명: 워크플로우 생성
    • 바디 파라미터: workflow (객체)
  • GET /workflows
    • 설명: 인스턴스의 모든 워크플로우 조회
    • 파라미터: active, tags, name, limit, cursor
  • GET /workflows/{id}
    • 설명: 워크플로우 ID로 워크플로우 조회
    • 파라미터: workflowId
  • DELETE /workflows/{id}
    • 설명: 워크플로우 ID로 워크플로우 삭제
    • 파라미터: workflowId
  • POST /workflows/{id}/activate
    • 설명: 워크플로우 활성화
    • 파라미터: workflowId
  • POST /workflows/{id}/deactivate
    • 설명: 워크플로우 비활성화
    • 파라미터: workflowId
  • GET /workflows/{id}/tags
    • 설명: 워크플로우 태그 조회
    • 파라미터: workflowId
  • PUT /workflows/{id}/tags
    • 설명: 워크플로우 태그 업데이트
    • 파라미터: workflowId
    • 바디 파라미터: tagIds (배열)

5. Credential (자격 증명 관련 작업)

  • POST /credentials
    • 설명: 자격 증명 생성
    • 바디 파라미터: credential (객체)
  • DELETE /credentials/{id}
    • 설명: 자격 증명 ID로 자격 증명 삭제
    • 파라미터: id
  • GET /credentials/schema/{credentialTypeName}
    • 설명: 자격 증명 데이터 스키마 조회
    • 파라미터: credentialTypeName

6. Tags (태그 관련 작업)

  • POST /tags
    • 설명: 태그 생성
    • 바디 파라미터: tag (객체)
  • GET /tags
    • 설명: 인스턴스의 모든 태그 조회
    • 파라미터: limit, cursor
  • GET /tags/{id}
    • 설명: 태그 ID로 태그 조회
    • 파라미터: tagId
  • DELETE /tags/{id}
    • 설명: 태그 ID로 태그 삭제
    • 파라미터: tagId
  • PUT /tags/{id}
    • 설명: 태그 ID로 태그 업데이트
    • 파라미터: tagId
    • 바디 파라미터: tag (객체)

7. SourceControl (소스 제어 관련 작업)

  • POST /source-control/pull
    • 설명: 원격 저장소에서 변경 사항 가져오기
    • 바디 파라미터: pull (객체)

응답 (HTTP CODE)

  • 200: 성공적인 작업
  • 400: 잘못된 요청
  • 401: 인증되지 않음
  • 403: 접근 금지됨
  • 404: 리소스를 찾을 수 없음
  • 409: 충돌 발생
  • 500: 서버 오류

HTTP Status Codes

이 API는 n8n 인스턴스에서 다양한 작업을 자동화하고 관리하는 데 유용하게 사용할 수 있습니다. n8n Public API에서 사용자 로그인 로그 및 API 접근/인증 로그를 직접적으로 수집하는 엔드포인트는 명시되어 있지 않습니다. 그러나 보안 감사(Audit) 관련 엔드포인트를 통해 보안 관련 정보를 수집할 수 있습니다.

Audit 엔드포인트 예제

POST /audit

  • 설명: n8n 인스턴스에 대한 보안 감사 생성
  • 요청
    {
      "additionalOptions": {
        "daysAbandonedWorkflow": 30,
        "categories": ["credentials", "database", "nodes", "filesystem", "instance"]
      }
    }
  • 응답
    {
      "Credentials Risk Report": {
        "risk": "credentials",
        "sections": [
          {
            "title": "Credentials not used in any workflow",
            "description": "These credentials are not used in any workflow. Keeping unused credentials in your instance is an unneeded security risk.",
            "recommendation": "Consider deleting these credentials if you no longer need them.",
            "location": [
              {
                "kind": "credential",
                "id": "1",
                "name": "My Test Account"
              }
            ]
          }
        ]
      },
      "Database Risk Report": {
        "risk": "database",
        "sections": [
          {
            "title": "Expressions in 'Execute Query' fields in SQL nodes",
            "description": "This SQL node has an expression in the 'Query' field of an 'Execute Query' operation. Building a SQL query with an expression may lead to a SQL injection attack.",
            "recommendation": "Consider using the 'Query Parameters' field to pass parameters to the query or validating the input of the expression in the 'Query' field.",
            "location": [
              {
                "kind": "node",
                "workflowId": "1",
                "workflowName": "My Workflow",
                "nodeId": "51eb5852-ce0b-4806-b4ff-e41322a4041a",
                "nodeName": "MySQL",
                "nodeType": "n8n-nodes-base.mySql"
              }
            ]
          }
        ]
      }
    }

보안 감사 엔드포인트는 n8n 인스턴스의 보안 상태를 평가하는 데 유용합니다. 이 엔드포인트를 통해 자격 증명, 데이터베이스, 노드, 파일 시스템 및 인스턴스의 보안 상태를 확인할 수 있습니다. 그러나 사용자 로그인 로그와 API 접근/인증 로그를 직접적으로 제공하지는 않습니다.

 

사용자 로그인 로그와 API 접근/인증 로그를 수집하려면 n8n의 내부 로그 파일 또는 로그 시스템에서 직접 데이터를 수집해야 할 수도 있습니다. 이를 위해서는 n8n 인스턴스의 로그 파일을 읽거나, 외부 로깅 시스템(예: ELK 스택, Splunk 등)을 설정하여 로그를 수집하는 것이 필요할 수 있습니다. n8n 인스턴스에서 로그 파일을 수집하는 예시 워크플로우를 다음과 같이 작성할 수 있습니다.

  1. Read Binary File 노드를 사용하여 로그 파일을 읽습니다.
  2. Function 노드를 사용하여 로그 파일에서 필요한 정보를 추출합니다.
  3. HTTP Request 노드를 사용하여 외부 로깅 시스템으로 로그 데이터를 전송합니다.
  4. 알람 노드 (예: 이메일 또는 Slack)를 사용하여 특정 이벤트가 발생했을 때 알림을 보냅니다.

이러한 방식으로 사용자 로그인 로그 및 API 접근/인증 로그를 수집하고 모니터링할 수 있습니다. 주기적으로 로그를 가져와서 파싱한 후, Google Sheets에 추가/업데이트하는 워크플로우를 구성하는 방법은 다음과 같습니다. 이 워크플로우는 다음 단계로 구성됩니다.

  1. Cron 노드를 사용하여 주기적으로 워크플로우 실행
  2. Read Binary File 노드를 사용하여 로그 파일 읽기
  3. Function 노드를 사용하여 로그 파싱
  4. Google Sheets 노드를 사용하여 파싱된 데이터를 Google Sheets에 추가/업데이트
  5. 알람 노드 (선택 사항)를 사용하여 특정 이벤트 발생 시 알림 전송

단계별 워크플로우 구성

1. Cron 노드 설정 (주기적 실행)

  • 노드 이름: Cron
  • 설정: 주기적으로 워크플로우를 실행하도록 설정 (예: 매일, 매시간 등)
{
  "nodes": [
    {
      "parameters": {
        "triggerTimes": {
          "item": [
            {
              "mode": "everyMinute"
            }
          ]
        }
      },
      "name": "Cron",
      "type": "n8n-nodes-base.cron",
      "typeVersion": 1,
      "position": [
        250,
        300
      ]
    }
  ]
}

2. Read Binary File 노드 설정 (로그 파일 읽기)

  • 노드 이름: Read Binary File
  • 설정: 로그 파일 경로 설정
{
  "nodes": [
    {
      "parameters": {
        "filePath": "/path/to/your/log/file.log",
        "options": {}
      },
      "name": "Read Binary File",
      "type": "n8n-nodes-base.readBinaryFile",
      "typeVersion": 1,
      "position": [
        450,
        300
      ]
    }
  ]
}

3. Function 노드 설정 (로그 파싱)

  • 노드 이름: Parse Logs
  • 설정: 로그 데이터를 파싱하여 필요한 정보 추출
{
  "nodes": [
    {
      "parameters": {
        "functionCode": "const logs = $binary.data.toString('utf-8');\nconst logEntries = logs.split('\\n').filter(entry => entry);\nconst parsedLogs = logEntries.map(entry => {\n  // 로그 형식에 따라 파싱 로직 작성\n  const [timestamp, logLevel, message] = entry.split(' ');\n  return {\n    timestamp,\n    logLevel,\n    message\n  };\n});\nreturn parsedLogs.map(log => ({ json: log }));"
      },
      "name": "Parse Logs",
      "type": "n8n-nodes-base.function",
      "typeVersion": 1,
      "position": [
        650,
        300
      ]
    }
  ]
}

4. Google Sheets 노드 설정 (Google Sheets에 추가/업데이트)

  • 노드 이름: Update Google Sheets
  • 설정: Google Sheets API를 사용하여 파싱된 데이터를 추가/업데이트
{
  "nodes": [
    {
      "parameters": {
        "authentication": "oAuth2",
        "sheetId": "<YOUR_SHEET_ID>",
        "range": "Sheet1!A:C",
        "valueInputMode": "USER_ENTERED",
        "data": "={{$node[\"Parse Logs\"].json[\"timestamp\"]}},{{$node[\"Parse Logs\"].json[\"logLevel\"]}},{{$node[\"Parse Logs\"].json[\"message\"]}}"
      },
      "name": "Update Google Sheets",
      "type": "n8n-nodes-base.googleSheets",
      "typeVersion": 1,
      "position": [
        850,
        300
      ],
      "credentials": {
        "googleSheetsOAuth2Api": {
          "id": "YOUR_CREDENTIALS_ID"
        }
      }
    }
  ]
}

5. 알람 노드 설정

  • 노드 이름: Send Alert
  • 설정: 이메일 또는 Slack을 사용하여 특정 이벤트 발생 시 알림 전송
{
  "nodes": [
    {
      "parameters": {
        "toEmail": "your.email@example.com",
        "subject": "n8n Log Alert",
        "text": "An important event occurred: {{$node[\"Parse Logs\"].json[\"message\"]}}"
      },
      "name": "Send Alert",
      "type": "n8n-nodes-base.emailSend",
      "typeVersion": 1,
      "position": [
        1050,
        300
      ],
      "credentials": {
        "smtp": {
          "id": "YOUR_SMTP_CREDENTIALS_ID"
        }
      }
    }
  ]
}

워크플로우 구성도

  1. Cron (주기적 실행)
  2. Read Binary File (로그 파일 읽기)
  3. Function (로그 파싱)
  4. Google Sheets (데이터 추가/업데이트)
  5. Send Alert (선택 사항, 알림 전송)

이 워크플로우를 통해 n8n에서 주기적으로 로그 데이터를 가져오고 파싱하여 Google Sheets에 저장할 수 있습니다. 추가적으로 특정 이벤트 발생 시 알림을 받을 수 있도록 설정할 수 있습니다.

728x90