簡體   English   中英

以非 root 用戶身份在 Docker 容器內運行 tcpdump

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM