Shell脚本如何配置容器capabilities

wen 实用脚本 3

本文目录导读:

Shell脚本如何配置容器capabilities

  1. Docker 容器配置 Capabilities
  2. Kubernetes Pod YAML 配置
  3. Docker Compose 配置
  4. Podman 容器配置
  5. 实用脚本示例
  6. Containerd 配置
  7. 检查容器 Capabilities
  8. 常用 Capabilities 列表
  9. 安全最佳实践

在Shell脚本中配置容器Capabilities,主要取决于你使用的容器运行时(如Docker、Podman、containerd等),以下是几种常见场景的配置方法:

Docker 容器配置 Capabilities

添加/删除 Capabilities

#!/bin/bash
# 添加capabilities
docker run --cap-add=NET_ADMIN --cap-add=SYS_TIME nginx
# 删除所有capabilities后再添加特定的
docker run --cap-drop=ALL --cap-add=NET_RAW nginx
# 使用完整的capability列表
docker run \
  --cap-add=CHOWN \
  --cap-add=DAC_OVERRIDE \
  --cap-add=NET_RAW \
  --cap-add=SYS_ADMIN \
  nginx

脚本中的动态配置

#!/bin/bash
# 定义capabilities列表
CAPS=(
  "NET_ADMIN"
  "SYS_PTRACE"
  "SYS_ADMIN"
)
# 构建参数
CAP_ARGS=""
for cap in "${CAPS[@]}"; do
  CAP_ARGS="$CAP_ARGS --cap-add=$cap"
done
# 运行容器
docker run $CAP_ARGS myapp

Kubernetes Pod YAML 配置

在shell脚本中生成配置

#!/bin/bash
cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: Pod
metadata:
  name: capability-pod
spec:
  containers:
  - name: test-container
    image: nginx
    securityContext:
      capabilities:
        add: ["NET_ADMIN", "SYS_TIME"]
        drop: ["ALL"]
EOF

Docker Compose 配置

# docker-compose.yml
version: '3.8'
services:
  app:
    image: nginx
    cap_add:
      - NET_ADMIN
      - SYS_PTRACE
    cap_drop:
      - ALL

在shell脚本中调用:

#!/bin/bash
docker-compose up -d

Podman 容器配置

#!/bin/bash
# Podman语法与Docker类似
podman run --cap-add=NET_RAW --cap-drop=ALL nginx
# 或者使用完整的capabilities
podman run --cap-add=ALL --cap-drop=MKNOD nginx

实用脚本示例

带参数运行的脚本

#!/bin/bash
# 用法: ./run_with_caps.sh [--all|--minimal|--custom] [command]
MODE=${1:-"minimal"}
COMMAND=${2:-"bash"}
case $MODE in
  "all")
    echo "授予所有capabilities"
    docker run --cap-add=ALL -it --rm ubuntu:latest $COMMAND
    ;;
  "minimal")
    echo "最小capabilities配置"
    docker run --cap-drop=ALL --cap-add=NET_RAW --cap-add=CHOWN -it --rm ubuntu:latest $COMMAND
    ;;
  "custom")
    echo "自定义capabilities"
    docker run \
      --cap-add=NET_ADMIN \
      --cap-add=SYS_PTRACE \
      --cap-add=SYS_ADMIN \
      -it --rm ubuntu:latest $COMMAND
    ;;
  *)
    echo "未知模式: $MODE"
    exit 1
    ;;
esac

Containerd 配置

#!/bin/bash
# 使用ctr命令行工具
ctr run --rm \
  --cap-add=NET_ADMIN \
  --cap-add=SYS_TIME \
  docker.io/library/nginx:latest \
  test-container

检查容器 Capabilities

#!/bin/bash
# 检查运行中的容器的capabilities
docker exec <container_id> cat /proc/1/status | grep CapEff
# 或者使用capsh工具(需在容器内安装)
docker run --rm ubuntu bash -c "apt-get update && apt-get install -y libcap2-bin && capsh --print"

常用 Capabilities 列表

Capability 用途
CHOWN 修改文件所有者
DAC_OVERRIDE 忽略文件权限检查
NET_RAW 使用原始套接字
NET_ADMIN 网络管理操作
SYS_ADMIN 系统管理操作
SYS_PTRACE 跟踪系统调用
SYS_TIME 设置系统时间
SYS_MODULE 加载/卸载内核模块

安全最佳实践

#!/bin/bash
# 推荐的最小权限原则
docker run \
  --cap-drop=ALL \
  --cap-add=NET_BIND_SERVICE \
  --cap-add=CHOWN \
  --cap-add=SETUID \
  --cap-add=SETGID \
  nginx

配置Capabilities时,请遵循最小权限原则,只授予容器运行所需的最小capability集合,不要随意使用--cap-add=ALL(除非必要)。

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