Всем доброго дня. Столкнувшись с необходимостью настроить SOCKS5 я обнаружил, что в интернетах и в частности на Хабре при настройке авторизации для dante-server используется метод «username».

Этот метод отнюдь не является безопасным. Об этом не раз писалось ( например ) и приводилось множество сравнений с 3proxy который для авторизации использует отдельный файл паролей. Кого интересует реализация данной возможности в Dante прошу под кат.

Описывать установку и базовую настройку не буду, этих статей огромное множество и в общем ничего сложного в них нет. Затрону лишь тему отдельного файла паролей. Все команды будут приведены для Ubuntu, однако сделать то же самое на других дистрибутивах так же не сложно.

Необходимо оговориться, что данте для данного функционала должен быть собран с поддержкой PAM, в статьях по установке это отображено тем, что в статусе конфигурации исходников должна быть следующая строка:

PAM:               Enabled


Если же вы устанавливаете пакет из репозитория, то PAM уже идет в его зависимотях.

Итак, для начала нам понадобятся дополнительные компоненты:

aptitude install libpam-pwdfile

Пакет libpam-pwdfile представляет возможность аутентификации по отдельному файлу формата /etc/passwd.

После установки редактируем файл /etc/pam.d/sockd

nano /etc/pam.d/socksd


В файл вписываем следующее:


auth required pam_pwdfile.so pwdfile ${DIR_FOR_PASSWD_FILE}/sockd.passwd
account required pam_permit.so


Здесь мы задаем файл с паролями для нашего сервиса. Замените ${DIR_FOR_PASSWD_FILE} на директорию где у вас будет лежать файл с паролями (например /opt/dante ).

Сам файл с паролями имеет формат файла /etc/passwd, что означает отдельная строка для каждого пользователя в виде разделенных двоеточием параметров. Первый параметр имя пользователя, второй — шифрованный пароль.

SomeUser:$1$1bhzkYnM$cfYSzS9Vx17AypWYAnnhn0


Шифрованые пароли можно получить посредством утилиты mkpasswd из пакета whois следующим образом:

mkpasswd --method=md5 SomeStrongPassword


После того как мы все подготовили, остается только включить соответствующий метод авторизации в Dante. Для этого редактируем ваш файл /etc/sockd.conf и меняем следующую строчку

socksmethod: username


на эту

socksmethod: pam.username


Презагружаем Dante и получаем авторизацию по отдельному файлу паролей.

P.S.

Имя PAM сервиса используемое Dante по умолчанию sockd. Так же, если вы хотите использовать файл конфигурации libpam_pwdfile от другого настроенного сервиса, либо использовать несколько конфигураций, вы можете воспользоваться директивой pamservicename в конфигурационном файле Dante. Пример использования:

client pass {
        from: 0.0.0.0/0 to: 0.0.0.0/0
	#the servicename should differ from the servicename in socks-rules
        pamservicename: pam_host
}

Для более полного понимания использования данной директивы рекомендую обратиться к документации Dante, ссылка на которую приведена ниже.

Использованные материалы:

Документация Dante. PAM Autentication.

Описание модуля libpam-pwdfile на GitHub

Комментарии (25)


  1. Din_V
    25.04.2018 13:29

    было бы хорошо указать, что для корректной работы PAM авторизации Dante должен быть скомпилирован c поддержкой PAM.
    (указано по ссылке которую автор привел в конце статьи.)


    1. liquidpredator Автор
      25.04.2018 13:30

      Благодарю за поправку, обязательно в ближайшее время добавлю данный момент.


  1. vostapenko
    25.04.2018 16:13

    Debian 9. Что если в /etc/pam.d нет файла sockd? Сервис данте, я так понимаю называется danted. Добавление файла danted в /etc/pam.d не решает ситуацию. Приконнектиться не удается.

    Dante из репозитория. v1.4.1


    1. liquidpredator Автор
      25.04.2018 16:26

      Если, файл отсутствует, то при открытие на редактирование (например командой nano /etc/pam.d/socksd ) он создастся. Необходимо создавать именно файл sockd.

      Для большей наглядности добавлю команду редактирования в статью.


      1. vostapenko
        25.04.2018 16:40

        sockd тоже сделал на всякий случай (хотя в дебиане такой службы нет, есть danted). Не пашет.
        В логе:
        Apr 25 14:37:23 (1524663443.287009) danted[4672]: info: Dante/server[1/1] v1.4.1 running
        Apr 25 14:37:34 (1524663454.948978) danted[4674]: info: block(1): tcp/accept ]: xxx.xx.xxx.x.xxxxx xx.xxx.xx.xxx.xxxx: error after reading 19 bytes in 3 seconds: pam_authenticate() for user "socks" failed: Authentication failure


        Отдельно скажу, что socksmethod: username работает нормально. Проблемы только после переключения.


        1. liquidpredator Автор
          25.04.2018 16:42

          от какого пользователя запускается Dante?

          В файле sockd.passwd все в порядке?


          1. vostapenko
            25.04.2018 16:50

            1.
            ~# ps -aux|grep danted
            nobody 4716 0.0 0.1 48556 1860 ? Ss 14:45 0:00 /usr/sbin/danted -D
            nobody 4717 0.0 0.0 48556 320 ? S 14:45 0:00 danted: monitor-ch
            root 4718 0.1 0.5 68264 5184 ? S 14:45 0:00 danted: negotiate-
            nobody 4719 0.0 0.0 48556 328 ? S 14:45 0:00 danted: request-ch
            nobody 4720 0.0 0.0 48556 328 ? S 14:45 0:00 danted: request-ch
            nobody 4721 0.0 0.0 48556 328 ? S 14:45 0:00 danted: request-ch
            nobody 4722 0.0 0.0 48556 328 ? S 14:45 0:00 danted: request-ch
            nobody 4723 0.0 0.0 48556 328 ? S 14:45 0:00 danted: request-ch
            nobody 4724 0.0 0.0 48556 328 ? S 14:45 0:00 danted: request-ch
            nobody 4725 0.0 0.0 48556 328 ? S 14:45 0:00 danted: request-ch
            nobody 4726 0.0 0.0 48556 328 ? S 14:45 0:00 danted: request-ch
            nobody 4727 0.0 0.0 48556 328 ? S 14:45 0:00 danted: request-ch
            nobody 4728 0.0 0.0 48556 328 ? S 14:45 0:00 danted: request-ch
            nobody 4729 0.0 0.0 48556 328 ? S 14:45 0:00 danted: request-ch
            nobody 4730 0.0 0.0 48556 328 ? S 14:45 0:00 danted: request-ch
            nobody 4731 0.0 0.0 48556 328 ? S 14:45 0:00 danted: request-ch
            nobody 4732 0.0 0.0 48556 328 ? S 14:45 0:00 danted: request-ch
            nobody 4733 0.0 0.0 48556 328 ? S 14:45 0:00 danted: request-ch
            nobody 4734 0.0 0.0 48556 328 ? S 14:45 0:00 danted: request-ch
            nobody 4735 0.0 0.1 48556 1412 ? S 14:45 0:00 danted: io-child:
            nobody 4736 0.0 0.1 48556 1484 ? S 14:45 0:00 danted: negotiate-
            root 4756 0.0 0.1 12784 1020 pts/0 S+ 14:47 0:00 grep danted


            2. sockd.passwd генерировался командой htpasswd -b -m -c /opt/danted/danted.passwd UserName SomeStrongPassword представляет из себя

            cat /opt/danted/danted.passwd
            socks:hash


            В /etc/pam.d/sockd и danted указан именно /opt/danted/danted.passwd


            1. sergrt
              25.04.2018 17:01

              Возможно, не установлен pam_pwdfile.so. В /lib/security (или /lib64/security) должен присутствовать таковой.


              1. vostapenko
                25.04.2018 17:06

                Установлен.

                Проблему удалось победить, сгенерировав хеш при помощи mkpasswd.

                Причем «htpasswd -b -m -c» при повторном вызове постоянно разный хеш вставляет в файл. Соль что ли используется? Ну и по результату не работает. В первопричинах пока не разбирался.


                1. liquidpredator Автор
                  25.04.2018 17:11

                  Странно, нужно будет проверить в чем проблема. Пока что уберу способ с htpasswd


                  1. vostapenko
                    25.04.2018 17:19

                    ~# htpasswd -b -m -c /opt/danted/danted.passwd1 socks qwer1234
                    Adding password for user socks
                    ~# htpasswd -b -m -c /opt/danted/danted.passwd2 socks qwer1234
                    Adding password for user socks
                    ~# cat /opt/danted/danted.passwd1
                    socks:$apr1$YfVx7bMg$QezEU7Mf0AgDiRCD3Yx/g.
                    ~# cat /opt/danted/danted.passwd2
                    socks:$apr1$aydFBNIn$uYkZh5VdRBiWdvT0AH.h2.


                    1. liquidpredator Автор
                      25.04.2018 17:51

                      Да, действительно htpasswd для md5 использует соль…

                      httpd.apache.org/docs/2.4/misc/password_encryptions.html

                      Но и mkpasswd использует соль. Проблема заключается в типе алгоритма в хэше. Тип для md5 должен быть $1, однако htpasswd устанавливает тип $apr1

                      www.shellhacks.com/ru/linux-generate-password-hash

                      И насколько я понимаю формат хеширования MD5 (APR) не поддерживается.


      1. Prototik
        25.04.2018 18:10

        Необходимо создавать именно файл sockd

        Не обязательно именно sockd, имя сервиса можно указать в конфиге с помощью pamservicename.


        1. liquidpredator Автор
          25.04.2018 18:16

          Благодарю, действительно упустил эту директиву. Добавлю в статью этот момент.


  1. Asparagales
    25.04.2018 16:37

    У меня более общий вопрос. Чаще всего используются следующие види прокси:
    http/https — thinproxy, squid.
    и socks — 3proxy, dante, shadowsocks.
    Если я понял правильно, то http/https прокси вообще не предусматривают паролей и к ним может подключиться любой. В socks-прокси можно настроить вход по паролям, но я слышал, что они передаются открытым текстом, то есть существует возможность их перехвата. Я верно изложил или нет?


    1. liquidpredator Автор
      25.04.2018 16:39

      Http прокси так же могут быть закрыты паролем, в том числе и с использованием SSL/TLS.
      Да, пароль к прокси передается в открытом виде, в связи с чем и появилась эта статья.


      1. gudvinr
        25.04.2018 21:17

        Кроме shadowsocks. Это обёртка, которая туннелирует внутри себя, и локально запускает socks сервер. и пароль зашифрованным передается.


  1. liquidpredator Автор
    25.04.2018 16:39

    --


  1. 9660
    26.04.2018 06:35

    А кто знает как в этом dante победить chaining local socks5-> remote socks5 для случая когда оба сервера с авторизацией?
    Фактически самая ходовая ситуация — купленый внешний socks5 прокси используется через socks5 установленный в локалке.


    1. Temtaime
      26.04.2018 10:08

      У меня немного схожий вопрос.
      Собираюсь спрятать прокси тора за авторизацию, данте же умеет переадресовывать запросы не на интерфейс, а на другую сокс проки(в данном случае тор)?


    1. liquidpredator Автор
      26.04.2018 10:14

      Согласно этому разделу документации, вы можете это реализовать. Авторизация при цепочки прокси возможна, но не поддерживается. Так что на свой страх и риск.


    1. liquidpredator Автор
      26.04.2018 10:15

      --


  1. kuPyxa
    26.04.2018 10:18

    www.inet.no/dante/doc/1.4.x/config/auth_pam.html вот здесь написано, что пароль передается все равно в открытом виде. Так что зачем эти заморочки…


    1. liquidpredator Автор
      26.04.2018 10:20

      Вроде я в начале статьи привет ссылку ( например ) по которой можно прочитать одну из вполне очевидных причин использовать «эти заморочки».
      Вообще возможность обезопасить свой сервер от потенциальной дыры вполне себе оправдывает данные действия.


  1. epanov
    26.04.2018 11:32

    Запуск dante в docker контейнере избавляет от многих проблем hub.docker.com/r/vimagick/dante

    Если dante настраивается только для телеграма, то можно в конфиге разрешить его подсети github.com/ojab/docker-dante-telegram/blob/master/danted_authenticated.conf
    Это подстрахует от mitm атак, так как логин и пароль передаются в открытом виде. Таким образом сделать, что-то противоправное через ваш прокси не получится. Но к сожалению не решает проблему использования вашего прокси на халяву для телеграма.