2009-09-23 12 views
10

Jak ukryć poufne informacje przed przechodzeniem do plików dziennika? Tak, możesz świadomie zrezygnować z rejestrowania wrażliwych bitów informacji w pierwszej kolejności, ale mogą istnieć ogólne przypadki, w których ślepo logujesz komunikaty o błędach w przypadku awarii lub wiadomości śledzenia podczas badania problemu itp., A kończysz na poufnych informacjach lądujących w twoim pliki dziennika.Ukrywanie poufnych informacji w plikach dziennika

Na przykład można próbować wstawić do bazy danych rekord zamówienia zawierający numer karty kredytowej klienta. Po awarii bazy danych może być konieczne zalogowanie właśnie wykonanej instrukcji SQL. W ten sposób otrzymasz numer karty kredytowej klienta w pliku dziennika.

Czy istnieje paradygmat projektowania, który można zastosować, aby "oznaczyć" określone fragmenty informacji jako wrażliwe, aby ogólny układ rejestrowania mógł je odfiltrować?

+2

Na zalecenie, aby przenieść to pytanie serverfault.com: Nie jest to pytanie z perspektywy oprogramowania. Chcesz, aby Twoje oprogramowanie było wystarczająco inteligentne, aby pomóc użytkownikom zamaskować poufne informacje. Jest to w istocie rzeczywisty wymóg, który widziałem od prawdziwych klientów. –

+0

* jesteś -> twój (po 7 latach) –

Odpowiedz

7

Moja obecna praktyka w omawianej sprawie polega na rejestrowaniu mieszania takich poufnych informacji. To pozwala nam identyfikować zapisy dziennika, które należą do konkretnego roszczenia (na przykład konkretny numer karty kredytowej), ale nie daje nikomu uprawnień do chwytania dzienników i wykorzystywania wrażliwych informacji do ich złych celów.

Oczywiście robi to konsekwentnie z dobrymi praktykami kodowania. Zwykle rejestruję wszystkie obiekty, używając przeciążenia toString (w Javie lub .NET), które serializują wartość mieszającą dla pól oznaczonych przy użyciu atrybutu Sensitive.

Oczywiście, łańcuchy SQL są bardziej problematyczne, ale bardziej polegamy na ORM dla trwałości danych i logujemy stan systemu na różnych etapach, a następnie logujemy zapytania SQL, w związku z czym staje się on problemem.

+0

Podoba mi się pomysł przesłonięcia toSource; w ten sposób kod rejestracyjny nie musi przejmować się tym, co jest rejestrowane. Chociaż nie rozwiązuje problemu ze zrzutami pamięci, przyjmuję to jako najlepszą odpowiedź, ponieważ bezpośrednio odpowiada na oryginalne pytanie. Dzięki! –

5

Sama osobiście uważałabym pliki dziennika za poufne i zapewniam ograniczenie dostępu do nich.

+0

Prawda! Mam na myśli przypadki, w których jesteś sprzedawcą oprogramowania i proszą klientów o przesłanie plików dziennika z ich systemu w celu zdiagnozowania awarii systemu itp. Czy na kliencie powinien najpierw wyczyścić swoje pliki dziennika? Wrażliwa informacja? Czy nie byłoby miło, gdyby twój system miał sposób, aby klienci mogli to dostać za darmo? –

+0

"Ograniczanie dostępu" nie jest wystarczająco szczegółowe, aby zapewnić wystarczającą ochronę danych karty kredytowej. Dzienniki muszą być zaszyfrowane, a dostęp do kluczy odszyfrowywania musi być zapisany w polityce bezpieczeństwa. – erickson

1

W twoim przykładzie powinieneś szyfrować numer karty kredytowej lub, jeszcze lepiej, nawet nie przechowywać go w pierwszej kolejności.

Jeśli, na przykład, rejestrowałeś coś innego, np. Login, możesz jawnie zamienić hasło na *****.

Jednak to udaje się starannie uniknąć odpowiedzi na postawione pytanie. Ogólnie rzecz biorąc, przy przetwarzaniu poufnych informacji, powinien być zaszyfrowany w drodze do dowolnej formy trwałego przechowywania, czy to pliku bazy danych, czy pliku dziennika. Załóżmy, że Bad Guy również będzie w stanie dostać się w swoje ręce i odpowiednio zabezpieczyć informacje.

+0

Myślę, że szyfrowanie może być odpowiedzią: gdy tylko poufne informacje wejdą do twojego systemu, zostaną zaszyfrowane i będą szyfrowane. Tak więc, jeśli logujesz się na niskim poziomie (agnostyk semantyczny) lub nawet robisz zrzut pamięci, informacje będą rozsądnie bezpieczne. Myślę, że podoba mi się pomysł szyfrowania informacji zamiast całego pliku dziennika, co sugerują inne odpowiedzi. –

1

Jeśli wiesz, co próbujesz filtrować, możesz uruchomić zapisywanie danych wyjściowych za pomocą wyrażeń czyszczących Regex, zanim się zalogujesz.

+0

Tak, myślałem o tym. W rzeczywistości może to być realne rozwiązanie, ponieważ zawsze znajdzie się dyskretna liczba różnych typów "wrażliwych" łańcuchów, które można zidentyfikować w wyrażeniach regularnych. –

2

Logowanie numeru karty kredytowej może być naruszeniem PCI. A jeśli nie jesteś zgodny z PCI, zostaniesz obciążony wyższymi opłatami za przetwarzanie kart. Albo nie rejestruj wrażliwych informacji, ani nie szyfruj wszystkich plików dziennika.

Twój pomysł "oznaczania" poufnych informacji jest intrygujący. Możesz mieć specjalny typ danych dla informacji Sensitive, który zawijał prawdziwy, bazowy typ danych. Kiedy ten obiekt jest renderowany jako ciąg znaków, po prostu zwraca "***" lub cokolwiek innego.

Może to jednak wymagać szeroko zakrojonych zmian w kodowaniu i wymaga takiego poziomu czujności, jaki jest potrzebny do uniknięcia rejestrowania poufnych informacji.

1

Jeśli chodzi o instrukcje SQL, jeśli twój język je obsługuje, powinieneś używać parametrów zamiast umieszczać wartości w samej instrukcji. Innymi słowy:

select * from customers where credit_card = ? 

Następnie ustaw parametr na numer karty kredytowej.

Oczywiście, jeśli planujesz logować instrukcje SQL z wypełnionymi parametrami, potrzebujesz innego sposobu odfiltrowania poufnych danych.

+0

Prawda. Ale obejmuje to tylko instrukcje SQL. –

+0

Dlatego poprzedzałem go słowem "Dotyczy konkretnie instrukcji SQL". To nie miało być w 100% ogólne. –

+0

Noted. Szukałem raczej rozwiązania z srebrną kulą zamiast analizy pojedynczych przypadków, ale dziękuję za tę odpowiedź! –

0

Skorzystaj z tego narzędzia, stworzonego właśnie dla tego przypadku użycia.

Jeśli chcesz zamaskować tylko wybrane pole, podczas rejestrowania i zachowaj inne wartości pola bez zmian. możesz spróbować tego.

https://github.com/senthilaru/sp-util

<dependency> 
    <groupId>com.immibytes</groupId> 
    <artifactId>sp-utils</artifactId> 
    <version>1.0.0-RELEASE</version> 
</dependency>