forked from apache/pulsar
-
Notifications
You must be signed in to change notification settings - Fork 1
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Make Docker images non-root, by default, and OpenShift compliant (apa…
…che#13376) Master Issue: apache#11269 ### Motivation In order to increase the overall security of our Pulsar docker images, they should default to run as the non-root user. While updating these permissions, I make sure to comply with the OpenShift spec so the docker image can run on that platform out of the box. Once we finalize these changes, we will need to update the Apache Pulsar Helm chart to make sure that deployments take advantage of this feature. We'll use the `fsGroup` to make sure that k8s sets the appropriate file system permissions for the zookeeper, bookkeeper, and function pods. ### Modifications * Default to run as UID 10000. As noted in the `Dockerfile`, this UID is arbitrary. No logic should rely on this id. * Update filesystem permissions so that the group user has sufficient write permission. The group user is 0 (root). * Remove unnecessary write access. * The `/pulsar/{conf,data,logs}` directories and their members must be writable by the root group. I don't know of any other directories that need to be written to. Note that the `bin/pulsar-admin` too creates a log file in the `/pulsar/logs` directory. Please let me know if there are any additional * Note also that the executable file permissions are already set in our git repo. Those permissions are inherited by the docker image when we run the `COPY` directive in the `Dockerfile`. * There are no changes to the function worker in the k8s runtime. We do not need them because we already merged apache@04b5da0. * Add note to `conf/bkenv.sh`, as it is a `.sh` script that is not executable (and doesn't need to be). * Update test docker image and `supervisord` configuration. Note: it's unclear to me how the OpenShift spec handles restarts. I know that the UID is arbitrary. It's possible that the umask needs to be switched from `022` to `002`. Setting the umask in the docker image does not persist for consumers of the image, so this would need to be set in a helm chart. ### Verifying this change You can access a test image built with these changes here: `michaelmarshall/pulsar:2.10.0-SNAPSHOT`. I have already run some manual tests like `bin/pulsar standalone` in the container. I still need to deploy an actual cluster to verify that all of the unique components work correctly. Because we already merged apache@04b5da0, the upgrade scenarios are already simplified. If this change is in 2.10.0, that means 2.8 and 2.9 will be compatible for certain function worker upgrade scenarios. I wrote test criteria in apache#11269. I'll need to follow up on that criteria using my newly build image. I should be able to look closer at this tomorrow. We'll also need tests to pass, as I modified some tests with this PR. ### References The following links were useful in understanding how to make these changes: * https://engineering.bitnami.com/articles/running-non-root-containers-on-openshift.html * https://cloud.redhat.com/blog/a-guide-to-openshift-and-uids ### Does this pull request potentially affect one of the following parts: This PR updates our Docker images in a breaking way. It could result in bookkeepers, zookeepers, or functions with insufficient permissions. We will mitigate these permissions by updating the helm chart. These changes are easily overridden by extending the docker image. In k8s, you can use the pod's `securityContext` to override the user or group.
- Loading branch information
1 parent
332eca8
commit f7f8619
Showing
12 changed files
with
150 additions
and
7 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,109 @@ | ||
<!-- | ||
Licensed to the Apache Software Foundation (ASF) under one | ||
or more contributor license agreements. See the NOTICE file | ||
distributed with this work for additional information | ||
regarding copyright ownership. The ASF licenses this file | ||
to you under the Apache License, Version 2.0 (the | ||
"License"); you may not use this file except in compliance | ||
with the License. You may obtain a copy of the License at | ||
http://www.apache.org/licenses/LICENSE-2.0 | ||
Unless required by applicable law or agreed to in writing, | ||
software distributed under the License is distributed on an | ||
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY | ||
KIND, either express or implied. See the License for the | ||
specific language governing permissions and limitations | ||
under the License. | ||
--> | ||
|
||
# Apache Pulsar Docker Images | ||
|
||
The Apache Pulsar community produces 2 docker images with each official release. | ||
|
||
* `apachepulsar/pulsar` - contains the necessary components for a working Pulsar cluster | ||
* `apachepulsar/pulsar-all` - extends the `apachepulsar/pulsar` image by adding many Pulsar connectors and offloaders | ||
|
||
Since the 2.10.0 release, these docker images run as an unnamed, non-root user that is also part of the root group, by | ||
default. This was done to increase container security. The user is part of the root group to ensure that the container | ||
image can easily run on OpenShift and to ensure that the Pulsar process can write to configuration files. | ||
|
||
## Development | ||
|
||
You can build and test these docker images on your own machine by running the `./build.sh` script in this directory. | ||
Note that you first must build the project in order to have the right dependencies in your local environment. | ||
|
||
## Building Derivative Custom Images | ||
|
||
If you find the `apachepulsar/pulsar-all` docker image too large, but you want to use a connector or an offloader, | ||
you can easily build an image with a curated list of connectors or offloaders based on the official Apache Pulsar | ||
images. You can use the following sample docker image as a guide: | ||
|
||
```Dockerfile | ||
ARG VERSION | ||
|
||
# Load the pulsar-all image as a builder image | ||
FROM apachepulsar/pulsar-all:${VERSION} as pulsar-all | ||
|
||
FROM apachepulsar/pulsar:${VERSION} | ||
|
||
# Add the cassandra connector | ||
COPY --from=pulsar-all /pulsar/connectors/pulsar-io-cassandra-*.nar /pulsar/connectors | ||
|
||
# Add the jcloud offloader | ||
COPY --from=pulsar-all /pulsar/connectors/tiered-storage-jcloud-*.nar /pulsar/offloaders | ||
``` | ||
|
||
NOTE: the above example uses a wildcard in the `COPY` commands because argument expansion does not work for `COPY`. | ||
|
||
Assuming that you have the above `Dockerfile` in your local directory and are running docker on your local host, you can | ||
run the following command to build a custom image with the cassandra connector and the jcloud offloader. | ||
|
||
```shell | ||
docker build --build-arg VERSION=2.9.1 -t pulsar-custom:2.9.1 . | ||
``` | ||
|
||
For reference, here are the sizes of the official 2.9.1 docker images and the custom image built from the above | ||
`Dockerfile`: | ||
|
||
| REPOSITORY | TAG | SIZE | | ||
| :---------------------- | :---- | :----- | | ||
| apachepulsar/pulsar | 2.9.1 | 1.59GB | | ||
| apachepulsar/pulsar-all | 2.9.1 | 3.44GB | | ||
| pulsar-custom | 2.9.1 | 1.6GB | | ||
|
||
|
||
## Troubleshooting non-root containers | ||
|
||
Troubleshooting is harder because the docker image runs as a non-root user. For example, a non-root user won't be able | ||
to download arbitrary utilities. There are several ways to troubleshoot. | ||
|
||
One option is to build a custom docker image that includes your preferred debugging tools. Here is an example of adding | ||
some tools to an existing docker image. | ||
|
||
```Dockerfile | ||
FROM apachepulsar/pulsar:2.10.0 | ||
|
||
# Switch to root user to download tools | ||
USER 0 | ||
|
||
# Install your preferred utilities | ||
RUN apt-get update \ | ||
&& apt-get install -y vim net-tools unzip \ | ||
&& apt-get clean \ | ||
&& rm -rf /var/lib/apt/lists/* | ||
|
||
# Assuming you still want to run as a non root user by default | ||
USER 10000 | ||
``` | ||
|
||
The remaining debug options depend on your environment. For example, if you have access to the host running your | ||
container, you might be able to use the `docker exec` command to shell into the container. By using the `--user` | ||
argument, you can run as the root user. | ||
|
||
If you're running your container on kubernetes, you can override the container's default user by setting the pod's | ||
`securityContext`. | ||
|
||
Bitnami provides a helpful guide here: https://engineering.bitnami.com/articles/running-non-root-containers-on-openshift.html. |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters