Docker (lXC 기반이 아닌 기본) 내부에서 lsof를 어떻게 대체 할 수 있습니까?


16

Docker 컨테이너 내부에서 lsof -i출력을 얻지 못한다 는 다소 당황 스럽습니다 .

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

[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절름발이 의 결과물 입니까?

NB : 컨테이너는로 실행됩니다 "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특정 "객체"가 어떤 유형 ( 인터넷 소켓으로 제한 되는지)을 식별하는 것은 불가능합니다 .


lsof보고서 는 무엇입니까 ? 똑같다?
slm

@ slm : 훌륭한 문의! 비워 두지 않습니다. 대신 전체 호스트 (또한 sshd관련) 행을 표시하며 그중 일부는 TCP 소켓 일 수 있습니다 TYPE unknown. 독특한. 내 질문에 출력을 추가합니다.
0xC0000022L 1

실행 strace -s 2000 -o lsof.log lsof -i하면 차단 된 항목에 대한 추가 정보를 얻을 수 있습니다.
slm

1
@ slm : 좋은 지적입니다. 상기시켜 주셔서 감사합니다. 그래도 내일 할게요 strace컨테이너 자체에 제한이있는 것도 가능합니다 . 배울 새로운 흥미로운 것들. 수신 거부 아이디어 주셔서 감사합니다. 그래도 침대를 쳐야합니다.
0xC0000022L

참고 : netstat -lp도 손상됩니다. 그것은 분명히 의류에 의한 것입니다.
Alan Robertson

답변:


7

(참고 : 어 커가 도커 컨테이너에 어떻게 들어가는 지 확실하지 않습니다. 사용 되었다고 가정 docker exec -it CONTAINER bash 합니다.)

centos:7도커 버전 으로 도커 이미지를 사용할 때이 문제가 있었고 이것을 1.9.0극복하기 위해 방금 실행했습니다.

docker exec --privileged -it CONTAINER bash

의 포함에 유의하십시오 --privileged.

이 필요한 이유를 내 순진한 이해 :으로 고정 표시기는, 컨테이너보다 "안전"이 가지고 노력하고 있습니다 보인다 여기에 문서화 .


4

아, 음모가 두꺼워집니다. 더 나은 답변을 가진 사람이 있으면 적어 주시면 받아 들일 것입니다. 그러나 여기 명백한 이유가 있습니다. 어떻게 부주의 나의의 로그 파일을 무시하는 호스트 :

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"

따라서 호스트 / 컨테이너 보안을 손상시키지 않고이를 허용하거나 보안을 손상시키지 않으면 서 가능한지 여부를 확인하는 방법을 알아 내야 할지라도, Apparmor는 범인으로 보입니다.



3

또 다른 가능성은 이번에보다 세밀한 보안 설정으로 도커 컨테이너에 SYS_PTRACE 권한을 부여하는 것입니다.

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

1
누군가 왜 lsof필요한지 궁금해하는 경우 CAP_SYS_PTRACE: 읽어야 /proc/*/stat합니다. ptrace (2)
David Röthlisberger

2

나는이 문제도 발견했다. 내가 비활성화 한 후에 문제가 발생 apparmor했습니다 docker.

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

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


3
이 답변에 더 많은 설명을 추가하는 것을 고려할 수도 있습니다 (예를 들어 aa-complain, 기능 또는이 솔루션을 지원하는 일부 문서).
HalosGhost

@HalosGhost 죄송합니다,에 익숙하지 않습니다. 방금 Google에 검색 apparmor하여 사용 중지하는 방법을 찾았습니다. 다시 말해, 왜 그것이 작동하는지 또는 왜 작동하지 않는지 모르겠습니다. 호스트 OS는 Ubuntu 14.04이므로 "ubuntu apparmor"를 검색하고 help.ubuntu.com/community/AppArmor를 찾았 습니다 . 이것이 도움이 되길 바랍니다.
menghan

2
이 문제가 없습니다. 내 관심사는 답변의 품질과 OP에 얼마나 도움이되고 유익한 지에 대한 것이 었습니다.
HalosGhost

@HalosGhost 도와 주셔서 감사합니다. 제 답변을 다시 작성해주세요.
menghan

우분투 14.04에서 명령은 sudo aa-complain /etc/apparmor.d/docker입니다. 기본적으로 도커 프로세스에 앱 아머를 비활성화하여도 커가 시스템의 모든 파일을 읽을 수 있음을 의미합니다. 이전에는 프로파일에서 허용 된 파일로만 작업 할 수있었습니다. 더 나은 솔루션은 / proc / pid / fd 파일에 대한 액세스를 허용하는 앱 아머 규칙을 변경하는 것입니다.
Martins Balodis
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.