-- ============================================================================ -- Een aparte databasegebruiker voor de applicatie, met alleen de rechten die -- hij nodig heeft: geen CREATE, geen DROP, geen ALTER. Schemawijzigingen doe -- je met een migratie onder je eigen account, niet vanuit de draaiende -- applicatie. -- -- Vervang het wachtwoord hieronder en bewaar het niet in de broncode -- -- zie docs/Beveiliging.md, "Waar de geheimen staan". -- -- Draaien (in cmd, NIET in PowerShell): -- mysql -u root -p < 02_applicatiegebruiker.sql -- -- Opnieuw draaien mag en is veilig: CREATE USER IF NOT EXISTS slaat de hele regel over als de -- gebruiker al bestaat, dus het wachtwoord verandert niet. Dat is precies wat je doet als er -- tabellen bij zijn gekomen. -- -- LET OP: komt er een tabel bij, dan hoort hij hier ook bij te staan. Zonder recht krijgt de -- applicatie "SELECT command denied" - en dat merk je pas als iemand dat scherm opent. Er is -- een zelftest die elke CREATE TABLE in deze map naast deze lijst legt. -- -- En hier, in DIT bestand, en nergens anders. Sommige migratiescripts deelden vroeger zelf -- rechten uit, vlak onder hun CREATE TABLE. Dat leest prettig, maar de scripts vanaf 03 worden -- ook door de uitrolagent gedraaid met een beperkt databaseaccount, en dat mag geen rechten -- uitdelen: de uitrol struikelde er dan op. Rechten uitdelen is inrichten, en dat doet een mens -- één keer als root. De zelftest bewaakt ook dat. -- ============================================================================ CREATE USER IF NOT EXISTS 'mijnbesluit_app'@'localhost' IDENTIFIED BY 'VERVANG_DIT_WACHTWOORD'; -- De rechten worden per tabel gegeven en niet in één keer op de hele database. -- Dat is met opzet: rechten in MariaDB zijn optellend, dus een recht dat op -- databaseniveau is gegeven kun je op tabelniveau niet meer afnemen. Wil je -- het logboek onwijzigbaar houden, dan mag UPDATE/DELETE op de database dus -- nooit gegeven worden. GRANT SELECT, INSERT, UPDATE, DELETE ON `mijnbesluit`.`persons` TO 'mijnbesluit_app'@'localhost'; GRANT SELECT, INSERT, UPDATE, DELETE ON `mijnbesluit`.`users` TO 'mijnbesluit_app'@'localhost'; GRANT SELECT, INSERT, UPDATE, DELETE ON `mijnbesluit`.`families` TO 'mijnbesluit_app'@'localhost'; GRANT SELECT, INSERT, UPDATE, DELETE ON `mijnbesluit`.`family_members` TO 'mijnbesluit_app'@'localhost'; GRANT SELECT, INSERT, UPDATE, DELETE ON `mijnbesluit`.`invitations` TO 'mijnbesluit_app'@'localhost'; GRANT SELECT, INSERT, UPDATE, DELETE ON `mijnbesluit`.`vault_items` TO 'mijnbesluit_app'@'localhost'; GRANT SELECT, INSERT, UPDATE, DELETE ON `mijnbesluit`.`vault_files` TO 'mijnbesluit_app'@'localhost'; GRANT SELECT, INSERT, UPDATE, DELETE ON `mijnbesluit`.`content_grants` TO 'mijnbesluit_app'@'localhost'; GRANT SELECT, INSERT, UPDATE, DELETE ON `mijnbesluit`.`messages` TO 'mijnbesluit_app'@'localhost'; GRANT SELECT, INSERT, UPDATE, DELETE ON `mijnbesluit`.`death_declarations` TO 'mijnbesluit_app'@'localhost'; GRANT SELECT, INSERT, UPDATE, DELETE ON `mijnbesluit`.`legacy_managers` TO 'mijnbesluit_app'@'localhost'; GRANT SELECT, INSERT, UPDATE, DELETE ON `mijnbesluit`.`refresh_tokens` TO 'mijnbesluit_app'@'localhost'; GRANT SELECT, INSERT, UPDATE, DELETE ON `mijnbesluit`.`login_codes` TO 'mijnbesluit_app'@'localhost'; GRANT SELECT, INSERT, UPDATE, DELETE ON `mijnbesluit`.`toestellen` TO 'mijnbesluit_app'@'localhost'; GRANT SELECT, INSERT, UPDATE, DELETE ON `mijnbesluit`.`samenvoegingen` TO 'mijnbesluit_app'@'localhost'; GRANT SELECT, INSERT, UPDATE, DELETE ON `mijnbesluit`.`adverteerders` TO 'mijnbesluit_app'@'localhost'; GRANT SELECT, INSERT, UPDATE, DELETE ON `mijnbesluit`.`campagnes` TO 'mijnbesluit_app'@'localhost'; GRANT SELECT, INSERT, UPDATE, DELETE ON `mijnbesluit`.`campagne_uren` TO 'mijnbesluit_app'@'localhost'; GRANT SELECT, INSERT, UPDATE, DELETE ON `mijnbesluit`.`sessies` TO 'mijnbesluit_app'@'localhost'; GRANT SELECT, INSERT, UPDATE, DELETE ON `mijnbesluit`.`vault_categories` TO 'mijnbesluit_app'@'localhost'; GRANT SELECT, INSERT, UPDATE, DELETE ON `mijnbesluit`.`vault_category_fields` TO 'mijnbesluit_app'@'localhost'; -- Het logboek mag er alleen bij komen en uit gelezen worden, niet uit verdwijnen. GRANT SELECT, INSERT ON `mijnbesluit`.`audit_log` TO 'mijnbesluit_app'@'localhost'; FLUSH PRIVILEGES; -- Controle: audit_log hoort alleen SELECT en INSERT te hebben, de rest alles behalve DDL. SHOW GRANTS FOR 'mijnbesluit_app'@'localhost';