@@ -39,37 +39,40 @@ bool TGRpcRequestProxyHandleMethods::ValidateAndReplyOnError(TCtx* ctx) {
39
39
}
40
40
}
41
41
42
- inline const TVector<TEvTicketParser::TEvAuthorizeTicket::TEntry>& GetEntriesForAuthAndCheckRequest (TEvRequestAuthAndCheck::TPtr& ev) {
42
+ inline TVector<TEvTicketParser::TEvAuthorizeTicket::TEntry> GetEntriesForAuthAndCheckRequest (TEvRequestAuthAndCheck::TPtr& ev, const TVector<std::pair<TString, TString>>& rootAttributes ) {
43
43
const bool isBearerToken = ev->Get ()->YdbToken && ev->Get ()->YdbToken ->StartsWith (" Bearer" );
44
44
const bool useAccessService = AppData ()->AuthConfig .GetUseAccessService ();
45
- const bool hasClusterAccessResourceId = !AppData ()->AuthConfig .GetClusterAccessResourceId ().empty ();
46
45
const bool needClusterAccessResourceCheck = AppData ()->DomainsConfig .GetSecurityConfig ().ViewerAllowedSIDsSize () > 0 ||
47
46
AppData ()->DomainsConfig .GetSecurityConfig ().MonitoringAllowedSIDsSize () > 0 ;
48
47
49
- if (!isBearerToken || !useAccessService || !hasClusterAccessResourceId || !needClusterAccessResourceCheck) {
50
- static const TVector<NKikimr::TEvTicketParser::TEvAuthorizeTicket::TEntry> emptyEntries = {};
51
- return emptyEntries;
48
+ if (!isBearerToken || !useAccessService || !needClusterAccessResourceCheck) {
49
+ return {};
52
50
}
53
51
54
- auto makeEntries = []() -> TVector<NKikimr::TEvTicketParser::TEvAuthorizeTicket::TEntry> {
55
- const TString& accessServiceType = AppData ()->AuthConfig .GetAccessServiceType ();
56
- TVector<TString> permissions;
57
- if (accessServiceType == " Yandex_v2" ) {
58
- permissions = {" ydb.developerApi.get" , " ydb.developerApi.update" };
59
- } else if (accessServiceType == " Nebius_v1" ) {
60
- permissions = {" ydb.clusters.get" , " ydb.clusters.monitor" , " ydb.clusters.manage" };
61
- } else {
52
+ const TString& accessServiceType = AppData ()->AuthConfig .GetAccessServiceType ();
53
+
54
+ if (accessServiceType == " Yandex_v2" ) {
55
+ static const TVector<NKikimr::TEvTicketParser::TEvAuthorizeTicket::TEntry> entries = {
56
+ {NKikimr::TEvTicketParser::TEvAuthorizeTicket::ToPermissions ({" ydb.developerApi.get" , " ydb.developerApi.update" }), {{" gizmo_id" , " gizmo" }}}
57
+ };
58
+ return entries;
59
+ } else if (accessServiceType == " Nebius_v1" ) {
60
+ static const auto permissions = NKikimr::TEvTicketParser::TEvAuthorizeTicket::ToPermissions ({
61
+ " ydb.clusters.get" , " ydb.clusters.monitor" , " ydb.clusters.manage"
62
+ });
63
+ auto it = std::find_if (rootAttributes.begin (), rootAttributes.end (),
64
+ [](const std::pair<TString, TString>& p) {
65
+ return p.first == " container_id" ;
66
+ });
67
+ if (it == rootAttributes.end ()) {
62
68
return {};
63
69
}
64
- const TString& clusterAccessResourceId = AppData ()->AuthConfig .GetClusterAccessResourceId ();
65
- TVector<NKikimr::TEvTicketParser::TEvAuthorizeTicket::TEntry> entries = {
66
- {NKikimr::TEvTicketParser::TEvAuthorizeTicket::ToPermissions (permissions), {{" gizmo_id" , clusterAccessResourceId}}}
70
+ return {
71
+ {permissions, {{" gizmo_id" , it->second }}}
67
72
};
68
- return entries;
69
- };
70
-
71
- static TVector<NKikimr::TEvTicketParser::TEvAuthorizeTicket::TEntry> entries = makeEntries ();
72
- return entries;
73
+ } else {
74
+ return {};
75
+ }
73
76
}
74
77
75
78
template <typename TEvent>
@@ -99,14 +102,14 @@ class TGrpcRequestCheckActor
99
102
100
103
static const TVector<TString>& GetPermissions ();
101
104
102
- void InitializeAttributesFromSchema (const TSchemeBoardEvents::TDescribeSchemeResult& schemeData) {
105
+ void InitializeAttributesFromSchema (const TSchemeBoardEvents::TDescribeSchemeResult& schemeData, const TVector<std::pair<TString, TString>>& rootAttributes ) {
103
106
CheckedDatabaseName_ = CanonizePath (schemeData.GetPath ());
104
107
if (!GrpcRequestBaseCtx_->TryCustomAttributeProcess (schemeData, this )) {
105
- ProcessCommonAttributes (schemeData);
108
+ ProcessCommonAttributes (schemeData, rootAttributes );
106
109
}
107
110
}
108
111
109
- void ProcessCommonAttributes (const TSchemeBoardEvents::TDescribeSchemeResult& schemeData) {
112
+ void ProcessCommonAttributes (const TSchemeBoardEvents::TDescribeSchemeResult& schemeData, const TVector<std::pair<TString, TString>>& rootAttributes ) {
110
113
TVector<TEvTicketParser::TEvAuthorizeTicket::TEntry> entries;
111
114
static std::vector<TString> allowedAttributes = {" folder_id" , " service_account_id" , " database_id" };
112
115
TVector<std::pair<TString, TString>> attributes;
@@ -121,7 +124,7 @@ class TGrpcRequestCheckActor
121
124
}
122
125
123
126
if constexpr (std::is_same_v<TEvent, TEvRequestAuthAndCheck>) {
124
- const auto & e = GetEntriesForAuthAndCheckRequest (Request_);
127
+ const auto & e = GetEntriesForAuthAndCheckRequest (Request_, rootAttributes );
125
128
entries.insert (entries.end (), e.begin (), e.end ());
126
129
}
127
130
@@ -134,12 +137,12 @@ class TGrpcRequestCheckActor
134
137
TBase::SetEntries (entries);
135
138
}
136
139
137
- void InitializeAttributes (const TSchemeBoardEvents::TDescribeSchemeResult& schemeData);
140
+ void InitializeAttributes (const TSchemeBoardEvents::TDescribeSchemeResult& schemeData, const TVector<std::pair<TString, TString>>& rootAttributes );
138
141
139
- void Initialize (const TSchemeBoardEvents::TDescribeSchemeResult& schemeData) {
142
+ void Initialize (const TSchemeBoardEvents::TDescribeSchemeResult& schemeData, const TVector<std::pair<TString, TString>>& rootAttributes ) {
140
143
TString peerName = GrpcRequestBaseCtx_->GetPeerName ();
141
144
TBase::SetPeerName (peerName);
142
- InitializeAttributes (schemeData);
145
+ InitializeAttributes (schemeData, rootAttributes );
143
146
TBase::SetDatabase (CheckedDatabaseName_);
144
147
InitializeAuditSettings (schemeData);
145
148
}
@@ -151,7 +154,8 @@ class TGrpcRequestCheckActor
151
154
TAutoPtr<TEventHandle<TEvent>> request,
152
155
IGRpcProxyCounters::TPtr counters,
153
156
bool skipCheckConnectRights,
154
- const IFacilityProvider* facilityProvider)
157
+ const IFacilityProvider* facilityProvider,
158
+ const TVector<std::pair<TString, TString>>& rootAttributes)
155
159
: Owner_(owner)
156
160
, Request_(std::move(request))
157
161
, Counters_(counters)
@@ -171,7 +175,7 @@ class TGrpcRequestCheckActor
171
175
TBase::SetSecurityToken (TString (clientCertificates.front ()));
172
176
}
173
177
}
174
- Initialize (schemeData);
178
+ Initialize (schemeData, rootAttributes );
175
179
}
176
180
177
181
void Bootstrap (const TActorContext& ctx) {
@@ -614,11 +618,11 @@ class TGrpcRequestCheckActor
614
618
615
619
// default behavior - attributes in schema
616
620
template <typename TEvent>
617
- void TGrpcRequestCheckActor<TEvent>::InitializeAttributes(const TSchemeBoardEvents::TDescribeSchemeResult& schemeData) {
621
+ void TGrpcRequestCheckActor<TEvent>::InitializeAttributes(const TSchemeBoardEvents::TDescribeSchemeResult& schemeData, const TVector<std::pair<TString, TString>>& rootAttributes ) {
618
622
for (const auto & attr : schemeData.GetPathDescription ().GetUserAttributes ()) {
619
623
Attributes_.emplace_back (std::make_pair (attr.GetKey (), attr.GetValue ()));
620
624
}
621
- InitializeAttributesFromSchema (schemeData);
625
+ InitializeAttributesFromSchema (schemeData, rootAttributes );
622
626
}
623
627
624
628
template <typename T>
@@ -662,9 +666,10 @@ IActor* CreateGrpcRequestCheckActor(
662
666
TAutoPtr<TEventHandle<TEvent>> request,
663
667
IGRpcProxyCounters::TPtr counters,
664
668
bool skipCheckConnectRights,
669
+ const TVector<std::pair<TString, TString>>& rootAttributes,
665
670
const IFacilityProvider* facilityProvider) {
666
671
667
- return new TGrpcRequestCheckActor<TEvent>(owner, schemeData, std::move (securityObject), std::move (request), counters, skipCheckConnectRights, facilityProvider);
672
+ return new TGrpcRequestCheckActor<TEvent>(owner, schemeData, std::move (securityObject), std::move (request), counters, skipCheckConnectRights, facilityProvider, rootAttributes );
668
673
}
669
674
670
675
}
0 commit comments