2017-09-23 74 views
1

我想在我的(debian stretch)服務器上設置一個容器,並儘可能地將其鎖定。通過setuid二進制運行碼頭容器

容器my-container只需要啓動時,它則做了一些處理,返回(整個事情大約需要一秒鐘)。

我可以很容易地以docker start -a my-container作爲根。

我的問題是這個處理需要用php腳本觸發。我沒有給www-data啓動docker容器的權利,而是用一個執行docker命令的小型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? 

:現在

,從其他用戶執行了setuid二進制不工作並返回。

我用4510權限:

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

二進制是一個非常簡單的程序,從execve手冊頁導出:

#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); 
} 

我真的不明白是什麼阻止我啓動docker進程與這個setuid二進制文件。

回答

2

我其實自己想到了這一點。 setuid位僅更改用戶標識,而不是進程的組標識。作爲結果,可執行具有新用戶的權利,但是從羣體不是那些屬於。

作爲一種變通方法,我改變了由root:docker所擁有的二進制文件(如屬於泊塢窗組給予泊塢窗插座上寫的權限):

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

我也改變了權限是2111setgid,由人執行的,因爲它不是我的系統上的安全問題,如果是,我想我可以使用訪問控制列表):

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

現在一切工作正常。

+0

你也可以接受它作爲答案 –

+0

在兩個小時內(SO限制,我不能接受它在提問後不到48小時);) – MayeulC

+0

Okie,直到現在我還不知道:-) –