본문 바로가기
프로그램 (PHP,Python)

Google Workspace 감사 로그 Google 스프레드시트 기록 및 공유

by 날으는물고기 2025. 1. 2.

Google Workspace 감사 로그 Google 스프레드시트 기록 및 공유

Google Workspace의 감사 로그를 통해 파일 공유 내역을 확인하고, 이를 Google 스프레드시트에 자동으로 기록하는 방법입니다. Google Apps Script와 Google Admin SDK Reports API를 활용하며, 이를 통해 파일 공유 이벤트와 외부 사용자 접근 로그를 효율적으로 관리할 수 있습니다.


1. Google Workspace Admin Audit API 활성화

  1. Google Cloud Console 접속
  2. 서비스 계정 생성
    • Google Cloud Console에서 IAM 및 관리자 > 서비스 계정으로 이동합니다.
    • 새로운 서비스 계정을 생성하고 Admin SDK Reports API에 대한 권한을 부여합니다.
  3. OAuth 2.0 클라이언트 ID 설정
    • API 및 서비스 > 사용자 인증 정보로 이동하여 OAuth 2.0 클라이언트 ID를 생성합니다.
    • 인증 정보를 다운로드하고 Google Apps Script에 연결합니다.

2. Apps Script 프로젝트 생성

  1. Google 스프레드시트 열기
    • Google 스프레드시트를 생성하거나 기존 스프레드시트를 엽니다.
  2. Apps Script 열기
    • Extensions > Apps Script를 클릭하여 새로운 Apps Script 프로젝트를 생성합니다.
  3. 스크립트 작성
    • 아래 제공된 코드 예제를 복사하여 붙여넣습니다.

3. 파일 공유 변경 로그 기록 스크립트

Apps Script 코드 예제

function updateFileShareAuditLogs() {
  const sheetName = "File Share Logs"; // 업데이트할 시트 이름
  const spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
  const sheet = spreadsheet.getSheetByName(sheetName) || spreadsheet.insertSheet(sheetName);

  // Admin SDK Reports API 호출
  const adminService = AdminReports.Activities;
  const applicationName = "drive"; // Google Drive 로그
  const eventName = "change_user_access"; // 공유 변경 이벤트

  // 기본적으로 마지막 24시간의 로그를 가져옴
  const now = new Date();
  const startTime = new Date(now.getTime() - 24 * 60 * 60 * 1000).toISOString();

  const logs = adminService.list("all", applicationName, {
    eventName: eventName,
    startTime: startTime,
  });

  if (logs && logs.items && logs.items.length > 0) {
    logs.items.forEach((log) => {
      const { id, actor, events } = log;
      const event = events[0]; // 첫 번째 이벤트만 가져옴

      // 로그 데이터 정리
      const logData = [
        new Date(id.time).toLocaleString(), // 이벤트 시간
        actor.email, // 액터 이메일
        event.name, // 이벤트 이름
        event.parameters.find(param => param.name === "doc_id")?.value || "N/A", // 파일 ID
        event.parameters.find(param => param.name === "target_user")?.value || "N/A", // 공유 대상
        event.parameters.find(param => param.name === "role")?.value || "N/A", // 역할
      ];

      // 시트에 추가
      sheet.appendRow(logData);
    });
  } else {
    Logger.log("새로운 공유 변경 로그가 없습니다.");
  }
}
  1. AdminReports.Activities.list 호출
    • Google Admin SDK Reports API를 사용하여 Google Drive에서 공유 변경 이벤트를 가져옵니다.
    • startTime을 설정하여 최근 24시간 동안의 로그를 가져오도록 지정했습니다.
  2. 로그 데이터 파싱
    • 이벤트에서 문서 ID, 대상 사용자, 역할 등의 주요 정보를 추출합니다.
  3. Google 시트에 기록
    • 공유 변경 로그를 Google 스프레드시트에 한 줄씩 추가합니다.

4. 외부 사용자 접근 로그 기록 스크립트

Apps Script 코드 예제

function logExternalAccessToSharedFiles() {
  const sheetName = "External Access Logs"; // 시트 이름
  const spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
  const sheet = spreadsheet.getSheetByName(sheetName) || spreadsheet.insertSheet(sheetName);

  // 첫 번째 실행 시, 헤더 추가
  if (sheet.getLastRow() === 0) {
    sheet.appendRow(["Timestamp", "Actor Email", "File ID", "File Name", "Access Type", "External User Email"]);
  }

  // Admin Reports API 호출
  const adminService = AdminReports.Activities;
  const applicationName = "drive"; // Google Drive 로그
  const eventName = "view"; // 접근 이벤트

  // 최근 24시간 로그 가져오기
  const now = new Date();
  const startTime = new Date(now.getTime() - 24 * 60 * 60 * 1000).toISOString();

  const logs = adminService.list("all", applicationName, {
    eventName: eventName,
    startTime: startTime,
  });

  if (logs && logs.items && logs.items.length > 0) {
    logs.items.forEach((log) => {
      const { id, actor, events } = log;
      const event = events[0]; // 첫 번째 이벤트

      // 파일 ID와 외부 사용자 이메일 추출
      const fileId = event.parameters.find(param => param.name === "doc_id")?.value || "Unknown";
      const fileName = event.parameters.find(param => param.name === "doc_title")?.value || "Unknown";
      const accessType = event.parameters.find(param => param.name === "access_type")?.value || "Unknown";
      const externalUserEmail = event.parameters.find(param => param.name === "target_user")?.value || "";

      // 외부 사용자인 경우에만 기록
      if (isExternalUser(externalUserEmail)) {
        const logData = [
          new Date(id.time).toLocaleString(), // 타임스탬프
          actor.email, // 액터 이메일
          fileId, // 파일 ID
          fileName, // 파일 이름
          accessType, // 접근 유형
          externalUserEmail, // 외부 사용자 이메일
        ];

        sheet.appendRow(logData);
      }
    });
  } else {
    Logger.log("새로운 외부 접근 로그가 없습니다.");
  }
}

// 외부 사용자 이메일 여부를 확인하는 함수
function isExternalUser(email) {
  const domain = email.split("@")[1];
  const internalDomain = "yourdomain.com"; // 내부 도메인 변경 필요
  return domain !== internalDomain;
}
  1. Admin Reports API 호출
    • eventName: "view": 파일 접근 이벤트를 가져옵니다.
    • startTime: 최근 24시간 동안의 로그를 가져옵니다.
  2. 외부 사용자 필터링
    • isExternalUser 함수는 사용자 이메일의 도메인을 내부 도메인(yourdomain.com)과 비교하여 외부 사용자 여부를 판별합니다.
    • 내부 도메인은 회사 도메인으로 변경해야 합니다.
  3. 시트 업데이트
    • File ID, File Name, Access Type, External User Email 등의 데이터를 Google 시트에 기록합니다.
  4. 헤더 추가
    • 스크립트가 처음 실행되면, 헤더를 자동으로 추가합니다.

5. 스크립트 실행 및 설정

  1. OAuth 스코프 승인
    • Resources > Cloud Project > Open in Cloud Console로 이동하여 서비스 계정을 승인하고 OAuth 2.0 설정을 완료합니다.
  2. 정기 실행 트리거 설정
    • Triggers > Add Trigger에서 updateFileShareAuditLogs 함수를 선택하고 정기 실행 시간(예: 매일)을 설정합니다.
    • Triggers > Add Trigger 메뉴에서 logExternalAccessToSharedFiles 함수를 선택하고, 매일 실행되도록 설정합니다.

6. Google Admin API 활성화 방법

  1. Google Workspace 관리자로 로그인합니다.
  2. Google Cloud Console에서 Admin SDK API를 활성화합니다.
  3. 서비스 계정을 설정하고 OAuth 클라이언트를 생성합니다.
  4. 생성된 인증 정보를 Apps Script에 연결합니다.

 

Google 드라이브에서 외부 사용자 접근 로그를 감사하고 이를 Google 스프레드시트에 기록하려면 Google Admin SDK Reports API를 사용합니다. 위의 스크립트를 사용하면 Google Workspace에서 발생한 파일 공유 내역과 외부 사용자 접근 로그를 자동으로 수집하고 스프레드시트에 기록할 수 있습니다. 이를 통해 감사 로그를 효율적으로 관리하고, 보안 모니터링을 강화할 수 있습니다.

728x90

댓글