本文目录导读:

在Shell脚本中配置容器安全上下文主要涉及以下几个层面,这里按不同的使用场景分别说明:
Docker 容器的安全上下文
通过 docker run 参数配置
#!/bin/bash # 只读根文件系统 docker run \ --read-only \ --tmpfs /tmp \ --tmpfs /var/run \ -d nginx:latest # 使用特定用户运行 docker run \ --user 1000:1000 \ -d nginx:latest # 禁止提升权限 docker run \ --security-opt no-new-privileges:true \ -d nginx:latest # 移除所有能力 docker run \ --cap-drop ALL \ --cap-add NET_BIND_SERVICE \ -d nginx:latest # 使用 seccomp 策略 docker run \ --security-opt seccomp=/path/to/seccomp/profile.json \ -d nginx:latest # 完整的生产级配置 docker run \ --read-only \ --tmpfs /tmp:rw,noexec,nosuid,size=65536k \ --tmpfs /var/run:rw,noexec,nosuid,size=65536k \ --tmpfs /var/log:rw,noexec,nosuid,size=65536k \ --user 1000:1000 \ --security-opt no-new-privileges:true \ --cap-drop ALL \ --cap-add NET_BIND_SERVICE \ --cap-add CHOWN \ --cap-add SETGID \ --cap-add SETUID \ --security-opt seccomp=default \ -d your-image:tag
Docker Compose 配置
# docker-compose.yml
version: '3.8'
services:
web:
image: nginx:latest
security_opt:
- no-new-privileges:true
cap_drop:
- ALL
cap_add:
- NET_BIND_SERVICE
- CHOWN
user: "1000:1000"
read_only: true
tmpfs:
- /tmp:rw,noexec,nosuid,size=65536k
- /var/run:rw,noexec,nosuid,size=65536k
- /var/log:rw,noexec,nosuid,size=65536k
# 应用配置的脚本 #!/bin/bash docker-compose up -d
Kubernetes Pod 安全上下文
Docker 级别的配置
#!/bin/bash
# 创建 Pod 并指定安全上下文
kubectl run secure-pod \
--image=nginx:latest \
--dry-run=client \
-o yaml > pod.yaml
# 修改 YAML 添加安全上下文
cat > pod.yaml << 'EOF'
apiVersion: v1
kind: Pod
metadata:
name: secure-pod
spec:
securityContext:
runAsUser: 1000
runAsGroup: 1000
fsGroup: 2000
supplementalGroups: [3000, 4000]
seccompProfile:
type: RuntimeDefault
seLinuxOptions:
level: "s0:c123,c456"
containers:
- name: nginx
image: nginx:latest
securityContext:
allowPrivilegeEscalation: false
privileged: false
readOnlyRootFilesystem: true
runAsNonRoot: true
capabilities:
drop: ["ALL"]
add: ["NET_BIND_SERVICE"]
procMount: Default
seccompProfile:
type: RuntimeDefault
EOF
# 应用配置
kubectl apply -f pod.yaml
容器运行时安全配置
Pod 安全标准 (Pod Security Standards)
#!/bin/bash
# 应用受限模式 (Restricted)
kubectl label --overwrite ns default \
pod-security.kubernetes.io/enforce=restricted \
pod-security.kubernetes.io/audit=restricted \
pod-security.kubernetes.io/warn=restricted
# 创建符合受限标准的部署
cat > secure-deployment.yaml << 'EOF'
apiVersion: apps/v1
kind: Deployment
metadata:
name: secure-app
spec:
replicas: 3
selector:
matchLabels:
app: secure-app
template:
metadata:
labels:
app: secure-app
spec:
securityContext:
runAsNonRoot: true
seccompProfile:
type: RuntimeDefault
containers:
- name: app
image: your-image:latest
securityContext:
allowPrivilegeEscalation: false
capabilities:
drop: ["ALL"]
readOnlyRootFilesystem: true
resources:
limits:
memory: "128Mi"
cpu: "500m"
EOF
kubectl apply -f secure-deployment.yaml
自动化安全配置脚本
#!/bin/bash
set -euo pipefail
SECURITY_CONFIG() {
local IMAGE=$1
local CONTAINER_NAME=$2
echo "启动安全容器: $CONTAINER_NAME"
docker run -d \
--name "$CONTAINER_NAME" \
--restart unless-stopped \
--cap-drop ALL \
--cap-add NET_BIND_SERVICE \
--cap-add CHOWN \
--cap-add SETGID \
--cap-add SETUID \
--security-opt no-new-privileges:true \
--security-opt seccomp=default \
--pids-limit 100 \
--memory "256m" \
--cpus "0.5" \
--read-only \
--tmpfs /tmp:rw,noexec,nosuid,size=32m \
--tmpfs /var/run:rw,noexec,nosuid,size=32m \
--user 1000:1000 \
"$IMAGE"
echo "安全上下文已应用"
}
# 检查容器安全状态
CHECK_CONTAINER_SECURITY() {
local CONTAINER_ID=$1
echo "容器安全配置检查:"
# 检查特权模式
if docker inspect --format='{{.HostConfig.Privileged}}' "$CONTAINER_ID"; then
echo "❌ 容器运行在特权模式"
else
echo "✅ 非特权模式"
fi
# 检查是否可提升权限
if docker inspect --format='{{.HostConfig.SecurityOpt}}' "$CONTAINER_ID" | grep -q "no-new-privileges"; then
echo "✅ 禁止权限提升"
else
echo "❌ 允许权限提升"
fi
# 检查只读文件系统
if docker inspect --format='{{.HostConfig.ReadonlyRootfs}}' "$CONTAINER_ID"; then
echo "✅ 只读文件系统"
else
echo "❌ 非只读文件系统"
fi
}
# 使用示例
# SECURITY_CONFIG "nginx:latest" "secure-nginx"
# CHECK_CONTAINER_SECURITY "container_id"
最佳实践检查脚本
#!/bin/bash
SECURITY_AUDIT() {
local IMAGE=$1
echo "安全配置审计: $IMAGE"
# 检查容器镜像
echo "1. 检查镜像扫描结果..."
docker scan "$IMAGE" || echo "⚠️ 建议使用 docker scan 扫描漏洞"
# 检查基础镜像
echo "2. 检查基础镜像..."
local BASE_IMAGE=$(docker inspect --format='{{.Config.Image}}' "$IMAGE")
echo "基础镜像: $BASE_IMAGE"
# 检查非root用户
echo "3. 检查用户配置..."
local USER=$(docker inspect --format='{{.Config.User}}' "$IMAGE")
if [ -z "$USER" ] || [ "$USER" == "root" ]; then
echo "❌ 建议设置非root用户"
else
echo "✅ 用户: $USER"
fi
# 生成安全报告
cat << EOF
安全配置建议:
- 使用最小基础镜像 (如 alpine, distroless)
- 设置明确的工作目录
- 添加非root用户运行
- 移除不必要的工具和权限
- 配置健康检查
- 设置资源限制
- 使用只读文件系统
- 应用 seccomp 和 AppArmor 策略
- 定期更新基础镜像
- 使用多阶段构建减少攻击面
EOF
}
# SECURITY_AUDIT "your-image:tag"
关键安全配置说明
#!/bin/bash echo "安全上下文配置关键点:" cat << 'SECURITY_GUIDE' 1. 用户权限: - 使用非root用户 (--user 1000:1000) - 设置 runAsNonRoot: true 2. 能力限制: - 移除所有能力 (--cap-drop ALL) - 只添加必要能力 (--cap-add NET_BIND_SERVICE) 3. 文件系统: - 使用只读根文件系统 (--read-only) - 挂载必要的 tmpfs 目录 4. 系统调用过滤: - 使用 seccomp 策略 - 禁止权限提升 (--security-opt no-new-privileges:true) 5. 资源限制: - 设置内存限制 (--memory "256m") - 设置 CPU 限制 (--cpus "0.5") - 限制进程数 (--pids-limit 100) 6. 网络策略: - 使用网络策略限制通信 - 只暴露必要端口 7. 日志和监控: - 限制日志文件大小 - 配置容器审计日志 SECURITY_GUIDE
使用建议
- 分层配置:从最严格的配置开始,按需放宽
- 测试验证:在生产环境前充分测试安全配置
- 定期审计:定期检查容器安全配置
- 最小权限:遵循最小权限原则
- 更新维护:保持镜像和运行时更新
脚本可以根据你的具体需求进行调整和组合使用。