Warum ich das überhaupt mache
Access-Frontends, die mit Webdiensten oder SQL-Servern kommunizieren, sind oft schmerzhaft offen.
Aber: Ich will keine vollwertige Authentifizierungsplattform bauen.
Ich will einfache Regeln.
Wer darf, wann, von wo.
Also: IP-Check, Benutzerkennung, Zeitfenster.
Direkt in VBA und im Backend.
1. IP-Adressen filtern (Client-seitig)
In VBA kannst Du die IP des Rechners ermitteln und mit einer Whitelist abgleichen.
IP holen (funktioniert meistens intern)
Function HoleIP() As String
Dim wmi As Object, obj As Object
Set wmi = GetObject("winmgmts:\\.\root\cimv2")
For Each obj In wmi.ExecQuery("Select * from Win32_NetworkAdapterConfiguration where IPEnabled=TRUE")
If Not IsNULL(obj.IPAddress) Then
HoleIP = obj.IPAddress(0)
Exit Function
End If
Next
End Function
Prüfung gegen einfache Whitelist
Function CheckIP() As Boolean
Dim erlaubteIPs As Variant
erlaubteIPs = Array("192.168.1.100", "192.168.1.101")
Dim ip As String
ip = HoleIP()
Dim i As Integer
For i = LBound(erlaubteIPs) To UBound(erlaubteIPs)
If ip = erlaubteIPs(i) Then
CheckIP = True
Exit Function
End If
Next
MsgBox "Zugriff verweigert. Deine IP ist nicht zugelassen.", vbCritical
CheckIP = False
End Function
Am besten rufst Du CheckIP
direkt im Startformular auf und beendest die App bei Ablehnung.
2. Benutzerkonten & Zeitsperren aus zentraler Tabelle
Ich lege mir eine kleine Tabelle im Backend an:
benutzer | gueltig_von | gueltig_bis | aktiv | ip_erwartet |
---|---|---|---|---|
SCHMIDT | 2025-05-01 | 2025-06-30 23:59 | Ja | 192.168.1.100 |
Prüfung bei Login
Function CheckZugang(Benutzer As String) As Boolean
Dim rs As DAO.Recordset
Dim sql As String
sql = "SELECT * FROM zugangskontrolle WHERE benutzer = '" & Benutzer & "' AND aktiv = TRUE"
Set rs = CurrentDb.OpenRecordset(sql)
If rs.EOF Then
MsgBox "Zugang verweigert: Benutzer nicht aktiv.", vbCritical
CheckZugang = False
Exit Function
End If
Dim jetzt As Date
jetzt = Now
If jetzt < rs!gueltig_von Or jetzt > rs!gueltig_bis Then
MsgBox "Zugang verweigert: Außerhalb des Zeitfensters.", vbCritical
CheckZugang = False
Exit Function
End If
If Nz(rs!ip_erwartet, "") <> "" Then
If HoleIP() <> rs!ip_erwartet Then
MsgBox "Zugang verweigert: IP nicht erlaubt.", vbCritical
CheckZugang = False
Exit Function
End If
End If
CheckZugang = True
End Function
Aufruf z. B. im Autoexec-Modul
If Not CheckZugang(Environ("USERNAME")) Then
DoCmd.Quit
End If
3. Serverseitig absichern
Wenn Du mit einem Webdienst oder SQL Server arbeitest, kannst Du auch serverseitig filtern.
Beispiel in PHP (REST-Endpunkt)
$remote_ip = $_SERVER['REMOTE_ADDR'];
$erlaubt = ['192.168.1.100', '203.0.113.55'];
if (!in_array($remote_ip, $erlaubt)) {
http_response_code(403);
exit('IP nicht erlaubt');
}
SQL-Trigger bei INSERT aus Access
CREATE TRIGGER trg_block_unerlaubten_zugriff
ON dbo.import_tabelle
AFTER INSERT
AS
BEGIN
IF EXISTS (
SELECT * FROM inserted WHERE session_user NOT IN ('support_user', 'access_user')
)
BEGIN
RAISERROR ('Nicht autorisierter Benutzer', 16, 1)
ROLLBACK
END
END
4. Logging: Wer versucht’s trotzdem?
Leg Dir ein einfaches Audit-Log an:
Sub LogZugriffsversuch(Benutzer As String, IP As String, Erfolg As Boolean)
CurrentDb.Execute "INSERT INTO zugriffslog (zeitpunkt, benutzer, ip, erfolg) VALUES (Now(), '" & Benutzer & "', '" & IP & "', " & Erfolg & ")"
End Sub
Ich nutze das später, um bruteforce-artige Zugriffe zu erkennen oder IP-Ranges zu blocken.
Access ist kein Sicherheitswunder.
Aber mit IP-Check, Benutzerliste und Zeitsperren kannst Du schon viel verhindern.
Gerade wenn Webdienste oder Cloudsysteme angebunden sind, brauchst Du sowas.
Keine Antworten