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 с ошибкой