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

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

Для установки и функционирования системы должны быть разрешены внутренние HTTPS сетевые соединения.

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

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

Шаги настройки:

  1. Cкопируйте полученные сертификаты в папку /opt/apphub/ssl:

    ls -l ./ssl/
    total 16
    -rw-r--r-- 1 root root 1277 Mar 9 14:33 hub.crt
    -rw------- 1 root root 1679 Mar 9 14:33 hub.key
    
  2. Измените конфигурацию запуска hub-ui — в секцию volumes добавьте папку, в которой будут храниться ключ и сертификат:

    volumes:
        - ./nginx/hub.conf:/etc/nginx/conf.d/default.conf:ro
        - ./logs/hub-ui:/var/log/nginx
        - ./ssl:/etc/ssl/certs/ssl-cert:ro
    
  3. Измените конфигурацию /opt/apphub/nginx/hub.conf (hub-ui), для использования SSL:

    listen 443 ssl;
    ssl_certificate /etc/ssl/certs/ssl-cert/hub.crt; # certificate
    ssl_certificate_key /etc/ssl/certs/ssl-cert/hub.key; # private key
    if ($scheme != "https") { # redirect 80 to 443
        return 301 https://$host$request_uri;
    }
    

Особенности настройки HTTPS в закрытом контуре

Если AppSec.Hub устанавливается в закрытом контуре, возникает необходимость использования самоподписанных сертификатов.

Создание самоподписанных сертификатов

Создание корневого сертификата 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 server101.mycloud.key 2048
    
  2. Сформируйте запрос на сертификат.

    openssl req -new -key server101.mycloud.key -out server101.mycloud.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, например, домен server101.mycloud).

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

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

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

AppSec.Hub

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

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

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

    docker cp hub-core:/usr/lib/jvm/java-11-amazon-corretto/lib/security/cacerts /opt/apphub/certs/cacerts
    
    docker cp hub-core:/etc/ssl/certs/java/cacerts /opt/apphub/certs/cacerts
    
  4. Остановите hub-core.

  5. В папку /opt/apphub/certs скопируйте rootCA.crt (или сертификаты доменов), а также в разделе hub-core файла docker-compose.yaml раскомментируйте следующие строки (если указываются сертификаты доменов, необходимо вместо rootCA.crt указать каждый из них отдельно).

    Примечание

    Пример файла docker-compose.yaml приведен в «Приложении 9. Пример docker-compose.yml для контейнера AppSec.hub.

    hub-core:
        image: docker.swordfishsecurity.com/appsechub/hub-core:${hub_core_version}
        container_name: hub-core
        networks:
            - net-hub
        environment:
            - UMASK=0022
            - HUB_LOG_LEVEL=debug
            - TZ=Europe/Moscow
        tmpfs:
            - /usr/local/tomcat/temp/:uid=2000,gid=2000
            - /usr/local/tomcat/work/:uid=2000,gid=2000
        volumes:
            - ./logs/hub-core:/usr/local/tomcat/logs
            - ./config/hub-core/app.properties:/usr/local/tomcat/webapps/hub/WEB-INF/classes/app.properties
            - ./config/hub-core/auth.properties:/usr/local/tomcat/webapps/hub/WEB-INF/classes/auth.properties
            #- ./certs/rootCA.crt:/etc/ssl/certs/self-signed/rootCA.crt
            #- ./certs/cacerts:/usr/lib/jvm/java-11-amazon-corretto/lib/security/cacerts
        pids_limit: 400
        security_opt:
            - no-new-privileges
        restart: on-failure:5
    
    hub-core:
        image: docker.swordfishsecurity.com/appsechub/hub-core:${hub_core_version}
        container_name: hub-core
        networks:
            - net-hub
        environment:
            - UMASK=0022
            - HUB_LOG_LEVEL=debug
            - TZ=Europe/Moscow
        tmpfs:
            - /usr/local/tomcat/temp/:uid=2000,gid=2000
            - /usr/local/tomcat/work/:uid=2000,gid=2000
        volumes:
            - ./logs/hub-core:/usr/local/tomcat/logs
            - ./config/hub-core/app.properties:/usr/local/tomcat/webapps/hub/WEB-INF/classes/app.properties
            - ./config/hub-core/auth.properties:/usr/local/tomcat/webapps/hub/WEB-INF/classes/auth.properties
            #- ./certs/rootCA.crt:/etc/ssl/certs/self-signed/rootCA.crt
            #- ./certs/cacerts:/etc/ssl/certs/java/cacerts
        pids_limit: 400
        security_opt:
            - no-new-privileges
        restart: on-failure:5
    
  6. Запустите hub-core с новыми параметрами.

  7. Внутри контейнера hub-core выполните следующие команды (пароль для хранилища сертификатов по умолчанию — changeit).

    docker exec --user root -ti hub-core /bin/sh
    ~ keytool  -import  -trustcacerts -alias rootCAAlias \
            -file /etc/ssl/certs/self-signed/rootCA.crt \
            -keystore /usr/lib/jvm/java-11-amazon-corretto/lib/security/cacerts
    Enter keystore password: changeit
    Re-enter new password: changeit
    ...
    ...
    Trust this certificate? [no]:  yes
    Certificate was added to keystore
    
    docker exec --user root -ti hub-core /bin/sh
    ~ keytool  -import  -trustcacerts -alias rootCAAlias \
            -file /etc/ssl/certs/self-signed/rootCA.crt \
            -keystore /etc/ssl/certs/java/cacerts
    Enter keystore password: changeit
    Re-enter new password: changeit
    ...
    ...
    Trust this certificate? [no]:  yes
    Certificate was added to keystore
    

    где:

    • rootCAAlias — имя, которое будет отображаться при просмотре сертификатов в keystore (если импортируется не корневой сертификат, а сертификаты доменов, укажите для них различные имена);
    • пароль для хранилища сертификатов java (по умолчанию — changeit);
    • /usr/lib/jvm/java-11-amazon-corretto/lib/security/cacerts или /etc/ssl/certs/java/cacerts — файл с сертификатом java (чтобы он сохранился при перезапуске контейнера, подключен как volume).

    Примечание

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

Jenkins

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

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

    sudo mkdir -p certs
    
  3. Сохраните в certs ВСЕ корневые и доменные сертификаты с расширением .crt и укажите необходимые разрешения.

    sudo chmod 775 -R certs
    sudo chown 1000:2000 -R certs
    
    REMAP_UID=$(cat /etc/subuid | grep -i $USER | awk -F : '{print $2}')
    UID_2000=$((${REMAP_UID}+1999))
    UID_1000=$((${REMAP_UID}+999))
    
    sudo chmod 775 -R certs
    sudo chown ${UID_1000}:${UID_2000} -R certs
    
  4. Импортируйте папку certs в контейнеры node-all и jenkins (через docker-compose.yml).

    volumes: 
        - ./certs:/tmp/certs
    
  5. Для активации автоматического импорта самоподписанных сертификатов docker registry создайте папку docker-certs/<repo>, где <repo> — container registry, который указывается при авторизации, например, если необходимо выполнить вход с помощью команды docker login gitlab.example.com, создайте директорию docker-certs/gitlab.example.com и сохраните корневой сертификат или сертификат домена в ней.

    sudo mkdir -p docker-certs/<repo>
    

    Сохраните ВСЕ корневые и доменные сертификаты в созданной папке и импортируйте в контейнер docker-in-docker (через docker-compose.yml).

    volumes: 
          - ./docker-certs:/etc/docker/certs.d
    

Добавление сертификатов в hub-ui

  1. При необходимости запросите сертификат и приватный ключ для AppSec.Hub у администратора (ответственного лица) закрытого контура или создайте свой ключ и передайте его на подпись, а затем дождитесь подписанного сертификата.

  2. Скопируйте полученный сертификат в папку ./ssl.

    ls -al ./ssl/
    total 16
    drwxr-xr-x 2 root   root   4096 Mar  9 14:33 .
    drwxr-xr-x 7 ubuntu ubuntu 4096 Mar 10 07:45 ..
    -rw-r--r-- 1 root   root   1277 Mar  9 14:33 hub.crt
    -rw------- 1 root   root   1679 Mar  9 14:33 hub.key
    
  3. Измените конфигурацию запуска hub-ui. В секцию volumes добавьте папку, в которой будут храниться ключ и сертификат:

    volumes:
        - ./nginx/hub.conf:/etc/nginx/conf.d/default.conf:ro
        - ./logs/nginx/logs:/var/log/nginx
        - ./ssl:/etc/ssl/certs/ssl-cert:ro
    
  4. Измените конфигурацию ./nginx/hub.conf (hub-ui) , для использования SSL:

    listen 443 ssl; 
    ssl_certificate /etc/ssl/certs/ssl-cert/hub.crt; # certificate
    ssl_certificate_key /etc/ssl/certs/ssl-cert/hub.key; #  private key
    
    if ($scheme != "https") {   #uncomment for redirect 80 to 443
        return 301 https://$host$request_uri;
    }
    
  5. Перезапустите hub-ui.

Добавление сертификатов в hub-cli

Для добавления самоподписанного сертификата в контейнер hub-cli, если он интегрируется в DevOps-пайплайн, необходимо перед запуском сканирования вставить следующий код. Рекомендуется сохранить сертификат как переменную окружения в репозитории (в примере ниже переменная названа ROOT_CA).

echo $ROOT_CA >> /etc/ssl/certs/ca-certificates.crt
echo $ROOT_CA > /etc/ssl/certs/self-signed/rootCA.crt
export REQUESTS_CA_BUNDLE=/etc/ssl/certs/self-signed/rootCA.crt

Запуск интеграционных python-скриптов

Для запуска интеграционных python-скриптов (описание скриптов см. в разделе «AppSec.Hub CLI»), которые будут обращаться к хостам с самоподписанными SSL-сертификатами, необходимо установить следующую переменную окружения:

REQUESTS_CA_BUNDLE=/etc/ssl/certs/self-signed/rootCA.crt

Отключение валидации SSL-сертификатов в TeamCity и Jenkins

Чтобы обеспечить возможность запуска интеграционных python-скриптов AppSec.Hub в тестовом окружении, предусмотрена возможность отключения валидации SSL-сертификатов. Для этого необходимо присвоить параметру --insecure значение True. Если оставить значение по умолчанию — False, при попытках работы с такими ресурсами Python будет выдавать ошибку.

Оптимальным решением проблемы с точки зрения трудозатрат на конфигурирование является указание переменной окружения APPSECHUB_INSECURE в Jenkins или TeamCity.

Если эта переменная не указана, значение параметра --insecure будет равно значению по умолчанию — False, т. е. SSL-сертификаты валидируются.

Добавление переменной окружения APPSECHUB_INSECURE в Jenkins
  1. Перейдите JenkinsManage JenkinsConfigure SystemGlobal propertiesEnvironment variables.

  2. Добавьте переменную APPSECHUB_INSECURE со значением True (не валидировать SSL-сертификаты).

Примечание

Переменная добавляется для всех проектов.

В настройках проекта значение переменной указываться не будет.

Убедиться, что значение верно можно в логах билдов или в Console Output проекта, см. значение параметра --insecure в вызовах python-скриптов.

К началу