Безопасная сетевая конфигурация¶
Система поддерживает подключение пользователей, а также компонентов системы друг к другу с использованием протокола TLS/SSL.
Настройка HTTPS-соединения¶
Для настройки HTTPS-соединения следует получить подписанные удостоверяющим центром (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).
Примечание
Если импортируется несколько сертификатов, выполните данную операцию отдельно для каждого.