Konzept
Benutzer und Rollen
Welche Benutzeridentitäten OPC UA kennt, wie ein Client Benutzer anmeldet und wie ein Server sie über Zugriffskontrolllisten und Rollen prüft.
Konzept
Benutzer und Rollen
Zertifikate weisen Client- und Serveranwendungen aus. Zusätzlich kann ein Server die Benutzer prüfen, die über einen Client mit ihm arbeiten, und ihnen Rechte zuordnen. Diese Seite erklärt die Grundbegriffe für Client und Server. Die Konfiguration im Einzelnen beschreiben die Abschnitte Benutzer anmelden der Seite „Clients absichern“ sowie Benutzer anmelden und Rollen der Seite „Server absichern“.
Benutzeridentitäten
Eine Clientanwendung wird stets von einem bestimmten Benutzer bedient, der über sie mit dem Server arbeitet. Je nach Konfiguration fordert ein Server vom Client zusätzlich Informationen über die Identität dieses Benutzers an. OPC UA kennt dafür die folgenden Arten von Benutzeridentitäten:
| Identität | Im Client | Im Server |
|---|---|---|
| Anonym | Standard, keine Angabe nötig | Zugriffskontrollliste AnonymousAcl; aktiv, solange keine andere Zugriffskontrollliste aktiv ist |
| Benutzername und Passwort | Klasse Opc | Zugriffskontrollliste UserNameAcl |
| Zertifikat | Klasse Opc, mit privatem Schlüssel | Zugriffskontrollliste CertificateAcl, Vergleich über den Fingerabdruck (engl. thumbprint) |
| Ausgestelltes Token (engl. issued token) | Zugriffskontrollliste IssuedTokenAcl; prüft ausschließlich Kerberos-Tickets und nur, wenn der Server unter .NET Framework läuft |
Ein Zertifikat dient also nicht nur Client- und Serveranwendungen als Personalausweis, sondern kann auch einen Benutzer identifizieren. Wie gründlich ein Server das Zertifikat eines Benutzers auf Gültigkeit, Echtheit und Vertrauenswürdigkeit prüft, hängt vom jeweiligen Server ab. Der Server des SDK prüft, ob der Fingerabdruck in seiner Zugriffskontrollliste für zertifikatbasierte Benutzeridentitäten steht. Wenn für diese Zugriffskontrollliste ein Validator konfiguriert ist (Eigenschaft OpcServer.Security.CertificateAcl.CertificateValidator), prüft der Server das Zertifikat zuvor zusätzlich mit diesem.
Anmeldung im Client
Der Client legt die Identität des Benutzers über die Eigenschaft OpcClient.Security.UserIdentity fest. Wenn der Server eine anonyme Benutzeridentität unterstützt, müssen Sie keine Identität festlegen. Der Zugriff über eine anonyme Identität ist aber meist eingeschränkt. Eine konkrete Identität kann dem Client dagegen den Zugriff auf sensiblere Daten ermöglichen.
Das Passwort einer Benutzername-Passwort-Identität verschlüsselt der Client mit dem Zertifikat des Servers, sofern der Server für seine Benutzer-Token eine Sicherheitsstrategie angibt. Melden Sie Benutzer trotzdem nur über Endpunkte mit dem Modus SignAndEncrypt an und nehmen Sie unbekannte Serverzertifikate dabei nicht automatisch an. Die Gründe und die Beispiele beschreibt der Abschnitt Benutzer anmelden.
Prüfung im Server
Ein Server erlaubt standardmäßig auch Zugriffe ohne Angabe einer konkreten Benutzeridentität (anonyme Authentifizierung). Wenn ein Client eine Benutzeridentität angibt, muss der Server diese Identität kennen. Dazu konfigurieren und aktivieren Sie die passenden Zugriffskontrolllisten (engl. Access Control List, ACL). Sobald eine andere Zugriffskontrollliste aktiv ist, ist der anonyme Zugriff automatisch abgeschaltet.
Jeder Eintrag einer Zugriffskontrollliste steht für einen Benutzer. Auf dem Eintrag legen Sie fest, welche Operationen der Benutzer ausführen darf und über welche Endpunkte er sich anmelden darf. Wie der Server erteilte und entzogene Operationen auswertet, bestimmt der Zugriffskontrollmodus. Die Zugriffskontrolllisten des SDK verwenden standardmäßig den Modus Whitelist: Ein Eintrag darf alle Operationen, die ihm nicht ausdrücklich entzogen wurden. Die Modi und die Beispiele beschreiben die Abschnitte Benutzer anmelden und Zugriffskontrollmodi.
Rollen
OPC UA definiert Standardrollen, denen die Benutzer eines Servers angehören können, zum Beispiel Observer, Operator, Engineer und SecurityAdmin. Anonyme Benutzer ordnet der Server automatisch der Rolle Anonymous zu, alle über eine Zugriffskontrollliste angemeldeten Benutzer der Rolle AuthenticatedUser. Weitere Rollen ordnen Sie einem Zugriffskontrolleintrag zu. Alle Rollen mit ihren Rechten und die Methoden dazu beschreibt der Abschnitt Rollen.
Eine Sitzung je Benutzer
Beteiligte TypenOpcServerOpcAccessControlEntryOpcSession
Ein Benutzer soll sich je Zugriffskontrolleintrag (engl. Access Control Entry, ACE), also je definiertem Benutzer im OPC UA Server, nur einmal verbinden können. Eine neue Verbindung soll erst wieder möglich sein, wenn die aktive Verbindung getrennt wurde. Dazu muss der Server die verfügbaren Endpunkte für den Benutzer blockieren, solange eine Sitzung des Benutzers aktiv ist. So kann das aussehen:
server.SessionActivated += (sender, e) => {
var identityEntry = GetUserEntry(server.Security, e.Session);
if (identityEntry != null)
identityEntry.Disable(OpcEndpointIdentity.GetCurrent());
};
server.SessionClosing += (sender, e) => {
var identityEntry = GetUserEntry(server.Security, e.Session);
if (identityEntry != null)
identityEntry.Enable(OpcEndpointIdentity.GetCurrent());
};
private static OpcAccessControlEntry GetUserEntry(
OpcServerSecurity security,
OpcSession session)
{
var identity = session.UsedIdentity;
// In case of anonymous.
if (identity == null)
return null;
return (from userEntry in security.UserNameAcl.Entries
let userPrincipal = userEntry.Principal
let userIdentity = (OpcUserIdentity)userPrincipal.Identity
where userIdentity.DisplayName == identity.DisplayName
select userEntry).FirstOrDefault();
}AddHandler server.SessionActivated, _
Sub(sender, e)
Dim identityEntry = GetUserEntry(server.Security, e.Session)
If identityEntry IsNot Nothing Then identityEntry.Disable(OpcEndpointIdentity.GetCurrent())
End Sub
AddHandler server.SessionClosing, _
Sub(sender, e)
Dim identityEntry = GetUserEntry(server.Security, e.Session)
If identityEntry IsNot Nothing Then identityEntry.Enable(OpcEndpointIdentity.GetCurrent())
End Sub
Private Shared Function GetUserEntry( _
ByVal security As OpcServerSecurity, _
ByVal session As OpcSession) As OpcAccessControlEntry
Dim identity = session.UsedIdentity
'In case of anonymous.
If identity Is Nothing Then Return Nothing
Return (From userEntry In security.UserNameAcl.Entries _
Let userPrincipal = userEntry.Principal _
Let userIdentity = CType(userPrincipal.Identity, OpcUserIdentity) _
Where userIdentity.DisplayName = identity.DisplayName _
Select userEntry).FirstOrDefault()
End Function
