testing cap

Signed-off-by: James Strong <strong.james.e@gmail.com>
This commit is contained in:
James Strong 2022-10-12 10:14:07 -04:00 committed by James Strong
parent 5f7fd35d2f
commit 4417bc6e0a
Failed to extract signature
8 changed files with 65 additions and 11 deletions

View file

@ -63,7 +63,7 @@ if [ "${SKIP_IMAGE_CREATION:-false}" = "false" ]; then
make build image make build image
docker tag "${REGISTRY}/controller:${TAG}" "${DEV_IMAGE}" docker tag "${REGISTRY}/controller:${TAG}" "${DEV_IMAGE}"
fi fi
export K8S_VERSION=${K8S_VERSION:-v1.24.2@sha256:1f0cee2282f43150b52dc7933183ed96abdcfc8d293f30ec07082495874876f1} export K8S_VERSION=${K8S_VERSION:-v1.25.2@sha256:9be91e9e9cdf116809841fc77ebdb8845443c4c72fe5218f3ae9eb57fdb4bace}
KIND_CLUSTER_NAME="ingress-nginx-dev" KIND_CLUSTER_NAME="ingress-nginx-dev"
@ -106,7 +106,6 @@ controller:
image: "${DEV_IMAGE}" image: "${DEV_IMAGE}"
tag: "${TAG}" tag: "${TAG}"
digest: "${DIGEST}" digest: "${DIGEST}"
runAsUser: 0
config: config:
worker-processes: "1" worker-processes: "1"
podLabels: podLabels:

View file

@ -28,9 +28,9 @@ IMAGE ?= $(REGISTRY)/controller
ARCH := $(shell uname -m) ARCH := $(shell uname -m)
MELANGE_DIR ?= melange MELANGE_DIR ?= melange
APKO_DIR ?= apko APKO_DIR ?= apko
MELANGE ?= docker run --rm --privileged -v "${PWD}":/work distroless.dev/melange:latest MELANGE ?= docker run --rm --privileged -w /work -v "${PWD}":/work distroless.dev/melange:latest
MELANGE_DETACHED ?= docker run -d --rm --privileged -v "${PWD}":/work distroless.dev/melange:latest MELANGE_DETACHED ?= docker run -d -w /work --rm --privileged -v "${PWD}":/work distroless.dev/melange:latest
APKO ?= docker run --rm -v "${PWD}":/work distroless.dev/apko:latest APKO ?= docker run --rm -w /work -v "${PWD}":/work ko.local:38f15a95ae791cd5deab7d054cb3c15129cedb25a2e30d0308a5f6c63c9865e3
KEY ?= melange.rsa KEY ?= melange.rsa
REPO ?= packages REPO ?= packages
TEMPLATE ?= melange/nginx-templates.json TEMPLATE ?= melange/nginx-templates.json
@ -39,7 +39,7 @@ MELANGE_INGRESS_OPT ?= -k ${KEY}.pub --signing-key ${KEY} --arch ${ARCHS} --empt
APKO_OPTS ?= -k ${KEY}.pub --debug --use-docker-mediatypes --sbom=false --build-arch ${ARCHS} ${APKO_DIR}/${FILE}.yaml APKO_OPTS ?= -k ${KEY}.pub --debug --use-docker-mediatypes --sbom=false --build-arch ${ARCHS} ${APKO_DIR}/${FILE}.yaml
KEY ?= melange.rsa KEY ?= melange.rsa
REPO ?= $(shell pwd)/packages REPO ?= $(shell pwd)/packages
ARCHS?="amd64,arm64,arm/v6,arm/v7,s390x" ARCHS ?="amd64,arm64,arm/v6,arm/v7,s390x"
define build-package define build-package
docker run $(2) --rm --privileged -v "${PWD}":/work distroless.dev/melange:latest build ${MELANGE_DIR}/$(1).yaml ${MELANGE_OPTS} --template '$(shell cat ${TEMPLATE})' docker run $(2) --rm --privileged -v "${PWD}":/work distroless.dev/melange:latest build ${MELANGE_DIR}/$(1).yaml ${MELANGE_OPTS} --template '$(shell cat ${TEMPLATE})'

View file

@ -39,7 +39,13 @@ contents:
- lua-resty-string@local - lua-resty-string@local
- lua-resty-upload@local - lua-resty-upload@local
accounts: accounts:
run-as: root groups:
- groupname: www-data
gid: 101
users:
- username: www-data
uid: 101
run-as: www-data
annotations: annotations:
org.opencontainers.image.title: "NGINX Ingress Controller for Kubernetes" org.opencontainers.image.title: "NGINX Ingress Controller for Kubernetes"
@ -60,6 +66,15 @@ work-dir: /etc/nginx
paths: paths:
- path: /tmp/nginx/client-body
type: empty-file
permissions: 0o777
recursive: true
- path: /nginx-ingress-controller
type: capabilities
capabilities:
- cap_net_bind_service=+ep
permissions: 0o777
- path: /usr/bin/nginx - path: /usr/bin/nginx
type: hardlink type: hardlink
source: /usr/local/nginx/sbin/nginx source: /usr/local/nginx/sbin/nginx

View file

@ -36,7 +36,7 @@ accounts:
users: users:
- username: www-data - username: www-data
uid: 101 uid: 101
run-as: root run-as: www-data
annotations: annotations:
org.opencontainers.image.title: "NGINX Ingress Controller for Kubernetes" org.opencontainers.image.title: "NGINX Ingress Controller for Kubernetes"

View file

@ -1,5 +1,5 @@
{ {
"INGRESS_NGINX_VERSION": "main", "INGRESS_NGINX_VERSION": "debug",
"PKG": "k8s.io/ingress-nginx", "PKG": "k8s.io/ingress-nginx",
"TAG": "main", "TAG": "main",
"COMMIT_SHA": "cee95b50a", "COMMIT_SHA": "cee95b50a",

View file

@ -17,8 +17,12 @@ limitations under the License.
package net package net
import ( import (
"errors"
"fmt" "fmt"
"k8s.io/klog/v2"
"kernel.org/pub/linux/libs/security/libcap/cap"
_net "net" _net "net"
"os"
"os/exec" "os/exec"
) )
@ -59,3 +63,32 @@ func IsIPv6Enabled() bool {
return false return false
} }
// CheckCapNetBind checks if cap_net_bind_service is set for ingress
func CheckCapNetBind() error {
processID := os.Getpid()
set, err := cap.GetPID(processID)
if err != nil {
return err
}
klog.InfoS("ingress-nginx capability set %v", set.String())
//check effective
// Value 10 = NET_BIND_SERVICE
effective, err := set.GetFlag(0, 10)
if err != nil {
return err
}
//check permitted
permitted, err := set.GetFlag(1, 10)
if err != nil {
return err
}
klog.InfoS("ingress-nginx capabilities: permitted %v effective %v", permitted, effective)
if !permitted && !effective {
return errors.New(fmt.Sprintf("ingress-nginx capabilities: permitted %v effective %v", permitted, effective))
}
return nil
}

View file

@ -35,7 +35,7 @@ import (
"k8s.io/ingress-nginx/internal/ingress/status" "k8s.io/ingress-nginx/internal/ingress/status"
ing_net "k8s.io/ingress-nginx/internal/net" ing_net "k8s.io/ingress-nginx/internal/net"
"k8s.io/ingress-nginx/internal/nginx" "k8s.io/ingress-nginx/internal/nginx"
klog "k8s.io/klog/v2" "k8s.io/klog/v2"
) )
// TODO: We should split the flags functions between common for all programs // TODO: We should split the flags functions between common for all programs
@ -254,6 +254,13 @@ https://blog.maxmind.com/2019/12/18/significant-changes-to-accessing-and-using-g
parser.AnnotationsPrefix = *annotationsPrefix parser.AnnotationsPrefix = *annotationsPrefix
//Check if ingress-nginx controller has cap_net_bind_service privileges
klog.InfoS("Ingress-nginx http port %v, https port %v", *httpPort, *httpsPort)
if *httpPort == 80 || *httpsPort == 443 {
klog.InfoS("Checking Ingress-nginx Capabilities, http port %v, https port %v", *httpPort, *httpsPort)
return false, nil, ing_net.CheckCapNetBind()
}
// check port collisions // check port collisions
if !ing_net.IsPortAvailable(*httpPort) { if !ing_net.IsPortAvailable(*httpPort) {
return false, nil, fmt.Errorf("port %v is already in use. Please check the flag --http-port", *httpPort) return false, nil, fmt.Errorf("port %v is already in use. Please check the flag --http-port", *httpPort)