2017-09-23 5 views
1

내 (debian stretch) 서버에 컨테이너를 설정하고 최대한 많이 잠글려고합니다.setuid 바이너리를 통해 도커 컨테이너를 실행하십시오.

컨테이너 my-container 만 시작하면됩니다. 그런 다음 몇 가지 처리 및 반환을 수행합니다 (모든 작업에는 약 1 초가 소요됩니다).

docker start -a my-container으로 루트로 쉽게 할 수 있습니다.

내 문제는이 처리가 PHP 스크립트로 실행되어야한다는 것입니다. Docker 컨테이너를 시작할 수있는 www 데이터를주는 대신, 나는 docker 명령을 실행하는 작은 setuid 바이너리를 가진 전용 사용자를 만들었습니다.

이제 다른 사용자로부터의 setuid 바이너리를 실행하는 일을 반환하지 않습니다

FATA[0000] Get http:///var/run/docker.sock/v1.18/containers/my-container/json: dial unix /var/run/docker.sock: permission denied. Are you trying to connect to a TLS-enabled daemon without TLS? 

를 특별한 사용자 계정 작품에서 바이너리를 실행하는 동안.

#include <unistd.h> 
#include <stdio.h> 
#include <stdlib.h> 
#include <unistd.h> 

int main(int argc, char *argv[]) 
{ 
char *newenviron[] = { NULL }; 
char * newargv[] = {NULL, "start", "-a", "my-container", NULL}; 
char * exec="/usr/bin/docker"; 

newargv[0] = exec; 

execve(exec, newargv, newenviron); 
perror("execve"); /* execve() only returns on error */ 
exit(EXIT_FAILURE); 
} 

난 정말 실행에서 저를 방해하는 것을 얻을하지 않습니다 이진은 execve man 페이지에서 파생 된 아주 간단한 프로그램입니다

-r-s--x--- 1 docker-proxy-launcher another-user 8448 sept. 23 23:43 /home/docker-proxy-launcher/docker-prestage 

:

나는 4510 권한을 사용 이 setuid 바이너리로 도커 프로세스.

답변

2

나는 이것을 실제로 알아 냈습니다. setuid 비트는 프로세스의 그룹 ID가 아닌 사용자 ID 만 변경합니다. 결과적으로, 실행 파일은 새 사용자의 권한을 갖지만 자신이 속한 그룹의 권한은 갖지 않습니다. 해결 방법으로

, 나는 root:docker 소유 할 수있는 바이너리를 변경합니다 (고정 표시기 소켓에 쓸 수있는 권한을주는 고정 표시기 그룹에 속하는 것으로) :

srw-rw---- 1 root docker 0 sept. 23 23:09 /var/run/docker.sock 

는 또한 2111을 할 권한을 변경 (setgid, 누구에 의해 실행이 내 시스템에 보안 문제가 아니므로,이 있다면, 내가 ACL을 사용했을 수 있다고 생각) : 그것은 지금 모두가 제대로 작동

---x--s--x 1 root docker 8448 sept. 24 10:58 /home/docker-proxy-launcher/docker-prestage 

.

+0

당신도 대답으로 받아 들일 수 있습니다. –

+0

2 시간 후 (질문 한 후 48 시간 이내에 받아 들일 수 없습니다.) – MayeulC

+0

Okie, 그 때까지는 몰랐습니다. :-) –

관련 문제