← Навигация по документации

Защищённые сервисы Архива с использованием Keycloak в качестве сервера аутентификации и сохранением системных логов и логов аудита в Elastic Stack

Убедитесь, что в вашем DNS-сервере есть запись имени хоста для docker-хоста.
(Опционально) Создайте системные группы и пользователей с конкретными ID групп и пользователей, используемых сервисами архива, как описано в Run secured archive services on a single host.
Системная конфигурация для Elasticsearch
$ sudo -i
# sysctl -w vm.swappiness=1
# echo 'vm.swappiness=1' >> /etc/sysctl.conf (чтобы сохранить после перезагрузки)
# exit
$ sudo -i
# sysctl -w vm.max_map_count=262144
# echo 'vm.max_map_count=262144' >> /etc/sysctl.conf (чтобы сохранить после перезагрузки)
# exit
Убедитесь, что Elasticsearch имеет доступ на запись в примонтированные каталоги config, data и log

Если вы монтируете локальный каталог или файл, они должны быть доступны для чтения пользователем elasticsearch. Кроме того, этот пользователь должен иметь право на запись в каталоги config, data и log (Elasticsearch требует доступ на запись в каталог config, чтобы иметь возможность сгенерировать keystore). Хорошая стратегия — предоставить групповой доступ с gid 0 для локального каталога.

Например, чтобы подготовить локальный каталог для хранения данных через bind-mount:

$ sudo mkdir -p /var/local/dcm4chee-arc/esdatadir
$ sudo chmod g+rwx /var/local/dcm4chee-arc/esdatadir
$ sudo chgrp 0 /var/local/dcm4chee-arc/esdatadir
Убедитесь, что Logstash имеет доступ на запись к файлу, используемому для сохранения отпечатка последнего сообщения аудита

Вам необходимо примонтировать файл или родительский каталог, заданный переменной окружения HASH_FILE, к тому или иному тому или каталогу хоста, чтобы избежать создания нового дерева хэшей при каждом пересоздании контейнера. Файл (или родительский каталог) должен быть доступен для записи пользователем logstash контейнера (uid=1000). Напр., для монтирования файла:

$ sudo mkdir -p /var/local/dcm4chee-arc/logstash
$ sudo touch /var/local/dcm4chee-arc/logstash/filter-hashtree
$ sudo chown 1000:1000 /var/local/dcm4chee-arc/logstash/filter-hashtree

или для монтирования родительского каталога

$ sudo mkdir -p /var/local/dcm4chee-arc/logstash
$ sudo chown 1000:1000 /var/local/dcm4chee-arc/logstash  

Продолжите, используя Docker Command Line или Docker Compose:

Использование Docker Command Line

  1. Создайте пользовательскую bridge-сеть

    $ docker network create dcm4chee_default

  2. Запустите Elasticsearch

    Запустите контейнер с Elasticsearch в созданной сети, напр.: $ docker run --network=dcm4chee_default --name elasticsearch \ -e ES_JAVA_OPTS="-Xms1024m -Xmx1024m" \ -e discovery.type=single-node \ -e xpack.security.enabled=false \ -p 9200:9200 \ -p 9300:9300 \ -v /etc/localtime:/etc/localtime:ro \ -v /etc/timezone:/etc/timezone:ro \ -v /var/local/dcm4chee-arc/esdatadir:/usr/share/elasticsearch/data \ -d docker.elastic.co/elasticsearch/elasticsearch:8.15.1

    -e ES_JAVA_OPTS="-Xms1024m -Xmx1024m" — задаёт размер heap JVM, используемый Elasticsearch.

    -e discovery.type=single-node — устанавливает тип discovery в single-node; иначе Elasticsearch не запустится из-за непройденных Bootstrap Checks при старте.

    -e xpack.security.enabled=false — отключает функции безопасности, иначе Logstash не сможет подключиться к Elasticsearch по обычному http.

    -p 9200:9200 \ -p 9300:9300 \ публикует REST-порт (9200) и порт межузлового взаимодействия (9300) Elasticsearch с контейнера на хост, чтобы позволить внешним приложениям получать доступ к Elasticsearch. Это не требуется для работы Архива, поскольку контейнеры Logstash и Kibana подключаются к Elasticsearch через созданную bridge-сеть.

    Bind-mount -v /etc/localtime:/etc/localtime:ro и -v /etc/timezone:/etc/timezone:ro дублирует ваш часовой пояс хоста внутри контейнера. Иначе часовой пояс контейнера — UTC. Внимание: если на вашем хосте нет /etc/timezone, необходимо создать его (напр.: $ echo "Europe/Vienna" > /etc/timezone) перед запуском контейнера, иначе контейнер не запустится.

    Bind-mount -v /var/local/dcm4chee-arc/esdatadir:/usr/share/elasticsearch/data обеспечивает хранение данных в указанном каталоге хоста. Каталог инициализируется при первом запуске контейнера, если он ещё не присутствует в указанном каталоге хоста. Это гарантирует, что данные не теряются при удалении и повторном создании контейнера Elasticsearch.

Дополнительно см. переменные окружения Elasticsearch

  1. Запустите Kibana

    Запустите контейнер с Kibana в созданной сети, напр.: $ docker run --network=dcm4chee_default --name kibana \ -v /etc/localtime:/etc/localtime:ro \ -v /etc/timezone:/etc/timezone:ro \ -d docker.elastic.co/kibana/kibana:8.15.1

    Вы можете разрешить доступ к Kibana из любого веб-браузера без аутентификации пользователя, опубликовав http-порт Kibana с контейнера на хост через -p 5601:5601.

    Иначе веб-браузеры должны получать доступ к Kibana через Keycloak Proxy, который обеспечивает аутентификацию пользователя в Keycloak и перенаправляет HTTP-запросы от авторизованных пользователей к Kibana через созданную bridge-сеть.

    Bind-mount -v /etc/localtime:/etc/localtime:ro и -v /etc/timezone:/etc/timezone:ro дублирует ваш часовой пояс хоста внутри контейнера. Иначе часовой пояс контейнера — UTC. Внимание: если на вашем хосте нет /etc/timezone, необходимо создать его (напр.: $ echo "Europe/Vienna" > /etc/timezone) перед запуском контейнера, иначе контейнер не запустится.

Дополнительно см. переменные окружения Kibana

  1. Запустите Logstash

    Запустите контейнер с Logstash в созданной сети, напр.: $ docker run --network=dcm4chee_default --name logstash \ -p 12201:12201/udp \ -p 8514:8514/udp \ -p 8514:8514 \ -v /etc/localtime:/etc/localtime:ro \ -v /etc/timezone:/etc/timezone:ro \ -v /var/local/dcm4chee-arc/logstash/filter-hashtree:/usr/share/logstash/data/filter-hashtree \ -d dcm4che/logstash-dcm4chee:8.15.1-18

    -p 12201:12201/udp \ -p 8514:8514/udp \ -p 8514:8514 \ публикует настроенный порт GELF Logger (12201) и Syslog (8514) Logstash с контейнера на хост, чтобы позволить внешним приложениям также подключаться к этим портам. Публикация порта GELF Logger также требуется, если другие контейнеры настроили GELF Logging Driver для отправки логов в Logstash. Keycloak и приложение Архива подключаются к Logstash через созданную bridge-сеть, поэтому они не зависят от того, опубликованы ли эти порты на docker-хост.

    Bind-mount -v /etc/localtime:/etc/localtime:ro и -v /etc/timezone:/etc/timezone:ro дублирует ваш часовой пояс хоста внутри контейнера. Иначе часовой пояс контейнера — UTC. Внимание: если на вашем хосте нет /etc/timezone, необходимо создать его (напр.: $ echo "Europe/Vienna" > /etc/timezone) перед запуском контейнера, иначе контейнер не запустится.

    Bind-mount /var/local/dcm4chee-arc/logstash/filter-hashtree:/usr/share/logstash/data/filter-hashtree обеспечивает хранение файла с отпечатком последнего сообщения аудита — настраивается переменной окружения HASH_FILE со значением по умолчанию /usr/share/logstash/data/filter-hashtree — вне контейнера, чтобы избежать создания нового дерева хэшей при каждом пересоздании контейнера. Внимание: файл уже должен существовать и должен быть доступен для записи пользователем logstash контейнера (uid=1000).

    Дополнительно см. переменные окружения Logstash

  2. Запустите OpenLDAP-сервер

    Запустите контейнер с LDAP-сервером в созданной сети, напр.: $ docker run --network=dcm4chee_default --name ldap \ --log-driver gelf \ --log-opt gelf-address=udp://<docker-host>:12201 \ --log-opt tag=slapd \ -p 389:389 \ -e SYSLOG_HOST=logstash \ -e SYSLOG_PORT=8514 \ -e SYSLOG_PROTOCOL=TLS \ -v /var/local/dcm4chee-arc/ldap:/var/lib/openldap/openldap-data \ -v /var/local/dcm4chee-arc/slapd.d:/etc/openldap/slapd.d \ -d dcm4che/slapd-dcm4chee:2.6.10-34.3 который отличается от Run minimum set of archive services on a single host следующим: - --log-driver gelf, --log-opt gelf-address=udp://<docker-host>:12201, --log-opt tag=slapd — настраивает GELF Logging Driver для контейнера. - -e SYSLOG_HOST=logstash, -e SYSLOG_PORT=8514, -e SYSLOG_PROTOCOL=TLS — указывает направлять логи контейнера LDAP-сервера и логи аудита из приложений Keycloak и Архива в контейнер Logstash, используя TLS (по умолчанию: UDP).

Дополнительно см. переменные окружения Slapd

  1. Запустите MariaDB-сервер для сервера аутентификации Keycloak

Запустите контейнер с MariaDB Server в созданной сети, напр.: $ docker run --network=dcm4chee_network --name mariadb \ --log-driver gelf \ --log-opt gelf-address=udp://<docker-host>:12201 \ --log-opt tag=mariadb \ -p 3306:3306 \ -e MYSQL_ROOT_PASSWORD=secret \ -e MYSQL_DATABASE=keycloak \ -e MYSQL_USER=keycloak \ -e MYSQL_PASSWORD=keycloak \ -v /etc/localtime:/etc/localtime:ro \ -v /etc/timezone:/etc/timezone:ro \ -v /var/local/dcm4chee-arc/mysql:/var/lib/mysql \ -d mariadb:10.11.4 который отличается от Run secured archive services on a single host следующим: - --log-driver gelf, --log-opt gelf-address=udp://<docker-host>:12201, --log-opt tag=mariadb — настраивает GELF Logging Driver для контейнера.

  1. Запустите сервер аутентификации Keycloak

    Запустите контейнер с предварительно настроенным сервером аутентификации Keycloak в созданной сети, напр.: $ docker run --network=dcm4chee_default --name keycloak \ --log-driver gelf \ --log-opt gelf-address=udp://<docker-host>:12201 \ --log-opt tag=keycloak \ -p 8843:8843 \ -e KC_HTTPS_PORT=8843 \ -e KC_HOSTNAME=https://<docker-host>:8843 \ -e KC_HOSTNAME_BACKCHANNEL_DYNAMIC=true \ -e KC_BOOTSTRAP_ADMIN_USERNAME=admin \ -e KC_BOOTSTRAP_ADMIN_PASSWORD=changeit \ -e KC_DB=mariadb \ -e KC_DB_URL_DATABASE=keycloak \ -e KC_DB_URL_HOST=mariadb \ -e KC_DB_USERNAME=keycloak \ -e KC_DB_PASSWORD=keycloak \ -e KC_LOG=file,gelf \ -e KC_LOG_GELF_HOST=logstash \ -e ARCHIVE_HOST=<docker-host> \ -e KIBANA_CLIENT_ID=kibana \ -e KIBANA_CLIENT_SECRET=<kibana-client-secret> \ -e KIBANA_REDIRECT_URL=https://<docker-host>:8643/oauth2/callback/* \ -e KEYCLOAK_WAIT_FOR=ldap:389 mariadb:3306 logstash:8514 \ -v /etc/localtime:/etc/localtime:ro \ -v /etc/timezone:/etc/timezone:ro \ -v /var/local/dcm4chee-arc/keycloak:/opt/keycloak/data \ -d dcm4che/keycloak:26.0.6 который отличается от Run secured archive services on a single host следующим: - --log-driver gelf, --log-opt gelf-address=udp://<docker-host>:12201 , --log-opt tag=keycloak — настраивает GELF Logging Driver для контейнера. - -e KC_LOG=file,gelf и -e KC_LOG_GELF_HOST=logstash — включает Quarkus GELF Logger для отправки системных логов в Logstash. - -e KIBANA_CLIENT_ID=kibana — задаёт ID клиента Keycloak для защиты UI Kibana. - -e KIBANA_CLIENT_SECRET=<kibana-client-secret> — задаёт client secret для клиента kibana типа Confidential. То же значение должно использоваться при запуске контейнера oauth2-proxy, описанном ниже. - -e KIBANA_REDIRECT_URL=https://<docker-host>:8643/oauth2/callback/* — задаёт Redirect URL клиента Keycloak для защиты UI Kibana. - -e KEYCLOAK_WAIT_FOR="ldap:389 mariadb:3306 logstash:8514" — задерживает запуск Keycloak до тех пор, пока OpenLDAP, MariaDB и Logstash не начнут прослушивать указанные порты.

Дополнительно см. переменные окружения Keycloak

  1. Запустите PostgreSQL-сервер

    Запустите контейнер с сервером базы данных в созданной сети, напр.: $ docker run --network=dcm4chee_default --name db \ --log-driver gelf \ --log-opt gelf-address=udp://<docker-host>:12201 \ --log-opt tag=postgres \ -p 5432:5432 \ -e POSTGRES_DB=pacsdb \ -e POSTGRES_USER=pacs \ -e POSTGRES_PASSWORD=pacs \ -v /etc/localtime:/etc/localtime:ro \ -v /etc/timezone:/etc/timezone:ro \ -v /var/local/dcm4chee-arc/db:/var/lib/postgresql/data \ -d dcm4che/postgres-dcm4chee:17.4-34

    который отличается от Run secured archive services on a single host следующим: - --log-driver gelf, --log-opt gelf-address=udp://<docker-host>:12201, --log-opt tag=postgres — настраивает GELF Logging Driver для контейнера.

Дополнительно см. переменные окружения PostgreSQL

  1. Запустите Wildfly с развёрнутым приложением dcm4che Archive 5

    Запустите контейнер с Wildfly и развёрнутым приложением dcm4che Archive 5 в созданной сети, напр.: $ docker run --network=dcm4chee_default --name arc \ --log-driver gelf \ --log-opt gelf-address=udp://<docker-host>:12201 \ --log-opt tag=dcm4chee-arc \ -p 8080:8080 \ -p 8443:8443 \ -p 9990:9990 \ -p 9993:9993 \ -p 2762:2762 \ -p 2575:2575 \ -p 12575:12575 \ -p 11112:11112 \ -e LOGSTASH_HOST=logstash \ -e POSTGRES_DB=pacsdb \ -e POSTGRES_USER=pacs \ -e POSTGRES_PASSWORD=pacs \ -e AUTH_SERVER_URL=https://keycloak:8843 \ -e UI_AUTH_SERVER_URL=https://<docker-host>:8843 \ -e WILDFLY_WAIT_FOR="ldap:389 db:5432 keycloak:8843 logstash:8514" \ -v /etc/localtime:/etc/localtime:ro \ -v /etc/timezone:/etc/timezone:ro \ -v /var/local/dcm4chee-arc/wildfly:/opt/wildfly/standalone \ -d dcm4che/dcm4chee-arc-psql:5.34.3-secure который отличается от Run secured archive services on a single host следующим: - --log-driver gelf, --log-opt gelf-address=udp://<docker-host>:12201, --log-opt tag=dcm4chee-arc — настраивает GELF Logging Driver для контейнера. - -e LOGSTASH_HOST=logstash — настраивает GELF Logger на отправку системных логов в Logstash. - -e WILDFLY_WAIT_FOR="ldap:389 db:5432 keycloak:8843 logstash:8514" — задерживает запуск Wildfly до тех пор, пока OpenLDAP slapd, PostgreSQL, Keycloak и Logstash не начнут прослушивать указанные порты.

Дополнительно см. переменные окружения Архива

  1. Проверьте OIDC-клиент для UI Архива в Keycloak, как описано в Run secured archive services on a single host
  2. Проверьте OIDC-клиент для Wildfly Administration Console в Keycloak, как описано в Run secured archive services on a single host
  3. Проверьте OIDC-клиент для OAuth2-Proxy, защищающего Kibana, в Keycloak

    Войдите с пользователем/паролем root/changeit в Realm Admin Console Keycloak по адресу https://<docker-host>:8843/admin/dcm4che/console — необходимо заменить \ на имя хоста docker-хоста. Если вы изменили имя realm по умолчанию: dcm4che через переменную окружения REALM_NAME для контейнеров Keycloak, Keycloak Proxy и Архива, вам также необходимо заменить dcm4che на это значение в URL.

    Docker-образ Keycloak dcm4che/keycloak:26.0.6 и новее создаёт OIDC-клиент для OAuth2-Proxy для защиты Kibana при первом запуске, настраиваемый через переменные окружения KIBANA_CLIENT_ID, KIBANA_CLIENT_SECRET и KIBANA_REDIRECT_URL:

    с Audience Token Mapper audience:

    и Client Credential changeit:

    который вы можете/должны Regenerate Secret и скопировать новое значение, чтобы передать его как переменную окружения OAUTH2_PROXY_CLIENT_SECRET контейнеру OAuth2 Proxy на следующем шаге.

  4. Запустите OAuth2 Proxy для защиты Kibana

    Oauth2-proxy можно настроить через опции командной строки, переменные окружения или конфигурационный файл (в порядке убывания приоритета, т.е. опции командной строки переопределяют переменные окружения, а переменные окружения переопределяют настройки конфигурационного файла).

    Запустите контейнер с OAuth2 Proxy для защиты Kibana в созданной сети, напр.: $ docker run --network=dcm4chee_default --name oauth2-proxy \ -p 8643:8643 \ -e OAUTH2_PROXY_HTTPS_ADDRESS=0.0.0.0:8643 \ -e OAUTH2_PROXY_PROVIDER=keycloak-oidc \ -e OAUTH2_PROXY_SKIP_PROVIDER_BUTTON="true" \ -e OAUTH2_PROXY_UPSTREAMS=http://kibana:5601 \ -e OAUTH2_PROXY_OIDC_ISSUER_URL=https://<docker-host>:8843/realms/dcm4che \ -e OAUTH2_PROXY_REDIRECT_URL=https://<docker-host>:8643/oauth2/callback \ -e OAUTH2_PROXY_ALLOWED_ROLES=auditlog \ -e OAUTH2_PROXY_CLIENT_ID=kibana \ -e OAUTH2_PROXY_CLIENT_SECRET=<kibana-client-secret> \ -e OAUTH2_PROXY_EMAIL_DOMAINS="*" \ -e OAUTH2_PROXY_OIDC_EMAIL_CLAIM="preferred_username" \ -e OAUTH2_PROXY_INSECURE_OIDC_ALLOW_UNVERIFIED_EMAIL="true" \ -e OAUTH2_PROXY_COOKIE_SECRET=T0F1dGhLaWJhbmFUZXN0cw== \ -e OAUTH2_PROXY_SSL_INSECURE_SKIP_VERIFY="true" \ -e OAUTH2_PROXY_TLS_CERT_FILE=/etc/certs/cert.pem \ -e OAUTH2_PROXY_TLS_KEY_FILE=/etc/certs/key.pem \ -e OAUTH2_PROXY_CUSTOM_TEMPLATES_DIR=/templates \ -d dcm4che/oauth2-proxy:7.7.1 \

Примечание: - OAUTH2_PROXY_OIDC_ISSUER_URL: "https://<docker-host>:8843/realms/dcm4che" применяется только для Keycloak v18.0+ и если используется значение по умолчанию KC_HTTP_RELATIVE_PATH. - Если используются более старые версии Keycloak или если KC_HTTP_RELATIVE_PATH установлен в /auth для Keycloak v18.0+, то OAUTH2_PROXY_OIDC_ISSUER_URL: "https://<docker-host>:8843/auth/realms/dcm4che"

- `-p 8643:8643` — публикует https-порт (`8643`) OAuth2-Proxy с контейнера на хост, чтобы
  разрешить подключения от внешних https-клиентов к OAuth2-Proxy, который должен совпадать с
- `-e OAUTH2_PROXY_HTTPS_ADDRESS=0.0.0.0:8643` — портом, который должен прослушиваться, и с портом
- `-e OAUTH2_PROXY_PROVIDER=kibana-oidc` — задаёт OAuth-провайдера.
- `-e OAUTH2_PROXY_SKIP_PROVIDER_BUTTON` опционален. Если установлен в `true`, пропускает страницу входа с указанием
  `Sign-on with Keycloak` и напрямую отображает страницу входа Keycloak.
- `-e OAUTH2_PROXY_UPSTREAMS=http://kibana:5601` — задаёт https URL Kibana как upstream-эндпоинт
- `-e OAUTH2_PROXY_OIDC_ISSUER_URL=https://<docker-host>:8843/realms/dcm4che` — задаёт URL издателя OpenID Connect,
  в котором порт (`8843`) ссылается на `KC_HTTPS_PORT`, использованный при запуске контейнера keycloak
- `-e OAUTH2_PROXY_REDIRECT_URL=https://<docker-host>:8643/oauth2/callback` — URL перенаправления для
  callback URL сервера аутентификации Keycloak — необходимо заменить _\<docker-host>_ на имя хоста docker-хоста, которое должно
  разрешаться вашим DNS-сервером.
- `-e OAUTH2_PROXY_ALLOWED_ROLES=auditlog` — (keycloak-oidc) ограничивает вход членами этих ролей (можно указывать несколько раз)
- `-e OAUTH2_PROXY_CLIENT_ID=kibana` — задаёт Client ID, используемый для аутентификации на сервере Keycloak,
- `-e OAUTH2_PROXY_CLIENT_SECRET=<kibana-client-secret>` — задаёт Client Secret, используемый для аутентификации
  на сервере аутентификации Keycloak для клиента _kibana_ типа _Confidential_. Значение должно совпадать с тем, что использовалось 
  при запуске контейнера _keycloak_. 
- `-e OAUTH2_PROXY_EMAIL_DOMAINS="*"` как `*` — аутентифицировать любой email.
- `-e OAUTH2_PROXY_OIDC_EMAIL_CLAIM="preferred_username"` — какой claim OIDC содержит email пользователя (по умолчанию "email")
- `-e OAUTH2_PROXY_INSECURE_OIDC_ALLOW_UNVERIFIED_EMAIL="true"` — не завершать работу ошибкой, если адрес email в id_token не проверен
- `-e OAUTH2_PROXY_COOKIE_SECRET=T0F1dGhLaWJhbmFUZXN0cw==` — задаёт seed-строку для защищённых cookies (опционально в base64)
- `-e OAUTH2_PROXY_SSL_INSECURE_SKIP_VERIFY=true` как `true` — пропускает проверку сертификатов, предоставляемых при использовании HTTPS
- `-e OAUTH2_PROXY_CUSTOM_TEMPLATES_DIR` задаёт расположение каталога пользовательских шаблонов, содержащего настроенную
  страницу ошибки запрета доступа, отображаемую неавторизованным пользователям при аутентификации. Примечание: в OAuth2 proxy пока нет механизма
  для настройки только одного из шаблонов (т.е. sign_in или error). Поэтому, если требуется настроить только один, оба шаблона
  всё равно необходимо предоставить.
- `-e OAUTH2_PROXY_TLS_CERT_FILE` и `OAUTH2_PROXY_TLS_KEY_FILE` задают пути к TLS-сертификату и приватному ключу в
      формате [Privacy-Enhanced Mail (PEM)](https://en.wikipedia.org/wiki/Privacy-Enhanced_Mail) для использования поддержки TLS.
      Чтобы избежать предупреждений безопасности веб-браузеров при подключении к Kibana через OAuth2 Proxy, замените сертификат, предоставленный в
      `/etc/certs/cert.pem` docker-образа:
      ![](/wp-content/uploads/dcm4chee-ru/images/images/cert.png)

   сертификатом, чьи _Common Name_ и/или _Subject Alt Name_ совпадают с именем хоста и который подписан
   доверенным издателем; примонтируйте PEM-файлы с сертификатом и соответствующим приватным ключом и скорректируйте
   `OAUTH2_PROXY_TLS_CERT_FILE` и `OAUTH2_PROXY_TLS_KEY_FILE`, чтобы они ссылались на их пути внутри контейнера.

```
$ docker run --rm dcm4che/oauth2-proxy:7.7.1 help
```
покажет все доступные переменные окружения и опции команд. См. также [OAuth2 Proxy](https://oauth2-proxy.github.io/oauth2-proxy/docs/configuration/overview/)
а также [Keycloak OIDC Auth Provider](https://oauth2-proxy.github.io/oauth2-proxy/docs/configuration/oauth_provider#keycloak-oidc-auth-provider)
[Keycloak](https://www.keycloak.org) для дополнительной информации о параметрах конфигурации OAuth2 Proxy.

Дополнительно см. [переменные окружения OAuth2-Proxy](https://github.com/dcm4che-dockerfiles/oauth2-proxy#readme)
  1. Вы можете остановить все 9 контейнеров командой:

    $ docker stop elasticsearch kibana logstash ldap mariadb keycloak oauth2-proxy db arc

    и запустить все 9 контейнеров снова командой:

    $ docker start elasticsearch kibana logstash ldap mariadb keycloak oauth2-proxy db arc

  2. Вы можете удалить остановленные контейнеры командой
    ```
    $ docker rm -v elasticsearch kibana logstash ldap mariadb keycloak oauth2-proxy db arc
    ```
    

    Вы можете удалить созданную bridge-сеть командой $ docker network rm dcm4chee_default

Использование Docker Compose

В качестве альтернативы Docker Command Line можно использовать Docker Compose для запуска всех 8 контейнеров:

  1. Опишите сервисы в конфигурационном файле docker-compose.yml (напр.):

    yaml version: "3" services: elasticsearch: image: docker.elastic.co/elasticsearch/elasticsearch:8.15.1 environment: ES_JAVA_OPTS: -Xms1024m -Xmx1024m discovery.type: single-node xpack.security.enabled: "false" logging: driver: json-file options: max-size: "10m" ports: - "9200:9200" - "9300:9300" volumes: - /etc/localtime:/etc/localtime:ro - /etc/timezone:/etc/timezone:ro - /var/local/dcm4chee-arc/esdatadir:/usr/share/elasticsearch/data kibana: image: docker.elastic.co/kibana/kibana:8.15.1 logging: driver: json-file options: max-size: "10m" depends_on: - elasticsearch volumes: - /etc/localtime:/etc/localtime:ro - /etc/timezone:/etc/timezone:ro logstash: image: dcm4che/logstash-dcm4chee:8.15.1-18 logging: driver: json-file options: max-size: "10m" ports: - "12201:12201/udp" - "8514:8514/udp" - "8514:8514" depends_on: - elasticsearch volumes: - /etc/localtime:/etc/localtime:ro - /etc/timezone:/etc/timezone:ro - /var/local/dcm4chee-arc/logstash/filter-hashtree:/usr/share/logstash/data/filter-hashtree ldap: image: dcm4che/slapd-dcm4chee:2.6.10-34.3 logging: driver: gelf options: gelf-address: "udp://<docker-host>:12201" tag: slapd ports: - "389:389" - "636:636" environment: SYSLOG_HOST: logstash SYSLOG_PORT: 8514 SYSLOG_PROTOCOL: TLS STORAGE_DIR: /storage/fs1 volumes: - /var/local/dcm4chee-arc/ldap:/var/lib/openldap/openldap-data - /var/local/dcm4chee-arc/slapd.d:/etc/openldap/slapd.d mariadb: image: mariadb:10.11.4 logging: driver: gelf options: gelf-address: "udp://<docker-host>:12201" tag: mariadb ports: - "3306:3306" environment: MYSQL_ROOT_PASSWORD: secret MYSQL_DATABASE: keycloak MYSQL_USER: keycloak MYSQL_PASSWORD: keycloak volumes: - /etc/localtime:/etc/localtime:ro - /etc/timezone:/etc/timezone:ro - /var/local/dcm4chee-arc/mysql:/var/lib/mysql keycloak: image: dcm4che/keycloak:26.0.6 logging: driver: gelf options: gelf-address: "udp://<docker-host>:12201" tag: keycloak ports: - "8843:8843" environment: KC_HTTPS_PORT: 8843 KC_HOSTNAME: https://<docker-host>:8843 KC_HOSTNAME_BACKCHANNEL_DYNAMIC: 'true' KC_BOOTSTRAP_ADMIN_USERNAME: admin KC_BOOTSTRAP_ADMIN_PASSWORD: changeit KC_DB: mariadb KC_DB_URL_DATABASE: keycloak KC_DB_URL_HOST: mariadb KC_DB_USERNAME: keycloak KC_DB_PASSWORD: keycloak KC_LOG: file,gelf KC_LOG_GELF_HOST: logstash ARCHIVE_HOST: <docker-host> KIBANA_CLIENT_ID: kibana KIBANA_CLIENT_SECRET: <kibana-client-secret> KIBANA_REDIRECT_URL: https://<docker-host>:8643/oauth2/callback/* KEYCLOAK_WAIT_FOR: ldap:389 mariadb:3306 logstash:8514 depends_on: - ldap - mariadb volumes: - /etc/localtime:/etc/localtime:ro - /etc/timezone:/etc/timezone:ro - /var/local/dcm4chee-arc/keycloak:/opt/keycloak/data oauth2-proxy: image: dcm4che/oauth2-proxy:7.7.1 ports: - "8643:8643" restart: on-failure environment: OAUTH2_PROXY_HTTPS_ADDRESS: 0.0.0.0:8643 OAUTH2_PROXY_PROVIDER: keycloak-oidc OAUTH2_PROXY_SKIP_PROVIDER_BUTTON: "true" OAUTH2_PROXY_UPSTREAMS: "http://kibana:5601" OAUTH2_PROXY_OIDC_ISSUER_URL: "https://<docker-host>:8843/realms/dcm4che" OAUTH2_PROXY_REDIRECT_URL: "https://<docker-host>:8643/oauth2/callback" OAUTH2_PROXY_ALLOWED_ROLES: auditlog OAUTH2_PROXY_CLIENT_ID: kibana OAUTH2_PROXY_CLIENT_SECRET: <kibana-client-secret> OAUTH2_PROXY_EMAIL_DOMAINS: "*" OAUTH2_PROXY_OIDC_EMAIL_CLAIM: "sub" OAUTH2_PROXY_INSECURE_OIDC_ALLOW_UNVERIFIED_EMAIL: "true" OAUTH2_PROXY_COOKIE_SECRET: T0F1dGhLaWJhbmFUZXN0cw== OAUTH2_PROXY_SSL_INSECURE_SKIP_VERIFY: "true" OAUTH2_PROXY_TLS_CERT_FILE: /etc/certs/cert.pem OAUTH2_PROXY_TLS_KEY_FILE: /etc/certs/key.pem OAUTH2_PROXY_CUSTOM_TEMPLATES_DIR: /templates depends_on: - keycloak db: image: dcm4che/postgres-dcm4chee:17.4-34 logging: driver: gelf options: gelf-address: "udp://<docker-host>:12201" tag: postgres ports: - "5432:5432" environment: POSTGRES_DB: pacsdb POSTGRES_USER: pacs POSTGRES_PASSWORD: pacs depends_on: - logstash volumes: - /etc/localtime:/etc/localtime:ro - /etc/timezone:/etc/timezone:ro - /var/local/dcm4chee-arc/db:/var/lib/postgresql/data arc: image: dcm4che/dcm4chee-arc-psql:5.34.3-secure logging: driver: gelf options: gelf-address: "udp://<docker-host>:12201" tag: dcm4chee-arc ports: - "8080:8080" - "8443:8443" - "9990:9990" - "9993:9993" - "11112:11112" - "2762:2762" - "2575:2575" - "12575:12575" environment: LOGSTASH_HOST: logstash POSTGRES_DB: pacsdb POSTGRES_USER: pacs POSTGRES_PASSWORD: pacs AUTH_SERVER_URL: https://keycloak:8843 UI_AUTH_SERVER_URL: https://<docker-host>:8843 WILDFLY_CHOWN: /storage WILDFLY_WAIT_FOR: ldap:389 db:5432 keycloak:8843 logstash:8514 depends_on: - ldap - keycloak - db - logstash volumes: - /etc/localtime:/etc/localtime:ro - /etc/timezone:/etc/timezone:ro - /var/local/dcm4chee-arc/wildfly:/opt/wildfly/standalone - /var/local/dcm4chee-arc/storage:/storage вам необходимо заменить \ на имя хоста docker-хоста, которое должно разрешяться вашим DNS-сервером.

Доступные переменные окружения для контейнеров: - Slapd - PostgreSQL - Archive - Keycloak - MariaDB - Logstash - OAuth2-Proxy - Kibana - Elasticsearch

Примечание: - OAUTH2_PROXY_OIDC_ISSUER_URL: "https://<docker-host>:8843/realms/dcm4che" применяется только для Keycloak v18.0+ и если используется значение по умолчанию KC_HTTP_RELATIVE_PATH. - Если используются более старые версии Keycloak или если KC_HTTP_RELATIVE_PATH установлен в /auth для Keycloak v18.0+, то OAUTH2_PROXY_OIDC_ISSUER_URL: "https://<docker-host>:8843/auth/realms/dcm4che" - Если возникают сложности с запуском сервиса архива из-за There is insufficient memory for the Java Runtime Environment to continue. Cannot create GC thread. Out of system resources. добавьте следующую опцию к сервису arc security_opt: - seccomp:unconfined

  1. Создайте и запустите все 8 контейнеров

    console $ docker-compose -p dcm4chee up -d Creating network "dcm4chee_default" with the default driver Creating dcm4chee_elasticsearch_1 ... done Creating dcm4chee_logstash_1 ... done Creating dcm4chee_ldap_1 ... done Creating dcm4chee_mariadb_1 ... done Creating dcm4chee_db_1 ... done Creating dcm4chee_kibana_1 ... done Creating dcm4chee_keycloak_1 ... done Creating dcm4chee_arc_1 ... done Creating dcm4chee_oauth2-proxy_1 ... done в каталоге, содержащем docker-compose.yml.

  2. Зарегистрируйте UI Архива как OIDC-клиент в Keycloak, как описано в Run secured archive services on a single host.
  3. Зарегистрируйте WildFly Administration Console как OIDC-клиент в Keycloak, как описано в Run secured archive services on a single host.
  4. Зарегистрируйте OAuth2 Proxy как OIDC-клиент в Keycloak, как описано выше
  5. (Условно) Пересоздайте и запустите контейнер с OAuth2 Proxy с скорректированным Client Secret
    Если вы настроили клиент для OAuth2 Proxy с `Access Type: confidential`, необходимо скорректировать значение
    переменной окружения `OAUTH2_PROXY_CLIENT_SECRET` сервиса `oauth2-proxy` в `docker-compose.yml`, чтобы
    оно совпадало с фактическим значением на вкладке `Credentials` для OIDC-клиента в Realm Admin Console Keycloak,
    и пересоздать и перезапустить контейнер OAuth2 Proxy командой
    ```console
    $ docker-compose -p dcm4chee up -d
    dcm4chee_elasticsearch_1 is up-to-date
    dcm4chee_kibana_1 is up-to-date
    dcm4chee_logstash_1 is up-to-date
    dcm4chee_ldap_1 is up-to-date
    dcm4chee_mariadb_1 is up-to-date
    dcm4chee_db_1 is up-to-date
    dcm4chee_keycloak_1 is up-to-date
    Recreating dcm4chee_oauth2-proxy_1 ... 
    Recreating dcm4chee_oauth2-proxy_1 ... done
    ```
    в каталоге, содержащем `docker-compose.yml`.
    
  6. Вы можете остановить все 9 контейнеров командой:
    ```console
    $ docker-compose -p dcm4chee stop
    Stopping dcm4chee_arc_1                 ... done
    Stopping dcm4chee_oauth2-proxy_1        ... done
    Stopping dcm4chee_keycloak_1            ... done
    Stopping dcm4chee_kibana_1              ... done
    Stopping dcm4chee_logstash_1            ... done
    Stopping dcm4chee_elasticsearch_1       ... done
    Stopping dcm4chee_mariadb_1             ... done
    Stopping dcm4chee_db_1                  ... done
    Stopping dcm4chee_ldap_1                ... done
    ```
    

    и запустить все 8 контейнеров снова командой: console $ docker-compose -p dcm4chee start Starting db ... done Starting elasticsearch ... done Starting kibana ... done Starting ldap ... done Starting mariadb ... done Starting logstash ... done Starting keycloak ... done Starting oauth2-proxy ... done Starting arc ... done

  7. Вы можете остановить и удалить все 9 контейнеров командой
    ```console
    $ docker-compose -p dcm4chee down
    Stopping dcm4chee_arc_1                 ... done
    Stopping dcm4chee_oauth2-proxy_1        ... done
    Stopping dcm4chee_keycloak_1            ... done
    Stopping dcm4chee_kibana_1              ... done
    Stopping dcm4chee_logstash_1            ... done
    Stopping dcm4chee_elasticsearch_1       ... done
    Stopping dcm4chee_mariadb_1             ... done
    Stopping dcm4chee_db_1                  ... done
    Stopping dcm4chee_ldap_1                ... done
    Removing dcm4chee_arc_1                 ... done
    Removing dcm4chee_oauth2-proxy_1        ... done
    Removing dcm4chee_keycloak_1            ... done
    Removing dcm4chee_kibana_1              ... done
    Removing dcm4chee_logstash_1            ... done
    Removing dcm4chee_elasticsearch_1       ... done
    Removing dcm4chee_mariadb_1             ... done
    Removing dcm4chee_db_1                  ... done
    Removing dcm4chee_ldap_1                ... done
    Removing network dcm4chee_default
    ```