Skip to content

Commit 6b6ca41

Browse files
LorcanMcVeighRulox
authored andcommitted
Run IC as non-root
1 parent 198967e commit 6b6ca41

17 files changed

+137
-47
lines changed

build/Dockerfile

+15-5
Original file line numberDiff line numberDiff line change
@@ -6,14 +6,24 @@ RUN ln -sf /proc/1/fd/1 /var/log/nginx/access.log \
66
&& ln -sf /proc/1/fd/1 /var/log/nginx/stream-access.log \
77
&& ln -sf /proc/1/fd/2 /var/log/nginx/error.log
88

9-
COPY nginx-ingress internal/configs/version1/nginx.ingress.tmpl internal/configs/version1/nginx.tmpl internal/configs/version2/nginx.virtualserver.tmpl /
10-
11-
RUN rm /etc/nginx/conf.d/*
9+
RUN mkdir -p /var/lib/nginx \
10+
&& mkdir -p /etc/nginx/secrets \
11+
&& apt-get update \
12+
&& apt-get install -y libcap2-bin \
13+
&& setcap 'cap_net_bind_service=+ep' /usr/sbin/nginx \
14+
&& chown -R nginx:0 /etc/nginx \
15+
&& chown -R nginx:0 /var/cache/nginx \
16+
&& chown -R nginx:0 /var/lib/nginx \
17+
&& apt-get remove --purge -y libcap2-bin \
18+
&& rm /etc/nginx/conf.d/* \
19+
&& rm -rf /var/lib/apt/lists/*
1220

13-
RUN mkdir -p /etc/nginx/secrets
21+
COPY nginx-ingress internal/configs/version1/nginx.ingress.tmpl internal/configs/version1/nginx.tmpl internal/configs/version2/nginx.virtualserver.tmpl /
1422

1523
# Uncomment the line below if you would like to add the default.pem to the image
1624
# and use it as a certificate and key for the default server
1725
# ADD default.pem /etc/nginx/secrets/default
1826

19-
ENTRYPOINT ["/nginx-ingress"]
27+
USER nginx
28+
29+
ENTRYPOINT ["/nginx-ingress"]

build/DockerfileForAlpine

+14-5
Original file line numberDiff line numberDiff line change
@@ -6,14 +6,23 @@ RUN ln -sf /proc/1/fd/1 /var/log/nginx/access.log \
66
&& ln -sf /proc/1/fd/1 /var/log/nginx/stream-access.log \
77
&& ln -sf /proc/1/fd/2 /var/log/nginx/error.log
88

9-
COPY nginx-ingress internal/configs/version1/nginx.ingress.tmpl internal/configs/version1/nginx.tmpl internal/configs/version2/nginx.virtualserver.tmpl /
10-
11-
RUN rm /etc/nginx/conf.d/*
9+
RUN mkdir -p /etc/nginx/secrets \
10+
&& mkdir -p /var/lib/nginx \
11+
&& apk add --no-cache libcap \
12+
&& setcap 'cap_net_bind_service=+ep' /usr/sbin/nginx \
13+
&& chown -R nginx:0 /etc/nginx \
14+
&& chown -R nginx:0 /var/cache/nginx \
15+
&& chown -R nginx:0 /var/lib/nginx \
16+
&& apk del libcap \
17+
&& rm /etc/nginx/conf.d/* \
18+
&& rm -rf /var/cache/apk/*
1219

13-
RUN mkdir -p /etc/nginx/secrets
20+
COPY nginx-ingress internal/configs/version1/nginx.ingress.tmpl internal/configs/version1/nginx.tmpl internal/configs/version2/nginx.virtualserver.tmpl /
1421

1522
# Uncomment the line below if you would like to add the default.pem to the image
1623
# and use it as a certificate and key for the default server
1724
# ADD default.pem /etc/nginx/secrets/default
1825

19-
ENTRYPOINT ["/nginx-ingress"]
26+
USER nginx
27+
28+
ENTRYPOINT ["/nginx-ingress"]

build/DockerfileForPlus

+13-6
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ RUN chmod 644 /etc/ssl/nginx/*
1616
# Install NGINX Plus
1717
RUN set -x \
1818
&& apt-get update \
19-
&& apt-get install --no-install-recommends --no-install-suggests -y apt-transport-https ca-certificates gnupg1 \
19+
&& apt-get install --no-install-recommends --no-install-suggests -y apt-transport-https ca-certificates gnupg1 libcap2-bin \
2020
&& \
2121
NGINX_GPGKEY=573BFD6B3D8FBC641079A6ABABF5BD827BD9BF62; \
2222
found=''; \
@@ -37,6 +37,7 @@ RUN set -x \
3737
&& echo "Acquire::https::plus-pkgs.nginx.com::User-Agent \"k8s-ic-$IC_VERSION-apt\";" >> /etc/apt/apt.conf.d/90nginx \
3838
&& printf "deb https://plus-pkgs.nginx.com/debian stretch nginx-plus\n" > /etc/apt/sources.list.d/nginx-plus.list \
3939
&& apt-get update && apt-get install -y nginx-plus=${NGINX_PLUS_VERSION} \
40+
&& setcap 'cap_net_bind_service=+ep' /usr/sbin/nginx \
4041
&& apt-get remove --purge --auto-remove -y gnupg1 \
4142
&& rm -rf /var/lib/apt/lists/* \
4243
&& rm -rf /etc/ssl/nginx \
@@ -46,19 +47,25 @@ RUN set -x \
4647
# forward nginx access and error logs to stdout and stderr of the ingress
4748
# controller process
4849
RUN ln -sf /proc/1/fd/1 /var/log/nginx/access.log \
49-
&& ln -sf /proc/1/fd/1 /var/log/nginx/stream-access.log \
50-
&& ln -sf /proc/1/fd/2 /var/log/nginx/error.log
50+
&& ln -sf /proc/1/fd/1 /var/log/nginx/stream-access.log \
51+
&& ln -sf /proc/1/fd/2 /var/log/nginx/error.log
5152

53+
RUN mkdir -p /var/lib/nginx \
54+
&& mkdir -p /etc/nginx/secrets \
55+
&& chown -R nginx:0 /etc/nginx \
56+
&& chown -R nginx:0 /var/cache/nginx \
57+
&& chown -R nginx:0 /var/lib/nginx/ \
58+
&& apt-get remove --purge -y libcap2-bin \
59+
&& rm /etc/nginx/conf.d/*
5260

5361
EXPOSE 80 443
5462

5563
COPY nginx-ingress internal/configs/version1/nginx-plus.ingress.tmpl internal/configs/version1/nginx-plus.tmpl internal/configs/version2/nginx-plus.virtualserver.tmpl /
5664

57-
RUN rm /etc/nginx/conf.d/* \
58-
&& mkdir -p /etc/nginx/secrets
59-
6065
# Uncomment the line below if you would like to add the default.pem to the image
6166
# and use it as a certificate and key for the default server
6267
# ADD default.pem /etc/nginx/secrets/default
6368

69+
USER nginx
70+
6471
ENTRYPOINT ["/nginx-ingress"]

build/DockerfileWithOpentracing

+18-5
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,8 @@ RUN set -x \
3333
&& make && make install \
3434
&& cd "$tempDir" \
3535
&& NGINX_VERSION_BUILD=`nginx -v 2>&1` && NGINX_VERSION_BUILD=${NGINX_VERSION_BUILD#*nginx/} \
36-
&& echo "deb-src http://nginx.org/packages/mainline/debian/ stretch nginx" >> /etc/apt/sources.list \
36+
&& DEBIAN_VERSION="$(cat /etc/os-release | grep CODENAME | cut -f2 -d '=')" \
37+
&& echo "deb-src http://nginx.org/packages/mainline/debian/ $DEBIAN_VERSION nginx" >> /etc/apt/sources.list \
3738
&& apt-get update \
3839
&& apt-get build-dep -y nginx=${NGINX_VERSION_BUILD} \
3940
&& wget -O nginx-release-${NGINX_VERSION_BUILD}.tar.gz https://github.com/nginx/nginx/archive/release-${NGINX_VERSION_BUILD}.tar.gz \
@@ -58,26 +59,38 @@ RUN set -x \
5859
# Final Image
5960
FROM nginx:${NGINX_VERSION}
6061
ARG OPENTRACING_CPP_VERSION
62+
6163
# forward nginx access and error logs to stdout and stderr of the ingress
6264
# controller process
6365
RUN ln -sf /proc/1/fd/1 /var/log/nginx/access.log \
6466
&& ln -sf /proc/1/fd/1 /var/log/nginx/stream-access.log \
6567
&& ln -sf /proc/1/fd/2 /var/log/nginx/error.log
6668

67-
COPY nginx-ingress internal/configs/version1/nginx.ingress.tmpl internal/configs/version1/nginx.tmpl internal/configs/version2/nginx.virtualserver.tmpl /
68-
6969
COPY --from=opentracing-builder /ngx_http_opentracing_module.so /usr/lib/nginx/modules/ngx_http_opentracing_module.so
7070
COPY --from=opentracing-builder /usr/local/lib/libopentracing.so.${OPENTRACING_CPP_VERSION} /usr/local/lib/libopentracing.so.1
7171
# Edit the line below to use a different tracer
7272
COPY --from=tracer-downloader /usr/local/lib/libjaegertracing_plugin.so /usr/local/lib/libjaegertracing_plugin.so
73+
7374
RUN ldconfig
7475

75-
RUN rm /etc/nginx/conf.d/*
76+
RUN mkdir -p /var/lib/nginx \
77+
&& mkdir -p /etc/nginx/secrets \
78+
&& apt-get update \
79+
&& apt-get install -y libcap2-bin \
80+
&& setcap 'cap_net_bind_service=+ep' /usr/sbin/nginx \
81+
&& chown -R nginx:0 /etc/nginx \
82+
&& chown -R nginx:0 /var/cache/nginx \
83+
&& chown -R nginx:0 /var/lib/nginx \
84+
&& apt-get remove --purge -y libcap2-bin \
85+
&& rm /etc/nginx/conf.d/* \
86+
&& rm -rf /var/lib/apt/lists/*
7687

77-
RUN mkdir -p /etc/nginx/secrets
88+
COPY nginx-ingress internal/configs/version1/nginx.ingress.tmpl internal/configs/version1/nginx.tmpl internal/configs/version2/nginx.virtualserver.tmpl /
7889

7990
# Uncomment the line below if you would like to add the default.pem to the image
8091
# and use it as a certificate and key for the default server
8192
# ADD default.pem /etc/nginx/secrets/default
8293

94+
USER nginx
95+
8396
ENTRYPOINT ["/nginx-ingress"]

build/DockerfileWithOpentracingForPlus

+14-8
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,7 @@ ARG JAEGER_VERSION=v0.4.2
44
RUN set -x \
55
&& apt-get update \
66
&& apt-get install --no-install-recommends --no-install-suggests -y ca-certificates apt-transport-https wget \
7-
&& wget https://github.com/jaegertracing/jaeger-client-cpp/releases/download/${JAEGER_VERSION}/libjaegertracing_plugin.linux_amd64.so -O /usr/local/lib/libjaegertracing_plugin.so
8-
7+
&& wget https://github.com/jaegertracing/jaeger-client-cpp/releases/download/${JAEGER_VERSION}/libjaegertracing_plugin.linux_amd64.so -O /usr/local/lib/libjaegertracing_plugin.so
98

109
# Final Image
1110
FROM debian:stretch-slim
@@ -27,7 +26,7 @@ RUN chmod 644 /etc/ssl/nginx/*
2726
# Install NGINX Plus
2827
RUN set -x \
2928
&& apt-get update \
30-
&& apt-get install --no-install-recommends --no-install-suggests -y apt-transport-https ca-certificates gnupg1 \
29+
&& apt-get install --no-install-recommends --no-install-suggests -y apt-transport-https ca-certificates gnupg1 libcap2-bin \
3130
&& \
3231
NGINX_GPGKEY=573BFD6B3D8FBC641079A6ABABF5BD827BD9BF62; \
3332
found=''; \
@@ -51,6 +50,7 @@ RUN set -x \
5150
nginx-plus=${NGINX_PLUS_VERSION} \
5251
# Install OpenTracing module
5352
nginx-plus-module-opentracing=${NGINX_OPENTRACING_MODULE_VERSION} \
53+
&& setcap 'cap_net_bind_service=+ep' /usr/sbin/nginx \
5454
&& apt-get remove --purge --auto-remove -y gnupg1 \
5555
&& rm -rf /var/lib/apt/lists/* \
5656
&& rm -rf /etc/ssl/nginx \
@@ -63,19 +63,25 @@ RUN ln -sf /proc/1/fd/1 /var/log/nginx/access.log \
6363
&& ln -sf /proc/1/fd/1 /var/log/nginx/stream-access.log \
6464
&& ln -sf /proc/1/fd/2 /var/log/nginx/error.log
6565

66-
6766
# Edit the line below to use a different tracer
6867
COPY --from=tracer-downloader /usr/local/lib/libjaegertracing_plugin.so /usr/local/lib/libjaegertracing_plugin.so
6968

69+
RUN mkdir -p /var/lib/nginx \
70+
&& mkdir -p /etc/nginx/secrets \
71+
&& chown -R nginx:0 /etc/nginx \
72+
&& chown -R nginx:0 /var/cache/nginx \
73+
&& chown -R nginx:0 /var/lib/nginx/ \
74+
&& apt-get remove --purge -y libcap2-bin \
75+
&& rm /etc/nginx/conf.d/*
76+
7077
EXPOSE 80 443
7178

7279
COPY nginx-ingress internal/configs/version1/nginx-plus.ingress.tmpl internal/configs/version1/nginx-plus.tmpl internal/configs/version2/nginx-plus.virtualserver.tmpl /
7380

74-
RUN rm /etc/nginx/conf.d/* \
75-
&& mkdir -p /etc/nginx/secrets
76-
7781
# Uncomment the line below if you would like to add the default.pem to the image
7882
# and use it as a certificate and key for the default server
7983
# ADD default.pem /etc/nginx/secrets/default
8084

81-
ENTRYPOINT ["/nginx-ingress"]
85+
USER nginx
86+
87+
ENTRYPOINT ["/nginx-ingress"]

cmd/nginx-ingress/main.go

+4-5
Original file line numberDiff line numberDiff line change
@@ -12,14 +12,13 @@ import (
1212
"syscall"
1313
"time"
1414

15-
"github.com/nginxinc/kubernetes-ingress/internal/configs/version2"
16-
"github.com/nginxinc/kubernetes-ingress/internal/metrics/collectors"
17-
1815
"github.com/golang/glog"
1916
"github.com/nginxinc/kubernetes-ingress/internal/configs"
2017
"github.com/nginxinc/kubernetes-ingress/internal/configs/version1"
18+
"github.com/nginxinc/kubernetes-ingress/internal/configs/version2"
2119
"github.com/nginxinc/kubernetes-ingress/internal/k8s"
2220
"github.com/nginxinc/kubernetes-ingress/internal/metrics"
21+
"github.com/nginxinc/kubernetes-ingress/internal/metrics/collectors"
2322
"github.com/nginxinc/kubernetes-ingress/internal/nginx"
2423
k8s_nginx "github.com/nginxinc/kubernetes-ingress/pkg/client/clientset/versioned"
2524
conf_scheme "github.com/nginxinc/kubernetes-ingress/pkg/client/clientset/versioned/scheme"
@@ -350,7 +349,7 @@ func main() {
350349

351350
var plusClient *client.NginxClient
352351
if *nginxPlus && !useFakeNginxManager {
353-
httpClient := getSocketClient("/var/run/nginx-plus-api.sock")
352+
httpClient := getSocketClient("/var/lib/nginx/nginx-plus-api.sock")
354353
plusClient, err = client.NewNginxClient(httpClient, "http://nginx-plus-api/api")
355354
if err != nil {
356355
glog.Fatalf("Failed to create NginxClient for Plus: %v", err)
@@ -362,7 +361,7 @@ func main() {
362361
if *nginxPlus {
363362
go metrics.RunPrometheusListenerForNginxPlus(*prometheusMetricsListenPort, plusClient, registry)
364363
} else {
365-
httpClient := getSocketClient("/var/run/nginx-status.sock")
364+
httpClient := getSocketClient("/var/lib/nginx/nginx-status.sock")
366365
client, err := metrics.NewNginxMetricsClient(httpClient)
367366
if err != nil {
368367
glog.Fatalf("Error creating the Nginx client for Prometheus metrics: %v", err)

deployments/daemon-set/nginx-ingress.yaml

+8
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,14 @@ spec:
2929
hostPort: 443
3030
#- name: prometheus
3131
#containerPort: 9113
32+
securityContext:
33+
allowPrivilegeEscalation: true
34+
runAsUser: 101 #nginx
35+
capabilities:
36+
drop:
37+
- ALL
38+
add:
39+
- NET_BIND_SERVICE
3240
env:
3341
- name: POD_NAMESPACE
3442
valueFrom:

deployments/daemon-set/nginx-plus-ingress.yaml

+8
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,14 @@ spec:
2929
hostPort: 443
3030
#- name: prometheus
3131
#containerPort: 9113
32+
securityContext:
33+
allowPrivilegeEscalation: true
34+
runAsUser: 101 #nginx
35+
capabilities:
36+
drop:
37+
- ALL
38+
add:
39+
- NET_BIND_SERVICE
3240
env:
3341
- name: POD_NAMESPACE
3442
valueFrom:

deployments/deployment/nginx-ingress.yaml

+8
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,14 @@ spec:
2828
containerPort: 443
2929
#- name: prometheus
3030
#containerPort: 9113
31+
securityContext:
32+
allowPrivilegeEscalation: true
33+
runAsUser: 101 #nginx
34+
capabilities:
35+
drop:
36+
- ALL
37+
add:
38+
- NET_BIND_SERVICE
3139
env:
3240
- name: POD_NAMESPACE
3341
valueFrom:

deployments/deployment/nginx-plus-ingress.yaml

+8
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,14 @@ spec:
2828
containerPort: 443
2929
#- name: prometheus
3030
#containerPort: 9113
31+
securityContext:
32+
allowPrivilegeEscalation: true
33+
runAsUser: 101 #nginx
34+
capabilities:
35+
drop:
36+
- ALL
37+
add:
38+
- NET_BIND_SERVICE
3139
env:
3240
- name: POD_NAMESPACE
3341
valueFrom:

deployments/helm-chart/templates/controller-daemonset.yaml

+8
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,14 @@ spec:
5858
- name: prometheus
5959
containerPort: {{ .Values.prometheus.port }}
6060
{{- end }}
61+
securityContext:
62+
allowPrivilegeEscalation: true
63+
runAsUser: 101 #nginx
64+
capabilities:
65+
drop:
66+
- ALL
67+
add:
68+
- NET_BIND_SERVICE
6169
env:
6270
- name: POD_NAMESPACE
6371
valueFrom:

deployments/helm-chart/templates/controller-deployment.yaml

+8
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,14 @@ spec:
5858
{{- end }}
5959
resources:
6060
{{ toYaml .Values.controller.resources | indent 10 }}
61+
securityContext:
62+
allowPrivilegeEscalation: true
63+
runAsUser: 101 #nginx
64+
capabilities:
65+
drop:
66+
- ALL
67+
add:
68+
- NET_BIND_SERVICE
6169
env:
6270
- name: POD_NAMESPACE
6371
valueFrom:

internal/configs/version1/nginx-plus.tmpl

+3-4
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11

2-
user nginx;
32
worker_processes {{.WorkerProcesses}};
43
{{- if .WorkerRlimitNofile}}
54
worker_rlimit_nofile {{.WorkerRlimitNofile}};{{end}}
@@ -11,7 +10,7 @@ worker_shutdown_timeout {{.WorkerShutdownTimeout}};{{end}}
1110
daemon off;
1211

1312
error_log /var/log/nginx/error.log {{.ErrorLogLevel}};
14-
pid /var/run/nginx.pid;
13+
pid /var/lib/nginx/nginx.pid;
1514

1615
{{- if .OpenTracingLoadModule}}
1716
load_module modules/ngx_http_opentracing_module.so;
@@ -80,7 +79,7 @@ http {
8079
opentracing on;
8180
{{end}}
8281
{{if .OpenTracingLoadModule}}
83-
opentracing_load_tracer {{ .OpenTracingTracer }} /etc/tracer-config.json;
82+
opentracing_load_tracer {{ .OpenTracingTracer }} /var/lib/nginx/tracer-config.json;
8483
{{end}}
8584

8685
{{if .ResolverAddresses}}
@@ -145,7 +144,7 @@ http {
145144

146145
# NGINX Plus API over unix socket
147146
server {
148-
listen unix:/var/run/nginx-plus-api.sock;
147+
listen unix:/var/lib/nginx/nginx-plus-api.sock;
149148
access_log off;
150149

151150
{{if .OpenTracingEnabled}}

0 commit comments

Comments
 (0)