using System; using System.IO.Pipes; using System.Security.AccessControl; using System.Security.Principal; namespace ZB.MOM.WW.OtOpcUa.Driver.Galaxy.Host.Ipc; /// /// Builds the required by driver-stability.md ยง"IPC Security": /// only the configured OtOpcUa server principal SID gets ReadWrite | Synchronize; /// LocalSystem and Administrators are explicitly denied. Any other authenticated user falls /// through to the implicit deny. /// public static class PipeAcl { public static PipeSecurity Create(SecurityIdentifier allowedSid) { if (allowedSid is null) throw new ArgumentNullException(nameof(allowedSid)); var security = new PipeSecurity(); security.AddAccessRule(new PipeAccessRule( allowedSid, PipeAccessRights.ReadWrite | PipeAccessRights.Synchronize, AccessControlType.Allow)); var localSystem = new SecurityIdentifier(WellKnownSidType.LocalSystemSid, null); var admins = new SecurityIdentifier(WellKnownSidType.BuiltinAdministratorsSid, null); if (allowedSid != localSystem) security.AddAccessRule(new PipeAccessRule(localSystem, PipeAccessRights.FullControl, AccessControlType.Deny)); if (allowedSid != admins) security.AddAccessRule(new PipeAccessRule(admins, PipeAccessRights.FullControl, AccessControlType.Deny)); // Owner = allowed SID so the deny rules can't be removed without write-DACL rights. security.SetOwner(allowedSid); return security; } }