Перейти к содержанию

Безопасная сетевая конфигурация

Система поддерживает подключение пользователей, а также компонентов системы друг к другу с использованием протокола TLS/SSL.

Настройка HTTPS-соединения

Для настройки HTTPS-соединения следует получить подписанные удостоверяющим центром (CA, Certificate Authority) сертификат в формате PEM и приватный ключ.

  1. Скопируйте полученные сертификаты в папку /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
    
  2. Измените конфигурацию запуска 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
    
  3. Измените конфигурацию /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;
    }
    
  4. Установите права доступа на каталог ssl, а также файлы сертификата и ключа внутри:

    chown -R 101:101 ssl
    chmod 551 ssl
    chmod 644 ssl/fullchain.pem
    chmod 600 ssl/privkey.pem
    
  5. Перезапустите систему:

    docker-compose down && docker-compose up -d
    

Настройка терминирования TLS на каждом сервисе

  1. Измените конфигурацию /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
    
  2. Измените конфигурацию /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
    
  3. Измените конфигурацию /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

  1. Сгенерируйте ключ корневого сертификата.

    openssl genrsa -out rootCA.key 2048
    
  2. Создайте корневой сертификат 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 следует надежно защитить от несанкционированного доступа.

Создание самоподписанного сертификата

  1. Сгенерируйте приватный ключ.

    openssl genrsa -out track.key 2048
    
  2. Сформируйте запрос на сертификат.

    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).

  3. Подпишите запрос сертификата созданным корневым сертификатом, см. раздел «Создание корневого сертификата CA».

    openssl x509 -req -in track.csr -CA rootCA.crt -CAkey rootCA.key \
    -CAcreateserial -out track.crt -days 5000
    

Добавление самоподписанных сертификатов в качестве доверенных

AppSec.Track

  1. Запросите корневой сертификат rootCA.crt у администратора (ответственного лица) закрытого контура для добавления его в список доверенных корневых сертификатов. Если такая возможность отсутствует, можно скачать сертификаты всех узлов, к которым будет обращаться AppSec.Track, и для каждого выполнить операции добавления в keystore.

  2. Создайте папку certs.

    sudo mkdir -p /opt/appsec-track/certs
    
  3. Запустите appsec-track-backend и сохраните локально на рабочий узел файл cacerts.

    docker cp track-backend:/usr/lib/jvm/java-11-openjdk-amd64/lib/security/cacerts /opt/appsec-track/certs/cacerts
    
  4. Остановите appsec-track-backend.

  5. В папку /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
    
  6. Запустите appsec-track-backend с новыми параметрами.

  7. Внутри контейнера 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).

    Примечание

    Если импортируется несколько сертификатов, выполните данную операцию отдельно для каждого.