Console Light: настройка location

В примере настройки Console Light в первом блоке указан параметр location без закрывающего слэша в конце:

location /console {
    allow 127.0.0.1;
    deny all;

    alias /usr/share/angie-console-light/html;
    index index.html;

    location /console/api/ {
        api /status/;
    }
}

а вот в блоке с API уже есть слэш.
Не рекомендуется ли и в блоке с location /console установить слэш в конце?

Добрый день

Установить слэш в location /console вы можете. При этом запрос к Console вы будете вынуждены делать http://www.example.com/console/, поскольку запрос http://www.example.com/console не сработает.

Подробности здесь: alias
и здесь: location

1 Like

Добавлю, что директива api так устроена, что она делает автоматический редирект если был запрошен путь, совпадающий с location-ом, в котором она находится, но без слеша. Таким же свойством обладает и, например, директива proxy_pass.

А вот директивы в location /console этого свойства не имеют, поэтому так.

1 Like

Ясно, получается, что если даже указать location /console/ то всё равно перенаправит на http://www.example.com/console/. Думал, что лучше будет указать у себя в конфигурации вариант со слэшем в конце.

Проверил текущий вариант через утилиту gixy:

==================== Results ===================

>> Problem: [alias_traversal] Path traversal via misconfigured alias.
Description: Using alias in a prefixed location that doesn't ends with directory separator could lead to path traversal vulnerability.
Additional info: https://github.com/yandex/gixy/blob/master/docs/en/plugins/aliastraversal.md
Pseudo config:

server {
        server_name example.com;

        location /console {
                alias /usr/share/angie-console-light/html;
        }
}

==================== Summary ===================
Total issues:
    Unspecified: 0
    Low: 0
    Medium: 1
    High: 0

Хотелось бы использовать вариант с закрывающим слэшем и без редиректов.

Пожалуйста, используйте:

location /console/ {
    allow 127.0.0.1;
    deny all;

    alias /usr/share/angie-console-light/html/;
    index index.html;

    location /console/api/ {
        api /status/;
    }
}
1 Like

Так и делаю.
Просто получается, что в документации приводится пример, имеющий небольшую уязвимость.

Больше похоже на то, что gixy врет на счет уязвимости. Уязвимость была бы, если бы alias содержал слеш на конце, а location нет. В данном случае и alias и location без слеша на конце.

1 Like

Тут пишут что остаётся маленькая вероятность, поэтому отмечают ошибку как низкую:

В данном случае они вполне ожидаемое поведение называют уязвимостью.

Если у меня есть пачка файлов или директорий, начинающихся с ru- и я хочу чтобы они были также доступны по именам, начинающимся с en-, то вполне могу написать такой конфиг:

location /path/ru- {
     alias /root/path/en-;
}

и это нормально.

В конфиге с /console это может быть нежелательным поведением, что все запросы начинающиеся с /console будут обработаны данным location, но будет ли это обязательно проблемой - нет. А для кого-то проблемой будет обратная ситуация: если добавить туда слеш, то запрос без слеша /console попадет не туда, а люди часто забывают слеши на конце URI.

Какая ситуация неприятнее, что /console попадет не туда, или что запрос /console-babla попадет в данный location - зависит от остальной конфигурации. На мой взгляд оба варианта не идеальны, но их никак нельзя назвать уязвимыми только на основании отсутствия/наличия слеша.

1 Like

Понятно, благодарю за пояснение.

Впрочем, есть у меня идея сделать директиву auto_redirect on/off. Сейчас у некоторых директив есть такое свойство (далее цитата из документации на location):

Если префиксный location задан со слэшом в конце и запросы обрабатываются при помощи proxy_pass, fastcgi_pass, uwsgi_pass, scgi_pass, memcached_pass или grpc_pass, используется особое поведение. На запрос с URI без завершающего слэша, в остальном совпадающим с префиксом, будет возвращено постоянное перенаправление с кодом 301, указывающее на URI запроса с добавленным в конце слэшом.

Так вот, auto_redirect on будет включать такое поведение без этих директив.

Бегло прочитал сообщение и побежал проверять этот параметр ))))))))
Оказывается рано ещё)

Только вот gixy об этом знать не будет, давно не обновляется. А в NixOS перед обновлением конфигурации запускается проверка конфигурации nginx через gixy, если есть потенциальные проблемы, то система не даст применить обновление.

Если решим сделать, то можно ожидать тогда с релизом 1.5.0, где-то в 1 кв. 2024.

1 Like

gixy будет видеть, что слеш есть там и там. Всё будет хорошо с точки зрения gixy.

Конфиг будет примерно таким:

location /console/ {
    auto_redirect on;

    allow 127.0.0.1;
    deny all;

    alias /usr/share/angie-console-light/html/;
    index index.html;

    location /console/api/ {
        api /status/;
    }
}
1 Like

т.е. при запросе /console перенаправит в /console/?
А то я сперва подумал наоборот - при конфигурации:

location /console {
    auto_redirect off;
    alias /usr/share/angie-console-light/html;

и запросе /console-test будет игнорировать alias и сработает другой location.

Да, верно. Ровно такое поведение сейчас, если в location есть, например, proxy_pass:

location /console/ {
     proxy_pass http://upstream;
}

Запрос к /console вернет 301-ый редирект на /console/.

1 Like

Ждём реализации :slight_smile:

Хочу добавить, что для удобства пользователей (пока нет специальной директивы) можно использовать классический вариант:

location = /console {
     return 302 /console/;
}
1 Like

В Console Light возможно ли добавить статистику TLS соединений, в том числе и использование модуля TLS в ядре (kTLS)?