Перейти к основному содержимому

Задание 3: Сертификаты TLS

В этом разделе мы изучим процесс установки, генерации и настройки SSL-сертификатов для защищенного кластера Pangolin, научимся работать с утилитой OpenSSL и управлять сертификатами на нескольких узлах кластера.

Проверка и установка необходимого ПО​

  1. Подключитесь к основному серверу кластера (srv1) и установите OpenSSL:

    [student@srv1 ~]$ sudo dnf install -y openssl
    Updating Subscription Management repositories.
    redos8.0-for-x86_64-powertools-rpms 7.7 kB/s | 2.6 kB 00:00
    redos8.0-for-x86_64-baseos-rpms 6.5 kB/s | 2.3 kB 00:00
    redos8.0-for-x86_64-baseos-debug-rpms 6.5 kB/s | 2.0 kB 00:00
    redos8.0-for-x86_64-appstream-rpms 8.5 kB/s | 2.6 kB 00:00
    redos8.0-for-x86_64-appstream-debug-rpms 6.1 kB/s | 2.0 kB 00:00
    Package openssl-1:3.5.5-2.sl9_8^1.x86_64 is already installed.
    Dependencies resolved.
    Nothing to do.
    Complete!

    Если вы получили такое сообщение, то это означает, что установка ПО была произведена ранее.

  2. Проверьте версии OpenSSL на всех узлах кластера:

    [student@srv1 ~]$ for comp in srv{1..3}; do
    echo -e "\n${comp}"
    ssh $comp rpm -qa 'openssl*'
    done
    srv1
    openssl-libs-3.5.5-2.sl9_8^1.x86_64
    openssl-fips-provider-so-3.0.7-8.sl9^1.x86_64
    openssl-fips-provider-3.0.7-8.sl9^1.x86_64
    openssl-3.5.5-2.sl9_8^1.x86_64

    srv2
    openssl-libs-3.5.5-2.sl9_8^1.x86_64
    openssl-fips-provider-so-3.0.7-8.sl9^1.x86_64
    openssl-fips-provider-3.0.7-8.sl9^1.x86_64
    openssl-3.5.5-2.sl9_8^1.x86_64

    srv3
    openssl-libs-3.5.5-2.sl9_8^1.x86_64
    openssl-fips-provider-so-3.0.7-8.sl9^1.x86_64
    openssl-fips-provider-3.0.7-8.sl9^1.x86_64
    openssl-3.5.5-2.sl9_8^1.x86_64

    Как видите ПО после клонирования серверов не отличается.

Создание каталогов для сертификатов​

  1. Создайте структуру каталогов на всех узлах кластера:

    [student@srv1 ~]$ for comp in srv{1..3}; do
    echo -e "\n${comp}"
    ssh $comp mkdir -p ~/cert/{ca_ssl,cnf,crt}
    ssh $comp ls -l ~/cert
    done
    srv1
    итого 12
    drwxr-xr-x 2 student student 4096 апр 14 19:03 ca_ssl
    drwxr-xr-x 2 student student 4096 апр 14 19:03 cnf
    drwxr-xr-x 2 student student 4096 апр 14 19:03 crt

    srv2
    итого 12
    drwxr-xr-x. 2 student student 4096 апр 14 21:33 ca_ssl
    drwxr-xr-x. 2 student student 4096 апр 14 20:28 cnf
    drwxr-xr-x. 2 student student 4096 апр 14 20:03 crt

    srv3
    итого 12
    drwxr-xr-x. 2 student student 4096 апр 14 21:33 ca_ssl
    drwxr-xr-x. 2 student student 4096 апр 14 20:28 cnf
    drwxr-xr-x. 2 student student 4096 апр 14 20:03 crt
  2. Создайте системного пользователя postgres на всех узлах:

    [student@srv1 ~]$ for comp in srv{1..3}; do
    echo -e "\n${comp}"
    ssh $comp sudo useradd -m -r -d /home/postgres postgres
    ssh $comp id postgres
    done
    srv1
    uid=991(postgres) gid=991(postgres) группы=991(postgres)

    srv2
    uid=991(postgres) gid=991(postgres) группы=991(postgres)

    srv3
    uid=991(postgres) gid=991(postgres) группы=991(postgres)

Генерация сертификата удостоверяющего центра (CA)​

  1. Перейдите в каталог CA на сервере srv1:

    [student@srv1 ~]$ cd ~/cert/ca_ssl/
  2. Сгенерируйте приватный ключ удостоверяющего центра:

    [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
  3. Сгенерируйте самоподписанный сертификат 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
  4. Скопируйте сертификаты CA на остальные узлы:

    [student@srv1 ca_ssl]$ cd ..
    [student@srv1 cert]$ for comp in srv{2,3}; do
    echo $comp
    scp -r ca_ssl/ $comp:`pwd`
    done

    Проверьте наличие файлов на всех узлах:

    [student@srv1 cert]$ for comp in srv{2,3}; do
    echo -e "\n$comp"
    ssh $comp ls -l `pwd`/ca_ssl
    done

Настройка конфигурационных файлов​

  1. Создайте базовый конфигурационный файл на srv1:

    [student@srv1 cert]$ cd
    [student@srv1 ~]$ vi ~/cert/cnf/server.cnf
    [req]
    req_extensions = v3_req
    distinguished_name = req_distinguished_name
    [req_distinguished_name]
    [ v3_req ]
    basicConstraints = CA:FALSE
    keyUsage = nonRepudiation, digitalSignature, keyEncipherment
    subjectAltName = @alt_names
    [ ssl_client ]
    extendedKeyUsage = clientAuth, serverAuth
    basicConstraints = CA:FALSE
    subjectKeyIdentifier=hash
    authorityKeyIdentifier=keyid,issuer
    subjectAltName = @alt_names
    [ v3_ca ]
    basicConstraints = CA:TRUE
    keyUsage = nonRepudiation, digitalSignature, keyEncipherment
    subjectAltName = @alt_names
    authorityKeyIdentifier=keyid:always,issuer
    [alt_names]

    Распределите конфигурационный файл по кластеру:

    [student@srv1 ~]$ for comp in srv{2,3}; do
    echo -e "\n$comp"
    scp ~/cert/cnf/server.cnf $comp:~/cert/cnf
    done
  2. Добавьте DNS-имена и IP-адреса узлов в конфигурационные файлы:

    [student@srv1 ~]$ for comp in srv{1..3}; do
    echo -e "\n${comp}"
    echo "DNS.1 = ${comp}" | ssh $comp tee -a ~/cert/cnf/server.cnf
    done
  3. Добавьте IP-адреса узлов в конфигурационные файлы:

    [student@srv1 ~]$ for comp in {<IP-Address1>,<IP-Address2>,<IP-Address3>}; do
    echo -e "\n$comp"
    echo "IP.1 = ${comp}" | ssh $comp tee -a ~/cert/cnf/server.cnf
    done
  4. Проверьте итоговые конфигурационные файлы:

    [student@srv1 ~]$ for comp in srv{2,3}; do
    echo -e "\n$comp\n"
    ssh $comp cat ~/cert/cnf/server.cnf
    done
  5. Создайте конфигурационный файл для клиента:

    [student@srv1 ~]$ vi ~/cert/cnf/postgres.cnf
    [req]
    req_extensions = v3_req
    distinguished_name = req_distinguished_name
    [req_distinguished_name]
    [ v3_req ]
    basicConstraints = CA:FALSE
    keyUsage = nonRepudiation, digitalSignature, keyEncipherment
    [ ssl_client ]
    extendedKeyUsage = clientAuth
    basicConstraints = CA:FALSE
    subjectKeyIdentifier=hash
    authorityKeyIdentifier=keyid,issuer
    [ v3_ca ]
    basicConstraints = CA:TRUE
    keyUsage = nonRepudiation, digitalSignature, keyEncipherment
    authorityKeyIdentifier=keyid:always,issuer

    Распределите клиентский конфигурационный файл по кластеру:

    [student@srv1 ~]$ for comp in srv{2,3}; do
    echo -e "\n$comp"
    scp ~/cert/cnf/postgres.cnf ${comp}:~/cert/cnf/
    done

Генерация запросов на сертификаты (CSR)​

  1. Сгенерируйте CSR для клиента postgres на всех узлах:

    [student@srv1 ~]$ for comp in srv{1..3}; do
    echo -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}; do
    echo -e "\n$comp"
    ssh $comp openssl req -noout -text -in ~/cert/crt/postgres.csr -reqopt no_sigdump,no_validity,no_pubkey
    done
  2. Сгенерируйте CSR для серверов на всех узлах:

    [student@srv1 ~]$ for comp in srv{1..3}; do
    echo -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}; do
    echo -e "\n$comp"
    ssh $comp openssl req -noout -text -in ~/cert/crt/server.csr -reqopt no_sigdump,no_validity,no_pubkey
    done
  3. Сгенерируйте CSR для службы patroni:

    [student@srv1 ~]$ for comp in srv{1..3}; do
    echo -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
  4. Сгенерируйте CSR для службы patronietcd:

    [student@srv1 ~]$ for comp in srv{1..3}; do
    echo -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
  5. Сгенерируйте CSR для pgbouncer:

    [student@srv1 ~]$ for comp in srv{1..3}; do
    echo -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
  6. Проверьте наличие всех CSR на узлах:

    [student@srv1 ~]$ for comp in srv{1..3}; do
    echo -e "\n$comp"
    ssh $comp ls -l ~/cert/crt/*.csr
    done

Подписание сертификатов сертификатом CA​

  1. Подпишите CSR клиента postgres сертификатом CA:

    [student@srv1 ~]$ for comp in srv{1..3}; do
    echo -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.cnf
    done
  2. Подпишите серверные CSR с указанием расширений для клиентов SSL:

    [student@srv1 ~]$ for comp in srv{1..3}; do
    echo -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_client
    done
  3. Проверьте созданные серверные сертификаты:

    [student@srv1 ~]$ for comp in srv{1..3}; do
    echo -e "\n$comp"
    ssh $comp openssl x509 -in ~/cert/crt/server.crt -text -noout -ext subjectAltName -certopt ca_default,no_sigdump
    done
  4. Подпишите CSR для patroni:

    [student@srv1 ~]$ for comp in srv{1..3}; do
    echo -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_client
    done
  5. Подпишите CSR для patronietcd:

    [student@srv1 ~]$ for comp in srv{1..3}; do
    echo -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_client
    done
  6. Подпишите CSR для pgbouncer:

    [student@srv1 ~]$ for comp in srv{1..3}; do
    echo -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_client
    done
  7. Проверьте наличие всех сертификатов:

    [student@srv1 ~]$ for comp in srv{1..3}; do
    echo -e "\n$comp"
    ssh $comp ls -l ~/cert/crt/*.crt
    done

Установка сертификатов в систему​

  1. Создайте каталоги для хранения сертификатов на всех узлах:

    [student@srv1 ~]$ for comp in srv{1..3}; do
    echo -e "\n$comp"
    ssh $comp sudo mkdir -p /pg_ssl{,/root_dir}
    done
  2. Скопируйте все сертификаты и ключи в системный каталог:

    [student@srv1 ~]$ for comp in srv{1..3}; do
    echo -e "\n$comp"
    ssh $comp sudo cp -v ~/cert/{crt,ca_ssl}/*.{crt,key} /pg_ssl
    done
  3. Установите владельца для каталога с сертификатами:

    [student@srv1 ~]$ for comp in srv{1..3}; do
    echo -e "\n$comp"
    ssh $comp sudo chown -cR postgres:postgres /pg_ssl
    done
  4. Проверьте права доступа и содержимое каталога:

    [student@srv1 ~]$ for comp in srv{1..3}; do
    echo -e "\n$comp"
    ssh $comp sudo ls -l /pg_ssl
    done
  5. Добавьте сертификат CA в хранилище доверенных сертификатов:

    [student@srv1 ~]$ for comp in srv{1..3}; do
    echo -e "\n$comp"
    ssh $comp sudo cp -v /pg_ssl/root.crt /etc/pki/ca-trust/source/anchors/
    done
  6. Обновите хранилище доверенных сертификатов:

    [student@srv1 ~]$ for comp in srv{1..3}; do
    echo -e "\n$comp"
    ssh $comp sudo update-ca-trust
    done
  7. Проверьте регистрацию сертификата CA:

    [student@srv1 ~]$ for comp in srv{1..3}; do
    echo -e "\n$comp"
    ssh $comp trust list | grep -B1 -A3 DBP
    done
  8. Скопируйте сертификаты CA в каталог root_dir:

    [student@srv1 ~]$ for comp in srv{1..3}; do
    echo -e "\n$comp"
    ssh $comp sudo cp -v /pg_ssl/root.{crt,key} /pg_ssl/root_dir/
    done

Самостоятельная работа​

  1. Создайте дополнительный сертификат для нового сервиса:

    1. Создайте дополнительный сертификат для нового сервиса:

      [student@srv1 ~]$ mkdir -p ~/cert/{ca_ssl,cnf,crt}
      [student@srv1 ~]$ tree -d ~/cert
      /home/student/cert
      ├── ca_ssl
      ├── cnf
      └── crt

      3 directories
    2. Создайте конфигурационный файл для нового сервиса:

      [student@srv1 ~]$ vi ~/cert/cnf/newservice.cnf
      [req]
      req_extensions = v3_req
      distinguished_name = req_distinguished_name
      [req_distinguished_name]
      [ v3_req ]
      basicConstraints = CA:FALSE
      keyUsage = nonRepudiation, digitalSignature, keyEncipherment
      subjectAltName = @alt_names
      [ ssl_client ]
      extendedKeyUsage = clientAuth, serverAuth
      basicConstraints = CA:FALSE
      subjectKeyIdentifier=hash
      authorityKeyIdentifier=keyid,issuer
      subjectAltName = @alt_names
      [alt_names]
      DNS.1 = newservice.local
      IP.1 = 172.27.28.103
    3. Сгенерируйте 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
  2. Проверьте цепочку доверия созданного сертификата:

    [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) серверных сертификатов?