Запуск tcpdump внутри контейнера Docker от имени пользователя без полномочий root

Я хочу создать образ Docker, содержащий tcpdump. Этот образ Docker запускает приложение, которое должно вызывать tcpdump, но оно не должно работать как root все время по очевидным причинам безопасности. Вместо этого пользователь без полномочий root должен иметь возможность запускать tcpdump напрямую.

Предполагая следующий Dockerfile:

FROM debian:bullseye

ENV DEBIAN_FRONTEND noninteractive

RUN apt-get update -qq \
  && apt-get install -y \
  libcap2 \
  libcap2-bin \
  tcpdump \
  && apt-get clean -y && apt-get autoremove -y \
  && rm -rf /var/lib/apt/lists/*

RUN addgroup --system --gid 1001 user
RUN adduser --system --uid 1001 user --shell /bin/bash

RUN groupadd pcap && usermod -a -G pcap user \
  && chgrp pcap /usr/bin/tcpdump \
  && chmod 750 /usr/bin/tcpdump \
  && setcap cap_net_raw,cap_net_admin=eip /usr/bin/tcpdump

USER user

ENTRYPOINT ["/usr/bin/tcpdump"]

Когда я запускаю образ:

docker build -t tcpdump:latest .
docker run --rm -it tcpdump

… он терпит неудачу с:

exec /usr/bin/tcpdump: операция не разрешена

Кто-то еще поднимал этот вопрос здесь, но без ответа.

Что я могу сделать, чтобы это сработало?


Обратите внимание, что при обычной установке не рекомендуется изменять разрешения и групповое владение /usr/bin/tcpdump, так как это может быть перезаписано обновлениями системного пакета. Однако, поскольку образ контейнера неизменяем, это здесь не применимо.

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
229
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Проблема в том, что в самом контейнере Docker отсутствуют необходимые возможности для запуска tcpdump.

Вы можете добавить эти возможности, добавив параметр --privileged к команде docker run, или, что еще лучше, добавить только строго необходимые возможности:

$ docker run --rm --cap-add=NET_ADMIN --cap-add=NET_RAW  -it tcpdump
tcpdump: verbose output suppressed, use -v[v]... for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), snapshot length 262144 bytes
^C12:47:29.433403 IP6 :: > ff02::16: HBH ICMP6, multicast listener report v2, 1 group record(s), length 28

1 packet captured
6 packets received by filter
0 packets dropped by kernel

Другие вопросы по теме