[英]Running tcpdump inside a Docker container as non-root user
我想構建一個包含 tcpdump 的 Docker 圖像。 那個 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
的權限和組所有權,因為這可能會被系統 package 升級覆蓋。 但是,由於容器鏡像是不可變的,所以這里不適用。
問題是 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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.