이것은 su
와 sudo
매우 이상하고 종종 성가신 tty와 신호를 향한 행동을 가지고 있다는 간단한 사실에서 자란 간단한 도구입니다. 또한 설치 및 사용 (특히 sudo
의 경우)에 다소 복잡한 표현력을 많이 제공하지만 필요한 경우이 특정 응용 프로그램을이 특정 사용자로 실행하고 관로".
gosu
작동 방식의 핵심은 Docker/Libcontainer 자체가 컨테이너 내부에서 응용 프로그램을 시작하는 방식에서 직접 도난 당한다 (실제로 Libcontainer의 코드베이스에서 /etc/passwd
처리 코드를 직접 사용하고 있음).
$ gosu
Usage: ./gosu user-spec command [args]
eg: ./gosu tianon bash
./gosu nobody:root bash -c 'whoami && id'
./gosu 1000:1 id
./gosu version: 1.1 (go1.3.1 on linux/amd64; gc)
사용자/그룹이 처리되면 해당 사용자로 전환 한 다음 지정된 프로세스를 exec
하고 gosu
자체가 더 이상 상주하거나 프로세스 라이프 사이클에 관여하지 않습니다. 이것은 신호 통과 및 TTY의 모든 문제를 피하고 gosu
호출하는 프로세스와 gosu
가 속한 프로세스에 속하는 과정에 펀칭합니다.
gosu
의 핵심 사용 사례는 컨테이너 스타트 업 동안 (특히 ENTRYPOINT
에서) root
에서 불리한 사용자로 물러나 는 것입니다.
그 너머의 gosu
의 사용은 CVE-2016-2779 (Docker 사용 사례가 자연스럽게 우리를 보호하는)와 같은 취약점으로 어려움을 겪을 수 있습니다. 이 시점에 대한 논의는 tianon/gosu#37
참조하십시오.
높은 수준 단계 :
gosu-$(dpkg --print-architecture | awk -F- '{ print $NF }')
gosu
로 다운로드하십시오.gosu-$(dpkg --print-architecture | awk -F- '{ print $NF }').asc
as gosu.asc
gpg --batch --keyserver hkps://keys.openpgp.org --recv-keys B42F6819007F00F88E364FD4036A9C25BF357DD4
gpg --batch --verify gosu.asc gosu
chmod +x gosu
명백한 Dockerfile
지침은 INSTALL.md
참조하십시오.
$ docker run -it --rm ubuntu:trusty su -c ' exec ps aux '
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.0 46636 2688 ? Ss+ 02:22 0:00 su -c exec ps a
root 6 0.0 0.0 15576 2220 ? Rs 02:22 0:00 ps aux
$ docker run -it --rm ubuntu:trusty sudo ps aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 3.0 0.0 46020 3144 ? Ss+ 02:22 0:00 sudo ps aux
root 7 0.0 0.0 15576 2172 ? R+ 02:22 0:00 ps aux
$ docker run -it --rm -v $PWD /gosu-amd64:/usr/local/bin/gosu:ro ubuntu:trusty gosu root ps aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.0 7140 768 ? Rs+ 02:22 0:00 ps aux
또한 gosu
user:group
처리하기 위해 Docker의 자체 코드를 사용하고 있다는 사실 때문에 Docker 자신의 --user
플래그와 정확히 1 : 1 패리티가 있습니다.
gosu
처리하는 엣지 케이스에 대해 궁금한 점이 있다면 "테스트 스위트"의 Dockerfile.test-alpine
(및 임의의 이진을 테스트하기 위해이를 마무리하는 관련 test.sh
스크립트)을 참조하십시오.
( sudo
이 프로젝트와는 다른 목표를 가지고 있으며 sudo
교체가되지는 않습니다 . 예를 들어, sudo
단지 exec
대신 fork
+ exec
하는 이유에 대한 간단한 설명은이 스택 오버플로 답변을 참조하십시오.)
chroot
--userspec
플래그를 사용하면 chroot
유사한 이점/행동을 제공 할 수 있습니다.
$ docker run -it --rm ubuntu:trusty chroot --userspec=nobody / ps aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
nobody 1 5.0 0.0 7136 756 ? Rs+ 17:04 0:00 ps aux
setpriv
최신 util-linux
( >= 2.32.1-0.2
, 데비안; https://manpages.debian.org/buster/util-linux/setpriv.1.en.html) :
$ docker run -it --rm buildpack-deps:buster-scm setpriv --reuid=nobody --regid=nogroup --init-groups ps faux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
nobody 1 5.0 0.0 9592 1252 pts/0 RNs+ 23:21 0:00 ps faux
su-exec
알파인 리눅스 생태계에서, su-exec
C에서 최소한의 gosu
재 작성하여 훨씬 작은 이진을 만들고 main
알파인 패키지 저장소에서 사용할 수 있습니다. 그러나 버전 0.2 기준으로 수년 동안 릴리스되지 않은 매우 심각한 파서 버그가 있습니다 (그리고 버그가 많은 동작은 오타가 코드를 예기치 않게 실행하게한다는 것입니다).
나는 그들에게 크게 익숙하지 않지만, 내가 알고있는 몇 가지 다른 대안은 다음과 같습니다.
chpst
( runit
의 일부)