Безопасность сервера Parse

Привет всем, в этой статье я расскажу о безопасности при использовании Parse Server на Back4App. Поскольку безопасность – это не та тема, которая радует разработчиков, я буду очень краток и прям. Моя цель – предоставить быстрый контрольный список безопасности для проверки вашего приложения, прежде чем сделать его производственным.

Механизм безопасности при 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, вы можете контролировать безопасность приложения на двух разных уровнях:

  1. Класс/таблица – Используйте CLPs (Class Level Permissions), чтобы ограничить создание новых колонок и общий доступ к данным для всего класса;
  2. Объект – используйте 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 предоставляют несколько способов защиты данных в облаке. По мере создания приложения и оценки типов данных, которые вы будете хранить, вы сможете принять решение о том, какую реализацию выбрать.

Мы надеемся, что вы будете использовать эти инструменты, чтобы сделать все возможное для обеспечения безопасности данных вашего приложения и ваших пользователей. Вместе мы сможем сделать Интернет более безопасным местом.


Leave a reply

Your email address will not be published.