Monday, July 24th, 2017

FreeBSD IPSEC: Racoon + сертификаты X.509

Published on Апрель 6, 2009 by   ·   Комментариев нет

Введение

how to cure acid reflux

Это краткое руководство описывает процесс настройки racoon на использование сертификатов X.509 вместо предопределенных ключей.
Сертификаты
Создание CA
Прежде всего, стоит загрузить несколько файлов с одного из указанных мест:

* http://www.camulus.org/openssl/ca/
* http://www.sial.org/howto/openssl/ca/

На всякий случай, копии файлов привожу в Приложении А.

После загрузки Makefile и openssl.cnf, вероятнее всего, потребуется редактирование файла openssl.cnf для того, чтобы изменить имена ответственных лиц и наименование организации. Также стоит поместить их в отдельный каталог, например, ssl.

После редактирования openssl.cnf, выполните:

      make init

Если вам интересно, то make init делает следующее:

      test ! -f serial
      mkdir crl newcerts private
      chmod go-rwx private
      echo '01' > serial
      touch index
      openssl req -nodes -config openssl.cnf -days 1825 -x509 -newkey rsa -out ca-cert.pem -outform PEM

Создание сертификата X.509
Теперь, когда мы имеем CA, мы можем создавать сертификаты для машин, образующих туннель. Вместо hostX рекомендую указывать имя вашей машины.

Сгенерируем частный ключ:

      openssl genrsa -out hostX.key

Генерируем сертификат:

      openssl req -new -nodes -key hostX.key -out hostX.csr

Используем Makefile:

      make sign

Теперь у нас имеется подписанный нами же сертификат X.509. Необходимо повторить эти действия для всех имеющихся у нас машин.

Если одолело любопытство по поводу того, что делает make sign, то это следущее:

      openssl ca -batch -config openssl.cnf -in hostX.csr -out hostX.cert

Создаем туннель
Для примера, мы будем использовать фиктивные IP адреса 3.3.3.3 и 4.4.4.4 вместо «реальных» IP. Для наших туннельных оконечных точек, мы будем использовать 10.1.1.1 на машине 3.3.3.3 и 10.1.2.1 на машине 4.4.4.4.

На машине 3.3.3.3:

      ifconfig gif0 create
      ifconfig gif0 tunnel 3.3.3.3 4.4.4.4
      ifconfig gif0 inet 10.1.1.1 10.1.2.1

Соответственно, необходимо прописать и на машине 4.4.4.4.
Маршрутизация
В этом примере, мы имеем две конечные точки нашего туннеля. Пусть одной из них будет вторичный сервер DNS, а второй точкой будет маршрутизатор, на котором выполняется NAT для локальной сети. Естественным нашим желанием будет обеспечить доступность DNS сервера из локальной сети, для чего на нем (имеющем адрес 4.4.4.4) необходимо выполнить:

      route add -net 172.16 -interface gif0

Возможно, вам придется изменить префикс, например, для большого количества сетей используются сети 192.168.х.х . Больше никаких маршрутов прописывать нигде не придется, так как NAT у нас уже сконфигурирован необходимым образом на маршрутизацию пакетов из внутренней сети.
Проверка туннеля перед использованием IPSEC
Нижеследущее предполагает наличие разрешающих правил на пакетном фильтре. Вам необходимо разрешить пакеты IP-в-IP (в /etc/protocols это ipencap). С DNS сервера (4.4.4.4) выполняем:

      ping 172.16.0.100

И, соответственно, с ping 172.16.0.100:

      ping 10.1.2.1

Если что-то не работает, то давайте подумаем, где мы могли совершить ошибку. Отталкивайтесь от следующего:

1. Вы правильно сконфигурировали интерфейс gif?
2. Вы прописали статический маршрут на сервере DNS?

IPSEC
Конфигурация ядра
Для шифрования пакетов нам необходима поддержка IPSEC на уровне ядра. Удостовериться в этом и добавить, при необходимости, можно, имея исходные тексты ядра.

Скопируем файл конфгурации ядра GENERIC под некоторым именем:

      cp /usr/src/sys/i386/conf/GENERIC
      /usr/src/sys/i386/conf/FRANK-N-BEANS

Добавим в файл следущие строки:

      options   IPSEC         #IP security
      options   IPSEC_ESP     #IP security (crypto; define w/ IPSEC)
      options   IPSEC_DEBUG   #debug for IP security

Компилируем и устанавливаем новое ядро:

   cd /usr/src && make KERCONF=FRANK-N-BEANS buildkernel && make KERNCONF=FRANK-N-BEANS installkernel && reboot

Конфигурация Racoon для использования сертификатов X.509
Сначала, необходимо перенести сертификаты (ca-cert.pem, hostX.key, hostX.cert) на машину, на которой они будут находиться, в каталог /usr/local/etc/racoon/cert. Внесите соответствующие изменения в racoon.conf и замените адреса удаленных точек, на используемые вами. Нижеследущая конфигурация используется на машине с NAT:

      remote 10.1.2.1
      {
        exchange_mode main,aggressive;
        doi ipsec_doi;

        situation identity_only;
        my_identifier asn1dn;
        peers_identifier asn1dn;
        verify_identifier on;
        certificate_type x509 "hostX.cert" "hostX.key";
        nonce_size 16;
        lifetime time 1 min;    # sec,min,hour

        support_mip6 on;

        proposal_check strict;  # obey, strict or claim



        proposal {

          encryption_algorithm 3des;
          hash_algorithm sha1;
          authentication_method rsasig ;
          dh_group 2 ;
        }
      }

Убедитесь, что прописан правильный путь к сертификатам:

    path certificate "/usr/local/etc/racoon/cert";

Укажем racoon, где находится сетрификат CA, ca-cert.pem:

  ln -s ca-cert.pem `openssl x509 -noout -hash -in ca-cert.pem`.0

Создаем записи SPD
В заключение, нам необходимо создать правила IPSEC, которые будут передаваться ядру. Прописать их надо на каждом конце туннеля. Вот что должно быть помещено в /etc/ipsec.conf:

      flush;
      spdflush;

      spdadd 10.1.2.1/32 10.1.1.1/32 any -P in  ipsec esp/tunnel/10.1.2.1-10.1.1.1/require;
      spdadd 10.1.1.1/32 10.1.2.1/32 any -P out ipsec esp/tunnel/10.1.1.1-10.1.2.1/require;

      spdadd 172.16.0.0/16 10.1.2.1/32 any -P out ipsec esp/tunnel/10.1.1.1-10.1.2.1/require;
      spdadd 10.1.2.1/32 172.16.0.0/16 any -P in ipsec esp/tunnel/10.1.2.1-10.1.1.1/require;

Запуск IPSEC из /etc/rc.conf

      cloned_interfaces="gif0"

      gif_interfaces="gif0"
      gifconfig_gif0="3.3.3.3 4.4.4.4"

      ifconfig_gif0="inet 10.1.1.1 10.1.2.1"

      racoon_enable="YES"
      racoon_flags="-f /usr/local/etc/racoon/racoon.conf"

      ipsec_enable="YES"

Для второй машины просто измените IP адреса.
Приложения
Библиография

    * Jeremy Mates (jmates@sial.org)
          o http://sial.org/howto/openssl/ca/
          o http://sial.org/howto/openssl/csr/
    * Mike DeGraw-Bertsch (mbertsch@radioactivedata.org)
          o http://www.onlamp.com/pub/a/bsd/2002/04/04/ipsec.html

Приложение А

[cc lang="bash" tab_size="2" lines="-1"]
      Makefile:

      requests = *.csr

      sign: ${requests}

      # remove -batch option if want chance to not certify a particular request
      ${requests}: FORCE
              @openssl ca -batch -config openssl.cnf -in $@ -out ${@:.csr=.cert}
              @[ -f ${@:.csr=.cert} ] && rm $@

      revoke:
              @test $${cert:?"usage: make revoke cert=certificate"}
              @openssl ca -config openssl.cnf -revoke $(cert)
              @$(MAKE) gencrl

      gencrl:
              @openssl ca -config openssl.cnf -gencrl -out ca-crl.pem

      clean:
              -rm ${requests}

      # creates required supporting files, CA key and certificate
      init:
              @test ! -f serial
              @mkdir crl newcerts private
              @chmod go-rwx private
              @echo '01' > serial
              @touch index
              @openssl req -nodes -config openssl.cnf -days 1825 -x509 -newkey rsa -out ca-cert.pem -outform PEM

      # for legacy make support
      FORCE:

      openssl.cnf

      HOME                    = .
      RANDFILE                = $ENV::HOME/.rnd

      [ ca ]
      default_ca      = CA_default

      [ CA_default ]
      dir             = .
      # unset at present, and my limited certs can be kept in current dir
      #certs          = $dir/certs
      new_certs_dir   = $dir/newcerts
      crl_dir         = $dir/crl
      database        = $dir/index

      certificate     = $dir/ca-cert.pem
      serial          = $dir/serial
      crl             = $dir/ca-crl.pem
      private_key     = $dir/private/ca-key.pem
      RANDFILE        = $dir/private/.rand

      x509_extensions = usr_cert

      # Comment out the following two lines for the "traditional"
      # (and highly broken) format.
      name_opt        = ca_default
      cert_opt        = ca_default

      default_crl_days= 30
      default_days    = 3650
      # if need to be compatible with older software, use weaker md5
      default_md      = sha1
      # MSIE may need following set to yes?
      preserve        = no

      # A few difference way of specifying how similar the request should look
      # For type CA, the listed attributes must be the same, and the optional
      # and supplied fields are just that :-)
      policy          = policy_match

      # For the CA policy
      [ policy_match ]
      countryName             = match
      stateOrProvinceName     = match
      organizationName        = match
      organizationalUnitName  = optional
      commonName              = supplied
      emailAddress            = optional

      # For the 'anything' policy
      # At this point in time, you must list all acceptable 'object'
      # types.
      [ policy_anything ]
      countryName             = optional
      stateOrProvinceName     = optional
      localityName            = optional
      organizationName        = optional
      organizationalUnitName  = optional
      commonName              = supplied
      emailAddress            = optional

      ####################################################################
      [ req ]
      default_bits            = 2048
      default_keyfile         = ./private/ca-key.pem
      default_md              = sha1

      prompt                  = no
      distinguished_name      = root_ca_distinguished_name

      x509_extensions = v3_ca

      # Passwords for private keys if not present they will be prompted for
      # input_password = secret
      # output_password = secret

      # This sets a mask for permitted string types. There are several options.
      # default: PrintableString, T61String, BMPString.
      # pkix   : PrintableString, BMPString.
      # utf8only: only UTF8Strings.
      # nombstr : PrintableString, T61String (no BMPStrings or UTF8Strings).
      # MASK:XXXX a literal mask value.
      # WARNING: current versions of Netscape crash on BMPStrings or UTF8Strings
      # so use this option with caution!
      string_mask = nombstr

      # req_extensions = v3_req

      [ root_ca_distinguished_name ]
      commonName = Camulus.org
      countryName = US
      stateOrProvinceName = Minnesota
      localityName = Proctor
      0.organizationName = camulus.org
      emailAddress = root@camulus.org

      [ usr_cert ]


      # These extensions are added when 'ca' signs a request.

      # This goes against PKIX guidelines but some CAs do it and some software
      # requires this to avoid interpreting an end user certificate as a CA.

      basicConstraints=CA:FALSE

      # PKIX recommendations harmless if included in all certificates.
      subjectKeyIdentifier=hash
      authorityKeyIdentifier=keyid,issuer:always

      nsCaRevocationUrl               = https://secure.camulus.org/ca-crl.pem
      #nsBaseUrl
      #nsRevocationUrl
      #nsRenewalUrl
      #nsCaPolicyUrl
      #nsSslServerName

      [ v3_req ]

      # Extensions to add to a certificate request

      basicConstraints = CA:FALSE
      keyUsage = nonRepudiation, digitalSignature, keyEncipherment

      [ v3_ca ]


      # Extensions for a typical CA

      # PKIX recommendation.
      subjectKeyIdentifier=hash
      authorityKeyIdentifier=keyid:always,issuer:always

      # This is what PKIX recommends but some broken software chokes on critical
      # extensions.
      #basicConstraints = critical,CA:true
      # So we do this instead.
      basicConstraints = CA:true

      [ crl_ext ]

      # CRL extensions.
      # Only issuerAltName and authorityKeyIdentifier make any sense in a CRL.

      # issuerAltName=issuer:copy
      authorityKeyIdentifier=keyid:always,issuer:always
zp8497586rq


















Смотрите также:

Readers Comments (Комментариев нет)

Comments are closed.

Exchange 2007

Проведение мониторинга Exchange 2007 с помощью диспетчера System Center Operations Manager 2007 (часть 3)

Если вы хотите прочитать предыдущие части этой серии статей, перейдите по ссылкам: Проведение мониторинга Exchange 2007 с помощью диспетчера System ... [+]

Практическое рассмотрение перехода с Exchange 2003 на Exchange 2007 (часть 1)

Введение В этой статье из нескольких частей я хочу показать вам процесс, который недавно использовал для перехода с существующей среды Exchange 2003 ... [+]

Использование инструмента Exchange Server Remote Connectivity Analyzer Tool (часть 2)

Если вы пропустили первую часть этой серии, пожалуйста, прочтите ее по ссылке Использование инструмента Exchange Server Remote Connectivity Analyzer Tool (Часть ... [+]

Мониторинг Exchange 2007 с помощью диспетчера System Center Operations Manager 2007 (часть 2)

Если вы пропустили предыдущую часть этой серии статей, перейдите по ссылке Мониторинг Exchange 2007 с помощью диспетчера System Center Operations ... [+]

Подробное рассмотрение подготовки Active Directory для Exchange 2007 (часть 5)

Если вы пропустили предыдущие части этой серии статей, перейдите по ссылкам: Подробное рассмотрение подготовки Active Directory для Exchange 2007 (часть 1) ... [+]

Установка и настройка Exchange 2007 из командной строки (Часть 3)

If you missed the previous parts in this article series please read: Exchange 2007 Install and Configuration from the command line (Part ... [+]

Использование инструмента Exchange Server Remote Connectivity Analyzer Tool (часть 1)

Инструмент ExRCA Текущий выпуск инструмента предоставляется только в целях тестирования и оснащен 5 опциями: Тест подключения Outlook 2007 Autodiscover Тест подключения Outlook 2003 RPC ... [+]

Развертывание сервера Exchange 2007 Edge Transport (часть 5)

Если вы хотите прочитать предыдущие части этой серии статей, перейдите по ссылкам: Развертывание сервера Exchange 2007 Edge Transport (часть 1) Развертывание ... [+]

Установка и настройка Exchange 2007 из командной строки (часть 2)

Если вы пропустили первую статью данного цикла, пожалуйста, перейдите по ссылке: Exchange 2007 Install and Configuration from the command line (Part ... [+]

Использование интегрированных сценариев Using Exchange Server 2007 – часть 2: генерирование отчетов агента Transport AntiSpam Agent

Если вы пропустили предыдущую часть этой серии статей, перейдите по ссылке Использование интегрированных сценариев Using Exchange Server 2007 – часть ... [+]