Что такое контроль доступа и зачем он нужен в Apps Script
Контроль доступа в Google Apps Script – это механизм, который определяет, кто и при каких условиях может выполнять или редактировать ваш скрипт. Он необходим для защиты данных, предотвращения несанкционированного использования и обеспечения соответствия политикам безопасности. Без надлежащего контроля доступа, ваши скрипты и связанные с ними данные (например, данные Google Sheets, Google Docs, Google Drive) могут быть уязвимы для злоумышленников или случайных ошибок.
Представьте себе скрипт, отправляющий email-рассылку на основе данных из Google Sheets. Без контроля доступа, любой, получивший ссылку на скрипт, сможет изменить список рассылки или даже отправить нежелательные сообщения. Контроль доступа позволяет избежать таких ситуаций, определяя, кто имеет право изменять данные или запускать скрипт.
Основные принципы безопасности при работе с Apps Script
При работе с Apps Script необходимо учитывать следующие принципы безопасности:
- Принцип наименьших привилегий: Предоставляйте пользователям только тот уровень доступа, который необходим для выполнения их задач. Не давайте избыточных прав.
- Аутентификация и авторизация: Убедитесь, что пользователи, обращающиеся к вашим скриптам, идентифицированы (аутентификация) и имеют соответствующие права (авторизация).
- Валидация входных данных: Тщательно проверяйте все данные, поступающие в ваш скрипт, чтобы предотвратить инъекции кода и другие атаки.
- Регулярное обновление: Следите за обновлениями Apps Script и связанных библиотек, чтобы вовремя устранять уязвимости.
- Логирование и мониторинг: Ведите журнал действий, выполняемых вашими скриптами, чтобы отслеживать подозрительную активность.
Обзор различных способов контроля доступа
В Google Apps Script существует несколько способов контроля доступа:
- Права доступа к скрипту: Определяют, кто может просматривать, редактировать и запускать скрипт. Устанавливаются через интерфейс редактора Apps Script.
- Триггеры: Позволяют запускать скрипты автоматически при определенных событиях (например, при открытии Google Sheets). Можно использовать для ограничения доступа на основе контекста события.
- OAuth 2.0: Используется для авторизации приложений и предоставления им доступа к данным пользователя с его согласия.
- Белый список IP-адресов: Позволяет ограничить доступ к веб-приложениям Apps Script только с определенных IP-адресов.
Реализация контроля доступа через триггеры и права доступа
Настройка триггеров для ограничения доступа
Триггеры позволяют автоматизировать выполнение скриптов при наступлении определенных событий. Их можно использовать для реализации контроля доступа, например, для проверки прав пользователя перед выполнением определенной операции.
Например, можно создать триггер, который запускает функцию проверки прав доступа при каждом открытии Google Sheets. Если у пользователя нет необходимых прав, функция может запретить дальнейшие действия или вывести сообщение об ошибке.
/**
* @OnlyCurrentDoc
*/
/**
* Проверяет права доступа пользователя при открытии Google Sheets.
*
* @param {GoogleAppsScript.Events.SheetsOnOpen} e Событие открытия Google Sheets.
*/
function onOpen(e: GoogleAppsScript.Events.SheetsOnOpen) {
const userEmail = Session.getActiveUser().getEmail();
const allowedUsers = ['admin@example.com', 'user1@example.com'];
if (allowedUsers.indexOf(userEmail) === -1) {
SpreadsheetApp.getUi()
.alert('Доступ запрещен. Обратитесь к администратору.');
SpreadsheetApp.getActiveSpreadsheet().toast('Доступ запрещен', 'Ошибка'); // Optional
// Optionally, prevent further actions or close the spreadsheet.
// SpreadsheetApp.getActiveSpreadsheet().removeMenu('Custom Menu');
// SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Sheet1').hideSheet();
}
}
/**
* Функция для установки триггера onOpen.
*/
function createOnOpenTrigger() {
ScriptApp.newTrigger('onOpen')
.forSpreadsheet(SpreadsheetApp.getActiveSpreadsheet())
.onOpen()
.create();
}
В этом примере, onOpen – это функция, которая запускается при открытии таблицы. Она получает email пользователя и проверяет, есть ли он в списке allowedUsers. Если пользователя нет в списке, выводится предупреждение, и ему запрещается дальнейшая работа.
Управление правами доступа к скрипту (кто может запускать, редактировать)
Права доступа к скрипту определяют, кто может просматривать, редактировать и запускать скрипт. Эти права можно настроить через редактор Apps Script, нажав на значок «Общий доступ» в правом верхнем углу.
- Владелец: Имеет полный контроль над скриптом. Может изменять, удалять, делиться и передавать права владения.
- Редактор: Может изменять код скрипта и его настройки.
- Просмотр: Может только просматривать код скрипта.
Важно предоставлять редакторские права только тем пользователям, которым это действительно необходимо. Для большинства пользователей достаточно предоставить доступ только для запуска скрипта (если это веб-приложение или используется API).
Примеры использования триггеров и прав доступа для защиты данных
- Ограничение редактирования данных: Создайте триггер
onEdit, который проверяет, кто пытается изменить данные в Google Sheets. Если пользователь не имеет прав на изменение, отмените его действие. - Защита API: Используйте права доступа к скрипту, чтобы ограничить доступ к API, предоставляемому вашим скриптом. Например, разрешите доступ только определенным Google Workspace аккаунтам.
- Контроль запуска скриптов: Настройте права доступа к скрипту так, чтобы его могли запускать только определенные пользователи или сервисные аккаунты.
Разрешение определенных источников для выполнения скриптов
Ограничение доступа к веб-приложениям Apps Script на основе IP-адресов
Для веб-приложений Apps Script можно ограничить доступ на основе IP-адресов. Это полезно, когда вы хотите, чтобы ваше приложение было доступно только из определенной сети (например, корпоративной).
К сожалению, Apps Script не предоставляет встроенных средств для фильтрации IP-адресов. Реализация потребует использования внешнего сервиса или API, чтобы определить IP-адрес пользователя и сравнить его с белым списком.
Пример (абстрактный):
- Использовать
UrlFetchAppдля получения IP-адреса пользователя из внешнего сервиса (например,https://api.ipify.org?format=json). - Сравнить полученный IP-адрес с вашим списком разрешенных IP-адресов.
- Если IP-адрес не разрешен, вернуть сообщение об ошибке.
Важно: Этот метод не является абсолютно надежным, так как IP-адрес пользователя может быть изменен (например, через прокси-сервер). Однако он может обеспечить дополнительный уровень безопасности.
Использование OAuth 2.0 для авторизации и контроля доступа
OAuth 2.0 – это стандартный протокол авторизации, который позволяет пользователям предоставлять приложениям доступ к своим данным без передачи своих учетных данных. В Apps Script OAuth 2.0 используется для авторизации доступа к Google API (например, Google Drive API, Google Sheets API) и к вашим собственным веб-приложениям.
Для использования OAuth 2.0 необходимо:
- Создать проект в Google Cloud Platform.
- Включить необходимые API.
- Настроить экран запроса согласия OAuth.
- Получить учетные данные OAuth 2.0 (client ID и client secret).
- Использовать библиотеку OAuth2 для Apps Script (например, https://github.com/googleworkspace/apps-script-oauth2) для получения токена доступа и выполнения запросов к API.
Пример:
// Пример использования библиотеки OAuth2
const oauth2 = OAuth2.createService('MyWebApp')
.setClientId('YOUR_CLIENT_ID')
.setClientSecret('YOUR_CLIENT_SECRET')
.setTokenUrl('https://accounts.google.com/o/oauth2/token')
.setAuthorizationBaseUrl('https://accounts.google.com/o/oauth2/auth')
.setCallbackFunction('authCallback')
.setPropertyStore(PropertiesService.getUserProperties())
.setScope('https://www.googleapis.com/auth/drive.readonly');
function authCallback(request) {
const authorized = oauth2.handleCallback(request);
if (authorized) {
return HtmlService.createHtmlOutput('Success!');
} else {
return HtmlService.createHtmlOutput('Denied!');
}
}
function doGet(e) {
if (oauth2.hasAccess()) {
// Выполнение действий, требующих авторизации
const files = DriveApp.getFiles();
// ...
return HtmlService.createHtmlOutput('Authorized');
} else {
const authorizationUrl = oauth2.getAuthorizationUrl();
return HtmlService.createHtmlOutput('<a href="' + authorizationUrl + '" target="_blank">Authorize</a>');
}
}
Реализация белого списка разрешенных доменов для API
Если ваше веб-приложение Apps Script взаимодействует с другими API, вы можете реализовать белый список разрешенных доменов, чтобы предотвратить запросы от неавторизованных источников. Это особенно важно для защиты от Cross-Site Request Forgery (CSRF) атак.
Реализация белого списка требует проверки заголовка Origin (или Referer) в запросе и сравнения его с вашим списком разрешенных доменов. Если домен не разрешен, отклоните запрос.
Пример:
function doGet(e) {
const allowedDomains = ['https://example.com', 'https://yourdomain.com'];
const origin = e.parameter.origin || e.parameter.referer; // Determine the correct parameter to check
if (origin && allowedDomains.indexOf(origin) !== -1) {
// Обработка запроса
return ContentService.createTextOutput('OK');
} else {
// Отклонение запроса
return ContentService.createTextOutput('Unauthorized').setStatusCode(403);
}
}
Практические примеры и сценарии
Сценарий 1: Контроль доступа к данным Google Sheets для разных пользователей
Предположим, у вас есть Google Sheets с конфиденциальной информацией о клиентах. Вам нужно предоставить доступ к этой таблице разным пользователям с разными уровнями прав (например, только для чтения, только для редактирования определенных столбцов).
Решение:
- Используйте права доступа к Google Sheets, чтобы предоставить разным пользователям разные уровни доступа (просмотр, редактирование).
- Создайте триггер
onEdit, который проверяет, кто пытается изменить данные в определенных столбцах. Если у пользователя нет прав на изменение, отмените его действие. - Используйте функцию
SpreadsheetApp.getActiveUser().getEmail()для определения пользователя, выполняющего действие.
Сценарий 2: Защита веб-приложения от неавторизованных запросов
Предположим, у вас есть веб-приложение Apps Script, которое принимает данные от других веб-сайтов. Вам нужно защитить его от неавторизованных запросов.
Решение:
- Реализуйте белый список разрешенных доменов, чтобы разрешить запросы только с определенных веб-сайтов.
- Используйте OAuth 2.0 для авторизации пользователей, обращающихся к вашему веб-приложению.
- Валидируйте все входные данные, чтобы предотвратить инъекции кода и другие атаки.
Сценарий 3: Разрешение доступа к скрипту только из определенного Google Workspace аккаунта
Необходимо разрешить доступ к Google Apps Script только пользователям, принадлежащим к определенному Google Workspace аккаунту (например, корпоративному).
Решение:
- Проверяйте доменную часть email-адреса пользователя, используя
Session.getActiveUser().getEmail(). Сравнивайте домен с разрешенным доменом Google Workspace. - В правах доступа к скрипту предоставьте доступ только редакторам или пользователям из нужного аккаунта. Остальным – запретите.
- Можно комбинировать с проверкой ID организации Google Workspace (требует Admin API и соответствующей авторизации).
Рекомендации по безопасности и отладка
Лучшие практики обеспечения безопасности Google Apps Script
- Регулярно проверяйте и обновляйте права доступа к вашим скриптам и данным.
- Используйте OAuth 2.0 для авторизации доступа к Google API и к вашим собственным веб-приложениям.
- Валидируйте все входные данные.
- Ограничьте использование сервиса
eval()(если необходимо, используйтеJSON.parse()для работы с JSON). - Используйте try-catch блоки для обработки исключений и предотвращения утечек информации.
- Не храните конфиденциальную информацию (например, пароли, ключи API) в коде скрипта. Используйте Service Properties или User Properties.
- Регулярно просматривайте журналы выполнения скриптов для выявления подозрительной активности.
Инструменты и методы отладки проблем с контролем доступа
- Используйте функцию
Logger.log()для вывода отладочной информации в журнал выполнения скрипта. - Используйте Chrome DevTools для отладки веб-приложений Apps Script.
- Используйте режим отладки в редакторе Apps Script для пошагового выполнения кода.
- Проверяйте сообщения об ошибках в консоли разработчика.
- Используйте Stack Overflow и другие ресурсы для поиска решений проблем.
Распространенные ошибки и способы их устранения
- Ошибка «Access denied»: Проверьте права доступа к скрипту и к связанным данным.
- Ошибка «Script function not found»: Убедитесь, что функция, которую вы пытаетесь вызвать, существует и доступна.
- Ошибка «Authorization is required to perform that action»: Убедитесь, что вы авторизовали доступ к необходимым API.
- Ошибка «The script does not have permission to access…»: Предоставьте скрипту необходимые разрешения.
- Неправильная валидация входных данных: Убедитесь, что вы правильно проверяете и фильтруете входные данные.