Śledzenie dostępu do danych w systemach Linux i macOS

pobierz sterownika ODBC

Ten artykuł pokazuje, jak skonfigurować śledzenie menedżera sterowników unixODBC w systemach Linux i macOS. Śledzenie rejestruje wywołania API ODBC, które wykonujesz przez Driver Manager. Nie śledzi wewnętrznych zdarzeń sterownika Microsoft ODBC. Informacje o różnicy między rekordami diagnostycznymi a warstwami śledzenia znajdują się w diagnostyce ODBC.

Sekcja [ODBC] w odbcinst.ini kontroluje śledzenie dla aplikacji korzystających z konfiguracji systemu unixODBC. Ustaw Trace=Yes i określ ścieżkę bezwzględną dla TraceFile:

[ODBC]
Trace=Yes
TracePid=No
TraceFile=/home/myappuser/odbc-trace.ABC123/odbc.log

Ścieżka jest ilustracyjna; użyj prywatnej ścieżki absolutnej wygenerowanej w następującej procedurze.

Zachowaj w tym pliku wpisy rejestracji sterownika, których wymaga Twoja aplikacja odbcinst.ini. Sekcja [ODBC] jest globalna dla całej konfiguracji. Dodanie Trace=Yes do sekcji specyficznej dla sterownika nie ogranicza śledzenia Driver Manager unixODBC do tego sterownika.

Domyślna ścieżka pliku śledzenia nie jest ograniczona do kontekstu Twojej aplikacji. Zamiast tego użyj prywatnego katalogu i wyraźnej ścieżki do pliku śledzenia. Śledzenie może wpływać na wydajność, a wyjście może zawierać dane aplikacji. Ogranicz dostęp do pliku i przechwytuj tylko te wywołania, których potrzebujesz.

Użyj wersji unixODBC, która zawiera poprawkę bufora śledzenia diagnostycznego w projekcie źródłowym. Pakiety dostawców mogą zawierać backport; sprawdź poprawki pakietu zamiast polegać wyłącznie na numerze wersji. Bez tej poprawki aplikacja może zostać przerwana w SQLGetDiagRec, podczas gdy menedżer formatuje natywny błąd do śledzenia.

Uruchom aplikację Trace One

Otwórz dedykowaną powłokę Bash, a następnie wykonaj polecenia powłoki opisane w tej procedurze w tej samej sesji terminala. Pierwsze polecenie włącza mechanizm szybkiego przerywania przy błędzie, więc nieudane utworzenie katalogu, zmiana uprawnień lub skopiowanie konfiguracji powodują zatrzymanie procesu przed uruchomieniem aplikacji. Pozostaw powłokę otwartą na późniejsze etapy i wpisz exit po czyszczeniu.

  1. Uruchom odbcinst -j i zanotuj ścieżki do plików sterownika systemowego i systemowego źródła danych. Utwórz prywatne katalogi konfiguracji i śledzenia, a następnie skopiuj pliki konfiguracyjne systemu. Zamień przykładowe ścieżki plików na te wyświetlane w systemie:

    set -eu
    config_dir=$(mktemp -d "$HOME/odbc-trace-config.XXXXXX")
    trace_dir=$(mktemp -d "$HOME/odbc-trace.XXXXXX")
    if [ "$(printf '%s' "$trace_dir/odbc.log" | wc -c)" -gt 62 ]; then
        printf 'Use a shorter parent path for the trace directory (log path exceeds 62 bytes).\n' >&2
        rmdir "$trace_dir" "$config_dir"
        exit 1
    fi
    driver_file=/etc/odbcinst.ini
    data_sources_file=/etc/odbc.ini
    chmod 700 "$config_dir" "$trace_dir"
    cp "$driver_file" "$config_dir/odbcinst.ini"
    if [ -f "$data_sources_file" ]; then
        cp "$data_sources_file" "$config_dir/odbc.ini"
    else
        printf '[ODBC Data Sources]\n' > "$config_dir/odbc.ini"
    fi
    chmod 600 "$config_dir/odbcinst.ini" "$config_dir/odbc.ini"
    printf '%s\n' "$trace_dir/odbc.log"
    

    Przypięta implementacja konfiguracji śledzenia unixODBC dostarcza 64-bajtowy bufor do czytnika profilu rejestracyjnego. Ten czytnik bezpiecznie kopiuje ścieżkę o długości do 62 bajtów oraz jej terminator null. Dla dłuższych ścieżek gałąź obsługująca obcinanie nie dodaje terminatora zerowego. Sprawdzenia z unixODBC 2.3.14 na Linuksie i macOS potwierdziły poprawne tworzenie śladu przy rozmiarze 62 bajtów. Strażnik liczy bajty i zatrzymuje się przed startem, jeśli wygenerowana ścieżka jest zbyt długa. Jeśli się zatrzyma, użyj krótszej ścieżki nadrzędnej z prawem zapisu w poleceniu trace_dir, zachowaj mktemp -d i zrestartuj procedurę.

    Zachowaj wszystkie wpisy rejestru sterownika, których wymaga aplikacja, w kopii odbcinst.ini. Jeśli aplikacja używa nazwy źródła danych systemowych (DSN), zachowaj jej definicję w skopiowanym odbc.ini. Jeśli jego Driver wartość jest nazwą wpisu rejestru, zachowaj tę dopasowaną definicję w skopiowanym odbcinst.ini. Jeśli wartość to absolutna ścieżka biblioteki, potwierdź, że biblioteka istnieje i jest dostępna na tej ścieżce. W przypiętej wersji unixODBC jako ścieżka biblioteki używa się wartości zaczynającej się od /; pozostałe wartości są rozwiązywane przez rejestrację sterownika. Więcej informacji można znaleźć w podręczniku odbc.ini programu unixODBC oraz w przypiętej implementacji wyszukiwania sterowników. Polecenia pozostawiają konfigurację DSN użytkownika bez zmian.

  2. W prywatnym odbcinst.ini, dodaj lub zaktualizuj sekcję globalną [ODBC] . Użyj absolutnej ścieżki wydrukowanej przez poprzednie polecenie dla TraceFile; nie tworz drugiej [ODBC] sekcji:

    [ODBC]
    Trace=Yes
    TracePid=No
    TraceFile=/home/myappuser/odbc-trace.ABC123/odbc.log
    

    Zastąp przykładową ścieżkę dokładnie tą ścieżką wydrukowaną w poprzednim kroku. Ustaw TracePid=No nawet jeśli skopiowana konfiguracja to umożliwia, tak aby ślad używał pojedynczego pliku pokazanego tutaj.

  3. Uruchom aplikację z prywatnym katalogiem konfiguracji systemu:

    if (umask 077; ODBCSYSINI="$config_dir" ODBCINSTINI=odbcinst.ini \
        ODBCSEARCH=ODBC_BOTH_DSN ./your-app); then
        :
    else
        app_status=$?
        printf 'Application exited with status %s\n' "$app_status" >&2
    fi
    

    Plik śledzenia powinien zawierać wywołania API ODBC oraz ich kody zwrotne. Instrukcja warunkowa utrzymuje powłokę otwartą do sprzątania, nawet jeśli aplikacja zakończy się błędem. Menedżer sterowników unixODBC odczytuje katalog konfiguracji systemu z ODBCSYSINI. Ustaw ODBCINSTINI=odbcinst.ini dla tego procesu potomnego, aby dziedziczone nadpisanie nazwy pliku rejestracji nie omijało skopiowanego pliku. Informacje o wyszukiwaniu nazwy pliku znajdziesz w przypiętej implementacji konfiguracji unixODBC.

    ODBCSEARCH=ODBC_BOTH_DSN nadpisuje odziedziczony tryb wyszukiwania DSN tylko dla użytkownika lub tylko dla systemu w tym uruchomieniu. Te ustawienia pozostawiają istniejący plik DSN użytkownika na miejscu. unixODBC przeszukuje zarówno pliki DSN systemowe, jak i użytkownika, a DSN użytkownika ma pierwszeństwo, gdy w obu przypadkach występuje ta sama nazwa. Sprawdź, czy istnieje zduplikowany DSN użytkownika, jeśli aplikacja wydaje się używać innych ustawień niż skopiowany systemowy DSN. Jeśli aplikacja celowo wymaga trybu ograniczonego wyszukiwania, zachowaj go zamiast tego i sprawdź, czy wybrany plik DSN zawiera wymaganą definicję. Więcej informacji można znaleźć w implementacji trybu wyszukiwania unixODBC , instrukcji isql oraz instrukcji odbc.ini.

Po zakończeniu odtwarzania wyjdź z aplikacji, aby zwolnić uchwyty środowiska ODBC. Przed kolejnym uruchomieniem ustaw Trace=No lub usuń ustawienia śledzenia [ODBC]. Ogranicz dostęp do logu przed jego inspekcją lub udostępnieniem:

if [ -f "$trace_dir/odbc.log" ]; then
    chmod 600 "$trace_dir/odbc.log"
else
    printf 'No trace file was created. Check that the application started and allocated an ODBC environment.\n' >&2
fi

Aplikacja, która nie uruchamia się lub kończy się przed przydziałem środowiska ODBC, może nie utworzyć pliku śledzenia. Kontrola zgłasza brakujący plik i pozostawia funkcję czyszczenia dostępną w dedykowanej powłoce.

Zredaguj wrażliwe treści przed udostępnieniem śladu. Usuń log, gdy już go nie potrzebujesz. Usuń prywatne pliki konfiguracyjne i katalogi tylko wtedy, gdy stworzyłeś je dla tego śladu i nie potrzebujesz już ich zawartości.

Następujące polecenia usuwają jedynie pliki i katalogi utworzone w tej procedurze:

rm -f "$trace_dir/odbc.log" "$config_dir/odbcinst.ini" "$config_dir/odbc.ini"
rmdir "$trace_dir" "$config_dir"

Znajdź pliki konfiguracyjne używane przez Driver Manager

Uruchom odbcinst -j, aby wyświetlić ścieżki konfiguracji systemu i użytkownika. Ścieżki mogą się różnić w zależności od platformy i kompilacji unixODBC. DSN użytkownika są dostępne dla konkretnego użytkownika. DSN systemowe są dostępne dla użytkowników w systemie, a ich zarządzanie może wymagać uprawnień administratora. Gdy ta sama nazwa DSN występuje w obu plikach, pierwszeństwo ma DSN użytkownika. Aby uzyskać więcej informacji, zobacz dokumentację systemu unixODBC.