Приветствую коллеги.
Во-первых, громадное спасибо Олегу за его прошивку и всем людям, участвующим в развитии этого форума. Почитав его, настолько вдохновился, что решил подкинуть свои 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. При входе, в зависимости от браузера, будет ругаться на неизвестный самоподписанный сертификат, тем не менее все работает замечательно. Можно, правда, вытащить сертификат сервера и импортировать его как доверенный, тогда и ругаться не будет. Может попозже допишу такой вариант.