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_адрес и логин_пользователя (с виндовз компьютера)
Всёёёёёёёёёё
Комментариев нет:
Отправить комментарий