README.md

Начало работы

Чтобы выполнить шаги ниже, должны быть установлены 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.

Исходный код:

Конфиги:

Запрашиваем страницу, требующую аутентификации через 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.

Исходный код:

Конфиги:

Запрашиваем страницу, требующую аутентификации через 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 для отслеживания состояния кластера.

Исходный код:

Конфиги:

Запрашиваем страницу, требующую аутентификации через 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
Описание

Опишите проект

Конвейеры
0 успешных
0 с ошибкой