Начало работы
Чтобы выполнить шаги ниже, должны быть установлены Docker Community Edition без sudo
и Docker Compose v2.
Собираем все
$ bin/build.sh devel && bin/build.sh
Запускаем FreeRADIUS сервер
Шаги установки и конфиги см. в папке freeradius
$ bin/run.sh freeradius
Устанавливаем freeradius-utils
для тестирования
Ubuntu
$ sudo apt install freeradius-utils
CentOS
$ sudo yum install freeradius-utils
Тестируем FreeRADIUS сервер
$ radtest -x bob hello 172.10.0.10 110 host_secret
Sent Access-Request Id 188 from 0.0.0.0:46758 to 172.10.0.10:1812 length 73
User-Name = "bob"
User-Password = "hello"
NAS-IP-Address = 127.0.1.1
NAS-Port = 110
Message-Authenticator = 0x00
Cleartext-Password = "hello"
Received Access-Accept Id 188 from 172.10.0.10:1812 to 172.10.0.1:46758 length 32
Reply-Message = "Hello, bob"
$ radtest -x lameuser hello 172.10.0.10 0 host_secret
Sent Access-Request Id 209 from 0.0.0.0:34798 to 172.10.0.10:1812 length 78
User-Name = "lameuser"
User-Password = "hello"
NAS-IP-Address = 127.0.1.1
NAS-Port = 0
Message-Authenticator = 0x00
Cleartext-Password = "hello"
Received Access-Reject Id 209 from 172.10.0.10:1812 to 172.10.0.1:34798 length 53
Reply-Message = "Your account has been disabled."
(0) -: Expected Access-Accept got Access-Reject
Запускаем OpenLDAP сервер
Шаги установки и конфиги см. в папке openldap
$ bin/run.sh openldap
Устанавливаем ldap-utils
для тестирования
Ubuntu
$ sudo apt install ldap-utils
CentOS
$ sudo yum install openldap-clients
Тестируем OpenLDAP сервер
$ ldapsearch -x -H ldap://172.10.0.11/ -D uid=bob,ou=People,dc=example,dc=com -w hello -b dc=example,dc=com '(uid=bob)' cn -LLL
dn: uid=bob,ou=People,dc=example,dc=com
cn: Bob Bobik
$ ldapsearch -x -H ldap://172.10.0.11/ -D uid=alice,ou=People,dc=example,dc=com -w hello -b dc=example,dc=com cn -LLL
ldap_bind: Invalid credentials (49)
Запускаем Nginx сервер
Nginx настроен следующие варианты аутентификации через FreeRADIUS или OpenLDAP:
- Аутентификация через FreeRADIUS
- Аутентификация через OpenLDAP
- Аутентификация через FreeRADIUS или OpenLDAP
Шаги установки и конфиги см. в папке nginx
$ bin/run.sh nginx
Запрашиваем начальную страницу, не требующую аутентификации
Получаем доступ.
$ curl 172.10.0.30
<html>
<body>
Nginx Default Page
</body>
</html>
Аутентификация через FreeRADIUS
Используется модуль ngx_http_auth_radius_module
.
Исходный код:
Конфиги:
- nginx/etc/nginx/nginx.conf
- nginx/etc/nginx/conf.d/10_radius_server.conf
- nginx/etc/nginx/modules/ngx_http_auth_radius_module.conf
- nginx/etc/nginx/default.d/radius_auth.conf
Запрашиваем страницу, требующую аутентификации через FreeRADIUS, без указания пользователя
Получаем ошибку.
$ curl -v 172.10.0.30/radius_auth/index.html
> GET /radius_auth/index.html HTTP/1.1
> Host: 172.10.0.30
> User-Agent: curl/7.81.0
> Accept: */*
>
* Mark bundle as not supporting multiuse
< HTTP/1.1 401 Unauthorized
< Server: nginx/1.20.1
< Date: Tue, 05 Dec 2023 14:41:28 GMT
< Content-Type: text/html
< Content-Length: 179
< Connection: keep-alive
< WWW-Authenticate: Basic realm="Radius Auth"
<
<html>
<head><title>401 Authorization Required</title></head>
<body>
<center><h1>401 Authorization Required</h1></center>
<hr><center>nginx/1.20.1</center>
</body>
</html>
Запрашиваем страницу, требующую аутентификации через FreeRADIUS, c указанием пользователя
Получаем доступ.
$ curl --user bob:hello 172.10.0.30/radius_auth/index.html
<html>
<body>
Nginx Radius Auth Success
</body>
</html>
Аутентификация через OpenLDAP
Используется модуль nginx-auth-ldap
.
Исходный код:
Конфиги:
- nginx/etc/nginx/nginx.conf
- nginx/etc/nginx/conf.d/10_ldap_server.conf
- nginx/etc/nginx/modules/ngx_http_auth_ldap_module.conf
- nginx/etc/nginx/default.d/ldap_auth.conf
Запрашиваем страницу, требующую аутентификации через OpenLDAP, без указания пользователя
Получаем ошибку.
$ curl -v 172.10.0.30/ldap_auth/index.html
> GET /ldap_auth/index.html HTTP/1.1
> Host: 172.10.0.30
> User-Agent: curl/7.81.0
> Accept: */*
>
* Mark bundle as not supporting multiuse
< HTTP/1.1 401 Unauthorized
< Server: nginx/1.20.1
< Date: Wed, 13 Dec 2023 10:43:07 GMT
< Content-Type: text/html
< Content-Length: 179
< Connection: keep-alive
< WWW-Authenticate: Basic realm="LDAP Auth"
<
<html>
<head><title>401 Authorization Required</title></head>
<body>
<center><h1>401 Authorization Required</h1></center>
<hr><center>nginx/1.20.1</center>
</body>
</html>
Запрашиваем страницу, требующую аутентификации через OpenLDAP, c указанием пользователя
Получаем доступ.
$ curl --user bob:hello 172.10.0.30/ldap_auth/index.html
<html>
<body>
Nginx LDAP Auth Success
</body>
</html>
Аутентификация через FreeRADIUS или OpenLDAP
Используется модуль nginx_upstream_check_module
для отслеживания состояния кластера.
Исходный код:
- https://github.com/yaoweibin/nginx_upstream_check_module
- См. Аутентификация через FreeRADIUS
- См. Аутентификация через OpenLDAP
Конфиги:
- См. Аутентификация через FreeRADIUS
- См. Аутентификация через OpenLDAP
- nginx/etc/nginx/conf.d/99_auth_cluster.conf
- nginx/etc/nginx/default.d/cluster_auth.conf
Запрашиваем страницу, требующую аутентификации через FreeRADIUS или OpenLDAP, без указания пользователя
Получаем ошибку.
Замечаем, что значения Basic realm
чередуются, т.е. обращение происходит то к FreeRADIUS, то к OpenLDAP.
$ curl -v 172.10.0.30/cluster_auth/index.html
> GET /cluster_auth/index.html HTTP/1.1
> Host: 172.10.0.30
> User-Agent: curl/7.81.0
> Accept: */*
>
* Mark bundle as not supporting multiuse
< HTTP/1.1 401 Unauthorized
< Server: nginx/1.20.1
< Date: Wed, 13 Dec 2023 10:49:01 GMT
< Content-Type: text/html
< Content-Length: 179
< Connection: keep-alive
< WWW-Authenticate: Basic realm="Cluster Auth (RADIUS)"
<
<html>
<head><title>401 Authorization Required</title></head>
<body>
<center><h1>401 Authorization Required</h1></center>
<hr><center>nginx/1.20.1</center>
</body>
</html>
Запрашиваем страницу, требующую аутентификации через FreeRADIUS или OpenLDAP, c указанием пользователя
Получаем доступ.
Обращение то к FreeRADIUS, то к OpenLDAP происходит равномерно.
$ curl --user bob:hello 172.10.0.30/cluster_auth/index.html
<html>
<body>
Nginx Cluster Auth Success
</body>
</html>
Запрашиваем страницу, требующую аутентификации через FreeRADIUS при выключенном OpenLDAP, c указанием пользователя
Выключаем OpenLDAP и делаем несколько запросов.
Получаем доступ через некоторый таймаут.
$ time curl --user bob:hello 172.10.0.30/cluster_auth/index.html
<html>
<body>
Nginx Cluster Auth Success
</body>
</html>
real 0m6.022s
user 0m0.004s
sys 0m0.004s
Через некоторое время модуль nginx_upstream_check_module
определяет, что OpenLDAP недоступен.
$ curl http://172.10.0.30/check_status?format=csv
0,auth_cluster,127.0.1.1:8001,up,25,0,http,0
1,auth_cluster,127.0.1.1:8002,down,0,1,http,0
Обращение только к FreeRADIUS. Обращения к OpenLDAP не происходит.
$ time curl --user bob:hello 172.10.0.30/cluster_auth/index.html
<html>
<body>
Nginx Cluster Auth Success
</body>
</html>
real 0m0.006s
user 0m0.006s
sys 0m0.000s