Запуск контейнера без прав внесения изменений в корневой файловой системе#

В данном режиме запрещено запускать контейнер с правами внесения изменений в корневой файловой системе. При активации этого режима злоумышленник не сможет записать посторонние исполняемые файлы на диск в корневую файловую систему. Режим настраивается в приложении и активируется настройками в скриптах запуска контейнера. В переменной окружения WRITABLE_PATH задается директория, в которую монтируется директория с правом записи файлов. По умолчанию данная переменная принимает значение "/tmp/kcse". Контейнер определяет режим запуска автоматически.

При запуске приложения в Docker при помощи утилиты docker-compose необходимо при определении сервиса указать параметр "read_only: true" и примонтировать том (см. volumes) в директорию заданную в переменной WRITABLE_PATH.

#docker-compose.yml
services:
  keycloak:
    image: keycloak.se:1.0
    read_only: true
    container_name: keycloak
    environment:
      KEYCLOAK_LOGLEVEL: "INFO"
	...
    volumes:
      - ./tmp:/tmp

При запуске приложения в Kubernetes/Openshift необходимо при определении сервиса указать параметр "readOnlyRootFilesystem: true" и примонтировать том (см. volumeMounts) в директорию, заданную в переменной WRITABLE_PATH. Пример запуска в Openshift:

# pod_readonly.yml
apiVersion: v1
kind: DeploymentConfig
 metadata:
  name: keycloak
  labels:
    name: keycloak
spec:
  containers:
    - name: keycloak
      image: <image_link>
      env:
		...
      securityContext:
        readOnlyRootFilesystem: true
        runAsNonRoot: true
      ports:
        - containerPort: 80
      volumeMounts:
        - mountPath: /tmp
          name: tmp
          readonly: false
        - name: shared-logs
          mountPath: /opt/keycloak/log/
  volumes:
    - name: tmp
      emptyDir: {}
    - name: shared-logs
      emptyDir: {}

При запуске в Kubernetes следует вместо DeploymentConfig указать Deployment.