Безопасность сервера Parse
Привет всем, в этой статье я расскажу о безопасности при использовании Parse Server на Back4App. Поскольку безопасность – это не та тема, которая радует разработчиков, я буду очень краток и прям. Моя цель – предоставить быстрый контрольный список безопасности для проверки вашего приложения, прежде чем сделать его производственным.
Contents
- 1 Механизм безопасности при Parse
- 2 Контрольный список приложений для обеспечения безопасности
- 2.1 1-Храните главный ключ в сейфе
- 2.2 2-Снять флажок создания класса клиента
- 2.3 3-Создайте структуру ролей
- 2.4 4-Настройка CLP для пользователей и ролей
- 2.5 5 – Сделать фиксированные классы доступными для чтения
- 2.6 6 Общие рекомендации по CLP и ACL
- 2.7 7 – Установите длительность сеанса (только некоторые случаи)
- 2.8 8-Использование Https и SSL
- 3 Заключительные слова
Механизм безопасности при Parse
Для того чтобы правильно настроить доступ к безопасности вашего приложения, вы должны сначала понять некоторые концепции базовых механизмов безопасности Parse, классы Parse по умолчанию и механизмы Auth.
1-Parse классов по умолчанию
По умолчанию Parse создает 3 класса: Пользователи, Роли и Сессии. Эти классы полностью интегрированы со всем бэкендом, а также облегчат вам жизнь при настройке механизмов аутентификации для защиты вашего приложения.
Пользователь
Parse предоставляет специализированный класс пользователя Parse.User
, который автоматически обрабатывает большую часть функций, необходимых для управления учетными записями пользователей.
Класс Parse.User
по умолчанию является защищенным. Данные, хранящиеся в Parse.User
, могут быть изменены только этим пользователем. По умолчанию данные могут быть прочитаны любым клиентом. Таким образом, некоторые объекты Parse.User
аутентифицированы и могут быть изменены, в то время как другие доступны только для чтения.
Роли
Роль – это класс, в котором вы можете объединить пользователей и другие роли в новую роль. После создания роли вы можете использовать ее для определения того, к чему эта роль будет иметь доступ в вашем приложении, используя CLP и ACL.
Сессия
Когда вы регистрируете пользователя с помощью метода входа User
, Parse автоматически создает новый неограниченный объект Session
на вашем сервере Parse. То же самое касается регистрации и входа в Facebook/Twitter.
Механизм авторизации 2-Parse
Говоря о доступе к данным в Parse, вы можете контролировать безопасность приложения на двух разных уровнях:
- Класс/таблица – Используйте CLPs (Class Level Permissions), чтобы ограничить создание новых колонок и общий доступ к данным для всего класса;
- Объект – используйте ACL (списки контроля доступа) для контроля доступа к определенному объекту;
Разрешения на уровне класса – CLPs
Разрешения на уровне класса – это механизм, который контролирует доступ к классу и всем его объектам. Используя CLP, вы можете настроить доступ на чтение/запись для роли, пользователя или указателя.
С помощью этого механизма вы можете ограничить доступ к следующим операциям:
- Прочитать
- Получить – Получить информацию об объектах для заданного ObjectId;
- Find – Запрос всех объектов в данном классе (ObjectID не нужен);
- Count – Общее количество объектов в классе;
- Написать
- Создать – создание новых объектов;
- Обновить – обновить существующий объект;
- Удалить – удалить существующий объект;
- Добавить
- Добавить поле – создание новых столбцов в данном классе;
Чтобы получить доступ к этим настройкам, нужно перейти к маленькому значку щита в правом верхнем углу быстрого меню.
После щелчка на значке щита вы увидите простое меню с опциями чтения/записи. Щелкните на значке в правом верхнем углу окна, чтобы перейти к расширенной конфигурации CLPs.
После этого вы увидите окно полной конфигурации CLP.
Списки контроля доступа – ACL
Списки контроля доступа позволяют по-разному контролировать доступ к каждому объекту данного класса. Вы можете создать ACL для объекта и настроить доступ (чтение/запись) для каждой роли или пользователя.
Для создания любой роли в Parse всегда требуется ACL. Поэтому для создания первой роли вам понадобится пользователь. Давайте создадим пользователя root, чтобы создать первые роли в нашем приложении. Этот пользователь будет единственным, кто сможет редактировать эти роли.
Во-первых, мы можем создать пользователя root, просто заполнив имя пользователя и пароль в таблице User Table.
Затем скопируйте root User ObjectId и перейдите в класс ролей. Создайте новую роль и дважды щелкните на поле ACL, чтобы создать ACL. В данном случае я собираюсь разрешить пользователю root читать/писать этот ACL, поэтому давайте заполним ACL объектным идентификатором пользователя root, а затем сохраним его.
После этого шага давайте дадим этой роли имя Admin и свяжем с ней пользователей Alex и Alysson. Поскольку класс Role имеет связь с классом User, вы можете щелкнуть обзор связи, а затем добавить идентификаторы объектов пользователей, которых вы хотите добавить в эту связь.
Теперь у вас есть администратор роли с 2 пользователями, которых вы можете использовать для создания новых ролей, атрибутирования новых ACL или CLP.
Контрольный список приложений для обеспечения безопасности
Теперь, когда вы знакомы с основными концепциями безопасности Parse, я хотел бы предложить вам несколько советов, как сделать ваше приложение более безопасным.
1-Храните главный ключ в сейфе
Мастер-ключ – это механизм Parse, позволяющий обойти все остальные уровни безопасности. Хорошее сравнение: иметь мастер-ключ для приложения – все равно что иметь корневой доступ к серверу.
Вот почему вы должны защищать этот ключ и при необходимости использовать его только через облачный код. Вы не должны использовать его в коде Front end, потому что кто-то может декомпилировать или, в случае JS, просто щелкнуть на просмотре исходного кода и скопировать ваш ключ.
Еще один совет – при использовании этого ключа в облачном коде убедитесь, что вы не собираетесь фиксировать ключ (который является частью вашего облачного кода) в каком-либо публичном хранилище кода.
2-Снять флажок создания класса клиента
Когда вы создаете новое приложение на Back4App, ключ Parse allowClientClassCreation включается. Это означает, что любой человек, имеющий AppID и Client Key, может создавать новые классы в вашей базе данных.
Вы можете изменить эту конфигурацию в Back4App в меню Настройки сервера->Основные настройки->Настройки.
Просто прокрутите страницу вниз и снимите флажок с опции “Разрешить создание классов клиентов”, как показано ниже.
Рекомендуется держать эту опцию включенной, пока вы разрабатываете приложение, а когда закончите, удалить ее.
3-Создайте структуру ролей
Как мы уже говорили в разделе ACL, вы можете продолжить и построить структуру ролей, чтобы лучше контролировать доступ ко всем классам и объектам вашего приложения. Допустим, вы создаете приложение Uber-Clone-App и у вас есть 3 основных доступа: Администратор, Пассажиры, Водители.
4-Настройка CLP для пользователей и ролей
Поскольку User – это класс Parse по умолчанию, любой человек, имеющий имя класса, ключ REST API и идентификатор приложения, может запросить весь список пользователей, выполнив одну команду curl:
curl -X GET -H "X-Parse-Application-Id: FyebII2zNpA2i9DdZ8froWna9vIvJMcgjfmjS0iK" -H "X-Parse-REST-API-Key: hluEgfZ084RdR0MyyE8Y9v4RwsOsTIWlJeCc4qGw" https://parseapi.back4app.com/users
И получите список пользователей:
Вы можете избежать этого, создав CLP и ограничив полномочия тех, кто может читать/писать вашу таблицу пользователей (также можно сделать защиту с помощью ACL). В данном случае я собираюсь разрешить только пользователям Admin читать весь список пользователей.
Вы можете проделать аналогичный процесс с классом ролей и удалить доступ для ролей/пользователей, которым не нужно читать весь класс.
Класс сеанса защищен по умолчанию, поскольку все объекты сеанса
имеют автоматически созданный ACL, который разрешает чтение и запись только данному пользователю.
5 – Сделать фиксированные классы доступными для чтения
Если у вас есть таблицы/классы, которые вы хотите изменять только через Parse Dashboard, вы можете сделать их доступными только для чтения с помощью CLP. В моем случае я создал класс, определяющий город, в котором будет работать мое приложение Uber-Clone-App.
Я хочу изменить этот класс только через Parse Dashboard, поэтому я сниму права на запись со всех остальных ролей.
6 Общие рекомендации по CLP и ACL
Большинство классов в вашем приложении будут относиться к одной из нескольких категорий, которые легко защитить. Для полностью публичных данных можно использовать разрешения на уровне класса, чтобы заблокировать таблицу и сделать ее общедоступной для чтения и записи. Для полностью приватных данных можно использовать ACL, чтобы убедиться, что только пользователь, которому принадлежат данные, может их прочитать.
Но иногда вы сталкиваетесь с ситуациями, когда вам не нужны полностью публичные или полностью приватные данные. Например, у вас может быть социальное приложение, где данные пользователя должны быть доступны для чтения только друзьям, которых он одобрил. Для этого вам понадобится комбинация методов, рассмотренных в этом руководстве, чтобы обеспечить именно те правила совместного доступа, которые вы хотите.
Ознакомьтесь с этим видео о том, как создать ACL, чтобы узнать больше.
7 – Установите длительность сеанса (только некоторые случаи)
Если вы разрабатываете приложение, которое содержит очень конфиденциальную информацию (банковское приложение, приложение для здравоохранения), и вам может потребоваться выход из системы пользователей через некоторое время.
Чтобы ограничить длину сессии, перейдите в Настройки сервера->Настройки пользовательских приложений.
В текстовом поле Custom Parse Options задайте длительность сеанса в секундах. В приведенном ниже примере я определяю длительность сеанса в 10 минут. Затем нажмите кнопку Сохранить.
8-Использование Https и SSL
Https – это безопасный протокол для передачи информации от браузера клиента к вашему серверу. Он необходим для того, чтобы хакеры не смогли получить доступ к конфиденциальной информации с помощью атак типа MITM.
Совет заключается в том, чтобы использовать Https поверх Http для установления соединения с сервером Parse. Ниже приведен пример использования JS-соединения с Parse, который показывает, как правильно использовать https для установления активного соединения. Обратите внимание, что неправильным способом будет использование http:// вместо https://.
Parse.initialize("APP_ID", "JS_KEY"); Parse.serverURL = 'https://parseapi.back4app.com/'
Если вы используете веб-хостинг Back4App, важно отметить, что Back4App уже предоставляет https-соединение по умолчанию (вы должны использовать https:// в своих звонках!).
Но если вы хотите использовать собственное доменное имя и перенаправлять на серверы Back4App, убедитесь, что ваш SSL-сертификат действителен и правильно установлен, и что вы делаете перенаправление на Back4App с помощью https.
Заключительные слова
Back4App и Parse предоставляют несколько способов защиты данных в облаке. По мере создания приложения и оценки типов данных, которые вы будете хранить, вы сможете принять решение о том, какую реализацию выбрать.
Мы надеемся, что вы будете использовать эти инструменты, чтобы сделать все возможное для обеспечения безопасности данных вашего приложения и ваших пользователей. Вместе мы сможем сделать Интернет более безопасным местом.