Задание 3: Сертификаты TLS
В этом разделе мы изучим процесс установки, генерации и настройки SSL-сертификатов для защищенного кластера Pangolin, научимся работать с утилитой OpenSSL и управлять сертификатами на нескольких узлах кластера.
Проверка и установка необходимого ПО
-
Подключитесь к основному серверу кластера (
srv1) и установите OpenSSL:[student@srv1 ~]$ sudo dnf install -y opensslUpdating Subscription Management repositories.redos8.0-for-x86_64-powertools-rpms 7.7 kB/s | 2.6 kB 00:00redos8.0-for-x86_64-baseos-rpms 6.5 kB/s | 2.3 kB 00:00redos8.0-for-x86_64-baseos-debug-rpms 6.5 kB/s | 2.0 kB 00:00redos8.0-for-x86_64-appstream-rpms 8.5 kB/s | 2.6 kB 00:00redos8.0-for-x86_64-appstream-debug-rpms 6.1 kB/s | 2.0 kB 00:00Package openssl-1:3.5.5-2.sl9_8^1.x86_64 is already installed.Dependencies resolved.Nothing to do.Complete!Если вы получили такое сообщение, то это означает, что установка ПО была произведена ранее.
-
Проверьте версии OpenSSL на всех узлах кластера:
[student@srv1 ~]$ for comp in srv{1..3}; doecho -e "\n${comp}"ssh $comp rpm -qa 'openssl*'donesrv1openssl-libs-3.5.5-2.sl9_8^1.x86_64openssl-fips-provider-so-3.0.7-8.sl9^1.x86_64openssl-fips-provider-3.0.7-8.sl9^1.x86_64openssl-3.5.5-2.sl9_8^1.x86_64srv2openssl-libs-3.5.5-2.sl9_8^1.x86_64openssl-fips-provider-so-3.0.7-8.sl9^1.x86_64openssl-fips-provider-3.0.7-8.sl9^1.x86_64openssl-3.5.5-2.sl9_8^1.x86_64srv3openssl-libs-3.5.5-2.sl9_8^1.x86_64openssl-fips-provider-so-3.0.7-8.sl9^1.x86_64openssl-fips-provider-3.0.7-8.sl9^1.x86_64openssl-3.5.5-2.sl9_8^1.x86_64Как видите ПО после клонирования серверов не отличается.
Создание каталогов для сертификатов
-
Создайте структуру каталогов на всех узлах кластера:
[student@srv1 ~]$ for comp in srv{1..3}; doecho -e "\n${comp}"ssh $comp mkdir -p ~/cert/{ca_ssl,cnf,crt}ssh $comp ls -l ~/certdonesrv1итого 12drwxr-xr-x 2 student student 4096 апр 14 19:03 ca_ssldrwxr-xr-x 2 student student 4096 апр 14 19:03 cnfdrwxr-xr-x 2 student student 4096 апр 14 19:03 crtsrv2итого 12drwxr-xr-x. 2 student student 4096 апр 14 21:33 ca_ssldrwxr-xr-x. 2 student student 4096 апр 14 20:28 cnfdrwxr-xr-x. 2 student student 4096 апр 14 20:03 crtsrv3итого 12drwxr-xr-x. 2 student student 4096 апр 14 21:33 ca_ssldrwxr-xr-x. 2 student student 4096 апр 14 20:28 cnfdrwxr-xr-x. 2 student student 4096 апр 14 20:03 crt -
Создайте системного пользователя
postgresна всех узлах:[student@srv1 ~]$ for comp in srv{1..3}; doecho -e "\n${comp}"ssh $comp sudo useradd -m -r -d /home/postgres postgresssh $comp id postgresdonesrv1uid=991(postgres) gid=991(postgres) группы=991(postgres)srv2uid=991(postgres) gid=991(postgres) группы=991(postgres)srv3uid=991(postgres) gid=991(postgres) группы=991(postgres)
Генерация сертификата удостоверяющего центра (CA)
-
Перейдите в каталог CA на сервере
srv1:[student@srv1 ~]$ cd ~/cert/ca_ssl/ -
Сгенерируйте приватный ключ удостоверяющего центра:
[student@srv1 ca_ssl]$ openssl genpkey -quiet -algorithm RSA -out root.key[student@srv1 ca_ssl]$ ls -l root.key-rw------- 1 student student 1704 апр 14 19:56 root.key -
Сгенерируйте самоподписанный сертификат CA:
[student@srv1 ca_ssl]$ openssl req -x509 -new -extensions v3_ca -days 3650 -key root.key -out root.crt -subj "/C=RU/ST=Moscow/L=Moscow/O=Sbt/CN=CA_DBP2"[student@srv1 ca_ssl]$ ls -ltrhитого 8,0K-rw------- 1 student student 1,7K апр 14 19:56 root.key-rw-r--r-- 1 student student 1,3K апр 14 19:57 root.crtПроверьте тип и содержимое созданного сертификата:
[student@srv1 ca_ssl]$ file root.crt[student@srv1 ca_ssl]$ openssl x509 -text -noout -in root.crt | head -20 -
Скопируйте сертификаты CA на остальные узлы:
[student@srv1 ca_ssl]$ cd ..[student@srv1 cert]$ for comp in srv{2,3}; doecho $compscp -r ca_ssl/ $comp:`pwd`doneПроверьте наличие файлов на всех узлах:
[student@srv1 cert]$ for comp in srv{2,3}; doecho -e "\n$comp"ssh $comp ls -l `pwd`/ca_ssldone
Настройка конфигурационных файлов
-
Создайте базовый конфигурационный файл на
srv1:[student@srv1 cert]$ cd[student@srv1 ~]$ vi ~/cert/cnf/server.cnf[req]req_extensions = v3_reqdistinguished_name = req_distinguished_name[req_distinguished_name][ v3_req ]basicConstraints = CA:FALSEkeyUsage = nonRepudiation, digitalSignature, keyEnciphermentsubjectAltName = @alt_names[ ssl_client ]extendedKeyUsage = clientAuth, serverAuthbasicConstraints = CA:FALSEsubjectKeyIdentifier=hashauthorityKeyIdentifier=keyid,issuersubjectAltName = @alt_names[ v3_ca ]basicConstraints = CA:TRUEkeyUsage = nonRepudiation, digitalSignature, keyEnciphermentsubjectAltName = @alt_namesauthorityKeyIdentifier=keyid:always,issuer[alt_names]Распределите конфигурационный файл по кластеру:
[student@srv1 ~]$ for comp in srv{2,3}; doecho -e "\n$comp"scp ~/cert/cnf/server.cnf $comp:~/cert/cnfdone -
Добавьте DNS-имена и IP-адреса узлов в конфигурационные файлы:
[student@srv1 ~]$ for comp in srv{1..3}; doecho -e "\n${comp}"echo "DNS.1 = ${comp}" | ssh $comp tee -a ~/cert/cnf/server.cnfdone -
Добавьте IP-адреса узлов в конфигурационные файлы:
[student@srv1 ~]$ for comp in {<IP-Address1>,<IP-Address2>,<IP-Address3>}; doecho -e "\n$comp"echo "IP.1 = ${comp}" | ssh $comp tee -a ~/cert/cnf/server.cnfdone -
Проверьте итоговые конфигурационные файлы:
[student@srv1 ~]$ for comp in srv{2,3}; doecho -e "\n$comp\n"ssh $comp cat ~/cert/cnf/server.cnfdone -
Создайте конфигурационный файл для клиента:
[student@srv1 ~]$ vi ~/cert/cnf/postgres.cnf[req]req_extensions = v3_reqdistinguished_name = req_distinguished_name[req_distinguished_name][ v3_req ]basicConstraints = CA:FALSEkeyUsage = nonRepudiation, digitalSignature, keyEncipherment[ ssl_client ]extendedKeyUsage = clientAuthbasicConstraints = CA:FALSEsubjectKeyIdentifier=hashauthorityKeyIdentifier=keyid,issuer[ v3_ca ]basicConstraints = CA:TRUEkeyUsage = nonRepudiation, digitalSignature, keyEnciphermentauthorityKeyIdentifier=keyid:always,issuerРаспределите клиентский конфигурационный файл по кластеру:
[student@srv1 ~]$ for comp in srv{2,3}; doecho -e "\n$comp"scp ~/cert/cnf/postgres.cnf ${comp}:~/cert/cnf/done
Генерация запросов на сертификаты (CSR)
-
Сгенерируйте CSR для клиента
postgresна всех узлах:[student@srv1 ~]$ for comp in srv{1..3}; doecho -e "\n$comp"ssh $comp openssl req -new -nodes -text -out ~/cert/crt/postgres.csr -keyout ~/cert/crt/postgres.key -config ~/cert/cnf/postgres.cnf -subj "/CN=postgres"doneПроверьте созданные CSR:
[student@srv1 ~]$ for comp in srv{1..3}; doecho -e "\n$comp"ssh $comp openssl req -noout -text -in ~/cert/crt/postgres.csr -reqopt no_sigdump,no_validity,no_pubkeydone -
Сгенерируйте CSR для серверов на всех узлах:
[student@srv1 ~]$ for comp in srv{1..3}; doecho -e "\n$comp"ssh $comp openssl req -new -nodes -text -out ~/cert/crt/server.csr -keyout ~/cert/crt/server.key -config ~/cert/cnf/server.cnf -subj "/CN=$comp"doneПроверьте CSR серверов с особым вниманием к альтернативным именам:
[student@srv1 ~]$ for comp in srv{1..3}; doecho -e "\n$comp"ssh $comp openssl req -noout -text -in ~/cert/crt/server.csr -reqopt no_sigdump,no_validity,no_pubkeydone -
Сгенерируйте CSR для службы
patroni:[student@srv1 ~]$ for comp in srv{1..3}; doecho -e "\n$comp"ssh $comp openssl req -new -nodes -text -out ~/cert/crt/patroni.csr -keyout ~/cert/crt/patroni.key -config ~/cert/cnf/server.cnf -subj "/CN=patroni"done -
Сгенерируйте CSR для службы
patronietcd:[student@srv1 ~]$ for comp in srv{1..3}; doecho -e "\n$comp"ssh $comp openssl req -new -nodes -text -out ~/cert/crt/patronietcd.csr -keyout ~/cert/crt/patronietcd.key -config ~/cert/cnf/server.cnf -subj "/CN=patronietcd"done -
Сгенерируйте CSR для
pgbouncer:[student@srv1 ~]$ for comp in srv{1..3}; doecho -e "\n$comp"ssh $comp openssl req -new -nodes -text -out ~/cert/crt/pgbouncer.csr -keyout ~/cert/crt/pgbouncer.key -config ~/cert/cnf/server.cnf -subj "/CN=pgbouncer"done -
Проверьте наличие всех CSR на узлах:
[student@srv1 ~]$ for comp in srv{1..3}; doecho -e "\n$comp"ssh $comp ls -l ~/cert/crt/*.csrdone
Подписание сертификатов сертификатом CA
-
Подпишите CSR клиента
postgresсертификатом CA:[student@srv1 ~]$ for comp in srv{1..3}; doecho -e "\n$comp"ssh $comp openssl x509 -req -in ~/cert/crt/postgres.csr -text -days 1800 -CA ~/cert/ca_ssl/root.crt -CAkey ~/cert/ca_ssl/root.key -CAcreateserial -out ~/cert/crt/postgres.crt -extfile ~/cert/cnf/postgres.cnfdone -
Подпишите серверные CSR с указанием расширений для клиентов SSL:
[student@srv1 ~]$ for comp in srv{1..3}; doecho -e "\n$comp"ssh $comp openssl x509 -req -in ~/cert/crt/server.csr -text -days 1800 -CA ~/cert/ca_ssl/root.crt -CAkey ~/cert/ca_ssl/root.key -CAcreateserial -out ~/cert/crt/server.crt -extfile ~/cert/cnf/server.cnf -extensions ssl_clientdone -
Проверьте созданные серверные сертификаты:
[student@srv1 ~]$ for comp in srv{1..3}; doecho -e "\n$comp"ssh $comp openssl x509 -in ~/cert/crt/server.crt -text -noout -ext subjectAltName -certopt ca_default,no_sigdumpdone -
Подпишите CSR для
patroni:[student@srv1 ~]$ for comp in srv{1..3}; doecho -e "\n$comp"ssh $comp openssl x509 -req -in ~/cert/crt/patroni.csr -text -days 1800 -CA ~/cert/ca_ssl/root.crt -CAkey ~/cert/ca_ssl/root.key -CAcreateserial -out ~/cert/crt/patroni.crt -extfile ~/cert/cnf/server.cnf -extensions ssl_clientdone -
Подпишите CSR для
patronietcd:[student@srv1 ~]$ for comp in srv{1..3}; doecho -e "\n$comp"ssh $comp openssl x509 -req -in ~/cert/crt/patronietcd.csr -text -days 1800 -CA ~/cert/ca_ssl/root.crt -CAkey ~/cert/ca_ssl/root.key -CAcreateserial -out ~/cert/crt/patronietcd.crt -extfile ~/cert/cnf/server.cnf -extensions ssl_clientdone -
Подпишите CSR для
pgbouncer:[student@srv1 ~]$ for comp in srv{1..3}; doecho -e "\n$comp"ssh $comp openssl x509 -req -in ~/cert/crt/pgbouncer.csr -text -days 1800 -CA ~/cert/ca_ssl/root.crt -CAkey ~/cert/ca_ssl/root.key -CAcreateserial -out ~/cert/crt/pgbouncer.crt -extfile ~/cert/cnf/server.cnf -extensions ssl_clientdone -
Проверьте наличие всех сертификатов:
[student@srv1 ~]$ for comp in srv{1..3}; doecho -e "\n$comp"ssh $comp ls -l ~/cert/crt/*.crtdone
Установка сертификатов в систему
-
Создайте каталоги для хранения сертификатов на всех узлах:
[student@srv1 ~]$ for comp in srv{1..3}; doecho -e "\n$comp"ssh $comp sudo mkdir -p /pg_ssl{,/root_dir}done -
Скопируйте все сертификаты и ключи в системный каталог:
[student@srv1 ~]$ for comp in srv{1..3}; doecho -e "\n$comp"ssh $comp sudo cp -v ~/cert/{crt,ca_ssl}/*.{crt,key} /pg_ssldone -
Установите владельца для каталога с сертификатами:
[student@srv1 ~]$ for comp in srv{1..3}; doecho -e "\n$comp"ssh $comp sudo chown -cR postgres:postgres /pg_ssldone -
Проверьте права доступа и содержимое каталога:
[student@srv1 ~]$ for comp in srv{1..3}; doecho -e "\n$comp"ssh $comp sudo ls -l /pg_ssldone -
Добавьте сертификат CA в хранилище доверенных сертификатов:
[student@srv1 ~]$ for comp in srv{1..3}; doecho -e "\n$comp"ssh $comp sudo cp -v /pg_ssl/root.crt /etc/pki/ca-trust/source/anchors/done -
Обновите хранилище доверенных сертификатов:
[student@srv1 ~]$ for comp in srv{1..3}; doecho -e "\n$comp"ssh $comp sudo update-ca-trustdone -
Проверьте регистрацию сертификата CA:
[student@srv1 ~]$ for comp in srv{1..3}; doecho -e "\n$comp"ssh $comp trust list | grep -B1 -A3 DBPdone -
Скопируйте сертификаты CA в каталог
root_dir:[student@srv1 ~]$ for comp in srv{1..3}; doecho -e "\n$comp"ssh $comp sudo cp -v /pg_ssl/root.{crt,key} /pg_ssl/root_dir/done
Самостоятельная работа
-
Создайте дополнительный сертификат для нового сервиса:
-
Создайте дополнительный сертификат для нового сервиса:
[student@srv1 ~]$ mkdir -p ~/cert/{ca_ssl,cnf,crt}[student@srv1 ~]$ tree -d ~/cert/home/student/cert├── ca_ssl├── cnf└── crt3 directories -
Создайте конфигурационный файл для нового сервиса:
[student@srv1 ~]$ vi ~/cert/cnf/newservice.cnf[req]req_extensions = v3_reqdistinguished_name = req_distinguished_name[req_distinguished_name][ v3_req ]basicConstraints = CA:FALSEkeyUsage = nonRepudiation, digitalSignature, keyEnciphermentsubjectAltName = @alt_names[ ssl_client ]extendedKeyUsage = clientAuth, serverAuthbasicConstraints = CA:FALSEsubjectKeyIdentifier=hashauthorityKeyIdentifier=keyid,issuersubjectAltName = @alt_names[alt_names]DNS.1 = newservice.localIP.1 = 172.27.28.103 -
Сгенерируйте CSR и сертификат:
[student@srv1 ~]$ openssl req -new -nodes -text -out ~/cert/crt/newservice.csr -keyout ~/cert/crt/newservice.key -config ~/cert/cnf/newservice.cnf -subj "/CN=newservice"[student@srv1 ~]$ openssl req -noout -text -in ~/cert/crt/newservice.csr[student@srv1 ~]$ openssl x509 -req -in ~/cert/crt/newservice.csr -text -days 365 -CA ~/cert/ca_ssl/root.crt -CAkey ~/cert/ca_ssl/root.key -CAcreateserial -out ~/cert/crt/newservice.crt -extfile ~/cert/cnf/newservice.cnf -extensions ssl_client
-
-
Проверьте цепочку доверия созданного сертификата:
[student@srv1 ~]$ openssl verify -CAfile ~/cert/ca_ssl/root.crt ~/cert/crt/newservice.crt
Очистка (опционально)
Удалите тестовые сертификаты на всех узлах кластера:
for comp in srv{1..3}; do
ssh $comp rm -rf ~/cert
ssh $comp sudo rm -rf /pg_ssl
ssh $comp sudo rm -f /etc/pki/ca-trust/source/anchors/root.crt
ssh $comp sudo update-ca-trust
done
Подведем итоги
Вопрос 1
Вопрос 1: Какая команда используется для генерации приватного ключа удостоверяющего центра (CA)?
Вопрос 2
Вопрос 2: Какой параметр должен быть включен в конфигурационный файл для серверных сертификатов, чтобы указать альтернативные имена?
Вопрос 3
Вопрос 3: Какая информация должна быть указана в поле Subject Alternative Name (SAN) серверных сертификатов?