Близько 10 років я працював над різними внутрішніми настільними клієнтськими програмами із сховищами даних SQL Server. Рідко я запускав ці проекти - більшість - це роботи з перевезення.
Одне, що здавалося незмінним скрізь, - це те, що існує один глобальний обліковий запис користувача SQL Server, який використовував цей додаток, який надав йому дозвіл на загальну базу даних, і так, в деяких наївних ситуаціях він використовував sa
обліковий запис користувача, який я, як правило, намагався виправити, коли це можливо .
Ви справді не можете ефективно приховати це ім’я користувача та пароль, якими користується програма для доступу до бази даних. Зазвичай вони зберігаються у файлі ini
чи config
файлі, або, можливо, вкладаються у сам файл, що виконується. У всіх випадках вони помітні користувачеві, якщо вони трохи копають. В одному випадку ми фактично використовували config
файл, але зашифрували його, але, звичайно, ключ шифрування мав бути збережений у виконуваному файлі (ми не були наївними до обмежень цього, але це фактично заважало людям роздиратися, хто був достатньо кмітливим. шукати у config
файлах).
Усі ці системи мали в програмі вбудовану систему аутентифікації користувачів, але, звичайно, всіма ними керував через додаток, тобто інформація про користувачів зберігалася в базі даних. Додаток обмежував, що ви можете робити, залежно від рівня доступу, але це все-таки суперечка, якщо ви можете просто підключитися до бази даних та запустити спеціальні запити.
Мені цікаво знати, що роблять інші системи, щоб подолати цю проблему. Ось варіанти, які я знаю:
- Використовуйте механізм захисту SQL Server для підтримки списку користувачів та ролей, а також додайте та додайте на робочий стіл додаток та видаліть користувачів за допомогою T-SQL запитів.
- Замість того, щоб підключатися безпосередньо до бази даних, створіть якусь веб-службу, яка працює на сервері, і введіть туди логіку аутентифікації. Зробіть кожен запит перевірки безпеки.
Перші параметри трохи некрасиві, оскільки ви відокремлюєте користувачів від бази даних, щоб користувачі перестали бути особами першого класу, і ви не можете посилатися на них із зовнішніми ключовими відносинами тощо.
Друга просто здається головною проблемою продуктивності та великою кількістю зайвої роботи, плюс ви не можете так просто використовувати картографи ORM, як NHibernate (я думаю).
Хтось має з цим досвід? Кращі практики?
Редагувати
Подумавши трохи більше, чи може автентифікація SQL Server насправді вирішити цю проблему? Наприклад, якщо ваш користувач повинен мати можливість вставляти та оновлювати записи часових таблиць, щоб ви могли редагувати свій розклад часу, SQL-сервер не може заборонити доступ до інших рядків у таблиці деталей таблиці, що означає, що ви можете також читати та писати записи інших людей.