本文記錄了在離線環境下部署Tomcat容器時遇到的權限問題及解決方案。在Docker環境中運行Tomcat時出現"找不到setclasspath.sh"錯誤,通過添加--security-opt seccomp=unconfined參數解決。在Kubernetes環境中部署時出現相同問題,通過設置containerSecurityContext.seccompProfile.type=Unconfined解決。文章對比了Unconfined和RuntimeDefault兩種seccomp
一、離線環境
CPU:Hygon C86 7285 32-core Processor
操作系統:麒麟操作系統
containerd:1.7.27
Kubernetes:1.26.12
KubeSphere:4.1.2
kubekey:3.1.10
Harbor:2.13.1
二、docker下的現象
執行如下代碼:
docker run -dit \
??--name tomcat \
??-p 8084:8080 \
??-e TOMCAT_USERNAME=admin \
??-e TOMCAT_PASSWORD=Sinops1234 \
??bitnami/tomcat:latest
?報如下錯誤:
Cannot find /opt/bitnami/tomcat/bin/setclasspath.sh
原因:
? ?權限不夠。
解決方案:
docker run -dit \
??--name tomcat \
??-p 8084:8080 \
??--security-opt seccomp=unconfined \
??-e TOMCAT_USERNAME=admin \
??-e TOMCAT_PASSWORD=Sinops1234 \
??bitnami/tomcat:latest
?
特性 | apparmor:unconfined | seccomp=unconfined |
所屬模塊 | AppArmor | seccomp |
控制內容 | 文件路徑、網絡訪問、權限等 | 系統調用(syscalls) |
用途 | 限制程序對系統資源的訪問 | 限制程序能執行的底層系統操作 |
安全影響 | 更細粒度的訪問控制 | 防止危險系統調用被執行 |
默認行為 | Docker 會應用默認 AppArmor profile(如果啟用) | Docker 默認啟用 seccomp,限制部分危險 syscall |
何時使用 | 容器無法訪問特定文件或資源 | 容器因系統調用失敗而崩潰 |
三、k8s下的現象?
執行如下命令:
helm install tomcat ./tomcat-12.0.0.tgz \
??--namespace default \
??--set image.registry=172.23.123.117:8443 \
??--set image.repository=library/bitnami/tomcat \
??--set image.tag=latest \
??--set image.pullPolicy=IfNotPresent \
--set image.pullSecrets=sinopsreg?\
??--set global.security.allowInsecureImages=false \
??--set usePasswordFiles=false \
??--set existingSecret=tomcat-secrets?\
??--set secretKeys.adminUsernameKey=tomcat-username \
??--set secretKeys.adminPasswordKey=tomcat-password
?
報如下錯誤:
Cannot find /opt/bitnami/tomcat/bin/setclasspath.sh
原因:
? ?權限不夠。
解決方案:
helm install tomcat ./tomcat-12.0.0.tgz \
??--namespace default \
??--set image.registry=172.23.123.117:8443 \
??--set image.repository=library/bitnami/tomcat \
??--set image.tag=latest \
??--set image.pullPolicy=IfNotPresent \
--set image.pullSecrets=sinopsreg?\
??--set global.security.allowInsecureImages=false \
??--set usePasswordFiles=false \
??--set existingSecret=tomcat-secrets?\
??--set secretKeys.adminUsernameKey=tomcat-username \
??--set secretKeys.adminPasswordKey=tomcat-password \
??--set containerSecurityContext.seccompProfile.type=Unconfined
Unconfined:當你設置 seccompProfile.type: Unconfined,這意味著禁用了 Seccomp 安全策略,允許容器內的進程執行所有系統調用。這種方式提供了最大的靈活性,但也降低了安全性。
RuntimeDefault:相比之下,使用 "RuntimeDefault" 提供了一定程度的安全性提升,因為它限制了容器能夠執行的系統調用,減少了潛在攻擊面。
?