Я хочу создать образ 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
, так как это может быть перезаписано обновлениями системного пакета. Однако, поскольку образ контейнера неизменяем, это здесь не применимо.
Проблема в том, что в самом контейнере 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