在高山码头图像中使用SUID



我试图在Alpine Docker Image中作为不同的用户运行一些脚本。登录为devuser时,我希望将setup.sh作为rootapp.sh作为appuser运行。由于我已经读到您无法在脚本文件上使用SUID,因此我有几个C程序setupapp,可以调用脚本。我可以将setup作为root运行,但不能以appuser为CC_11。

这是目录的内容。请注意,应用程序和设置在程序上设置了SUID位。我尝试在脚本上设置SUID,但这不起作用。

/opt/app $ ls -l
total 24552
-r-sr-xr-x    1 appuser  appgroup     10632 Jun 27 12:59 app
-r--------    1 appuser  appgroup  25101769 Jun 27 12:59 app.jar
-r-xr-xr--    1 appuser  appgroup       327 Jun 27 12:59 app.sh
-r--------    1 appuser  appgroup       316 Jun 27 12:59 application.yml
-r-sr-xr-x    1 root     root         10632 Jun 27 12:59 setup
-r-xr-xr--    1 root     root           152 Jun 27 12:59 setup.sh

我正在以devuser

运行
/opt/app $ whoami
devuser

我可以成功运行setup。它由root所有,以root

运行
/opt/app $ ./setup
Running As: root:appgroup

我尝试运行app,并且不会更改为所有者。

/opt/app $ ./app
Running As: devuser:appgroup
Error: Unable to access jarfile app.jar

这是setup.sh的来源。

/opt/app $ cat setup.sh
#!/bin/ash
echo "Running As: $(whoami):$(id -gn)"

这是app.sh的来源。

/opt/app $ cat app.sh
#!/bin/ash
echo "Running As: $(whoami):$(id -gn)"
java $JAVA_OPTS -Djava.security.egd=file:/dev/./urandom -jar app.jar $SPRING_OPTS

这是两个用户。

/opt/app $ id devuser
uid=701(devuser) gid=700(appgroup) groups=700(appgroup),700(appgroup)
/opt/app $ id appuser
uid=700(appuser) gid=700(appgroup) groups=700(appgroup),700(appgroup)

这是setup.c的来源。

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
int main() {
    setuid(0);
    system("./setup.sh");
    return 0;
}

这是app.c的来源。我也尝试过setuid(0),但这不起作用。

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
int main() {
    setuid(700);
    system("./app.sh");
    return 0;
}

最后我的脏衣服;Docker构建。我尝试设置adduser作为系统用户和非系统用户。

RUN    addgroup -g 700 appgroup 
    && adduser -G appgroup -D -u 700 -S -H -s /bin/sh appuser 
    && adduser -G appgroup -D -u 701 -s /bin/sh devuser
RUN    sh -c 'touch app.jar' 
    && chown appuser:appgroup *.jar  
    && chown appuser:appgroup *.yml  
    && chown appuser:appgroup app.sh  
    && chown appuser:appgroup app 
#    && chmod -R 750 . 
    && chmod u+x,g+x,o-x *.sh 
    && chmod 4555 setup 
    && chmod 4555 app 
    && chmod 400 *.yml 
    && chmod 400 *.jar 
    && chmod -R -w .
USER devuser
# USER appuser

感谢您的任何帮助,wes。

如果将 setuid()更改为 app.c中的 setreuid(),它将起作用。

出于原因,请参阅此答案和评论:https://stackoverflow.com/a/20687988


但是,您的描述方式是非标准的。听起来有suid二进制文件来调用shell脚本。

这是使用高山标准su-Exec进行操作的一种方法:

app.sh

#!/bin/sh
echo "Running As: $(whoami):$(id -gn)"
java $JAVA_OPTS -Djava.security.egd=file:/dev/./urandom -jar app.jar $SPRING_OPTS

setup.sh

#!/bin/sh
echo "Running As: $(whoami):$(id -gn)"
exec su-exec appuser:appgroup ./app.sh

dockerfile

FROM alpine
WORKDIR /app
RUN apk add --no-cache su-exec
RUN    addgroup -g 700 appgroup 
    && adduser -G appgroup -D -u 700 -S -H -s /bin/sh appuser
COPY * ./
RUN chmod 0755 *.sh
ENTRYPOINT ["./setup.sh"]

更简单,也可能更安全。

相关内容

  • 没有找到相关文章

最新更新