Docker에서 lsof를 교체하는 방법(LXC 기반이 아닌 기본)

Docker에서 lsof를 교체하는 방법(LXC 기반이 아닌 기본)

제가 조금 혼란스러워하는 점은 lsof -iDocker 컨테이너 내부에서는 출력이 생성되지 않는다는 것입니다.

예(컨테이너 내부의 모든 명령/출력):

[1] root@ec016481cf5f:/# lsof -i
[1] root@ec016481cf5f:/# netstat -tulpn
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      -
tcp6       0      0 :::22                   :::*                    LISTEN      -

또한 PID나 프로그램 이름이 어떻게 표시되지 않는지 확인하십시오 netstat. fuser또한 혼란스러운 출력을 제공했으며 PID도 정확히 찾아낼 수 없었습니다.

누구든지 이것에 대해 밝힐 수 있습니까?

  • 어떻게 대체할 수 있습니까 lsof -i(보기 위해)프로세스 이름게다가! )
  • 왜 출력 netstat도 깨졌나요?

알아채다:컨테이너 런타임은 "ExecDriver": "native-0.1"LXC 대신 Docker의 자체 실행 계층을 사용합니다.


[1] root@ec016481cf5f:/# fuser -a4n tcp 22
Cannot stat file /proc/1/fd/0: Permission denied
Cannot stat file /proc/1/fd/1: Permission denied
Cannot stat file /proc/1/fd/2: Permission denied
Cannot stat file /proc/1/fd/3: Permission denied
Cannot stat file /proc/1/fd/255: Permission denied
Cannot stat file /proc/6377/fd/0: Permission denied
Cannot stat file /proc/6377/fd/1: Permission denied
Cannot stat file /proc/6377/fd/2: Permission denied
Cannot stat file /proc/6377/fd/3: Permission denied
Cannot stat file /proc/6377/fd/4: Permission denied
22/tcp:

(나는 숫자이기 때문에 그것에 집착하지 않습니다 Permission denied. 나를 혼란스럽게 하는 것은 끝에 있는 빈 PID 목록입니다 22/tcp.)


# lsof|awk '$1 ~ /^sshd/ && $3 ~ /root/ {print}'
sshd    6377      root  cwd   unknown                        /proc/6377/cwd (readlink: Permission denied)
sshd    6377      root  rtd   unknown                        /proc/6377/root (readlink: Permission denied)
sshd    6377      root  txt   unknown                        /proc/6377/exe (readlink: Permission denied)
sshd    6377      root    0   unknown                        /proc/6377/fd/0 (readlink: Permission denied)
sshd    6377      root    1   unknown                        /proc/6377/fd/1 (readlink: Permission denied)
sshd    6377      root    2   unknown                        /proc/6377/fd/2 (readlink: Permission denied)
sshd    6377      root    3   unknown                        /proc/6377/fd/3 (readlink: Permission denied)
sshd    6377      root    4   unknown                        /proc/6377/fd/4 (readlink: Permission denied)
sshd    6442      root  cwd   unknown                        /proc/6442/cwd (readlink: Permission denied)
sshd    6442      root  rtd   unknown                        /proc/6442/root (readlink: Permission denied)
sshd    6442      root  txt   unknown                        /proc/6442/exe (readlink: Permission denied)
sshd    6442      root    0   unknown                        /proc/6442/fd/0 (readlink: Permission denied)
sshd    6442      root    1   unknown                        /proc/6442/fd/1 (readlink: Permission denied)
sshd    6442      root    2   unknown                        /proc/6442/fd/2 (readlink: Permission denied)
sshd    6442      root    3   unknown                        /proc/6442/fd/3 (readlink: Permission denied)
sshd    6442      root    4   unknown                        /proc/6442/fd/4 (readlink: Permission denied)
sshd    6442      root    5   unknown                        /proc/6442/fd/5 (readlink: Permission denied)

연결된 사용자로부터 일부 출력이 있는데, 이 역시 정확하게 식별되지만 그게 전부입니다. lsof -i특정 "객체"(인터넷 소켓에만 해당)의 유형을 말하는 것은 분명히 불가능합니다 .

답변1

(참고: 질문자가 어떻게 도커 컨테이너에 들어왔는지는 질문에서 명확하지 않습니다.가설 docker exec -it CONTAINER bash사용되었습니다. )

centos:7docker 버전을 기반으로 한 docker 이미지를 사용할 때 이 문제가 발생했습니다. 1.9.0이 문제를 극복하기 위해 방금 실행했습니다.

docker exec --privileged -it CONTAINER bash

포함되어 있으니 주의하시기 바랍니다 --privileged.

이것이 필요한 이유에 대한 나의 순진한 이해: docker는 컨테이너를 더 "안전하게" 만들기 위해 노력하는 것 같습니다.여기에 녹음하세요.

답변2

하하, 줄거리가 점점 더 풍성해지고 있어요. 더 나은 답변이 있는 경우 적어주시면 수용 가능하다면 수락하겠습니다. 그러나 이것이 분명한 이유이다. 내가 얼마나 부주의했는지, 로그 파일을 무시했는지주인:

Jun 12 01:29:46 hostmachine kernel: [140235.718807] audit_printk_skb: 183 callbacks suppressed
Jun 12 01:29:46 hostmachine kernel: [140235.718810] type=1400 audit(1402536586.521:477): apparmor="DENIED" operation="ptrace" profile="docker-default" pid=3782 comm="lsof" requested_mask="trace" denied_mask="trace" peer="docker-default"
Jun 12 01:29:46 hostmachine kernel: [140235.718860] type=1400 audit(1402536586.521:478): apparmor="DENIED" operation="ptrace" profile="docker-default" pid=3782 comm="lsof" requested_mask="read" denied_mask="read" peer="docker-default"
Jun 12 01:29:46 hostmachine kernel: [140235.718886] type=1400 audit(1402536586.521:479): apparmor="DENIED" operation="ptrace" profile="docker-default" pid=3782 comm="lsof" requested_mask="read" denied_mask="read" peer="docker-default"
Jun 12 01:29:46 hostmachine kernel: [140235.718899] type=1400 audit(1402536586.521:480): apparmor="DENIED" operation="ptrace" profile="docker-default" pid=3782 comm="lsof" requested_mask="read" denied_mask="read" peer="docker-default"
Jun 12 01:29:46 hostmachine kernel: [140235.718921] type=1400 audit(1402536586.521:481): apparmor="DENIED" operation="ptrace" profile="docker-default" pid=3782 comm="lsof" requested_mask="read" denied_mask="read" peer="docker-default"
Jun 12 01:29:46 hostmachine kernel: [140235.718954] type=1400 audit(1402536586.521:482): apparmor="DENIED" operation="ptrace" profile="docker-default" pid=3782 comm="lsof" requested_mask="read" denied_mask="read" peer="docker-default"
Jun 12 01:29:46 hostmachine kernel: [140235.719001] type=1400 audit(1402536586.521:483): apparmor="DENIED" operation="ptrace" profile="docker-default" pid=3782 comm="lsof" requested_mask="read" denied_mask="read" peer="docker-default"
Jun 12 01:29:46 hostmachine kernel: [140235.719043] type=1400 audit(1402536586.521:484): apparmor="DENIED" operation="ptrace" profile="docker-default" pid=3782 comm="lsof" requested_mask="read" denied_mask="read" peer="docker-default"
Jun 12 01:29:46 hostmachine kernel: [140235.719086] type=1400 audit(1402536586.521:485): apparmor="DENIED" operation="ptrace" profile="docker-default" pid=3782 comm="lsof" requested_mask="read" denied_mask="read" peer="docker-default"
Jun 12 01:29:46 hostmachine kernel: [140235.719126] type=1400 audit(1402536586.521:486): apparmor="DENIED" operation="ptrace" profile="docker-default" pid=3782 comm="lsof" requested_mask="read" denied_mask="read" peer="docker-default"

따라서 의류가 범인인 것 같습니다. 호스트/컨테이너의 보안을 손상시키지 않고 이를 허용하도록 설득하는 방법을 알아내거나 보안을 손상시키지 않고 가능한지 확인해야 합니다.

답변3

이번에는 더욱 세분화된 보안 설정을 사용하는 또 다른 가능성이 있습니다. Docker 컨테이너에 SYS_PTRACE 권한을 부여하세요.

docker run --cap-add=SYS_PTRACE ...

답변4

나는 또한이 문제를 발견했습니다. 비활성화한 apparmor후 문제가 사라졌습니다 docker.

$ sudo aa-complain <docker apparmor profile name, "docker-default" on ubuntu>

참조 URL:https://help.ubuntu.com/community/AppArmor

관련 정보