Absicherung der Access-Schnittstelle nach außen über IP, User und Zeitsperren

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:

benutzergueltig_vongueltig_bisaktivip_erwartet
SCHMIDT2025-05-012025-06-30 23:59Ja192.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.

Kategorien:

Schlagwörter:

Keine Antworten

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert