четверг, 13 октября 2016 г.

Установка NGINX kerberos на centos 7.



I. Установка nginx с модулем kerberos.


под su

1. Устанавливаю nginx (чтобы не изобретать настройки для nginx, возьмем их из стандартной установки)

# yum install nginx

2. Устанавливаю пакеты необходимые для сборки из исходников

# yum install gcc-c++ pcre-devel zlib-devel make wget openssl-devel libxml2-devel libxslt-devel gd-devel perl-ExtUtils-Embed GeoIP-devel gperftools-devel

3. Смотрим настройки с которыми установился NGINX

# nginx -V

nginx version: nginx/1.10.1
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-4) (GCC)
built with OpenSSL 1.0.1e-fips 11 Feb 2013
TLS SNI support enabled
configure arguments: --prefix=/usr/share/nginx --sbin-path=/usr/sbin/nginx --modules-path=/usr/lib64/nginx/modules --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --http-client-body-temp-path=/var/lib/nginx/tmp/client_body --http-proxy-temp-path=/var/lib/nginx/tmp/proxy --http-fastcgi-temp-path=/var/lib/nginx/tmp/fastcgi --http-uwsgi-temp-path=/var/lib/nginx/tmp/uwsgi --http-scgi-temp-path=/var/lib/nginx/tmp/scgi --pid-path=/run/nginx.pid --lock-path=/run/lock/subsys/nginx --user=nginx --group=nginx --with-file-aio --with-ipv6 --with-http_ssl_module --with-http_v2_module --with-http_realip_module --with-http_addition_module --with-http_xslt_module=dynamic --with-http_image_filter_module=dynamic --with-http_geoip_module=dynamic --with-http_sub_module --with-http_dav_module --with-http_flv_module --with-http_mp4_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_random_index_module --with-http_secure_link_module --with-http_degradation_module --with-http_slice_module --with-http_stub_status_module --with-http_perl_module=dynamic --with-mail=dynamic --with-mail_ssl_module --with-pcre --with-pcre-jit --with-stream=dynamic --with-stream_ssl_module --with-google_perftools_module --with-debug --with-cc-opt='-O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -m64 -mtune=generic' --with-ld-opt='-Wl,-z,relro -specs=/usr/lib/rpm/redhat/redhat-hardened-ld -Wl,-E'


4. Скачиваю исходники NGINX и распаковываю

$ wget http://nginx.org/download/nginx-1.10.1.tar.gz
$ tar zxvf nginx-1.10.1.tar.gz


5. Перехожу в каталог исходников nginx

$ cd nginx-1.10.1/

6. Скачиваю Nginx module for HTTP SPNEGO auth (модуль для аутентификации kerberos)

# git clone https://github.com/stnoonan/spnego-http-auth-nginx-module

7. Останавливаю nginx

# service nginx stop

8. Собираю и устанавливаю nginx с ранее просмотренными настройками и добавляю --add-module=spnego-http-auth-nginx-module

$ ./configure --prefix=/usr/share/nginx --sbin-path=/usr/sbin/nginx --modules-path=/usr/lib64/nginx/modules --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --http-client-body-temp-path=/var/lib/nginx/tmp/client_body --http-proxy-temp-path=/var/lib/nginx/tmp/proxy --http-fastcgi-temp-path=/var/lib/nginx/tmp/fastcgi --http-uwsgi-temp-path=/var/lib/nginx/tmp/uwsgi --http-scgi-temp-path=/var/lib/nginx/tmp/scgi --pid-path=/run/nginx.pid --lock-path=/run/lock/subsys/nginx --user=nginx --group=nginx --with-file-aio --with-ipv6 --with-http_ssl_module --with-http_v2_module --with-http_realip_module --with-http_addition_module --with-http_xslt_module=dynamic --with-http_image_filter_module=dynamic --with-http_geoip_module=dynamic --with-http_sub_module --with-http_dav_module --with-http_flv_module --with-http_mp4_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_random_index_module --with-http_secure_link_module --with-http_degradation_module --with-http_slice_module --with-http_stub_status_module --with-http_perl_module=dynamic --with-mail=dynamic --with-mail_ssl_module --with-pcre --with-pcre-jit --with-stream=dynamic --with-stream_ssl_module --with-google_perftools_module --with-debug --with-cc-opt='-O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -m64 -mtune=generic' --with-ld-opt='-Wl,-z,relro -specs=/usr/lib/rpm/redhat/redhat-hardened-ld -Wl,-E' --add-module=spnego-http-auth-nginx-module

# make

# make install

9. Запускаю nginx и смотрю результат в браузере по адресу http://127.0.0.1/

# service nginx start



II. Настройка kerberos на Centos для подключения к Active directory


1. Проверяю пингуется ли контролер домена (test.example.com) по имени (у меня контролер домена на Windows 2012). Если не пингуется, надо прописать в качестве dns сервер контролер домена.

# ping test.example.com

2. Устанавливаю пакет для тестирования работы kerberos на centos

# yum install krb5-workstation

3. Настраиваю kerbereros путем редактивания /etc/krb5.conf. Вместо example.com подставить свой домен (!!!где написан EXAMPLE.COM большими буквами там обязательно надо свой домен написать большими буквами). Контролер домена у меня имеет ip - 192.168.1.10 (вам надо заменить).

    [logging]
     default = FILE:/var/log/krb5libs.log
     kdc = FILE:/var/log/krb5kdc.log
     admin_server = FILE:/var/log/kadmind.log
   
    [libdefaults]
     dns_lookup_realm = false
     ticket_lifetime = 24h
     renew_lifetime = 7d
     forwardable = true
     rdns = false
     default_realm = EXAMPLE.COM
     default_ccache_name = KEYRING:persistent:%{uid}

    [realms]
     EXAMPLE.COM = {
      kdc = 192.168.1.10
      admin_server = 192.168.1.10
     }

    [domain_realm]
     .example.com = EXAMPLE.COM
     example.com = EXAMPLE.COM

4. Проверяю работы kerberos путем подключения под доменным пользователем. Я создал пользователя на контролере домена - testuser.

# kinit testuser@EXAMPLE.COM
Password for testuser@EXAMPLE.COM: Ввожу пароль для testuser

- смотрю созданный тикет

# klist

Ticket cache: KEYRING:persistent:0:0
Default principal: testuser@EXAMPLE.COM

Valid starting       Expires              Service principal
10/10/2016 09:35:01  10/10/2016 19:35:01  krbtgt/EXAMPLE.COM@EXAMPLE.COM
renew until 10/17/2016 09:34:55

- удаляю созданный тикет (проверил, работает, больше этот тикет не нужен)
# kdestroy

5. На контролере домена (windows):
5.1 Создаю учетную запись компьютера - srv-nginx (В active directory пользователи и компьютеры -> в домене example.com -> компьютеры -> создать компьютер srv-nginx). Пользователя с именем srv-nginx не должно быть в этом домене
5.2 Создаю ключ keytab, выполняю команду

ktpass -princ HTTP/srv-nginx.example.com@EXAMPLE.COM -mapuser srv-nginx$@EXAMPLE.COM -crypto ALL -ptype KRB5_NT_SRV_HST +rndpass -out d:\srv-nginx.keytab

появится сообщение, которое предупреждает о создание нового пароля для моего компьютера SRV-NGINX$ - соглашаемся - y:
Reset SRV-NGINX$'s password [y/n]? y

- небольшие пояснения: srv-nginx$@EXAMPLE.COM - имя компьютера в актив директори (именно с $); +rndpass - пароль, который будет сгенерирован для учетной записи компьютера, где домен написан большими буквами пишем большими буквами.

- если все прошло удачно, то ключик появится на диске - d:\srv-nginx.keytab

!!! Eсли вы до этого пытались создать ключ - keytab и использовали какие-то учетную запись и пароль и у вас ничего не получилось, то бросьте эту учетку и создайте новую ранее не использованную, любую, запись компьютера в актив директори. Не обязательно использовать для keytab имя имеющегося комьютера (имя файла вообще может быть какое угодно) или имеющегося пользователя, как в моем примере srv-nginx.example.com, я его потом заменил на portal. Я создал имя компьютера portal в актив директори, которого вообще не существует в сети, и сгенерил для него keytab и все прекрасно работает, главное чтобы была отработана привязка -princ HTTP/имя_компьютера.домен.ру@ДОМЕН.РУ -mapuser имя_компьютера$@ДОМЕН.РУ
Создать ключ keytab с правильным именем у меня так и не получилось, пришлось менять название веб сервера на portal. Видать где-то еще какая-то привязка есть, если кто знает - подскажите (по всей видимиости я что-то перемудрил на начально этапе).

- Проверить привязку spn (service principal name) к учетной записи компьютера можно используя команду windows:

setspn -Q HTTP/srv-nginx.example.com

Если HTTP/srv-nginx.example.com привязана к нескольким компьютерам или пользователям, то аутентификация кербероз работать не будет.
(для любителей покапаться в могзах актив директори могу посоветовать зайти в редактор атрибутов учетной записи созданного компьютера и там увидеть все своими глазами)

6. Копирую созданный ключ srv-nginx.keytab на srv-nginx в /etc/ (можно использовать winscp)

7. Проверяю ключ в работе:

# ktutil
ktutil:  rkt /etc/srv-nginx.keytab
ktutil:  list
slot KVNO Principal
---- ---- ---------------------------------------------------------------------
  1    4                   HTTP/srv-nginx.example.com@EXAMPLE.COM
  2    4                   HTTP/srv-nginx.example.com@EXAMPLE.COM
  3    4                   HTTP/srv-nginx.example.com@EXAMPLE.COM
  4    4                   HTTP/srv-nginx.example.com@EXAMPLE.COM
  5    4                   HTTP/srv-nginx.example.com@EXAMPLE.COM
ktutil:  q

или

# klist -ke /etc/srv-nginx.keytab
Keytab name: FILE:/etc/srv-nginx.keytab
KVNO Principal
---- --------------------------------------------------------------------------
  4 HTTP/srv-nginx.example.com@EXAMPLE.COM (des-cbc-crc)
  4 HTTP/srv-nginx.example.com@EXAMPLE.COM (des-cbc-md5)
  4 HTTP/srv-nginx.example.com@EXAMPLE.COM (arcfour-hmac)
  4 HTTP/srv-nginx.example.com@EXAMPLE.COM (aes256-cts-hmac-sha1-96)
  4 HTTP/srv-nginx.example.com@EXAMPLE.COM (aes128-cts-hmac-sha1-96)


затем проверяю работу ключа

# kinit -kt /etc/srv-nginx.keytab HTTP/srv-nginx.example.com@EXAMPLE.COM

# kvno HTTP/srv-nginx.example.com@EXAMPLE.COM
HTTP/srv-nginx.example.com@EXAMPLE.COM: kvno = 3

# klist -e
Ticket cache: KEYRING:persistent:0:0
Default principal: HTTP/srv-nginx.example.com@EXAMPLE.COM

Valid starting       Expires              Service principal
10/10/2016 15:30:34  10/11/2016 01:22:04  HTTP/srv-nginx.example.com@EXAMPLE.COM
renew until 10/17/2016 15:22:03, Etype (skey, tkt): arcfour-hmac, arcfour-hmac
10/10/2016 15:22:04  10/11/2016 01:22:04  krbtgt/EXAMPLE.COM@EXAMPLE.COM
renew until 10/17/2016 15:22:03, Etype (skey, tkt): aes256-cts-hmac-sha1-96, arcfour-hmac

Убиваю ключ в памяти компьютера (сам ключ /etc/srv-nginx.keytab на диске остается :) )

# kdestroy

Созданный ключ можно использовать на любом компьютере, главное чтобы он видел контролер домена. Поэтому держите ключ в надежном месте.


III. Конфигурация NGINX для работы с kerberos


1. Для тестирования добавляю в файервол порт 8888

- смотрю в файерволе что открыто

# firewall-cmd --permanent --list-all
public (default)
 interfaces:
 sources:
 services: dhcpv6-client ipp ipp-client mdns ssh
 ports:
 masquerade: no
 forward-ports:
 icmp-blocks:
 rich rules:

- Попутно удаляю неиспользуемый dhcpv6 (я использую в локалке ip v4)

# firewall-cmd --permanent --zone=public --remove-service=dhcpv6-client

- Добавляю порт tcp 8888

# firewall-cmd --permanent --zone=public --add-port=8888/tcp
success

- Перезагружаю файервол

# firewall-cmd --reload
success

2. Прописываю настройки nginx для сервера srv-nginx.example.com
 - Основной конфиг /etc/nginx/nginx.conf ссылается (include /etc/nginx/conf.d/*.conf;) на папку /etc/nginx/conf.d/ для дополнительных конфигов, там я и сделаю конфиг srv-nginx.example.com.conf

 - Создаю и редактирую файл конфигурации

# vi /etc/nginx/conf.d/srv-nginx.example.com.conf
server {
listen  8888; #слушает на порту tcp 8888
server_name srv-nginx.example.com

# аутентификация kerberos
location /  {
#       proxy_pass http://********/$request_uri;
# proxy_set_header   X-Real-IP $remote_addr;
# proxy_set_header   Host $http_host;
# proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;

auth_gss on;
auth_gss_realm EXAMPLE.COM;
auth_gss_keytab /etc/srv-nginx.keytab;
auth_gss_service_name HTTP/srv-nginx.example.com;

# выключает basic аутентификация, рекомендуется использовать off если нет https подключения
# auth_gss_allow_basic_fallback off;
}
}

 - Проверяю правильность написания конфигурации nginx:

# nginx -t

nginx: [emerg] directive "server_name" is not terminated by ";" in /etc/nginx/conf.d/srv-nginx.example.com.conf.conf:6
nginx: configuration file /etc/nginx/nginx.conf test failed

 Забыл поставить точку с запятой после server_name srv-nginx.example.com
 Правлю /etc/nginx/conf.d/srv-nginx.example.com.conf и снова тестирую

# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

 - Вот теперь перезапускаю сервер nginx. Хотя, если у вас не боевой сервер, то можно и сразу перезапустить и получить ошибку. А на рабочем останов веб сервера чреват громким шумом пользователей :).


3. Отладка nginx kerberos
 - Запущен ли сервер на порту 8888 можно посмотреть командой

# netstat -na |grep 8888

 - Логи nginx по умолчанию складываются в /var/log/nginx/, есть access.log error.log (доступны только для root)

 - Заходим на windows компьютер под доменным пользователем, запускаем internet explorer, заходим в свойства -> Безопасность -> Местная интрасеть -> Сайты -> Дополнительно -> Добавить в зону следующий узел - *.example.com -> Добавить -> Закрыть. Затем  набираем http://srv-nginx.example.com:8888 и видим страницу по умолчанию из корня сайта (вход выполнен под доменным пользователем)

 - Чтобы убедится в правильности входа, на сервере смотрим логи /var/log/nginx/access.log и видим ip_адрес и логин_пользователя (с виндовз компьютера)

Всёёёёёёёёёё

Комментариев нет:

Отправить комментарий

django-oscar tinymce 4 filebrowser

Задача: в дашборде django-oscar загружать изображения 1. Установка django-filebrowser-no-grappelli - Открываем проект, загружаем виртуа...