Перейти до вмісту

Основи безпеки

Що таке Supabase? База даних, яку обрав ваш білдер

Що таке Supabase: база даних, вхід і сховище файлів за вашим застосунком. Supabase тримає сервери, а правила про те, хто читає ваші рядки, ваші.

Vlad Tkachenko6 хв читання
Жорсткий кейс зі знятою кришкою, у ньому чотири гнізда різної форми: три застебнуті, одне відкрите й підсвічене бурштиновим.

Коротко

  • Що таке Supabase? Це місце, де ваш застосунок зберігає все, що мусить пам'ятати: ваших користувачів і їхні паролі, рядки за кожним списком і файли, які завантажують люди.
  • Майже напевно його обрав за вас ваш білдер, поки створював проєкт, і саме тому ніхто ніколи не показав вам, що там усередині.
  • Supabase тримає машини. Правила про те, хто які рядки може читати, ваші, і на таблиці, створеній через SQL, вони початково вимкнені.

Ваш застосунок працює. Десь у його налаштуваннях, у листі про рахунок або посеред повідомлення від Lovable стоїть слово Supabase. Рано чи пізно доводиться з'ясувати, що це, і причина рідко буває цікавістю: скан згадав ваш проєкт Supabase, розробник запитав, на якому ви тарифі, або ваш застосунок перестав зберігати і відповідь десь там усередині.

Отже: що таке Supabase. Кожне інше пояснення відповідає на це як на вибір між інструментами, а це питання, яке ставить собі розробник перед початком проєкту. Ви цього вибору ніколи не робили. Його зробив ваш білдер за ті секунди, що пішли на створення проєкту, і саме тому ніхто ніколи не провів вас по тій речі, яка тепер тримає всі дані ваших користувачів.

Це версія для того, хто вже його має.

Що таке Supabase, одним реченням?

Це місце, де ваш застосунок зберігає все, що мусить пам'ятати.

Ваші користувачі та їхні паролі. Рядки за кожним списком, який показує ваш застосунок. Зображення та документи, які завантажують люди. Коли хтось реєструється о другій ночі, цей запис лягає у ваш проєкт Supabase і лишається там після того, як вкладку браузера закрито.

Під усім цим лежить Postgres, база даних, що в продакшені з дев'яностих і що вас не здивує. Supabase додає все довкола: систему входу, місце для файлів і спосіб, яким ваш застосунок просить дані просто з браузера, а ви не пишете сервер.

Саме на останньому починаються ваші власні рішення.

Чотири частини, які ви насправді маєте

Чотири, і ваш застосунок імовірно користується щонайменше двома.

  • База даних. Таблиці рядків: ваші користувачі, ваші замовлення, ваші дописи. Та частина, яку мають на увазі, коли кажуть "Supabase".
  • Auth. Реєстрація, вхід, скидання пароля. Якщо у вашому застосунку є облікові записи, вони живуть тут.
  • Storage. Завантажені файли, у бакетах з назвами. Аватари, вкладення, експорти.
  • Edge functions. Невеликі шматки коду, що виконуються на серверах Supabase, а не в браузері вашого відвідувача. У вашому застосунку їх може не бути жодної, і все одно є одна добра причина цим цікавитися, нижче.

Ваша панель перелічує більше за ці чотири. Решту не чіпайте, доки те, що ви будуєте, цього не потребує.

Чотири сервіси під одним проєктом. Ваш застосунок дістається до всіх чотирьох за однією адресою проєкту, і саме тому ця адреса стоїть у сторінці.

Чим опікується Supabase, а що моє?

Supabase опікується машинами. Ви опікуєтеся правилами.

Межа проходить вище, ніж припускає більшість. Уявіть проєкт як орендоване приміщення. Орендодавець утримує будівлю, електрику та вхідні двері. Що ви тримаєте всередині й кого впускаєте, ніколи не було його рішенням.

Що тримає SupabaseЩо ваше
Сервери, версію Postgres і оновленняЯкі рядки дозволено читати кожному відвідувачу
Щоденні резервні копії вашої бази на платних тарифах, тиждень зберіганняЧи існує копія десь, куди ваш власний проєкт не дістає
Шифрування ваших даних на своїх дисках і дорогою до застосункуУ кого ваші ключі й котрий із них стоїть у застосунку
Щоб система входу працювалаЯкі файли в бакеті може перелічити будь-хто

Ніщо з лівої колонки не ламається тихо: якщо в Supabase збій, ви почуєте про це від своїх користувачів за кілька хвилин. Права колонка це те місце, де все йде не так зовсім беззвучно, бо нічого не ламається. Ваш застосунок працює далі точнісінько як учора.

Усе, що над пунктирною лінією, налаштовуєте ви, і ніщо звідти не ламає ваш застосунок, коли воно неправильне.

Чи мої дані в Supabase приватні за замовчуванням?

Залежить від того, як створено кожну таблицю, і спосіб, яким їх створює білдер, це той спосіб, що лишає їх відкритими.

Власна документація Supabase прямо про це пише. Вона каже, що Table Editor вмикає Row Level Security за вас, коли ви створюєте таблицю в Dashboard, і що коли ви створюєте таблицю через SQL, вмикаєте її ви самі. Row Level Security це налаштування на рівні окремої таблиці, яке вирішує, які рядки може читати відвідувач. Ваш білдер пише SQL, тож таблиця, створена вашим білдером, приходить із вимкненим налаштуванням.

Наступне речення тієї самої сторінки каже, що це по собі лишає: таблиця в схемі public досяжна через Data API, і доки ви не ввімкнете Row Level Security й не напишете політику, будь-хто з ключем publishable вашого проєкту може читати й писати кожен її рядок. Цей ключ стоїть у вашому застосунку, де йому й місце, і будь-хто може прочитати його зі сторінки.

Тож замок на кожній таблиці це те, що треба піти й подивитися, і він стоїть на таблиці, а не на проєкті. Як його ввімкнути і що таке політика це покрокова інструкція. Ми також порахували, як часто його бракує: 2 096 із 3 680 застосунків, чия база Supabase нам відповіла, мали щонайменше одну таблицю, яка віддавала свої рядки незнайомцю.

Якщо вам простіше подивитися ззовні, ніж проходити список таблиць, наш безкоштовний скан ставить вашому проєкту те саме питання, яке поставив би браузер незнайомця, і показує, що повернулося. Це триває близько 20 секунд і не потребує облікового запису: просканувати застосунок безкоштовно.

Де ваші ключі й котрий із них публічний

На сторінці налаштувань API стоять значення двох видів, і лише один вид належить вашому застосунку.

Ключ, що починається на sb_publishable_ і в старішому проєкті зветься anon, створений бути публічним і сам по собі не робить нічого, крім того, що каже, до якого проєкту належить запит. Ключ, що починається на sb_secret_ і в старішому проєкті зветься service_role, проходить повз кожне правило, яке ви поставите. Supabase каже це прямо: секретний ключ обходить Row Level Security, тому його треба тримати на сервері. Це й та сама добра причина цікавитися edge functions, бо function це місце, де робота, якій потрібен секретний ключ, може відбуватися без того, щоб ключ наближався до браузера.

Де ця сторінка й що робить кожне значення на ній покриває місця, а які ключі безпечні у фронтенді покриває те, як розрізнити два майже однакові ключі.

Як воно лишається вашим після публікації

Те, що ви знайдете сьогодні, описує сьогоднішній застосунок. Наступна таблиця, яку додасть ваш білдер, прийде з тим самим налаштуванням за замовчуванням, що й попередня, і ніхто не надішле вам про це повідомлення.

Reeve Monitor ставить питання з цієї статті знову, за розкладом:

  • усі дев'ять перевірок щогодини, до трьох застосунків
  • чи застосунок доступний, кожні 60 секунд
  • повідомлення, коли результат змінюється, щоб таблиця, яка відкрилася вночі, дійшла до вас раніше, ніж до незнайомця
  • щомісячний звіт про побачене

Reeve Care ще й тримає копію вашої бази даних Supabase. Це другий рядок правої колонки вище, зроблений за вас.

  • зашифрована копія вашої бази Supabase щоночі, покладена там, куди ваш проєкт не дістає
  • кожна копія перевіряється, перш ніж зарахуватися, підрахунком рядків у кожній таблиці
  • відновлення в один клік, коли воно знадобиться
  • ваші завантажені файли теж, щойно ви підключите доступ до Storage
  • усе, що робить Monitor

Таблиця, яку може прочитати незнайомець, це річ, яку знаходить перевірка. Міграція, що пішла навпаки, або агент із доступом до вашої бази натомість спустошує таблицю, і ось як це виглядає зсередини.

Що перевірити один раз, сьогодні

Що робити

  • Увійдіть у Supabase і відкрийте власний проєкт. Обліковий запис ваш, навіть якщо його створив білдер, і саме в панелі лежить кожна відповідь нижче.
  • Прочитайте замок на кожній таблиці в Authentication → Policies. Таблиця з вимкненим Row Level Security віддає свої рядки будь-кому, хто має ключ, що вже стоїть у вашому застосунку, а політика, яка дозволяє всім усе, рахується за вимкнену.
  • Відкрийте Settings → API Keys і з'ясуйте, які з ваших значень publishable, а які secret. Якщо секретний колись стояв у застосунку, замініть його в Supabase, перш ніж прибирати з коду.
  • Подивіться на свої бакети storage. Бакет, позначений публічним, перелічує кожен свій файл будь-кому, хто запитає, зокрема ті, яких ваш застосунок ніколи не показує.
  • Тримайте копію бази там, куди ваш проєкт не дістає, бо ніщо зі списку вище не поверне видалену таблицю.

Почніть із замків на таблицях, бо це єдиний пункт цього списку, яким незнайомець може користуватися вже зараз. Якщо вам зручніше пройти все списком, чеклист безпеки на 10 хвилин покриває це й інші налаштування, які варто прочитати в щойно опублікованому застосунку. Чи безпечний Supabase береться за інше питання, з яким приходять люди: чи все це взагалі було доброю ідеєю.

Поширені запитання

Що таке Supabase простими словами?

Це місце, де ваш застосунок зберігає все, що мусить пам'ятати, на серверах, які доглядає хтось інший. Ваші користувачі та їхні паролі, рядки за кожним списком, який показує ваш застосунок, і файли, які завантажують люди, живуть у вашому проєкті Supabase. В основі лежить Postgres, база даних, що в продакшені з дев'яностих, а довкола неї додано систему входу, сховище файлів і спосіб, яким ваш застосунок просить дані просто з браузера.

Supabase це база даних?

Він містить базу даних і він більший за неї. База даних це Postgres, і саме цю частину мають на увазі, коли кажуть Supabase. Поруч із нею стоять ще три сервіси, якими ваш застосунок може користуватися: Auth для входу, Storage для завантажених файлів і Edge Functions для коду, що виконується на серверах Supabase, а не в браузері вашого відвідувача. Ваша панель перелічує більше за ці чотири, і решту можна не чіпати, доки щось не знадобиться.

Чи обрав Supabase за мене мій білдер?

Майже напевно так. Lovable, Bolt, v0, Cursor, Replit і Windsurf усі беруть хостинговий Postgres тієї миті, коли ваш застосунок мусить щось запам'ятати, і Supabase це звична відповідь. Можливо, ви натиснули одну кнопку з написом підключити базу даних, а можливо, ваш білдер створив проєкт і не питав. Так чи так обліковий запис ваш і ви можете до нього увійти, і це перше, що варто зробити.

Які частини безпеки Supabase це моя робота?

Supabase тримає сервери, версію Postgres, оновлення, шифрування на своїх дисках і сам механізм входу. Ваші це правила: які рядки може читати кожен відвідувач, які файли в бакеті публічні, у кого ваші ключі й котрий із них стоїть у застосунку, і чи існує копія ваших даних десь, куди ваш проєкт не дістає. Ніщо з першого списку не ламається тихо. Усе з другого може бути неправильним місяцями, поки ваш застосунок працює бездоганно.

Чи мої дані в Supabase приватні за замовчуванням?

Залежить від того, як створено кожну таблицю. Документація Supabase каже, що Table Editor вмикає Row Level Security за вас, коли ви створюєте таблицю в Dashboard, і що коли ви створюєте таблицю через SQL, вмикаєте її ви самі. Білдер пише SQL, тож таблиці, які він створив для вас, приходять із вимкненим налаштуванням. Доки воно вимкнене й політики немає, Supabase каже, що будь-хто з вашим ключем publishable може читати й писати кожен рядок тієї таблиці, а цей ключ стоїть у вашому застосунку, де його може прочитати будь-хто.

Автор

Vlad Tkachenko

Засновник Reeve

Я щодня дивлюся на застосунки, зібрані в Lovable, Bolt, v0, Cursor і Replit, і на короткий список помилок, які трапляються в них знову і знову.

Більше про автора

Читати далі

Усі статті

Зробіть резервну копію бази Supabase перед наступною зміною

Reeve за розкладом зберігає зашифровану копію і відновить її за вас, якщо щось зламається.

Резервні копії Supabase

Автоматична зовнішня перевірка, а не повний аудит. Відсутність знахідок не є гарантією безпеки.