Сначала немного предыстории.
Проект LedgerSMB - это проект программного обеспечения для финансового учета с открытым исходным кодом, работающий на PostgreSQL. Мы реализуем очень большой объем бизнес-логики в пользовательских функциях, которые действуют как основной инструмент отображения между методами объекта программы и поведением базы данных. В настоящее время мы используем пользователей базы данных в качестве пользователей для аутентификации, частично по выбору (это позволяет централизованную логику безопасности, так что другие инструменты могут быть написаны и повторно использовать разрешения, предоставленные пользователям), и частично по необходимости (после того, как мы разветвились из SQL-Ledger, там было не так много вариантов переоборудования безопасности на эту кодовую базу).
Это дает нам доступ к разумному количеству опций единой регистрации, к которым имеет доступ PostgreSQL, от LDAP до Kerberos 5. Мы можем даже использовать PAM, когда речь идет о паролях. Это также позволяет нам повторно использовать разрешения при интеграции с другими приложениями или разрешении других клиентских интерфейсов. Для приложения финансового учета это выглядит как чистый выигрыш.
Есть очевидные затраты. Для веб-приложения мы очень ограничены типами http-аутентификации, которые могут поддерживаться. Дайджест, например, полностью отсутствует. BASIC работает, и мы могли бы достаточно легко внедрить KRB5 (я планирую поддерживать это и работать из коробки для 1.4). Очень строгие меры аутентификации не могут быть должным образом обработаны напрямую, хотя мы, возможно, могли бы включить их в случае необходимости (например, BASIC + SSL-сертификат на стороне клиента с cn, совпадающим с именем пользователя и определенным корневым ca).
В то же время мы столкнулись с большим количеством критики, в основном со стороны разработчиков, а иногда со стороны dba, которые говорят мне, что приложение должно быть барьером безопасности, а не базой данных. Я по-прежнему считаю, что меньший периметр безопасности, как правило, лучше, что повторное использование бизнес-логики и логики безопасности сочетаются друг с другом, и мне кажется опасным повторное использование бизнес-логики без повторного использования логики безопасности на том же уровне. программы.
Я пропускаю какие-либо серьезные компромиссы здесь? Есть ли ошибки, которые я не рассматриваю?
источник
Ответы:
Я думаю, что вы объединяете аутентификацию и авторизацию .
Я полностью согласен с тем, что сохранение модели безопасности в БД целесообразно, особенно с учетом того, что LedgerSMB разработан с учетом доступа нескольких клиентов. Если вы не планируете на 3-й уровня с промежуточным слоем имеет идеальный смысл иметь пользователь в качестве ролей базы данных, особенно для что - то вроде учета приложения.
Это не означает, что вы должны аутентифицировать пользователей по базе данных, используя метод аутентификации, поддерживаемый PostgreSQL. Пользователи, роли и гранты вашей базы данных могут быть использованы для авторизации, только если вам это нравится.
Вот как это работает для веб-интерфейса, например:
jane
подключается к серверу веб-интерфейса и проходит проверку подлинности с использованием любого желаемого метода, например, рукопожатия сертификата клиента HTTPS X.509 и аутентификации DIGEST. Сервер теперь имеет соединение от пользователя, которого он принимает на самом делеjane
.Сервер подключается к PostgreSQL, используя фиксированное имя пользователя / пароль (или Kerberos, или что угодно), аутентифицируя себя на сервере db в качестве пользователя
webui
. Сервер db доверяетwebui
аутентифицировать своих пользователей, поэтомуwebui
ему были присвоены соответствующие значенияGRANT
(см. Ниже).В этом соединении сервер использует
SET ROLE jane;
уровень авторизации пользователяjane
. До тех пор, пока не будет запущеноRESET ROLE;
другоеSET ROLE
, соединение работает с теми же правами доступа, чтоjane
иSELECT current_user()
отчет, и тjane
. Д.Сервер поддерживает связь между подключением к базе данных, к которому он имеет
SET ROLE
отношение,jane
и веб-сеансом для пользователяjane
, не позволяя этому соединению PostgreSQL использоваться другими подключениями с другими пользователями без новогоSET ROLE
промежуточного соединения.Теперь вы проходите аутентификацию вне сервера, но сохраняете авторизацию на сервере. Pg должен знать, какие пользователи существуют, но ему не нужны пароли или методы аутентификации для них.
Видеть:
SET SESSION AUTHORIZATION
SET ROLE
GRANT
Детали
Сервер webui контролирует выполнение запросов, и он не позволяет
jane
запускать сырой SQL (надеюсь!), Поэтомуjane
не можетRESET ROLE; SET ROLE special_admin_user;
через веб-интерфейс. Для большей безопасности я бы добавил фильтр операторов на сервер, который отклонил,SET ROLE
иRESET ROLE
если соединение не входило или не входило в пул неназначенных соединений.Вы по-прежнему можете использовать прямую аутентификацию для Pg в других клиентах; Вы можете смешивать и сочетать свободно. Вы просто должны
GRANT
наwebui
пользователя праваSET ROLE
пользователей , которые могут войти в систему через Интернет , а затем дать этим пользователям любые обычныеCONNECT
права, пароли и т.д. , которые вы хотите. Если вы хотите сделать их доступными только через Интернет,REVOKE
ихCONNECT
права на базу данных (и отpublic
).Чтобы сделать такое разделение аутентификации / авторизации легким, у меня есть особая роль,
assume_any_user
которую я долженGRANT
выполнять каждый вновь созданный пользователь. Затем я перехожуGRANT assume_any_user
к реальному имени пользователя, используемому такими вещами, как доверенный веб-интерфейс, давая им право стать любым пользователем, который им нравится.Очень важно , чтобы
assume_any_user
наNOINHERIT
роль, так чтоwebui
пользователь или любой другой не имеет privilges от своей самости и может действовать только в базе данных , как только этоSET ROLE
для реального пользователя. Ни при каких обстоятельствах не долженwebui
быть суперпользователем или владельцем БД .Если вы используете пул соединений, вы можете использовать
SET LOCAL ROLE
для установки роли только внутри транзакции, поэтому вы можете вернуть соединения в пул послеCOMMIT
илиROLLBACK
. Остерегайтесь, этоRESET ROLE
все еще работает, поэтому все еще не безопасно позволить клиенту запускать любой SQL, который он хочет.SET SESSION AUTHORIZATION
является связанной, но более сильной версией этой команды. Это не требует членства в роли, но это команда только для суперпользователя. Вы не хотите, чтобы ваш веб-интерфейс подключался как суперпользователь. Это может быть отменено сRESET SESSION AUTHORIZATION
,SET SESSION AUTHORIZATION DEFAULT
илиSET SESSION AUTHORIZATION theusername
вернуть права суперпользователя , так что это не привилегия , сбрасывая барьер безопасности либо.Команда, которая работала бы как,
SET SESSION AUTHORIZATION
но была необратимой и работала бы, если бы вы были участником роли, но не суперпользователем, было бы здорово. На данный момент их нет, но вы все равно можете разделить аутентификацию и авторизацию, если будете осторожны.Пример и объяснение
Теперь подключите как
webui
. Обратите внимание , что вы не можете ничего сделать ,test_table
но вы можетеSET ROLE
сjane
и затем вы можете получить доступ кtest_table
:Обратите внимание , что
webui
можетSET ROLE
, чтобыjim
, даже когда ужеSET ROLE
цифроjane
и даже еслиjane
неGRANT
эд право принимать на себя рольjim
.SET ROLE
устанавливает ваш эффективный идентификатор пользователя, но он не удаляет вашу способность кSET ROLE
другим ролям, это свойство роли, к которой вы подключены, а не текущей действующей роли. Следовательно , вы должны тщательно контролировать доступ кSET ROLE
иRESET ROLE
командам. У AFAIK нет никакого способа навсегдаSET ROLE
установить соединение, действительно стать целевым пользователем, хотя было бы неплохо иметь его.Для сравнения:
чтобы:
Это означает, что
SET ROLE
это не то же самое, что вход в систему с заданной ролью, о чем вы должны помнить.webui
может неSET ROLE
до ,dbowner
так как он не былGRANT
эд это право:так что сам по себе он довольно бессилен, он может принять права других пользователей и только тогда, когда у этих пользователей включен веб-доступ.
источник
pgbouncer
работает для некоторых деталей.DISCARD ALL
это еще один способ вернуть права на дефолт. Я действительно хотел бы, чтобы у Пг былаSET ROLE NORESET
или что-то подобное ...