c# - 修改映像以使用除 root [.net core] 以外的用户运行
问题描述
我们使用漏洞工具扫描了我们的图像,我们收到了这条消息“修改图像以使用非 root 用户运行”
我们尝试了几件事,创建目录,创建用户并将用户设置为新用户。根据我们尝试的“解决方案”,我们会遇到几个错误,如有必要,我很乐意分享。我开始意识到我们的 dockerfile 存在一个更基本的问题
码头工人文件
1. FROM mcr.microsoft.com/dotnet/sdk:5.0-focal as build
2.
3. ENV APP_USER app_user
4. ENV HOME /home/$APP_USER
5. RUN useradd -r $APP_USER
6.
7. RUN mkdir -p $HOME/src
8. WORKDIR $HOME/src
9.
10. COPY "./nuget.config" ./
11. COPY "./Directory.Build.props" ./
12. COPY "./src/Services/BookStore/" .
13.
14. USER root
15. RUN chown -R $APP_USER $HOME/src
16.
17. # Set user name to run container
18. USER $APP_USER
19. WORKDIR ./BookStore.Api
20. RUN dotnet build "BookStore.Api.csproj"
21.
22. EXPOSE 80
23. ENTRYPOINT ["dotnet", "run", "--urls", "http://0.0.0.0:80"]
24.
25. FROM build AS publish
26. RUN dotnet publish "BookStore.Api.csproj" -c Release -o /app/publish
27. WORKDIR /app/publish
28. RUN rm -f *.pdb && rm -f *Development*.* && rm -f nuget.config
29.
30. FROM mcr.microsoft.com/dotnet/sdk:5.0-focal AS release
31. WORKDIR /app
32. COPY --from=publish /app/publish .
33. EXPOSE 80
34. ENTRYPOINT ["dotnet", "BookStore.Api.dll", "--urls", "http://0.0.0.0:80"]
错误:
- 让用户在第 18 行:我们在构建图像时收到错误“ System.UnauthorizedAccessException: Access to the path '/home/app_user/.dotnet' is denied ”
- 让用户在第 21 行:图像构建,我们在运行时收到以下错误
NuGet.targets(565,5):错误:无法获得对“/home/app_user/src/nuget.config”操作的“/tmp/NuGetScratch/lock/6d5da057f9063f4d1ecd1b43e767d61dce14616c”上的锁定文件访问权限。这可能意味着其他用户或管理员持有此锁,并且此进程无权访问它。如果当前没有其他进程对此文件执行操作,则可能意味着早期的 NuGet 进程崩溃并留下无法访问的锁定文件,在这种情况下,删除文件 '/tmp/NuGetScratch/lock/6d5da057f9063f4d1ecd1b43e767d61dce14616c' 将允许 NuGet 继续
- 让用户在第 35 行:解决了所有构建和运行时问题,但由于明显的原因扫描失败.. :)
我尝试了更多修复,在 SO 和 github 帖子上找到,但没有任何运气我错过了什么?
解决方案
您需要将用户创建和USER
指令添加到结果图像(发布),而不是构建图像。例如,第 31 行(之后WORKDIR
),您将创建用户并设置容器用户,然后您的应用程序将在非 root 用户权限下运行。
就像是:
#...
FROM mcr.microsoft.com/dotnet/sdk:5.0-focal AS release
WORKDIR /app
ENV APP_USER app_user
RUN useradd -r $APP_USER
USER $APP_USER
COPY --from=publish /app/publish .
EXPOSE 80
ENTRYPOINT ["dotnet", "BookStore.Api.dll", "--urls", "http://0.0.0.0:80"]
推荐阅读
- mysql - 如何获取给定一周的员工时间表
- javascript - 使用三角学通过圆绘制等距平行线
- python - 根据多个依赖项在气流中安排重新运行任务
- regex - 正则表达式 - 模式部分匹配但不完全通过跳过模式
- c++ - 使用 gdbserver 远程调试 EV3 失败
- google-play - 如何获取 EMV 标签 9F19 令牌请求者 ID?
- playback - 获取视频播放错误(错误代码 -2):Roku 中的连接超时
- javascript - 电子应用程序:在电子生成器派生的 .exe 中保留数据
- javascript - Apex 图表文本在 dataLabel 中对齐样式
- android - 当 DialogFragment 时,带有 AutoCompleteTextView 的 TextInpuLayout 显示更短