Shell脚本如何配置容器安全上下文

wen 实用脚本 2

本文目录导读:

Shell脚本如何配置容器安全上下文

  1. Docker 容器的安全上下文
  2. Docker Compose 配置
  3. Kubernetes Pod 安全上下文
  4. 容器运行时安全配置
  5. 自动化安全配置脚本
  6. 最佳实践检查脚本
  7. 关键安全配置说明
  8. 使用建议

在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

使用建议

  1. 分层配置:从最严格的配置开始,按需放宽
  2. 测试验证:在生产环境前充分测试安全配置
  3. 定期审计:定期检查容器安全配置
  4. 最小权限:遵循最小权限原则
  5. 更新维护:保持镜像和运行时更新

脚本可以根据你的具体需求进行调整和组合使用。

抱歉,评论功能暂时关闭!