diff --git a/.github/workflows/backend-ci.yml b/.github/workflows/backend-ci.yml index b91734495..77729863d 100644 --- a/.github/workflows/backend-ci.yml +++ b/.github/workflows/backend-ci.yml @@ -16,6 +16,7 @@ jobs: run: | /bin/bash -n deploy/apple-container.sh /bin/bash deploy/tests/apple-container-test.sh + /bin/sh deploy/tests/docker-compose-security-test.sh /bin/sh deploy/test-caddyfile-cache.sh test: diff --git a/deploy/docker-compose.dev.yml b/deploy/docker-compose.dev.yml index db00ac9de..8603f121d 100644 --- a/deploy/docker-compose.dev.yml +++ b/deploy/docker-compose.dev.yml @@ -17,6 +17,8 @@ services: NPM_CONFIG_REGISTRY: ${NPM_CONFIG_REGISTRY:-https://registry.npmmirror.com} container_name: sub2api-dev restart: unless-stopped + security_opt: + - no-new-privileges:true ports: - "${BIND_HOST:-127.0.0.1}:${SERVER_PORT:-8080}:8080" volumes: diff --git a/deploy/docker-compose.local.yml b/deploy/docker-compose.local.yml index 364fcc2ec..588862e2f 100644 --- a/deploy/docker-compose.local.yml +++ b/deploy/docker-compose.local.yml @@ -27,6 +27,8 @@ services: image: weishaw/sub2api:latest container_name: sub2api restart: unless-stopped + security_opt: + - no-new-privileges:true ulimits: nofile: soft: 100000 diff --git a/deploy/docker-compose.standalone.yml b/deploy/docker-compose.standalone.yml index 04a46a8dd..cd0a00887 100644 --- a/deploy/docker-compose.standalone.yml +++ b/deploy/docker-compose.standalone.yml @@ -15,6 +15,8 @@ services: image: weishaw/sub2api:latest container_name: sub2api restart: unless-stopped + security_opt: + - no-new-privileges:true ulimits: nofile: soft: 100000 diff --git a/deploy/docker-compose.yml b/deploy/docker-compose.yml index 3e1e69a89..68a51e78d 100644 --- a/deploy/docker-compose.yml +++ b/deploy/docker-compose.yml @@ -19,6 +19,8 @@ services: image: weishaw/sub2api:latest container_name: sub2api restart: unless-stopped + security_opt: + - no-new-privileges:true ulimits: nofile: soft: 100000 diff --git a/deploy/tests/docker-compose-security-test.sh b/deploy/tests/docker-compose-security-test.sh new file mode 100755 index 000000000..b6cfe768d --- /dev/null +++ b/deploy/tests/docker-compose-security-test.sh @@ -0,0 +1,44 @@ +#!/bin/sh +set -eu + +repo_root=$(CDPATH= cd -- "$(dirname -- "$0")/../.." && pwd) +cd "$repo_root" + +check_application_security_opt() { + file=$1 + count=$( + awk ' + $0 == " sub2api:" { + in_application = 1 + next + } + in_application && $0 ~ /^ [A-Za-z0-9_-]+:$/ { + in_application = 0 + } + in_application && $0 == " security_opt:" { + in_security_opt = 1 + next + } + in_application && in_security_opt && $0 == " - no-new-privileges:true" { + count++ + } + END { print count + 0 } + ' "$file" + ) + + if [ "$count" -ne 1 ]; then + printf '%s must enable no-new-privileges exactly once for the sub2api service\n' "$file" >&2 + exit 1 + fi +} + +for compose_file in \ + deploy/docker-compose.yml \ + deploy/docker-compose.local.yml \ + deploy/docker-compose.standalone.yml \ + deploy/docker-compose.dev.yml +do + check_application_security_opt "$compose_file" +done + +printf 'docker compose security test passed\n'