Skip to content

Commit 7cce95d

Browse files
committed
config: revoke privs for default users and roles
All user-defined users and roles are not being removed and their privileges are not being revoked when this user or role is removed from config. This is done to prevent extreme repercussions of misconfiguration, e.g. empty config is provided to cluster and it breaks up. Default users and roles are not supposed to be changed, so this rule does not apply to them. Now all of non-default privileges will be revoked if such user or role is removed from config. Default users: * guest * admin Default roles: * super * public * replication Part of tarantool#8967 NO_DOC=tarantool/doc#3544 links the most actual schema, no need to update the issue.
1 parent 754af7a commit 7cce95d

File tree

3 files changed

+117
-0
lines changed

3 files changed

+117
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
## feature/config
2+
3+
* Implemented revoking of non-default privileges for default
4+
users and roles (gh-8967).

src/box/lua/config/applier/credentials.lua

+22
Original file line numberDiff line numberDiff line change
@@ -493,6 +493,28 @@ local function apply(config)
493493
return
494494
end
495495

496+
-- Now the credentials config should be enriched with empty configs
497+
-- for roles and users that are present by default on every instance:
498+
-- - - super
499+
-- - public
500+
-- - replication
501+
-- - - guest
502+
-- - admin
503+
--
504+
-- It is done to revoke all non-default privileges for this roles and
505+
-- users if they are not present in config. Otherwise, the privileges
506+
-- will be synced as usual.
507+
508+
credentials.roles = credentials.roles or {}
509+
credentials.roles['super'] = credentials.roles['super'] or {}
510+
credentials.roles['public'] = credentials.roles['public'] or {}
511+
credentials.roles['replication'] = credentials.roles['replication'] or {}
512+
513+
credentials.users = credentials.users or {}
514+
credentials.users['guest'] = credentials.users['guest'] or {}
515+
credentials.users['admin'] = credentials.users['admin'] or {}
516+
517+
-- Create roles and users and synchronise privileges for them.
496518
create_roles(credentials.roles)
497519
create_users(credentials.users)
498520
end

test/config-luatest/credentials_applier_test.lua

+91
Original file line numberDiff line numberDiff line change
@@ -636,3 +636,94 @@ g.test_remove_user_role = function(g)
636636
verify_2 = verify,
637637
})
638638
end
639+
640+
g.test_restore_defaults_for_default_user = function(g)
641+
-- Verify that if the default users and roles are not present in config
642+
-- their excessive privileges are revoked (restored to built-in defaults).
643+
644+
helpers.reload_success_case(g, {
645+
options = {
646+
credentials = {
647+
roles = {
648+
dummy = { },
649+
super = {
650+
roles = { 'dummy' },
651+
},
652+
public = {
653+
roles = { 'dummy' },
654+
},
655+
replication = {
656+
roles = { 'dummy' },
657+
},
658+
},
659+
users = {
660+
guest = {
661+
roles = { 'super', 'dummy' }
662+
},
663+
admin = {
664+
roles = { 'dummy' }
665+
},
666+
}
667+
}
668+
},
669+
verify = function()
670+
local internal =
671+
require('internal.config.applier.credentials')._internal
672+
673+
local default_identities = {{
674+
'user', 'admin',
675+
}, {
676+
'user', 'guest',
677+
}, {
678+
'role', 'super',
679+
}, {
680+
'role', 'public',
681+
}, {
682+
'role', 'replication',
683+
},}
684+
685+
for _, id in ipairs(default_identities) do
686+
local user_or_role, name = unpack(id)
687+
688+
local perm = box.schema[user_or_role].info(name)
689+
perm = internal.privileges_from_box(perm)
690+
691+
t.assert_equals(perm['role']['dummy'], {execute = true})
692+
end
693+
end,
694+
options_2 = {
695+
credentials = {
696+
users = {
697+
guest = {
698+
roles = { 'super' }
699+
}
700+
}
701+
}
702+
},
703+
verify_2 = function()
704+
local internal =
705+
require('internal.config.applier.credentials')._internal
706+
707+
local default_identities = {{
708+
'user', 'admin',
709+
}, {
710+
'user', 'guest',
711+
}, {
712+
'role', 'super',
713+
}, {
714+
'role', 'public',
715+
}, {
716+
'role', 'replication',
717+
},}
718+
719+
for _, id in ipairs(default_identities) do
720+
local user_or_role, name = unpack(id)
721+
722+
local perm = box.schema[user_or_role].info(name)
723+
perm = internal.privileges_from_box(perm)
724+
725+
t.assert_not_equals(perm['role']['dummy'], {execute = true})
726+
end
727+
end,
728+
})
729+
end

0 commit comments

Comments
 (0)