Безопасная сетевая конфигурация
Для установки и функционирования системы должны быть разрешены внутренние 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
Teamcity
-
Запросите корневой сертификат rootCA.crt у администратора (ответственного лица) закрытого контура для добавления его в список доверенных CA. Если такая возможность отсутствует, можно скачать сертификаты всех узлов, с которыми будет работать Teamcity.
-
Импортируйте rootCA.crt (или сертификаты доменов) в Teamcity.
-
Авторизовавшись в Teamcity, перейдите на страницу Administration › Projects › <Root project> › Show more › SSL / HTTPS Certificates. Если сертификат имеет формат crt, переименуйте файл, чтобы расширение было pem. Загрузите сертификат и нажмите кнопку Save. После добавления доверенного сертификата на master node, он автоматически добавится в качестве доверенного и на агентах.
-
Создайте директорию в папке инсталляции Teamcity.
$ sudo mkdir certs
-
Запустите teamcity-server и agent и сохраните локально на рабочий узел следующие файлы.
5.1 Для teamcity-server:
$ docker cp <teamcity-server-container-name>:/opt/java/openjdk/lib/security/cacerts certs/server-cacerts $ docker cp <teamcity-server-container-name>:/etc/ssl/certs/ca-certificates.crt certs/ca-certificates.crt
а также в файле docker-compose.yaml в разделе volumes укажите файл server-cacerts и корневой сертификат.
volumes: - ./certs/server-cacerts:/opt/java/openjdk/lib/security/cacerts - ./certs/ca-certificates.crt:/etc/ssl/certs/ca-certificates.crt - ./certs/rootCA.crt:/etc/ssl/certs/self-signed/rootCA.crt
5.2 Для teamcity-agent:
$ docker cp <teamcity-agent-container-name>:/opt/java/openjdk/jre/lib/security/cacerts certs/agent-cacerts
а также в файле docker-compose.yaml в разделах volumes и environment укажите файл agent-cacerts, корневой сертификат и переменную окружения JAVA_OPTS.
environment: - "JAVA_OPTS=-Djavax.net.ssl.trustStore=/opt/java/openjdk/jre/lib/security/cacerts -Djavax.net.ssl.trustStorePassword=changeit" ... volumes: - ./certs/agent-cacerts:/opt/java/openjdk/jre/lib/security/cacerts - ./certs/ca-certificates.crt:/etc/ssl/certs/ca-certificates.crt - ./certs/rootCA.crt:/etc/ssl/certs/self-signed/rootCA.crt
-
Запустите teamcity-server и agent с новыми параметрами.
-
Добавьте сертификат в общее хранилище teamcity-agent в качестве доверенного (пароль по умолчанию —
changeit
).$ docker exec --user root -it <container-name> bash ~ $ cat /etc/ssl/certs/self-signed/rootCA.crt >> /etc/ssl/certs/ca-certificates.crt ~ $ keytool -import -trustcacerts -alias rootCAAlias \ -file /etc/ssl/certs/self-signed/rootCA.crt \ -keystore /opt/java/openjdk/jre/lib/security/cacerts Enter keystore password: changeit Re-enter new password: changeit ... ... Trust this certificate? [no]: yes Certificate was added to keystore
где:
<container-name>
— имя контейнера в системе;-
rootCA.crt
— корневой сертификат, который импортируется в контейнер;Примечание
Если указываются сертификаты доменов, необходимо выполнить данные действия для каждого.
-
rootCAAlias
— имя, которое будет отображаться при просмотре сертификатов в keystore; -
пароль, который будет запрошен, и имя keystoreFile должны соответствовать указанным в конфигурации для JAVA_OPTS.
Важно
Пароль задается именно этой командой, а в JAVA_OPTS он используется.
Примечание
Если rootCA.crt не выдан, выполните эту операцию для каждого сертификата (узла), к которому будет обращаться AppSec.Hub.
-
Добавьте сертификат в общее хранилище teamcity-server.
$ docker exec --user root -it <container-name> bash ~ $ keytool -import -trustcacerts -alias rootCAAlias \ -file /etc/ssl/certs/self-signed/rootCA.crt \ -keystore /opt/java/openjdk/lib/security/cacerts
Добавление сертификатов в 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