Безопасная сетевая конфигурация
Для установки и функционирования системы должны быть разрешены внутренние HTTPS сетевые соединения.
Настройка HTTPS-соединения
Для настройки HTTPS-соединения следует получить подписанные удостоверяющим центром (CA, Certificate Authority) сертификаты (открытый и закрытый) в формате PEM.
Шаги настройки:
-
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
-
Измените конфигурацию запуска 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
-
Измените конфигурацию /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
-
Сгенерируйте ключ корневого сертификата.
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 server101.mycloud.key 2048
-
Сформируйте запрос на сертификат.
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). -
Подпишите запрос сертификата созданным корневым сертификатом, см. раздел «Создание корневого сертификата CA».
openssl x509 -req -in server101.mycloud.csr -CA rootCA.crt -CAkey rootCA.key \ -CAcreateserial -out server101.mycloud.crt -days 5000
Добавление самоподписанных сертификатов в качестве доверенных
AppSec.Hub
-
Запросите корневой сертификат rootCA.crt у администратора (ответственного лица) закрытого контура для добавления его в список доверенных корневых сертификатов. Если такая возможность отсутствует, можно скачать сертификаты всех узлов, к которым будет обращаться AppSec.Hub, и для каждого выполнить операции добавления в keystore.
-
Создайте папку certs.
sudo mkdir -p /opt/apphub/certs
-
Запустите 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
-
Остановите hub-core.
-
В папку /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
-
Запустите hub-core с новыми параметрами.
-
Внутри контейнера 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
-
Запросите корневой сертификат rootCA.crt у администратора (ответственного лица) закрытого контура для добавления его в список доверенных CA. Если такая возможность отсутствует, можно скачать сертификаты всех узлов, с которыми будет работать Jenkins.
-
Создайте папку certs.
sudo mkdir -p certs
-
Сохраните в 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
-
Импортируйте папку certs в контейнеры node-all и jenkins (через docker-compose.yml).
volumes: - ./certs:/tmp/certs
-
Для активации автоматического импорта самоподписанных сертификатов 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
-
При необходимости запросите сертификат и приватный ключ для AppSec.Hub у администратора (ответственного лица) закрытого контура или создайте свой ключ и передайте его на подпись, а затем дождитесь подписанного сертификата.
-
Скопируйте полученный сертификат в папку ./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
-
Измените конфигурацию запуска 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
-
Измените конфигурацию ./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; }
-
Перезапустите 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
-
Перейдите Jenkins › Manage Jenkins › Configure System › Global properties › Environment variables.
-
Добавьте переменную
APPSECHUB_INSECURE
со значениемTrue
(не валидировать SSL-сертификаты).
Примечание
Переменная добавляется для всех проектов.
В настройках проекта значение переменной указываться не будет.
Убедиться, что значение верно можно в логах билдов или в Console Output проекта, см. значение параметра --insecure
в вызовах python-скриптов.