1- #include " msgbus_servicereq.h"
1+ #include " msgbus_server_request.h"
2+ #include " msgbus_securereq.h"
23#include " grpc_server.h"
34
45#include < ydb/library/actors/core/actor_bootstrapped.h>
@@ -19,36 +20,35 @@ using namespace NNodeBroker;
1920
2021namespace {
2122
22- class TNodeRegistrationActor : public TActorBootstrapped < TNodeRegistrationActor>, public TMessageBusSessionIdentHolder
23+ class TNodeRegistrationActor : public TMessageBusSecureRequest <TMessageBusServerRequestBase< TNodeRegistrationActor>>
2324{
2425 using TActorBase = TActorBootstrapped<TNodeRegistrationActor>;
25-
26- struct TNodeAuthorizationResult {
27- bool IsAuthorized = false ;
28- bool IsCertificateUsed = false ;
29-
30- operator bool () const {
31- return IsAuthorized;
32- }
33- };
26+ using TBase = TMessageBusSecureRequest<TMessageBusServerRequestBase<TNodeRegistrationActor>>;
3427
3528public:
3629 static constexpr NKikimrServices::TActivity::EType ActorActivityType () {
3730 return NKikimrServices::TActivity::MSGBUS_COMMON;
3831 }
3932
40- TNodeRegistrationActor (NKikimrClient::TNodeRegistrationRequest &request, NMsgBusProxy::TBusMessageContext &msg, const NKikimr::TDynamicNodeAuthorizationParams& dynamicNodeAuthorizationParams )
41- : TMessageBusSessionIdentHolder (msg)
33+ TNodeRegistrationActor (NKikimrClient::TNodeRegistrationRequest &request, NMsgBusProxy::TBusMessageContext &msg)
34+ : TBase (msg)
4235 , Request(request)
43- , DynamicNodeAuthorizationParams(dynamicNodeAuthorizationParams)
4436 {
37+ const auto & clientCertificates = msg.FindClientCert ();
38+ if (!clientCertificates.empty ()) {
39+ TBase::SetSecurityToken (TString (clientCertificates.front ()));
40+ } else {
41+ TBase::SetSecurityToken (BUILTIN_ACL_ROOT); // NBS compatibility
42+ }
4543 }
4644
4745 void Bootstrap (const TActorContext &ctx)
4846 {
49- const TNodeAuthorizationResult nodeAuthorizationResult = IsNodeAuthorized ();
50- if (!nodeAuthorizationResult.IsAuthorized ) {
47+ if (!CheckAccess ()) {
48+ Response.MutableStatus ()->SetCode (TStatus::UNAUTHORIZED);
49+ Response.MutableStatus ()->SetReason (" Cannot authorize node. Access denied" );
5150 SendReplyAndDie (ctx);
51+ return ;
5252 }
5353
5454 auto dinfo = AppData (ctx)->DomainsInfo ;
@@ -90,7 +90,7 @@ class TNodeRegistrationActor : public TActorBootstrapped<TNodeRegistrationActor>
9090 if (Request.HasPath ()) {
9191 request->Record .SetPath (Request.GetPath ());
9292 }
93- request->Record .SetAuthorizedByCertificate (nodeAuthorizationResult. IsCertificateUsed );
93+ request->Record .SetAuthorizedByCertificate (IsNodeAuthorizedByCertificate );
9494
9595 NTabletPipe::SendData (ctx, NodeBrokerPipe, request.Release ());
9696
@@ -157,7 +157,7 @@ class TNodeRegistrationActor : public TActorBootstrapped<TNodeRegistrationActor>
157157 void Die (const TActorContext &ctx)
158158 {
159159 NTabletPipe::CloseClient (ctx, NodeBrokerPipe);
160- TActorBase ::Die (ctx);
160+ TBase ::Die (ctx);
161161 }
162162
163163 void SendReplyAndDie (const TActorContext &ctx)
@@ -186,52 +186,34 @@ class TNodeRegistrationActor : public TActorBootstrapped<TNodeRegistrationActor>
186186 }
187187
188188private:
189- TNodeAuthorizationResult IsNodeAuthorized () {
190- TNodeAuthorizationResult result {.IsAuthorized = false , .IsCertificateUsed = false };
191- auto * appdata = AppData ();
192- if (appdata && appdata->FeatureFlags .GetEnableDynamicNodeAuthorization () && DynamicNodeAuthorizationParams) {
193- const auto & nodeAuthValues = FindClientCert ();
194- if (nodeAuthValues.empty ()) {
195- Response.MutableStatus ()->SetCode (TStatus::UNAUTHORIZED);
196- Response.MutableStatus ()->SetReason (" Cannot authorize node. Node has not provided certificate" );
197- return result;
198- }
199- const auto & pemCert = nodeAuthValues.front ();
200- TMap<TString, TString> subjectDescription;
201- X509CertificateReader::X509Ptr x509cert = X509CertificateReader::ReadCertAsPEM (pemCert);
202- for (const auto & term: X509CertificateReader::ReadSubjectTerms (x509cert)) {
203- subjectDescription.insert (term);
204- }
205-
206- if (!DynamicNodeAuthorizationParams.IsSubjectDescriptionMatched (subjectDescription)) {
207- Response.MutableStatus ()->SetCode (TStatus::UNAUTHORIZED);
208- Response.MutableStatus ()->SetReason (" Cannot authorize node by certificate" );
209- return result;
210- }
211- const auto & host = Request.GetHost ();
212- if (!DynamicNodeAuthorizationParams.IsHostMatchAttributeCN (host)) {
213- Response.MutableStatus ()->SetCode (TStatus::UNAUTHORIZED);
214- Response.MutableStatus ()->SetReason (" Cannot authorize node with host: " + host);
215- return result;
189+ bool CheckAccess () {
190+ const auto serializedToken = TBase::GetSerializedToken ();
191+ // Empty serializedToken means token is not required. Checked in secure_request.h
192+ if (!serializedToken.empty () && !AppData ()->RegisterDynamicNodeAllowedSIDs .empty ()) {
193+ NACLib::TUserToken token (serializedToken);
194+ for (const auto & sid : AppData ()->RegisterDynamicNodeAllowedSIDs ) {
195+ if (token.IsExist (sid)) {
196+ IsNodeAuthorizedByCertificate = true ;
197+ return true ;
198+ }
216199 }
217- result. IsCertificateUsed = true ;
200+ return false ;
218201 }
219- result.IsAuthorized = true ;
220- return result;;
202+ return true ;
221203 }
222204
223205 NKikimrClient::TNodeRegistrationRequest Request;
224206 NKikimrClient::TNodeRegistrationResponse Response;
225207 TActorId NodeBrokerPipe;
226- const TDynamicNodeAuthorizationParams DynamicNodeAuthorizationParams ;
208+ bool IsNodeAuthorizedByCertificate = false ;
227209};
228210
229211} // namespace
230212
231- IActor *CreateMessageBusRegisterNode (NMsgBusProxy::TBusMessageContext &msg, const NKikimr::TDynamicNodeAuthorizationParams& dynamicNodeAuthorizationParams ) {
213+ IActor *CreateMessageBusRegisterNode (NMsgBusProxy::TBusMessageContext &msg) {
232214 NKikimrClient::TNodeRegistrationRequest &record
233215 = static_cast <TBusNodeRegistrationRequest*>(msg.GetMessage ())->Record ;
234- return new TNodeRegistrationActor (record, msg, dynamicNodeAuthorizationParams );
216+ return new TNodeRegistrationActor (record, msg);
235217}
236218
237219} // namespace NMsgBusProxy
0 commit comments