Page 1 of 5 123 ... LastLast
Results 1 to 15 of 69

Thread: Доступ к lighttpd с ssl только по сертификатам

  1. #1

    Post Доступ к lighttpd с ssl только по сертификатам

    Приветствую коллеги.

    Во-первых, громадное спасибо Олегу за его прошивку и всем людям, участвующим в развитии этого форума. Почитав его, настолько вдохновился, что решил подкинуть свои 5 копеек
    Дело в том, что установив rtorrent с веб-мордой, vnstat, ados, rrdtool, решил выпустить всё это добро наружу с соответствующим уровнем безопасности. И вот что из этого вышло.

    Внимание, данный HOWTO не претендует на полноту, абсолютную правильность и вселенскую истину. Я не гуру в Линуксе, просто чтение и попытки понять мануалы и хелпы. Как обычно as is. У меня всё замечательно работает. С удовольствием принимаются замечания, корректировки и комментарии.

    Источники:
    http://wl500g.info/showpost.php?p=90459&postcount=343
    http://www.unixdoc.ru/print.php?print_id=155

    Задача - получить доступ по ssl к lighttpd снаружи c авторизацией исключительно с помощью клиентских сертификатов. Как результат, получаем зашифрованное соединение, отсутствие передачи по сети каких-либо паролей, которые можно попытаться снять кейлоггером либо брутфорсом, доступ только с компьютера, в браузер которого импортирован сооответствующий клиентский сертификат.

    Предполагается, что уже имеем настроенный и корректно работающий lighttpd. Уже сконфигуренные замечательные приблуды типа ados, морды rtorrent, rrdtool, vnstat и т.д. ("ку" 3 раза их создателям и людям, написавшим мануалы по их установке) процессу не мешают и впоследствии совершенно замечательно работают под новой конфигурацией.

    1. Устанавливаем openssl
    Code:
    ipkg install openssl
    2. Создаем каталог, где будет храниться всё, имеющее отношение к ssl.
    Code:
    mkdir /opt/etc/lighttpd/ssl
    3. Копируем текущий конфигурационный файл lighttpd.
    Code:
    cp /opt/etc/lighttpd/lighttpd.conf /opt/etc/lighttpd/lighttpd_ssl.conf
    4. Редактируем новый файл lighttpd_ssl.conf
    - в разделе server.modules раскомментируем записи о mod_access, mod_cgi и mod_accesslog;
    - в разделе server.port меняем порт на 443;
    - раскомментируем раздел cgi.assign. У меня уже был установлен perl, посему просто прописал корректные пути к бинарнику
    Code:
    cgi.assign                 = ( ".pl"  => "/opt/bin/perl",
                                   ".cgi" => "/opt/bin/perl" )
    Коллеги рекомендуют вместо /opt/bin/perl прописать /bin/sh. Наверное, чтобы не ставить perl, но у меня он уже был установлен, так что оставил как есть.
    - раскомментируем всю секцию SSL engine. В качестве путей вписываем пути до файлов сертификатов сервера, которые нам еще предстоит создать ниже, в пунктах 7 и 8.

    Code:
    #### SSL engine
    ssl.engine                 = "enable"
    ssl.pemfile                = "/opt/etc/lighttpd/ssl/lighttpd.pem"
    ssl.ca-file                = "/opt/etc/lighttpd/ssl/lighttpd.crt"
    ssl.verifyclient.activate  = "enable"
    ssl.verifyclient.enforce   = "enable"
    ssl.verifyclient.depth     = 1
    5. Идем в каталог ssl и начинаем шаманить.

    Code:
    cd /opt/etc/lighttpd/ssl
    touch index.txt
    echo '01' > serial
    touch ca.cfg
    6. Редактируем файл ca.cfg до подобного содержания

    Code:
    [ ca ]
    default_ca = CA_CLIENT
    [ CA_CLIENT ]
    dir                            =   /opt/etc/lighttpd/ssl
    certs                          =   $dir
    new_certs_dir                  =   $dir
    database                       =   $dir/index.txt
    serial                         =   $dir/serial
    certificate                    =   $dir/lighttpd.crt
    private_key                    =   $dir/lighttpd.key
    default_days                   =   3650
    default_crl_days               =   3
    default_md                     =   md5
    policy                         =   policy_anything
    [ policy_anything ]
    countryName                    = optional
    stateOrProvinceName            = optional
    localityName             =   optional
    organizationName         =   optional
    organizationalUnitName   =   optional
    commonName               =   supplied
    emailAddress             =   optional
    7. Cоздаем сертификат для сервера. В процессе спросит свойства ключа, заполнять по желанию. Единственное замечание - в поле common name желательно прописать FQDN рутера, например ваш dyndns-аккаунт, если конечно вы это используете.

    Code:
    openssl req -newkey rsa:2048 -nodes -keyout lighttpd.key -x509 -days 3650 -out lighttpd.crt
    
    Generating a 2048 bit RSA private key
    .................+++
    .+++
    writing new private key to 'lighttpd.key'
    -----
    You are about to be asked to enter information that will be incorporated
    into your certificate request.
    What you are about to enter is what is called a Distinguished Name or a DN.
    There are quite a few fields but you can leave some blank
    For some fields there will be a default value,
    If you enter '.', the field will be left blank.
    -----
    Country Name (2 letter code) [AU]:RU
    State or Province Name (full name) [Some-State]:Russia
    Locality Name (eg, city) []:Moscow
    Organization Name (eg, company) [Internet Widgits Pty Ltd]:Home
    Organizational Unit Name (eg, section) []:
    Common Name (eg, YOUR name) []:user.dyndns.org
    Email Address []:
    [user@/opt/etc/lighttpd/ssl ]$
    8. Создаем pem-файл для сервера.

    Code:
    cat lighttpd.key lighttpd.crt > lighttpd.pem
    9. Создаем клиентский сертификат. В процессе аналогично интересуются про страну, имя и т.д. как в пункте 8. На вопросы

    Code:
    A challenge password []:
    An optional company name []:
    просто нажимаем Enter.

    Code:
    openssl req -new -newkey rsa:2048 -nodes -keyout user.key -out user.csr
    10. Подписываем и конвертируем клиентский сертификат. Вместо 12345 в нижеследующем коде пишем пароль для защиты сертификата, который у вас запросят при импортировании сертификата в браузер.

    Code:
    openssl ca -config ca.cfg -in user.csr -out user.crt -batch
    openssl pkcs12 -export -in user.crt -inkey user.key -certfile lighttpd.crt -out user.p12 -passout pass:12345
    11. Через Самбу, ftp или флешку, у кого чего, копируем файл /opt/etc/lighttpd/ssl/user.p12 с роутера на клиентскую машину и импортируем в броузер.

    12. Останавливаем lighttpd

    Code:
    /opt/etc/init.d/S80lighttpd stop
    13. Редактируем скрипт запуска lighttpd для старта с новым конфигурационным файлом. Изменяем следующую строчку в файле /opt/etc/init.d/S80lighttpd. Если чего-то пойдет не так, всегда можно вернутся к предыдущему конфигу.

    Code:
    DAEMON_OPTS="-f ${prefix}/etc/lighttpd/lighttpd_ssl.conf"
    14. Разрешаем на файрволе доступ по https. Для этого редактируем файл /usr/local/sbin/post-firewall и заносим туда строчку

    Code:
    iptables -I INPUT -m tcp -p tcp --dport 443 -j ACCEPT
    15. Как всегда на всякий пожарный

    Code:
    flashfs save && flashfs commit && flashfs enable
    reboot
    16. Заходим на роутер уже через https. При входе, в зависимости от браузера, будет ругаться на неизвестный самоподписанный сертификат, тем не менее все работает замечательно. Можно, правда, вытащить сертификат сервера и импортировать его как доверенный, тогда и ругаться не будет. Может попозже допишу такой вариант.

  2. #2

    Question lighttpd + ssl = ?

    Вопрос:
    как поставить ssl и авторизацию только на директорию с rtorrent, если папка rtorrent должна находиться в корне (/www/rtorrent) ?
    Долго игрался с настройкой модуля http://wl500g.info/showpost.php?p=90611&postcount=352 так ничего и не вышло, есть доступ и к корню и к rtorrent Гуру, помогите пожалуйста с настройкой

  3. #3
    Join Date
    Feb 2008
    Location
    Moscow, Tver
    Posts
    3,962
    Quote Originally Posted by DarthSemafor View Post
    Вопрос:
    как поставить ssl и авторизацию только на директорию с rtorrent, если папка rtorrent должна находиться в корне (/www/rtorrent) ?
    Долго игрался с настройкой модуля http://wl500g.info/showpost.php?p=90611&postcount=352 так ничего и не вышло, есть доступ и к корню и к rtorrent Гуру, помогите пожалуйста с настройкой
    А почему она там должна находиться? Переместите ее в параллельную папку и все будет нормально работать.

  4. #4
    Переместил в /opt/share/rtorrent серт просит подписать, но авторизацию по имени и паролю не требует А вообще можно настроить так, чтобы при запросе на www.blablabla.com был http, а при запросе на https://blablabla.com/rtorrent был ssl и авторизация, и http://blablabla.com/rtorrent недоступно вообще?

  5. #5
    Join Date
    Feb 2008
    Location
    Moscow, Tver
    Posts
    3,962
    Quote Originally Posted by DarthSemafor View Post
    Переместил в /opt/share/rtorrent серт просит подписать, но авторизацию по имени и паролю не требует А вообще можно настроить так, чтобы при запросе на www.blablabla.com был http, а при запросе на https://blablabla.com/rtorrent был ssl и авторизация, и http://blablabla.com/rtorrent недоступно вообще?
    Два порта --- два разных корня

  6. #6
    Quote Originally Posted by vectorm View Post
    Два порта --- два разных корня[/URL]
    Сделал так:
    Code:
    $SERVER["socket"] == ":443" {
    ssl.engine = "enable"
    ssl.pemfile = "/opt/var/run/lighttpd.pem"
    server.document-root = "/opt/share/rtorrent"
    auth.require = ( "" =>
      (
        "method"  => "digest",
        "realm"   => "RT",
        "require" => "valid-user"
       )
      )
    }
    https://192.168.1.1:8081/rtorrent/ не открывает

  7. #7
    Join Date
    Feb 2008
    Location
    Moscow, Tver
    Posts
    3,962
    Quote Originally Posted by DarthSemafor View Post
    Сделал так:
    Code:
    $SERVER["socket"] == ":443" {
    ssl.engine = "enable"
    ssl.pemfile = "/opt/var/run/lighttpd.pem"
    server.document-root = "/opt/share/rtorrent"
    auth.require = ( "" =>
      (
        "method"  => "digest",
        "realm"   => "RT",
        "require" => "valid-user"
       )
      )
    }
    https://192.168.1.1:8081/rtorrent/ не открывает
    Порт тут зачем???

  8. #8
    Quote Originally Posted by vectorm View Post
    Порт тут зачем???
    Я даже не понял сначала Ваш ответ

    1.
    Считаю что нужно обяснить:
    НТТР - по умолчанию 80 порт
    НТТРS - по умолчанию 443 порт
    браузер сам смотрит на эти порты их указывать не надо!

    2.
    Если Вы в конфиг файле прописали как $SERVER["socket"] == ":443"
    тогда https://192.168.1.1/rtorrent/

    Или например

    Если Вы в конфиг файле прописали как $SERVER["socket"] == ":8083"
    тогда https://192.168.1.1:8083/rtorrent/

    3.
    Сообщение от DarthSemafor
    Сделал так:

    $SERVER["socket"] == ":443" {
    ssl.engine = "enable"
    ssl.pemfile = "/opt/var/run/lighttpd.pem"
    server.document-root = "/opt/share/rtorrent"
    auth.require = ( "" =>
    (
    "method" => "digest",
    "realm" => "RT",
    "require" => "valid-user"
    )
    )
    }

    https://192.168.1.1:8081/rtorrent/ не открывает
    Зачем вы вы указываете подпапку в корне сервера если корнем является именно она?
    Выглядит это так:
    Ваш server.document-root = "/opt/share/rtorrent"

    А по Вашему запросу Ваш сервер будет обращатся в
    /opt/share/rtorrent/rtorrent

    Итог
    Чтобы открыть морду rtorrent Вам необходимо ввести в строке браузера
    https://192.168.1.1/
    После чего если все остальные настройки верны Вы получите запрос авторизации.

  9. #9

    Thumbs up

    Люди, помогите плз. не работают ssl соединения через рутер - https(443), pop3(995).
    http, ftp работает отлично, а при попытке соединения по https IE выдает ошибку, а в логах рутера появляются сообщения :
    Feb 24 21:45:52 pppd[98]: Protocol-Reject for unsupported protocol 0xea4f
    Feb 24 21:45:53 pppd[98]: Protocol-Reject for unsupported protocol 0x8c62
    Feb 24 21:46:05 pppd[98]: Protocol-Reject for unsupported protocol 0xf65b
    Feb 24 21:46:22 pppd[98]: Protocol-Reject for unsupported protocol 0xd42f
    Feb 24 21:46:41 pppd[98]: Protocol-Reject for unsupported protocol 0x9ec8
    причем цифры типа 0x8c62 от случая к случаю могут отличаться.
    При попытках получить почту через POP3(SSL) часть почты удается получить, но все равно в логах появляются подобные приведенным выше сообщения.
    может кто сталкивался с такой проблемой?

    UPD: вопрос решился установкой nomppc в дополнительных параметрах pppd

    Всем спасибо за ответы! Особенно Less за разъяснение И еще маленький вопрос: как наиболее безопасно и грамотно пробросить порт 443 наружу с помощью post-firewall?
    Last edited by Omega; 25-08-2012 at 06:09. Reason: 2 posts merged

  10. #10

    Arrow

    Quote Originally Posted by DarthSemafor View Post
    Всем спасибо за ответы! Особенно Less за разъяснение И еще маленький вопрос: как наиболее безопасно и грамотно пробросить порт 443 наружу с помощью post-firewall?
    Я думаю ето то что нужно Доступ к lighttpd с ssl только по сертификатам

  11. #11
    Quote Originally Posted by Less View Post
    Сделал так:
    Code:
    iptables -I INPUT -m tcp -p tcp --dport 443 -j ACCEPT
    ssl не бросается наружу Изнутри прекрасно коннектится.

  12. #12
    Quote Originally Posted by DarthSemafor View Post
    Сделал так:
    Code:
    iptables -I INPUT -m tcp -p tcp --dport 443 -j ACCEPT
    ssl не бросается наружу Изнутри прекрасно коннектится.
    А дайте ка вывод команды iptables -nvL INPUT
    Должно быть что то типа:
    Code:
    Chain INPUT (policy DROP 0 packets, 0 bytes)
     pkts bytes target     prot opt in     out     source               destination
        0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0          tcp dpt:443
    ...
    А так же netstat -na | grep 443
    И тут
    Code:
    Active Internet connections (servers and established)
    Proto Recv-Q Send-Q Local Address           Foreign Address         State
    tcp        0      0 0.0.0.0:443          0.0.0.0:*               LISTEN
    И попробуйте вот так
    Code:
    iptables -I INPUT -m tcp -p tcp --syn -i "$1"  --dport 443 -j ACCEPT
    wl500gp-1.9.2.7-d-r1222 + StoreJet 35 Ultra >>> rtorrent+rutorrent -|- lighhtpd + ssl + auth -|- vnStat + vnStat PHP frontend -|- vsftpd -|- squid + lightsquid...

  13. #13
    Quote Originally Posted by Less View Post

    И попробуйте вот так
    Code:
    iptables -I INPUT -m tcp -p tcp --syn -i "$1"  --dport 443 -j ACCEPT
    вбил правило, получилось следующее
    iptables -nvL INPUT
    Code:
     pkts bytes target     prot opt in     out     source               destination 
        0     0 ACCEPT     tcp  --  ppp0   *       0.0.0.0/0            0.0.0.0/0          tcp dpt:443 flags:0x16/0x02
        4   208 ACCEPT     tcp  --  ppp0   *       0.0.0.0/0            93.80.xxx.xxx     tcp dpt:8080 flags:0x16/0x02
    и так далее...
    netstat -na | grep 443
    Code:
    tcp        0      0 0.0.0.0:443             0.0.0.0:*               LISTEN
    Слушается...
    Нодоступа из инета всё равно нет

  14. #14
    Причина найдена - провайдер!
    Просто - напросто блокирует порты с 1 по 1024, кроме фтп и http

  15. #15
    Quote Originally Posted by DarthSemafor View Post
    Причина найдена - провайдер!
    Просто - напросто блокирует порты с 1 по 1024, кроме фтп и http
    перебросьте вверх вместо 443 на 8000+ в чём проблема?

Page 1 of 5 123 ... LastLast

Similar Threads

  1. Инсталяция и настройка lighttpd
    By Vollsky in forum Russian Discussion - РУССКИЙ (RU)
    Replies: 425
    Last Post: 09-11-2016, 08:00
  2. Доступ к S.M.A.R.T HDD
    By bigest in forum Russian Discussion - РУССКИЙ (RU)
    Replies: 78
    Last Post: 22-05-2016, 22:54
  3. Доступ к роутеру из сети. Как это сделать?
    By Bormann in forum Russian Discussion - РУССКИЙ (RU)
    Replies: 258
    Last Post: 27-12-2013, 09:07
  4. How-to Lighttpd, PHP, MySQL and Eaccelerator
    By wpte in forum WL-500gP Tutorials
    Replies: 152
    Last Post: 06-06-2012, 18:28
  5. Удаленный доступ
    By 26dx in forum Russian Discussion - РУССКИЙ (RU)
    Replies: 131
    Last Post: 08-04-2009, 20:09

Tags for this Thread

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •