Skip to content

Commit a57ed48

Browse files
craig[bot]spilchen
andcommitted
Merge #153798
153798: sql/catalog: improve redaction of privilege validation errors r=spilchen a=spilchen We had a sentry error come in for a privilege validation error. The error looked like this: ``` privilege.go:397: relation × (52): × ``` This change improves things so not everything is redacted. It now looks something like this: ``` privilege.go:397: relation × (52): user root must have exactly [ALL] privileges on table ‹×› ``` Closes #152912 Epic: none Release note: none Co-authored-by: Matt Spilchen <[email protected]>
2 parents 3b1e9fa + 2a60884 commit a57ed48

File tree

3 files changed

+50
-10
lines changed

3 files changed

+50
-10
lines changed

pkg/sql/catalog/catpb/BUILD.bazel

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,10 +49,13 @@ go_library(
4949
deps = [
5050
"//pkg/keys",
5151
"//pkg/security/username",
52+
"//pkg/sql/pgwire/pgcode",
53+
"//pkg/sql/pgwire/pgerror",
5254
"//pkg/sql/privilege",
5355
"//pkg/sql/sem/catconstants",
5456
"//pkg/sql/sem/catid",
5557
"@com_github_cockroachdb_errors//:errors",
58+
"@com_github_cockroachdb_redact//:redact",
5659
],
5760
)
5861

@@ -68,6 +71,8 @@ go_test(
6871
"//pkg/sql/sem/catid",
6972
"//pkg/testutils",
7073
"//pkg/util/leaktest",
74+
"@com_github_cockroachdb_redact//:redact",
75+
"@com_github_stretchr_testify//require",
7176
],
7277
)
7378

pkg/sql/catalog/catpb/privilege.go

Lines changed: 18 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -6,15 +6,17 @@
66
package catpb
77

88
import (
9-
"fmt"
109
"sort"
1110

1211
"github.com/cockroachdb/cockroach/pkg/keys"
1312
"github.com/cockroachdb/cockroach/pkg/security/username"
13+
"github.com/cockroachdb/cockroach/pkg/sql/pgwire/pgcode"
14+
"github.com/cockroachdb/cockroach/pkg/sql/pgwire/pgerror"
1415
"github.com/cockroachdb/cockroach/pkg/sql/privilege"
1516
"github.com/cockroachdb/cockroach/pkg/sql/sem/catconstants"
1617
"github.com/cockroachdb/cockroach/pkg/sql/sem/catid"
1718
"github.com/cockroachdb/errors"
19+
"github.com/cockroachdb/redact"
1820
)
1921

2022
// PrivilegeDescVersion is a custom type for PrivilegeDescriptor versions.
@@ -364,21 +366,27 @@ func (p PrivilegeDescriptor) ValidateSuperuserPrivileges(
364366
// We expect an "admin" role. Check that it has desired superuser permissions.
365367
username.AdminRoleName(),
366368
} {
369+
// In case we hit an error, we include the user name in the redacted message.
370+
// It's safe to include this since it's hardcoded system user.
371+
redactSafeUser := redact.SafeString(user.Normalized())
372+
367373
superPriv, ok := p.FindUser(user)
368374
if !ok {
369-
return fmt.Errorf(
375+
return pgerror.Newf(
376+
pgcode.InsufficientPrivilege,
370377
"user %s does not have privileges over %s",
371-
user,
378+
redactSafeUser,
372379
privilegeObject(parentID, objectType, objectName),
373380
)
374381
}
375382

376383
// The super users must match the allowed privilege set exactly.
377384
if superPriv.Privileges != allowedSuperuserPrivileges.ToBitField() {
378-
return fmt.Errorf(
379-
"user %s must have exactly %s privileges on %s",
380-
user,
381-
allowedSuperuserPrivileges.SortedDisplayNames(),
385+
return pgerror.Newf(
386+
pgcode.InsufficientPrivilege,
387+
"user %s must have exactly [%v] privileges on %s",
388+
redactSafeUser,
389+
allowedSuperuserPrivileges,
382390
privilegeObject(parentID, objectType, objectName),
383391
)
384392
}
@@ -574,10 +582,10 @@ func (p *PrivilegeDescriptor) SetVersion(version PrivilegeDescVersion) {
574582
// privilegeObject is a helper function for privilege errors.
575583
func privilegeObject(
576584
parentID catid.DescID, objectType privilege.ObjectType, objectName string,
577-
) string {
585+
) redact.RedactableString {
578586
if parentID == keys.SystemDatabaseID ||
579587
(parentID == catid.InvalidDescID && objectName == catconstants.SystemDatabaseName) {
580-
return fmt.Sprintf("system %s %q", objectType, objectName)
588+
return redact.Sprintf("system %s %q", objectType, objectName)
581589
}
582-
return fmt.Sprintf("%s %q", objectType, objectName)
590+
return redact.Sprintf("%s %q", objectType, objectName)
583591
}

pkg/sql/catalog/catpb/privilege_test.go

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@ import (
1717
"github.com/cockroachdb/cockroach/pkg/sql/sem/catid"
1818
"github.com/cockroachdb/cockroach/pkg/testutils"
1919
"github.com/cockroachdb/cockroach/pkg/util/leaktest"
20+
"github.com/cockroachdb/redact"
21+
"github.com/stretchr/testify/require"
2022
)
2123

2224
func TestPrivilege(t *testing.T) {
@@ -704,3 +706,28 @@ func TestRevokeWithGrantOption(t *testing.T) {
704706
}
705707
}
706708
}
709+
710+
// TestPrivilegeValidationErrorRedaction tests that privilege validation errors
711+
// are properly redacted.
712+
func TestPrivilegeValidationErrorRedaction(t *testing.T) {
713+
defer leaktest.AfterTest(t)()
714+
715+
// Create a descriptor where root/admin don't have the required privileges
716+
// This will trigger ValidateSuperuserPrivileges error
717+
descriptor := catpb.NewCustomSuperuserPrivilegeDescriptor(
718+
privilege.List{privilege.UPDATE}, // Wrong privilege (not ALL)
719+
username.AdminRoleName(),
720+
)
721+
722+
id := catid.DescID(bootstrap.TestingMinUserDescID())
723+
err := descriptor.Validate(id, privilege.Table, "sensitive_table_name", catpb.DefaultSuperuserPrivileges)
724+
require.Error(t, err)
725+
726+
nonRedactedMsg := redact.Sprint(err).StripMarkers()
727+
expectedNonRedacted := `user root must have exactly [ALL] privileges on table "sensitive_table_name"`
728+
require.Equal(t, expectedNonRedacted, nonRedactedMsg, "non-redacted message mismatch")
729+
730+
redactedMsg := redact.Sprint(err).Redact()
731+
expectedRedacted := `user root must have exactly [ALL] privileges on table ‹×›`
732+
require.Equal(t, expectedRedacted, string(redactedMsg), "redacted message mismatch")
733+
}

0 commit comments

Comments
 (0)