Приветствую коллеги.
Во-первых, громадное спасибо Олегу за его прошивку и всем людям, участвующим в развитии этого форума. Почитав его, настолько вдохновился, что решил подкинуть свои 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
2. Создаем каталог, где будет храниться всё, имеющее отношение к ssl.Code:ipkg install openssl
3. Копируем текущий конфигурационный файл lighttpd.Code:mkdir /opt/etc/lighttpd/ssl
4. Редактируем новый файл lighttpd_ssl.confCode:cp /opt/etc/lighttpd/lighttpd.conf /opt/etc/lighttpd/lighttpd_ssl.conf
- в разделе server.modules раскомментируем записи о mod_access, mod_cgi и mod_accesslog;
- в разделе server.port меняем порт на 443;
- раскомментируем раздел cgi.assign. У меня уже был установлен perl, посему просто прописал корректные пути к бинарнику
Коллеги рекомендуют вместо /opt/bin/perl прописать /bin/sh. Наверное, чтобы не ставить perl, но у меня он уже был установлен, так что оставил как есть.Code:cgi.assign = ( ".pl" => "/opt/bin/perl", ".cgi" => "/opt/bin/perl" )
- раскомментируем всю секцию SSL engine. В качестве путей вписываем пути до файлов сертификатов сервера, которые нам еще предстоит создать ниже, в пунктах 7 и 8.
5. Идем в каталог ssl и начинаем шаманить.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
6. Редактируем файл ca.cfg до подобного содержанияCode:cd /opt/etc/lighttpd/ssl touch index.txt echo '01' > serial touch ca.cfg
7. Cоздаем сертификат для сервера. В процессе спросит свойства ключа, заполнять по желанию. Единственное замечание - в поле common name желательно прописать FQDN рутера, например ваш dyndns-аккаунт, если конечно вы это используете.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
8. Создаем pem-файл для сервера.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 ]$
9. Создаем клиентский сертификат. В процессе аналогично интересуются про страну, имя и т.д. как в пункте 8. На вопросыCode:cat lighttpd.key lighttpd.crt > lighttpd.pem
просто нажимаем Enter.Code:A challenge password []: An optional company name []:
10. Подписываем и конвертируем клиентский сертификат. Вместо 12345 в нижеследующем коде пишем пароль для защиты сертификата, который у вас запросят при импортировании сертификата в браузер.Code:openssl req -new -newkey rsa:2048 -nodes -keyout user.key -out user.csr
11. Через Самбу, ftp или флешку, у кого чего, копируем файл /opt/etc/lighttpd/ssl/user.p12 с роутера на клиентскую машину и импортируем в броузер.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
12. Останавливаем lighttpd
13. Редактируем скрипт запуска lighttpd для старта с новым конфигурационным файлом. Изменяем следующую строчку в файле /opt/etc/init.d/S80lighttpd. Если чего-то пойдет не так, всегда можно вернутся к предыдущему конфигу.Code:/opt/etc/init.d/S80lighttpd stop
14. Разрешаем на файрволе доступ по https. Для этого редактируем файл /usr/local/sbin/post-firewall и заносим туда строчкуCode:DAEMON_OPTS="-f ${prefix}/etc/lighttpd/lighttpd_ssl.conf"
15. Как всегда на всякий пожарныйCode:iptables -I INPUT -m tcp -p tcp --dport 443 -j ACCEPT
16. Заходим на роутер уже через https. При входе, в зависимости от браузера, будет ругаться на неизвестный самоподписанный сертификат, тем не менее все работает замечательно. Можно, правда, вытащить сертификат сервера и импортировать его как доверенный, тогда и ругаться не будет. Может попозже допишу такой вариант.Code:flashfs save && flashfs commit && flashfs enable reboot