Seccomp
Podstawowe informacje
Seccomp, co oznacza tryb bezpiecznego obliczania, to funkcja bezpieczeństwa jądra Linuxa, która filtruje wywołania systemowe. Ogranicza procesy do ograniczonego zestawu wywołań systemowych (exit()
, sigreturn()
, read()
i write()
) dla już otwartych deskryptorów plików. Jeśli proces próbuje wywołać coś innego, zostaje zakończony przez jądro za pomocą sygnałów SIGKILL lub SIGSYS. Ten mechanizm nie wirtualizuje zasobów, ale izoluje proces od nich.
Istnieją dwie metody aktywacji seccomp: za pomocą wywołania systemowego prctl(2)
z PR_SET_SECCOMP
lub dla jąder Linuxa w wersji 3.17 i nowszych, za pomocą wywołania systemowego seccomp(2)
. Starsza metoda aktywacji seccomp poprzez zapis do /proc/self/seccomp
została zastąpiona przez prctl()
.
Rozszerzenie seccomp-bpf dodaje możliwość filtrowania wywołań systemowych za pomocą konfigurowalnej polityki, używając reguł Berkeley Packet Filter (BPF). To rozszerzenie jest wykorzystywane przez oprogramowanie takie jak OpenSSH, vsftpd i przeglądarki Chrome/Chromium w systemach Chrome OS i Linux do elastycznego i wydajnego filtrowania wywołań systemowych, oferując alternatywę dla nieobsługiwanego już systrace dla Linuxa.
Tryb oryginalny/ścisły
W tym trybie Seccomp pozwala tylko na wywołania systemowe exit()
, sigreturn()
, read()
i write()
dla już otwartych deskryptorów plików. Jeśli zostanie wykonane jakiekolwiek inne wywołanie systemowe, proces zostaje zabity za pomocą sygnału SIGKILL.
Seccomp-bpf
Ten tryb umożliwia filtrowanie wywołań systemowych za pomocą konfigurowalnej polityki zaimplementowanej przy użyciu reguł Berkeley Packet Filter.
Seccomp w Dockerze
Seccomp-bpf jest obsługiwany przez Docker w celu ograniczenia syscalls z kontenerów, co skutecznie zmniejsza powierzchnię ataku. Możesz znaleźć zablokowane syscalls domyślnie w https://docs.docker.com/engine/security/seccomp/ a domyślny profil seccomp można znaleźć tutaj https://github.com/moby/moby/blob/master/profiles/seccomp/default.json. Możesz uruchomić kontener Docker z inną polityką seccomp za pomocą:
Jeśli chcesz na przykład zabronić kontenerowi wykonywania niektórych syscalli, takich jak uname
, możesz pobrać domyślny profil ze strony https://github.com/moby/moby/blob/master/profiles/seccomp/default.json i po prostu usunąć ciąg uname
z listy.
Jeśli chcesz upewnić się, że jakiś plik binarny nie działa wewnątrz kontenera Docker, możesz użyć narzędzia strace, aby wyświetlić listę syscalli, których używa ten plik binarny, a następnie je zabronić.
W poniższym przykładzie odkrywane są syscalli dla uname
:
Jeśli używasz Dockera tylko do uruchomienia aplikacji, możesz profilować go za pomocą strace
i pozwolić tylko na wywołania systemowe, których potrzebuje.
Przykładowa polityka Seccomp
Aby zilustrować funkcję Seccomp, stwórzmy profil Seccomp, który wyłącza wywołanie systemowe "chmod" jak poniżej.
W powyższym profilu ustawiliśmy domyślną akcję na "allow" i utworzyliśmy czarną listę, aby wyłączyć "chmod". Aby być bardziej bezpiecznym, możemy ustawić domyślną akcję na "drop" i utworzyć białą listę, aby selektywnie włączać wywołania systemowe. Poniższy wynik pokazuje, że wywołanie "chmod" zwraca błąd, ponieważ jest wyłączone w profilu seccomp.
Poniższy wynik pokazuje "docker inspect" wyświetlający profil:
Wyłącz to w Dockerze
Uruchom kontener z flagą: --security-opt seccomp=unconfined
Od wersji Kubernetes 1.19, seccomp jest domyślnie włączony dla wszystkich Podów. Jednak domyślny profil seccomp stosowany do Podów to profil "RuntimeDefault", który jest dostarczany przez kontenerowy runtime (np. Docker, containerd). Profil "RuntimeDefault" pozwala na większość wywołań systemowych, blokując jednocześnie kilka, które są uważane za niebezpieczne lub ogólnie nie wymagane przez kontenery.
Last updated