Авторизация данных

Цели

  • Понять какие грабли при авторизации
  • Упорядочить механики авторизации
  • Сделать так, чтобы механики авторизации были понятны разработчикам
  • Вероятность того, что разработчик забудет авторизовать данные должна быть нулевой или, хотя бы, близкой к нулю

Авторизация

в Партнёрке

Причины

  • По ощущениям: На вебах сложнее всего сделать единую авторизацию
  • Много открытых уязвимостей
  • Большое количество пользователей
    выше вероятность эксплуатации уязвимости

Подготовительные работы

Проблемы

  • Общие контроллеры
    • Непонятно как впиливать авторизацию на уровне конкретного приложения
  • Нет единого места для инфраструктуры
    • BaseController, BaseUploadController, BaseApiController, GlobalBase ...
  • Нет каких-то правил, непонятно где искать нужную логику

Что пришлось сделать

Проблема механизма авторизации данных

Web

BusinessService

DB

Context

UserId

AuthService

ids[]

Web

BusinessService

DB

Context

UserId

AuthService

ids[]

Web

BusinessService

DB

DataService

Context

UserId

Web

BusinessService

DB

query

WHERE userId = '...'

Context

UserId

Web

BusinessService

DB

query

SearchIndex

ids[]

BasePartnerController

хорошо спроектированная система

хорошо защищенная система

Баланс при проектировании API

ничего нельзя сделать

слишком мало информации

излишняя связность

слишком много информации

Излишняя связность

Bill

  • Id
  • Number
  • ...
  • Comment
  • ...

изначально

не использовался

можем поменять контракт?

а что если кто-то пользуется?

Баланс при проектировании API

ничего нельзя сделать

слишком мало информации

излишняя связность

слишком много информации

На макро уровне: Bounded context

На микро уровне: Interface Segregation Principle

Баланс в безопасности

ничего нельзя сделать

слишком мало информации

возможность злоупотребления

слишком много информации

Баланс в безопасности

ничего нельзя сделать

слишком мало информации

возможность злоупотребления

слишком много информации

Принцип наименьшей ответственности:

«не даём возможности что-либо делать, если нет разрешения»

Защита от дурака

Защита от злодея

Какая разница кто удалит чувствительные данные?

Слова-то красивые...

Client

API

Пример

  • /prospectivesales/{id}/postpone

Что если вместо того, чтобы говорить мне чего нельзя делать, система будет говорить что можно?

Client

API

auth

Пример

  • /prospectivesales/{id}/
    CanTransferTo
  • /prospectivesales/{id}/
    TransferTo

Выводы

  • Единый механизм вызывает сложности
  • Авторизация данных — часть бизнес-логики

Результаты

  • Закрыли 10 IDOR уязвимостей в Партнёрке
  • Отсылаем данные в security log при попытке неавторизованного доступа

Наши данные

  • Партнёрка
    • ​Сертификаты
  • Все API
  • SQL таблицы в BillyAccounting
  • Redash

Планы

Текущая ситуация

  • 18 задач в бэклоге трелло + 14 уязвимостей в YT
  • ~ 2-2,5 месяца на человека

AuthData

By koteek

AuthData

  • 299