정보보호 (Security)

Google Workspace 감사 로그 Admin SDK API 활용 모니터링

날으는물고기 2024. 8. 17. 00:10

Provision a customer Admin console - Google for Developers

Google Admin SDK API를 사용하여 OAuth 2.0 인증을 설정하는 방법입니다.

Google Cloud Console에서 OAuth 2.0 클라이언트 ID 생성

  1. Google Cloud Console에 로그인합니다.
  2. API 및 서비스 > 사용자 인증 정보로 이동합니다.
  3. OAuth 2.0 클라이언트 ID를 생성합니다. 클라이언트 유형은 웹 애플리케이션을 선택합니다.
  4. 리디렉션 URI를 추가합니다.

OAuth 2.0 클라이언트 ID 생성 후 필요한 정보

  • Client ID: 클라이언트 ID 생성 시 제공된 값
  • Client Secret: 클라이언트 ID 생성 시 제공된 값

n8n에서 OAuth 2.0 인증 설정

  1. n8n 인터페이스에 로그인합니다.
  2. Credentials 메뉴로 이동하여 새로운 OAuth2 API 자격 증명을 생성합니다.
  3. 다음과 같은 정보를 입력합니다.
    General Settings
    • Name: 적절한 이름 입력 (예: Google Admin SDK)
    OAuth2 API Settings
    • Grant Type: Authorization Code
    • Authorization URL: https://accounts.google.com/o/oauth2/auth
    • Access Token URL: https://oauth2.googleapis.com/token
    • Client ID: Google Cloud Console에서 생성한 Client ID
    • Client Secret: Google Cloud Console에서 생성한 Client Secret
    • Scope: https://www.googleapis.com/auth/admin.reports.audit.readonly
    • Auth URI Query Parameters: access_type=offline
    Authentication
    • Authentication: Header
  4. 다음은 위 정보를 기반으로 한 설정 예시입니다.
    • Grant Type: Authorization Code
    • Authorization URL: https://accounts.google.com/o/oauth2/auth
    • Access Token URL: https://oauth2.googleapis.com/token
    • Client ID: YOUR_CLIENT_ID
    • Client Secret: YOUR_CLIENT_SECRET
    • Scope: https://www.googleapis.com/auth/admin.reports.audit.readonly
    • Auth URI Query Parameters: access_type=offline
    • Authentication: Header

이제 Google Admin SDK API에 접근할 수 있는 OAuth 2.0 자격 증명을 n8n에 설정했습니다.

n8n 워크플로에서 사용

  1. 새로운 워크플로를 생성합니다.
  2. HTTP Request 노드를 추가합니다.
    • Method: GET
    • URL: https://admin.googleapis.com/admin/reports/v1/activity/users/all/applications/login?eventName=LOGIN_SUCCESS
    • Authentication: OAuth2
    • OAuth2 API: 위에서 생성한 OAuth 2.0 자격 증명을 선택합니다.
  3. 이 노드를 실행하여 Google Admin SDK API에서 로그 데이터를 가져옵니다.
  4. 필요한 데이터를 추출하고, Slack 노드를 추가하여 Slack으로 알림을 보냅니다.

위 단계를 통해 Google Admin SDK API를 사용하여 감사 로그를 수집하고, n8n을 통해 Slack으로 알림을 보낼 수 있습니다. Google Admin SDK를 통해 특정 이벤트를 가져오는 방법과 n8n에서 이를 설정하는 방법입니다.

Google Admin SDK API로 감사 로그 가져오기

Google Admin SDK에서 사용할 수 있는 이벤트 유형을 확인하고, 로그인 이벤트를 가져오기 위한 예시입니다.

1. Google Cloud Console에서 OAuth 2.0 클라이언트 ID 생성

위와 동일한 절차를 통해 OAuth 2.0 클라이언트 ID를 생성합니다.

2. n8n에서 OAuth 2.0 인증 설정

위와 동일한 설정을 사용하여 OAuth 2.0 인증을 설정합니다.

3. HTTP Request 노드 구성

n8n에서 HTTP Request 노드를 다음과 같이 구성합니다.

  • Method: GET
  • URL: https://admin.googleapis.com/admin/reports/v1/activity/users/all/applications/login
  • Authentication: OAuth2
  • OAuth2 API: 위에서 설정한 OAuth 2.0 자격 증명을 선택합니다.

HTTP Request 노드 설정 예시는 다음과 같습니다.

{
  "nodes": [
    {
      "parameters": {
        "requestMethod": "GET",
        "url": "https://admin.googleapis.com/admin/reports/v1/activity/users/all/applications/login",
        "authentication": "oAuth2",
        "responseFormat": "json",
        "oAuth2Api": {
          "clientId": "YOUR_CLIENT_ID",
          "clientSecret": "YOUR_CLIENT_SECRET",
          "tokenType": "Bearer"
        }
      },
      "name": "Get Audit Logs",
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 1,
      "position": [
        250,
        300
      ]
    }
  ]
}

4. Slack 노드 구성

가져온 데이터를 Slack으로 알림을 보내기 위해 Slack 노드를 구성합니다.

  • Slack Webhook URL: Slack에서 생성한 Webhook URL 입력
  • Text: 가져온 데이터를 이용하여 알림 메시지를 구성합니다. 예를 들어, 최근 로그인 이벤트의 타임스탬프를 포함한 메시지를 보냅니다.
{
  "nodes": [
    {
      "parameters": {
        "requestMethod": "GET",
        "url": "https://admin.googleapis.com/admin/reports/v1/activity/users/all/applications/login",
        "authentication": "oAuth2",
        "responseFormat": "json",
        "oAuth2Api": {
          "clientId": "YOUR_CLIENT_ID",
          "clientSecret": "YOUR_CLIENT_SECRET",
          "tokenType": "Bearer"
        }
      },
      "name": "Get Audit Logs",
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 1,
      "position": [
        250,
        300
      ]
    },
    {
      "parameters": {
        "webhookUri": "https://hooks.slack.com/services/YOUR/WEBHOOK/URL",
        "text": "New Login Event: {{$json[\"items\"][0][\"id\"][\"time\"]}}"
      },
      "name": "Send Slack Notification",
      "type": "n8n-nodes-base.slack",
      "typeVersion": 1,
      "position": [
        450,
        300
      ]
    }
  ],
  "connections": {
    "Get Audit Logs": {
      "main": [
        [
          {
            "node": "Send Slack Notification",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}
  1. Scope를 올바르게 설정했는지 확인합니다.
  2. 로그인 이벤트가 실제로 발생했는지 확인하고, API 응답을 통해 이벤트를 확인합니다.
  3. Slack 메시지가 올바르게 구성되었는지 확인합니다.

위 단계들을 따라 Google Admin SDK API를 통해 감사 로그를 수집하고 n8n을 사용하여 Slack으로 알림을 보낼 수 있습니다. 필요한 경우 이벤트 유형이나 API 요청 파라미터를 조정하여 원하는 데이터를 가져올 수 있습니다. 다음은 Google Workspace Admin SDK API를 통해 드라이브 파일의 추가 및 변경 내역을 가져와서 최근 내역을 슬랙으로 알람하는 워크플로우를 구성하는 방법입니다.

1. Google Workspace Admin SDK API 설정

  1. Google Cloud Console에서 프로젝트를 생성합니다.
  2. Google Drive API와 Admin SDK API를 활성화합니다.
  3. OAuth 2.0 클라이언트 ID를 생성하고, 필요한 OAuth 범위를 설정합니다. (예: https://www.googleapis.com/auth/drive, https://www.googleapis.com/auth/admin.reports.audit.readonly)

2. n8n 설치 및 기본 설정

  1. n8n을 설치합니다. (예: Docker, Heroku 등)
  2. n8n에 접근하여 새로운 워크플로우를 생성합니다.

3. Google Drive API 노드 설정

  1. HTTP Request 노드를 추가합니다.
  2. Google OAuth 2.0 인증을 설정합니다.
  3. Google Drive API에 요청을 보낼 URL을 설정합니다:
    • https://www.googleapis.com/drive/v3/files
    • 필요한 매개변수와 헤더를 추가합니다. (예: Authorization: Bearer YOUR_ACCESS_TOKEN)

4. Google Admin SDK API 노드 설정

  1. 또 다른 HTTP Request 노드를 추가합니다.
  2. Admin SDK API의 Reports API 엔드포인트를 사용하여 감사 로그를 가져옵니다.
    • https://admin.googleapis.com/admin/reports/v1/activity/users/all/applications/drive
    • 필요한 매개변수와 헤더를 추가합니다. (예: Authorization: Bearer YOUR_ACCESS_TOKEN)

5. 데이터 가공 및 조건 설정

  1. Function 노드를 추가하여 필요한 데이터만 필터링합니다.
  2. 데이터 가공 후 최근 변경 내역을 추출합니다.

6. Slack 노드 설정

  1. Slack 노드를 추가하여 알림을 보낼 채널을 설정합니다.
  2. Slack API 토큰을 설정하고 메시지 포맷을 지정합니다.

7. 전체 워크플로우 구성

  • HTTP Request 노드 (Google Drive API) -> Function 노드 (데이터 가공) -> HTTP Request 노드 (Admin SDK API) -> Function 노드 (최근 변경 내역 필터링) -> Slack 노드 (알림 전송)

 

이러한 구성으로 Google Drive 파일의 추가 및 변경 내역을 가져와 최근 내역을 슬랙으로 알림을 보내는 워크플로우를 완성할 수 있습니다. 다만, Google Workspace Admin SDK API와 Google Drive API 호출로는 모든 사용자의 드라이브 파일 추가 및 변경 내역을 수집할 수는 없습니다. Google Drive API는 개인 사용자의 파일 정보를 가져오는 데 사용되며, Admin SDK의 Reports API는 감사 로그를 통해 활동 내역을 확인할 수 있지만, 모든 파일 변경 사항을 포괄적으로 다루지는 않습니다.

 

모든 사용자의 드라이브 파일 변경 내역을 수집하려면 Google Workspace Admin SDK의 Reports API를 사용하는 것이 적합합니다. 이 API를 통해 전체 도메인의 파일 활동 로그를 수집할 수 있습니다. 하지만, 정확히 파일의 추가 및 변경 내역을 얻으려면 추가적인 필터링과 데이터 처리 과정이 필요합니다.

 

다음은 모든 사용자의 드라이브 파일 활동 내역을 수집하는 방법입니다.

1. Google Workspace Admin SDK API 설정

  1. Google Cloud Console에서 프로젝트를 생성합니다.
  2. Admin SDK API를 활성화합니다.
  3. OAuth 2.0 클라이언트 ID를 생성하고, 필요한 OAuth 범위를 설정합니다.
    • https://www.googleapis.com/auth/admin.reports.audit.readonly

2. n8n 워크플로우 구성

위 설정에서 Reports API를 통해 모든 사용자에 대한 활동 로그를 가져오는 방식으로 변경합니다.

3. n8n 노드 설정

  1. HTTP Request 노드를 추가하여 Admin SDK의 Reports API 엔드포인트를 사용합니다.
    • URL: https://admin.googleapis.com/admin/reports/v1/activity/users/all/applications/drive
    • 필요한 매개변수와 헤더를 추가합니다. (예: Authorization: Bearer YOUR_ACCESS_TOKEN)

4. 데이터 가공 및 조건 설정

  1. Function 노드를 추가하여 필요한 데이터만 필터링합니다.
    • 파일 추가 및 변경 내역만 필터링하는 코드 예시 
    • return items.filter(item => item.events.some(event => event.name === 'create' || event.name === 'edit'));

5. Slack 노드 설정

  1. Slack 노드를 추가하여 알림을 보낼 채널을 설정합니다.
  2. Slack API 토큰을 설정하고 메시지 포맷을 지정합니다.

이렇게 Admin SDK의 Reports API를 사용하여 도메인의 모든 사용자에 대한 드라이브 파일 활동 내역을 수집하고, 최근 24시간 내의 파일 추가 및 변경 내역을 필터링하여 슬랙으로 알림을 전송합니다. Google Workspace Admin SDK의 Reports API를 사용하여 모든 사용자가 만든 Google 드라이브 파일에 대한 모든 액세스 내역을 수집하는 방법은 각 사용자가 만든 파일에 대한 접근 활동(조회, 다운로드, 수정 등)을 포함하여 전체 활동 로그를 수집하는 것을 목표로 합니다.

 

파일 액세스 이벤트만 필터링하는 코드 예시

return items.filter(item => item.events.some(event => event.name === 'view' || event.name === 'download' || event.name === 'edit'));

n8n 워크플로우 예제

{
  "nodes": [
    {
      "parameters": {
        "url": "https://admin.googleapis.com/admin/reports/v1/activity/users/all/applications/drive",
        "options": {
          "headers": {
            "Authorization": "Bearer YOUR_ACCESS_TOKEN"
          }
        }
      },
      "name": "Get Drive Activities",
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 1,
      "position": [450, 300]
    },
    {
      "parameters": {
        "functionCode": "return items.filter(item => item.events.some(event => event.name === 'view' || event.name === 'download' || event.name === 'edit'));"
      },
      "name": "Filter Access Events",
      "type": "n8n-nodes-base.function",
      "typeVersion": 1,
      "position": [600, 300]
    },
    {
      "parameters": {
        "functionCode": "const recentAccess = items.filter(item => new Date(item.id.time) > new Date(Date.now() - 24*60*60*1000)); return recentAccess.map(access => ({json: access}));"
      },
      "name": "Filter Recent Access",
      "type": "n8n-nodes-base.function",
      "typeVersion": 1,
      "position": [750, 300]
    },
    {
      "parameters": {
        "channel": "YOUR_SLACK_CHANNEL",
        "text": "Recent Drive Access Events: {{$json}}"
      },
      "name": "Send Slack Message",
      "type": "n8n-nodes-base.slack",
      "typeVersion": 1,
      "position": [900, 300]
    }
  ],
  "connections": {
    "Get Drive Activities": {
      "main": [
        [
          {
            "node": "Filter Access Events",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Filter Access Events": {
      "main": [
        [
          {
            "node": "Filter Recent Access",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Filter Recent Access": {
      "main": [
        [
          {
            "node": "Send Slack Message",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}
  1. Get Drive Activities: Admin SDK의 Reports API를 사용하여 모든 사용자에 대한 Google 드라이브 파일 액세스 활동 로그를 수집합니다.
  2. Filter Access Events: view, download, edit 이벤트만 필터링하여 액세스 내역만을 추출합니다.
  3. Filter Recent Access: 최근 24시간 내의 액세스 내역만 필터링하여 필요한 데이터만 남깁니다.
  4. Send Slack Message: 필터링된 액세스 내역을 슬랙 채널로 전송합니다.

이 워크플로우를 통해 도메인의 모든 사용자가 만든 Google 드라이브 파일에 대한 모든 액세스 내역을 수집하고, 최근 24시간 내의 내역을 슬랙으로 알림을 전송할 수 있습니다. Google Workspace Admin SDK의 Reports API를 사용하여 드라이브 활동 로그를 수집할 때, 여러 가지 이벤트 유형을 포함한 다양한 활동 로그가 수집됩니다. 이를 통해 드라이브 파일에 대한 다양한 유형의 접근 및 활동을 추적할 수 있습니다. 각 이벤트 유형을 구분하고 필터링하는 방법을 이해하는 것이 중요합니다.

이벤트 유형 예시

Reports API에서 수집할 수 있는 주요 드라이브 활동 이벤트 유형과 그 예시는 다음과 같습니다.

  1. create
    • 파일 생성
    • 예시: { "name": "create", "parameters": [{ "name": "doc_id", "value": "file_id" }] }
  2. edit
    • 파일 편집
    • 예시: { "name": "edit", "parameters": [{ "name": "doc_id", "value": "file_id" }] }
  3. view
    • 파일 보기
    • 예시: { "name": "view", "parameters": [{ "name": "doc_id", "value": "file_id" }] }
  4. download
    • 파일 다운로드
    • 예시: { "name": "download", "parameters": [{ "name": "doc_id", "value": "file_id" }] }
  5. delete
    • 파일 삭제
    • 예시: { "name": "delete", "parameters": [{ "name": "doc_id", "value": "file_id" }] }
  6. share
    • 파일 공유
    • 예시: { "name": "share", "parameters": [{ "name": "doc_id", "value": "file_id" }] }
  7. permission_change
    • 파일 권한 변경
    • 예시: { "name": "permission_change", "parameters": [{ "name": "doc_id", "value": "file_id" }] }

JSON 로그 예시

Reports API에서 반환하는 JSON 로그의 예시는 다음과 같습니다.

{
  "kind": "admin#reports#activity",
  "id": {
    "time": "2024-07-23T14:00:00.000Z",
    "uniqueQualifier": "1234567890",
    "applicationName": "drive",
    "customerId": "C0123456789",
    "actor": {
      "email": "user@example.com",
      "profileId": "1234567890"
    },
    "events": [
      {
        "type": "access",
        "name": "view",
        "parameters": [
          {
            "name": "doc_id",
            "value": "1ZdR3RklfN-3Jj8z9aJjaJ9o0Kjdf3a6"
          },
          {
            "name": "target_user",
            "value": "anotheruser@example.com"
          }
        ]
      }
    ]
  },
  "ipAddress": "192.168.1.1",
  "etag": "\"etag_value\""
}

파일 생성 및 편집 이벤트 필터링

return items.filter(item => item.events.some(event => event.name === 'create' || event.name === 'edit'));

파일 보기, 다운로드, 삭제 이벤트 필터링

return items.filter(item => item.events.some(event => event.name === 'view' || event.name === 'download' || event.name === 'delete'));

파일 공유 및 권한 변경 이벤트 필터링

return items.filter(item => item.events.some(event => event.name === 'share' || event.name === 'permission_change'));

Google Workspace 도메인 외부 사용자가 Google 드라이브 파일에 접근하거나 변경한 내역을 확인하려면, Google Workspace Admin SDK의 Reports API를 활용할 수 있습니다. 이 API를 통해 외부 사용자의 파일 접근 및 변경 활동을 추적할 수 있습니다.

도메인 외부 사용자를 필터링하는 코드 예시

return items.filter(item => {
  const isExternalUser = !item.actor.email.endsWith('@yourdomain.com');
  const relevantEvents = item.events.some(event => ['view', 'download', 'edit', 'create', 'delete', 'share', 'permission_change'].includes(event.name));
  return isExternalUser && relevantEvents;
});

Google Workspace Admin SDK의 Reports API를 사용하여 Google 드라이브 파일이나 디렉토리를 도메인 외부 사용자에게 공유하는 내역을 수집하고 모니터링할 수 있습니다. 이를 통해 외부 사용자와의 공유 활동을 추적할 수 있습니다.

외부 공유 이벤트를 필터링하는 코드 예시

return items.filter(item => {
  const isShareEvent = item.events.some(event => event.name === 'share');
  const isExternalUser = item.events.some(event => event.parameters.some(param => param.name === 'target_user' && !param.value.endsWith('@yourdomain.com')));
  return isShareEvent && isExternalUser;
});

Google Workspace Admin SDK의 Reports API를 통해 다양한 유형의 활동 로그를 수집할 수 있습니다. 대표적인 유형인 WORKSPACE_ACTIVITY, WORKSPACE_ALERTS, WORKSPACE_CHROMEOS, WORKSPACE_GROUPS, WORKSPACE_MOBILE, WORKSPACE_PRIVILEGES, WORKSPACE_USERS 등은 각기 다른 활동 내역을 나타내며, 각 유형별 로그를 수집할 수 있습니다.

 

이 유형들을 모두 수집하려면 Reports API를 여러 번 호출하여 각 유형별로 데이터를 수집해야 합니다.

WORKSPACE_ACTIVITY 로그 수집

{
  "nodes": [
    {
      "parameters": {
        "url": "https://admin.googleapis.com/admin/reports/v1/activity/users/all/applications/drive",
        "options": {
          "headers": {
            "Authorization": "Bearer YOUR_ACCESS_TOKEN"
          }
        }
      },
      "name": "Get Drive Activities",
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 1,
      "position": [450, 300]
    }
  ],
  "connections": {}
}

WORKSPACE_ALERTS 로그 수집

{
  "nodes": [
    {
      "parameters": {
        "url": "https://admin.googleapis.com/admin/reports/v1/activity/users/all/applications/alerts",
        "options": {
          "headers": {
            "Authorization": "Bearer YOUR_ACCESS_TOKEN"
          }
        }
      },
      "name": "Get Alerts Activities",
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 1,
      "position": [450, 400]
    }
  ],
  "connections": {}
}

WORKSPACE_CHROMEOS 로그 수집

{
  "nodes": [
    {
      "parameters": {
        "url": "https://admin.googleapis.com/admin/reports/v1/activity/users/all/applications/chromeos",
        "options": {
          "headers": {
            "Authorization": "Bearer YOUR_ACCESS_TOKEN"
          }
        }
      },
      "name": "Get ChromeOS Activities",
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 1,
      "position": [450, 500]
    }
  ],
  "connections": {}
}

WORKSPACE_GROUPS 로그 수집

{
  "nodes": [
    {
      "parameters": {
        "url": "https://admin.googleapis.com/admin/reports/v1/activity/users/all/applications/groups",
        "options": {
          "headers": {
            "Authorization": "Bearer YOUR_ACCESS_TOKEN"
          }
        }
      },
      "name": "Get Groups Activities",
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 1,
      "position": [450, 600]
    }
  ],
  "connections": {}
}

WORKSPACE_MOBILE 로그 수집

{
  "nodes": [
    {
      "parameters": {
        "url": "https://admin.googleapis.com/admin/reports/v1/activity/users/all/applications/mobile",
        "options": {
          "headers": {
            "Authorization": "Bearer YOUR_ACCESS_TOKEN"
          }
        }
      },
      "name": "Get Mobile Activities",
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 1,
      "position": [450, 700]
    }
  ],
  "connections": {}
}

WORKSPACE_PRIVILEGES 로그 수집

{
  "nodes": [
    {
      "parameters": {
        "url": "https://admin.googleapis.com/admin/reports/v1/activity/users/all/applications/privileges",
        "options": {
          "headers": {
            "Authorization": "Bearer YOUR_ACCESS_TOKEN"
          }
        }
      },
      "name": "Get Privileges Activities",
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 1,
      "position": [450, 800]
    }
  ],
  "connections": {}
}

WORKSPACE_USERS 로그 수집

{
  "nodes": [
    {
      "parameters": {
        "url": "https://admin.googleapis.com/admin/reports/v1/activity/users/all/applications/users",
        "options": {
          "headers": {
            "Authorization": "Bearer YOUR_ACCESS_TOKEN"
          }
        }
      },
      "name": "Get Users Activities",
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 1,
      "position": [450, 900]
    }
  ],
  "connections": {}
}

데이터 필터링 및 통합

수집된 데이터는 각기 다른 유형별로 필터링 및 통합할 수 있습니다.

{
  "nodes": [
    // Add HTTP Request nodes for each log type as shown above
    {
      "parameters": {
        "functionCode": `
          let allEvents = [];
          // Merge all events from different nodes
          allEvents = allEvents.concat($node["Get Drive Activities"].json);
          allEvents = allEvents.concat($node["Get Alerts Activities"].json);
          allEvents = allEvents.concat($node["Get ChromeOS Activities"].json);
          allEvents = allEvents.concat($node["Get Groups Activities"].json);
          allEvents = allEvents.concat($node["Get Mobile Activities"].json);
          allEvents = allEvents.concat($node["Get Privileges Activities"].json);
          allEvents = allEvents.concat($node["Get Users Activities"].json);

          // Filter recent events (e.g., last 24 hours)
          const recentEvents = allEvents.filter(event => new Date(event.id.time) > new Date(Date.now() - 24*60*60*1000));
          return recentEvents.map(event => ({json: event}));
        `
      },
      "name": "Filter and Merge Events",
      "type": "n8n-nodes-base.function",
      "typeVersion": 1,
      "position": [600, 500]
    },
    {
      "parameters": {
        "channel": "YOUR_SLACK_CHANNEL",
        "text": "Recent Workspace Activities: {{$json}}"
      },
      "name": "Send Slack Message",
      "type": "n8n-nodes-base.slack",
      "typeVersion": 1,
      "position": [750, 500]
    }
  ],
  "connections": {
    "Get Drive Activities": {
      "main": [
        [
          {
            "node": "Filter and Merge Events",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Get Alerts Activities": {
      "main": [
        [
          {
            "node": "Filter and Merge Events",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Get ChromeOS Activities": {
      "main": [
        [
          {
            "node": "Filter and Merge Events",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Get Groups Activities": {
      "main": [
        [
          {
            "node": "Filter and Merge Events",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Get Mobile Activities": {
      "main": [
        [
          {
            "node": "Filter and Merge Events",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Get Privileges Activities": {
      "main": [
        [
          {
            "node": "Filter and Merge Events",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Get Users Activities": {
      "main": [
        [
          {
            "node": "Filter and Merge Events",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Filter and Merge Events": {
      "main": [
        [
          {
            "node": "Send Slack Message",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}

Google OAuth 2.0 인증은 기본적으로 액세스 토큰과 리프레시 토큰을 제공합니다. 액세스 토큰은 제한된 시간 동안 유효하며, 만료되면 새로 발급받아야 합니다. 이를 자동화하기 위해 리프레시 토큰을 사용하여 액세스 토큰을 갱신할 수 있습니다. 이렇게 하면 사용자가 매번 인증을 다시 하지 않아도 됩니다.

n8n에서 Google OAuth 2.0을 설정하고 액세스 토큰을 자동 갱신하는 방법

  1. Google Cloud Console에서 OAuth 2.0 클라이언트 ID를 생성합니다.
  2. 필요한 OAuth 범위를 설정합니다. (예: https://www.googleapis.com/auth/admin.reports.audit.readonly)
  3. 생성된 클라이언트 ID와 클라이언트 시크릿을 사용하여 n8n에서 OAuth 2.0 인증을 설정합니다.

1. Google Cloud Console에서 OAuth 2.0 클라이언트 ID 생성

  1. Google Cloud Console에 로그인합니다.
  2. 프로젝트 선택 -> API 및 서비스 -> 사용자 인증 정보로 이동합니다.
  3. 사용자 인증 정보 만들기 -> OAuth 클라이언트 ID를 선택합니다.
  4. 애플리케이션 유형으로 웹 애플리케이션을 선택하고, 리디렉션 URI를 추가합니다. (예: http://localhost:5678/rest/oauth2-credential/callback)
  5. 클라이언트 ID와 클라이언트 시크릿을 복사해 둡니다.

2. n8n에서 OAuth 2.0 인증 설정

  1. n8n에서 크레덴셜로 이동하여 Google -> OAuth2 API를 선택합니다.
  2. 클라이언트 ID와 클라이언트 시크릿을 입력합니다.
  3. 리디렉션 URI를 Google Cloud Console에 추가한 것과 동일하게 설정합니다.
  4. OAuth 범위를 추가합니다. (예: https://www.googleapis.com/auth/admin.reports.audit.readonly)
  5. 인증을 완료하여 액세스 토큰과 리프레시 토큰을 획득합니다.

3. n8n 워크플로우 설정

  1. HTTP Request 노드를 추가하여 Admin SDK의 Reports API 엔드포인트를 사용합니다.
  2. OAuth 2.0 인증을 설정하여 획득한 액세스 토큰을 사용합니다.

HTTP Request 노드 설정

{
  "nodes": [
    {
      "parameters": {
        "url": "https://admin.googleapis.com/admin/reports/v1/activity/users/all/applications/drive",
        "authentication": "oAuth2",
        "options": {
          "headers": {
            "Authorization": "Bearer {{ $json['access_token'] }}"
          }
        }
      },
      "name": "Get Drive Activities",
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 1,
      "position": [450, 300]
    }
  ],
  "connections": {}
}

4. 액세스 토큰 자동 갱신 설정

액세스 토큰이 만료되면 리프레시 토큰을 사용하여 새 액세스 토큰을 요청할 수 있습니다.

 

Function 노드 예시

// Refresh the access token using the refresh token
const axios = require('axios');

const clientId = 'YOUR_CLIENT_ID';
const clientSecret = 'YOUR_CLIENT_SECRET';
const refreshToken = 'YOUR_REFRESH_TOKEN';

const response = await axios.post('https://oauth2.googleapis.com/token', {
  client_id: clientId,
  client_secret: clientSecret,
  refresh_token: refreshToken,
  grant_type: 'refresh_token'
});

const newAccessToken = response.data.access_token;

return {
  json: {
    access_token: newAccessToken
  }
};

5. n8n 워크플로우 전체 예시

액세스 토큰을 갱신하고 API 요청을 수행하는 전체 워크플로우는 다음과 같습니다.

{
  "nodes": [
    {
      "parameters": {
        "functionCode": `
          const axios = require('axios');

          const clientId = 'YOUR_CLIENT_ID';
          const clientSecret = 'YOUR_CLIENT_SECRET';
          const refreshToken = 'YOUR_REFRESH_TOKEN';

          const response = await axios.post('https://oauth2.googleapis.com/token', {
            client_id: clientId,
            client_secret: clientSecret,
            refresh_token: refreshToken,
            grant_type: 'refresh_token'
          });

          const newAccessToken = response.data.access_token;

          return {
            json: {
              access_token: newAccessToken
            }
          };
        `
      },
      "name": "Refresh Access Token",
      "type": "n8n-nodes-base.function",
      "typeVersion": 1,
      "position": [450, 200]
    },
    {
      "parameters": {
        "url": "https://admin.googleapis.com/admin/reports/v1/activity/users/all/applications/drive",
        "authentication": "oAuth2",
        "options": {
          "headers": {
            "Authorization": "Bearer {{$node['Refresh Access Token'].json['access_token']}}"
          }
        }
      },
      "name": "Get Drive Activities",
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 1,
      "position": [450, 300]
    },
    {
      "parameters": {
        "functionCode": `
          const recentEvents = items.filter(item => new Date(item.id.time) > new Date(Date.now() - 24*60*60*1000));
          return recentEvents.map(event => ({json: event}));
        `
      },
      "name": "Filter Recent Events",
      "type": "n8n-nodes-base.function",
      "typeVersion": 1,
      "position": [600, 300]
    },
    {
      "parameters": {
        "channel": "YOUR_SLACK_CHANNEL",
        "text": "Recent Drive Activities: {{$json}}"
      },
      "name": "Send Slack Message",
      "type": "n8n-nodes-base.slack",
      "typeVersion": 1,
      "position": [750, 300]
    }
  ],
  "connections": {
    "Refresh Access Token": {
      "main": [
        [
          {
            "node": "Get Drive Activities",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Get Drive Activities": {
      "main": [
        [
          {
            "node": "Filter Recent Events",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Filter Recent Events": {
      "main": [
        [
          {
            "node": "Send Slack Message",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}

위의 워크플로우는 다음과 같이 구성됩니다.

  1. Refresh Access Token: 리프레시 토큰을 사용하여 새 액세스 토큰을 요청합니다.
  2. Get Drive Activities: 갱신된 액세스 토큰을 사용하여 Google 드라이브 활동 로그를 요청합니다.
  3. Filter Recent Events: 최근 24시간 내의 이벤트를 필터링합니다.
  4. Send Slack Message: 필터링된 이벤트를 슬랙 채널로 전송합니다.

이 설정을 통해 한 번의 인증으로 지속적으로 자동화된 워크플로우를 실행할 수 있습니다.

 

Google Ingest API 사용 시 보안 관점에서 고려해야 할 포인트는 다음과 같습니다.

  1. 인증 및 권한 관리
    • OAuth 2.0 및 API 키를 사용한 인증 방식을 적절히 설정하여 인증되지 않은 접근을 방지합니다.
    • 최소 권한 원칙(Principle of Least Privilege)을 적용하여 필요한 권한만 부여합니다.
  2. 데이터 암호화
    • 전송 중인 데이터는 HTTPS를 통해 암호화하여 전송합니다.
    • 저장된 데이터는 가능한 경우 서버 측에서 암호화(Storage Encryption)를 사용합니다.
  3. API 사용 모니터링 및 로깅
    • API 호출을 모니터링하고 로그를 남겨 이상 활동을 감지합니다.
    • Google Cloud Logging과 같은 도구를 사용하여 API 호출 내역을 기록합니다.
  4. Rate Limiting 설정
    • API 호출에 대한 Rate Limiting을 설정하여 서비스 남용을 방지합니다.
    • 사용량 제한을 통해 API 오버로드를 방지하고 서비스의 안정성을 유지합니다.
  5. 입력 데이터 검증
    • API로 전송되는 모든 입력 데이터를 철저히 검증하여 SQL 인젝션, XSS와 같은 공격을 방지합니다.
    • 데이터 형식, 길이, 범위 등을 검증합니다.
  6. 보안 패치 및 업데이트
    • API 사용 시 최신 보안 패치와 업데이트를 적용합니다.
    • Google Cloud의 보안 업데이트와 권장 사항을 주기적으로 확인합니다.
  7. 비밀 정보 관리
    • API 키, 인증서, 비밀 키 등의 민감한 정보를 안전하게 저장합니다.
    • 환경 변수 또는 Google Secret Manager를 사용하여 비밀 정보를 관리합니다.
  8. 사용자 교육 및 보안 인식
    • API를 사용하는 개발자 및 관련 인력에게 보안 교육을 실시합니다.
    • 보안 정책과 모범 사례를 문서화하여 공유합니다.
  9. 침투 테스트 및 취약점 분석
    • 정기적으로 침투 테스트를 실시하여 보안 취약점을 찾고 수정합니다.
    • 취약점 분석 도구를 사용하여 API의 보안 상태를 점검합니다.

이러한 보안 고려 사항들을 통해 Google Ingest API 사용 시 보안 리스크를 최소화하고 안전한 서비스를 운영할 수 있습니다. Google Ingest API는 데이터의 수집 및 통합을 용이하게 해주는 API입니다. 이를 통해 다양한 소스에서 데이터를 수집하고, 이를 Google Cloud Platform(GCP) 내의 다양한 서비스에 통합할 수 있습니다.

Google Ingest API

  1. 개요
    • Google Ingest API는 데이터 수집, 저장, 처리, 분석을 통합적으로 관리할 수 있게 해주는 서비스입니다.
    • 주로 로그 데이터, 센서 데이터, 사용자 이벤트 등 다양한 유형의 데이터를 실시간으로 수집하여 분석할 수 있습니다.
  2. 사용법
    • 설정: Google Cloud Console을 통해 API를 활성화합니다.
    • 인증: OAuth 2.0 또는 API 키를 사용하여 인증을 설정합니다.
    • 데이터 전송: 데이터 소스에서 Ingest API로 데이터를 전송합니다. 이때 HTTP POST 요청을 통해 데이터를 전송합니다.
    • 데이터 처리: 수집된 데이터는 BigQuery, Cloud Storage, Pub/Sub 등과 같은 GCP 서비스로 전달됩니다.
  3. 대표적인 활용 용도
    • 로그 수집 및 분석: 다양한 애플리케이션 및 시스템 로그를 실시간으로 수집하여 BigQuery를 통해 분석합니다.
    • IoT 데이터 처리: 센서 및 IoT 장치에서 생성된 데이터를 실시간으로 수집하여 분석 및 모니터링합니다.
    • 이벤트 추적: 웹 및 모바일 애플리케이션의 사용자 이벤트 데이터를 수집하여 사용자 행동 분석에 활용합니다.

보안 고려사항

  1. 인증 및 권한 관리
    • OAuth 2.0 및 API 키: API 사용 시 반드시 OAuth 2.0 인증을 사용하여 보안된 액세스를 보장합니다. API 키 사용 시 키를 안전하게 저장하고 주기적으로 교체합니다.
    • IAM(Identity and Access Management): 최소 권한 원칙을 적용하여 필요한 권한만 부여합니다. 예를 들어, 데이터 쓰기 권한만 필요한 애플리케이션에는 읽기 권한을 부여하지 않습니다.
  2. 데이터 암호화
    • 전송 중 암호화: 데이터는 HTTPS를 통해 암호화된 채로 전송됩니다. 이를 통해 중간에서의 데이터 탈취를 방지합니다.
    • 저장 시 암호화: 수집된 데이터는 Cloud Storage, BigQuery 등에서 저장될 때 서버 측 암호화를 적용합니다.
  3. API 사용 모니터링 및 로깅
    • Cloud Logging: API 호출 내역을 Google Cloud Logging을 통해 기록하고 모니터링합니다. 이를 통해 비정상적인 접근 시도를 탐지할 수 있습니다.
    • Alert 설정: 비정상적인 API 사용이 감지되면 즉시 알림을 받을 수 있도록 알림을 설정합니다.
  4. Rate Limiting 설정
    • 사용량 제한: API 사용량을 제한하여 서비스 남용을 방지합니다. 예를 들어, 일정 시간 내의 API 호출 수를 제한합니다.
    • API Gateway 사용: API Gateway를 사용하여 Rate Limiting 및 기타 보안 정책을 중앙에서 관리합니다.
  5. 입력 데이터 검증
    • 데이터 검증: API로 전송되는 모든 데이터를 철저히 검증합니다. 예를 들어, 예상치 못한 형식의 데이터가 입력되지 않도록 합니다.
    • SQL 인젝션 방지: 데이터베이스에 저장하기 전에 입력 데이터를 검증하여 SQL 인젝션 공격을 방지합니다.
  6. 비밀 정보 관리
    • Secret Manager 사용: API 키, 인증서 등의 비밀 정보를 Google Secret Manager를 통해 안전하게 관리합니다.
    • 환경 변수: 코드 내에 하드코딩하지 않고 환경 변수를 사용하여 비밀 정보를 관리합니다.
  7. 보안 업데이트
    • 정기적 패치: API와 관련된 소프트웨어 및 라이브러리를 정기적으로 업데이트하여 보안 취약점을 제거합니다.
    • 보안 공지 확인: Google Cloud의 보안 공지를 주기적으로 확인하고, 필요 시 보안 패치를 적용합니다.

Google Ingest API는 다양한 데이터 소스에서 데이터를 실시간으로 수집하고 이를 GCP의 다양한 서비스에 통합할 수 있는 강력한 도구입니다. 이를 안전하게 사용하기 위해서는 인증 및 권한 관리, 데이터 암호화, 모니터링 및 로깅, 입력 데이터 검증 등 다양한 보안 조치를 철저히 준수해야 합니다. 이러한 보안 관점을 통해 데이터의 무결성과 기밀성을 유지하고, 서비스의 신뢰성을 높일 수 있습니다.

 

Google Cloud Platform(GCP)에서 제공하는 여러 API 중 대표적으로 활용되는 API들을 소개합니다.

BigQuery API

  • 설명: BigQuery는 대용량 데이터 세트를 저장하고, 실시간으로 분석할 수 있는 데이터 웨어하우스 서비스입니다. BigQuery API를 통해 사용자는 SQL 쿼리를 실행하고, 데이터를 분석하며, 결과를 검색할 수 있습니다.
  • 주요 활용
    • 데이터 분석: 대용량 로그 데이터를 수집하여 실시간 분석에 사용.
    • 데이터 시각화: 분석 결과를 시각화 도구와 연동하여 데이터 인사이트를 제공.
    • 머신러닝: BigQuery ML을 통해 데이터 웨어하우스 내에서 직접 머신러닝 모델을 구축 및 배포.

Cloud Storage API

  • 설명: Cloud Storage는 확장성 있고 보안이 강화된 객체 스토리지 서비스입니다. Cloud Storage API를 사용하면 데이터를 업로드, 다운로드 및 관리할 수 있습니다.
  • 주요 활용
    • 백업 및 복구: 애플리케이션 및 데이터베이스의 백업 데이터를 안전하게 저장.
    • 미디어 콘텐츠 저장: 이미지, 비디오 등의 대용량 미디어 파일 저장 및 스트리밍.
    • 데이터 아카이빙: 규정 준수를 위해 데이터 아카이빙 솔루션으로 활용.

Pub/Sub API

  • 설명: Pub/Sub는 비동기 메시징 서비스로, 분산 시스템 간의 메시지 전달을 용이하게 합니다. Pub/Sub API를 통해 게시자와 구독자 간의 메시지를 쉽게 관리할 수 있습니다.
  • 주요 활용
    • 이벤트 기반 아키텍처: 마이크로서비스 간의 이벤트 전달을 위한 메시징 시스템.
    • 실시간 데이터 스트리밍: IoT 기기나 애플리케이션에서 생성된 데이터를 실시간으로 스트리밍.
    • 로그 수집 및 처리: 다양한 소스에서 로그 데이터를 수집하고 실시간 분석.

Cloud Functions API

  • 설명: Cloud Functions는 서버리스 컴퓨팅 서비스로, 이벤트 기반의 짧은 코드 실행을 지원합니다. Cloud Functions API를 통해 함수의 배포, 실행, 관리가 가능합니다.
  • 주요 활용
    • 자동화된 작업: 일정한 이벤트에 따라 자동으로 실행되는 스크립트.
    • 백엔드 로직 처리: 웹훅 처리, 데이터 변환 등 간단한 백엔드 작업.
    • 실시간 데이터 처리: 이벤트 트리거를 통해 실시간 데이터 처리를 수행.

Cloud Run API

  • 설명: Cloud Run은 컨테이너 기반의 서버리스 애플리케이션을 배포, 실행할 수 있는 서비스입니다. Cloud Run API를 통해 컨테이너 애플리케이션을 관리할 수 있습니다.
  • 주요 활용
    • 마이크로서비스 배포: 독립적으로 배포 가능한 마이크로서비스를 쉽게 관리.
    • CI/CD 파이프라인: 지속적인 통합 및 배포 파이프라인 구축.
    • 웹 애플리케이션 호스팅: 확장 가능한 웹 애플리케이션 및 API 백엔드 호스팅.

Dialogflow API

  • 설명: Dialogflow는 자연어 처리(NLP)를 통해 챗봇 및 음성 어시스턴트를 구축할 수 있는 서비스입니다. Dialogflow API를 사용하면 대화형 인터페이스를 쉽게 개발할 수 있습니다.
  • 주요 활용
    • 고객 지원 봇: 고객 문의에 자동으로 응답하는 챗봇 개발.
    • 음성 어시스턴트: 음성 인식 및 응답 기능을 갖춘 어시스턴트 구축.
    • 대화형 인터페이스: 웹사이트 및 모바일 앱에 통합된 대화형 사용자 인터페이스.
728x90