Безопасная сетевая конфигурация¶
Система поддерживает подключение пользователей, а также компонентов системы друг к другу с использованием протокола TLS/SSL.
Настройка терминирования трафика на Nginx¶
Для настройки терминирования трафика на Nginx следует получить подписанные удостоверяющим центром (CA, Certificate Authority) сертификат в формате PEM и приватный ключ.
-
Скопируйте полученные сертификаты в папку /opt/appsec-track/ssl/:
$ ls -l ./ssl/ total 16 -rw-r--r-- 1 root root 1337 Mar 9 14:35 fullchain.pem -rw------- 1 root root 1679 Mar 9 14:33 privkey.pemКонвертация crt в pem
Для конвертации файла сертификата из формата CRT в PEM можно воспользоваться следующей командой:
openssl x509 -in track.crt -out fullchain.pem -outform PEM -
Измените конфигурацию запуска track-frontend в файле /opt/appsec-track/docker-compose.yml — в секцию volumes необходимо добавить папку, в которой будут храниться ключ и сертификат, а в секцию ports добавить проброс порта (по умолчанию, 443:4443):
ports: - 8070:8080 - 443:4443 volumes: - ./logs/nginx/logs:/var/log/nginx - ./nginx/nginx.conf:/etc/nginx/nginx.conf:ro - ./nginx/default.conf:/etc/nginx/conf.d/default.conf - ./ssl:/etc/ssl/certs/ssl-cert:ro -
Измените конфигурацию /opt/appsec-track/nginx/default.conf для использования SSL:
listen 4443 ssl; # managed by Certbot ssl_certificate /etc/ssl/certs/ssl-cert/fullchain.pem; # managed by Certbot ssl_certificate_key /etc/ssl/certs/ssl-cert/privkey.pem; # managed by Certbot if ($scheme != "https") { return 301 https://$host$request_uri; } -
Установите права доступа на каталог ssl, а также файлы сертификата и ключа внутри:
chown -R 101:101 ssl chmod 551 ssl chmod 644 ssl/fullchain.pem chmod 600 ssl/privkey.pem -
Перезапустите систему:
docker-compose down && docker-compose up -d
Настройка терминирования TLS на каждом сервисе¶
-
Измените конфигурацию /opt/appsec-track/config/application-prod.yml для терминирования TLS на бекенде:
## Раскомментировать для включения TLS на backend # server: # ssl: # key-store: server.jks # key-store-password: ${jks_store_pass} # key-store-type: jks # port: 8443 -
Измените конфигурацию /opt/appsec-track/nginx/default.conf для терминирования TLS на фронтенде:
# Закомментировать для терминирования tls на backend proxy_pass http://appsec-track-backend:8080/api; # Раскомментировать для терминирования tls на backend #proxy_pass https://appsec-track-backend:8443/api;# Раскомментировать для терминирования tls на frontend # # listen 443 ssl; # ssl_certificate /etc/ssl/certs/ssl-cert/fullchain.pem; # managed by Certbot # ssl_certificate_key /etc/ssl/certs/ssl-cert/privkey.pem; # managed by Certbot -
Измените конфигурацию /opt/appsec-track/docker-compose.yml для терминирования TLS на эндпоинтах:
#Раскомментировать для включения TLS или LDAP на backend #entrypoint: /opt/track/entrypoint/entrypoint.sh ... #Раскомментировать для включения TLS на backend и закомментировать порт 8080 #- "8443" ... #Раскомментировать для включения TLS на backend #- ./ssl:/track/tls/certs #Раскомментировать для включения TLS или LDAP на backend #- ./entrypoint/entrypoint.sh:/opt/track/entrypoint/entrypoint.sh:ro ... #Раскомментировать для терминирования TLS #- pksc_store_pass=${pksc_store_pass} #- jks_store_pass=${jks_store_pass} ... #Раскомментировать для терминирования TLS на frontend #- ./ssl:/etc/ssl/certs/ssl-cert:ro
Работа с самоподписанными сертификатами¶
Система также поддерживает работу с использованием самоподписанных сертификатов (к примеру, для подключения к Track.Feed, когда оно проходит через внутренний прокси-сервер, осуществляющий инспецию трафика), однако для этого необходимо осуществить ряд дополнительных настроек.
Создание самоподписанных сертификатов¶
Создание корневого сертификата CA¶
-
Сгенерируйте ключ корневого сертификата.
openssl genrsa -out rootCA.key 2048 -
Создайте корневой сертификат CA.
openssl req -x509 -new -key rootCA.key -days 10000 -out rootCA.crtВ ходе создания корневого сертификата указываются следующие параметры:
Country Name (2 letter code) [AU]: State or Province Name (full name) [Some-State]: Locality Name (eg, city) []: Organization Name (eg, company) [Internet Widgits Pty Ltd]: Organizational Unit Name (eg, section) []: Common Name (e.g. server FQDN or YOUR name) []: Email Address []:Созданный корневой сертификат может использоваться для заверения сертификатов серверов и устанавливаться на клиентские машины.
Внимание
Сертификат rootCA.crt может копироваться на сервера и клиентские машины, а ключ rootCA.key следует надежно защитить от несанкционированного доступа.
Создание самоподписанного сертификата¶
-
Сгенерируйте приватный ключ.
openssl genrsa -out track.key 2048 -
Сформируйте запрос на сертификат.
openssl req -new -key track.key -out track.csrВ ходе выполнения данной команды указываются следующие параметры:
Country Name (2 letter code) [AU]: State or Province Name (full name) [Some-State]: Locality Name (eg, city) []: Organization Name (eg, company) [Internet Widgits Pty Ltd]: Organizational Unit Name (eg, section) []: Common Name (e.g. server FQDN or YOUR name) []:server101.mycloud Email Address []: A challenge password []: An optional company name []:Важно отметить, что на данном этапе в качестве параметра
Common Nameнеобходимо указать имя вашего сервера (домен или IP, например, домен track.mycloud). -
Подпишите запрос сертификата созданным корневым сертификатом, см. раздел «Создание корневого сертификата CA».
openssl x509 -req -in track.csr -CA rootCA.crt -CAkey rootCA.key \ -CAcreateserial -out track.crt -days 5000
Добавление самоподписанных сертификатов в качестве доверенных¶
AppSec.Track¶
-
Запросите корневой сертификат rootCA.crt у администратора (ответственного лица) закрытого контура для добавления его в список доверенных корневых сертификатов. Если такая возможность отсутствует, можно скачать сертификаты всех узлов, к которым будет обращаться AppSec.Track, и для каждого выполнить операции добавления в keystore.
-
Создайте папку certs.
sudo mkdir -p /opt/appsec-track/certs -
Запустите appsec-track-backend и сохраните локально на рабочий узел файл cacerts.
docker cp track-backend:/usr/lib/jvm/java-11-openjdk-amd64/lib/security/cacerts /opt/appsec-track/certs/cacerts -
Остановите appsec-track-backend.
-
В папку /opt/appsec-track/ssl скопируйте rootCA.crt (или сертификаты доменов), а также в разделе appsec-track-backend файла docker-compose.yml добавьте монтирование файла корневого сертификата (если указываются сертификаты доменов, необходимо вместо rootCA.crt указать каждый из них отдельно).
appsec-track-backend: container_name: appsec-track-backend hostname: appsec-track-backend image: ${backend_image} depends_on: appsec-track-db: condition: service_healthy networks: - track_net ports: - "8080" volumes: - ./config/application-prod.yml:/appsec-track/config/application-prod.yml - ./certs/cacerts:/jdk-17.0.2/lib/security/cacerts - ./ssl:/ssl environment: - TZ=Europe/Moscow - pgsql_url=${pgsql_url} - pgsql_port=${pgsql_port} - pgsql_db=${pgsql_db} - pgsql_user=${pgsql_user} - pgsql_password=${pgsql_password} - feed_url=${feed_url} - base_url=${base_url} - redis_host=${redis_host} - redis_port=${redis_port} restart: always deploy: replicas: 1 -
Запустите appsec-track-backend с новыми параметрами.
-
Внутри контейнера appsec-track-backend выполните следующие команды (пароль для хранилища сертификатов по умолчанию —
changeit).$ docker exec --user root -ti appsec-track-backend /bin/sh ~ $ keytool -import -trustcacerts -alias rootCAAlias \ -file /ssl/rootCA.crt \ -keystore /etc/ssl/cacerts:/jdk-17.0.2/lib/security/cacerts Enter keystore password: changeit Re-enter new password: changeit ... ... Trust this certificate? [no]: yes Certificate was added to keystoreгде:
rootCAAlias— имя, которое будет отображаться при просмотре сертификатов в keystore (если импортируется не корневой сертификат, а сертификаты доменов, укажите для них различные имена);- пароль для хранилища сертификатов java (по умолчанию —
changeit); ./etc/ssl/cacerts:/jdk-17.0.2/lib/security/cacerts— файл с сертификатом java (чтобы он сохранился при перезапуске контейнера, подключен как volume).
Примечание
Если импортируется несколько сертификатов, выполните данную операцию отдельно для каждого.
Инструкция по работе с SSL/TLS сертификатами в Helm Chart AppSec.Track¶
Общие сведения¶
Helm Chart AppSec.Track поддерживает использование SSL/TLS сертификатов как на уровне отдельных микросервисов (frontend, backend, scanner), так и глобально для всего релиза.
Основные параметры определяются в файле values.yaml.
Глобальная конфигурация TLS¶
Назначение: Обеспечивает соединение между сервисами по HTTPS.
-
Установите флаг
tls.enabled: true, чтобы включить шифрование:tls: enabled: true -
Если секрет ещё не создан в кластере — включите автосоздание секрета:
tls: ... createSecret: true secretName: mtls crt: <BASE64_СЕРТИФИКАТ> key: <BASE64_КЛЮЧ>иначе укажите имя существующего секрета:
tls: ... createSecret: false secretName: existing-secret-mtls -
Задайте пароли для Java Keystore.
tls: ... keystorepass: pksc: StrongPass1! jks: StrongPass2!
Backend¶
Назначение: Обеспечивает защищённое взаимодействие с LDAP.
Версия чарта >= 3.21.0.
Настройки указываются в .Values.backend.additionalCerts.
-
Задайте пароли для Java Keystore.
backend: ... additionalCerts: keystore: secretName: keystore-backend keystorepass: StrongPass! -
При необходимости заполните блок
certsнужным количеством сертификатов.backend: ... additionalCerts: ... certs: - name: ldap-dev filename: ldap-dev.crt data: <BASE64_СЕРТИФИКАТ> - name: ldap-test filename: ldap-test.crt data: <BASE64_СЕРТИФИКАТ> -
Добавьте сертификат LDAPS.
backend: ... additionalCerts: ... ldaps: enabled: true secretName: ldaps # Если секрет ещё не создан в кластере — включите автосоздание секрета: createSecret: true cert: <BASE64_LDAPS_СЕРТИФИКАТ> -
(Опционально) Для включения шифрования пароля администратора каталога LDAP задайте ключ шифрования.
backend: ... additionalCerts: ... ldaps: ... securekey: <LDAPS_SECURE_KEY>
Scanner¶
Назначение: Используется для безопасного взаимодействия со сторонними Docker Registry (например, Nexus) при включённом HTTPS.
-
Заполните блок
scanner.additionalCertsнужным количеством сертификатов.scanner: ... additionalCerts: - name: ca-nexus-dev filename: nexus-dev.crt data: <BASE64_CA_NEXUS_DEV> - name: ca-nexus-test filename: nexus-test.crt data: <BASE64_CA_NEXUS_TEST> - name: ca-nexus-prod filename: nexus-prod.crt data: <BASE64_CA_NEXUS_PROD>