Инсталяция и настройка lighttpd
Решил обновить начало темы, потому что вопрос заработает, или нет - уже не стоит.
Заработает.
Ну и чтобы всем все было понятно.
1. Устанавливаем Lighttpd:
ipkg install lighttpd
2.Устанавливаем php:
ipkg install php-fcgi
3. Правим файл: /opt/etc/lighttpd/lighttpd.conf
Code:
# lighttpd configuration file
server.modules = (
"mod_access",
"mod_cgi",
"mod_fastcgi",
"mod_accesslog" )
server.document-root = "/opt/share/www/"
connection.kbytes-per-second = 320
index-file.names = ( "index.php", "index.html")
mimetype.assign = (
".pdf" => "application/pdf",
".sig" => "application/pgp-signature",
".spl" => "application/futuresplash",
".class" => "application/octet-stream",
".ps" => "application/postscript",
".torrent" => "application/x-bittorrent",
".dvi" => "application/x-dvi",
".gz" => "application/x-gzip",
".pac" => "application/x-ns-proxy-autoconfig",
".swf" => "application/x-shockwave-flash",
".tar.gz" => "application/x-tgz",
".tgz" => "application/x-tgz",
".tar" => "application/x-tar",
".zip" => "application/zip",
".mp3" => "audio/mpeg",
".m3u" => "audio/x-mpegurl",
".wma" => "audio/x-ms-wma",
".wax" => "audio/x-ms-wax",
".ogg" => "application/ogg",
".wav" => "audio/x-wav",
".gif" => "image/gif",
".jpg" => "image/jpeg",
".jpeg" => "image/jpeg",
".png" => "image/png",
".xbm" => "image/x-xbitmap",
".xpm" => "image/x-xpixmap",
".xwd" => "image/x-xwindowdump",
".css" => "text/css",
".html" => "text/html",
".htm" => "text/html",
".js" => "text/javascript",
".asc" => "text/plain",
".c" => "text/plain",
".cpp" => "text/plain",
".log" => "text/plain",
".conf" => "text/plain",
".text" => "text/plain",
".txt" => "text/plain",
".dtd" => "text/xml",
".xml" => "text/xml",
".mpeg" => "video/mpeg",
".mpg" => "video/mpeg",
".mov" => "video/quicktime",
".qt" => "video/quicktime",
".avi" => "video/x-msvideo",
".asf" => "video/x-ms-asf",
".asx" => "video/x-ms-asf",
".wmv" => "video/x-ms-wmv",
".bz2" => "application/x-bzip",
".tbz" => "application/x-bzip-compressed-tar",
".tar.bz2" => "application/x-bzip-compressed-tar"
)
accesslog.filename = "/opt/var/log/lighttpd/access.log"
accesslog.format = "%h %l %u %{date}t \"%r\" \"%{Referer}i\""
url.access-deny = ( "~", ".inc",".sqlite" )
$HTTP["url"] =~ "\.pdf$" {
server.range-requests = "disable"
}
static-file.exclude-extensions = ( ".fcgi", ".php", ".pl", ".py", ".rb" )
server.port = 8080
server.pid-file = "/var/run/lighttpd.pid"
fastcgi.server = ( ".php" =>
( "localhost" =>
(
"min-procs" => 1,
"max-procs" => 1,
"max-load-per-proc" => 4,
"socket" => "/tmp/php-fastcgi.socket",
"bin-path" => "/opt/bin/php-fcgi"
)
)
)
4. В файле: /opt/etc/init.d/S45php
Code:
#!/bin/sh
export PHP_FCGI_CHILDREN=1
PORT=1026
BIN=/opt/bin/php-fcgi
case $1 in
start)
$BIN -b $PORT &
;;
stop)
kill Pidof phpM ;;
*)
echo "usage: $0 (start|stop)"
exit 1
;;
esac
5. В файле /opt/etc/init.d/S80lighttpd
Code:
#!/bin/sh
prefix="/opt"
PATH=${prefix}/bin:${prefix}/sbin:/sbin:/bin:/usr/sbin:/usr/bin
NAME=lighttpd
DAEMON=${prefix}/sbin/${NAME}
DAEMON_OPTS="-f ${prefix}/etc/lighttpd/lighttpd.conf"
test -x $DAEMON || exit 0
if [ -z "$1" ] ; then
case `echo "$0" | sed 's:^.*/\(.*\):\1:g'` in
S??*) rc="start" ;;
K??*) rc="stop" ;;
*) rc="usage" ;;
esac
else
rc="$1"
fi
case "$rc" in
start)
echo "Starting web server: $NAME"
$DAEMON $DAEMON_OPTS
;;
stop)
if [ -n "`pidof $NAME`" ]; then
echo "Stopping web server: $NAME"
killall $NAME 2> /dev/null
fi
;;
restart)
"$0" stop
sleep 1
"$0" start
;;
*)
echo "Usage: $0 (start|stop|restart|usage)"
;;
esac
exit 0
6. В файле /opt/share/www/index.php
PHP Code:
<?php
phpinfo();
?>
7. Задаем разрешения:
chmod +x /opt/etc/init.d/S45php
chmod +x /opt/etc/init.d/S80lighttpd
chmod 744 /opt/share/www/index.php
8. Запускаем
/opt/etc/init.d/S45php start
/opt/etc/init.d/S80lighttpd start
9. Проверяем работу:
В процессах (ps) должно быть примерно так:
Code:
355 admin 4120 S /opt/bin/php-fcgi -b 1026
356 admin 4124 S /opt/bin/php-fcgi -b 1026
362 admin 1116 S /opt/sbin/lighttpd -f /opt/etc/lighttpd/lighttpd.conf
363 admin 4120 S /opt/bin/php-fcgi
364 admin 4124 S /opt/bin/php-fcgi
открываем информационную страничку php, которую мы написали в п.6:
http:\\192.168.1.1:8080(или ваш адрес роутера)
10.Все.
UPD by vectorm: нет, не все.
Со всеми последними версиями нужно ОБЯЗАТЕЛЬНО сделать это.
Иначе не запустится.
Доступ к 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. При входе, в зависимости от браузера, будет ругаться на неизвестный самоподписанный сертификат, тем не менее все работает замечательно. Можно, правда, вытащить сертификат сервера и импортировать его как доверенный, тогда и ругаться не будет. Может попозже допишу такой вариант.
Использование встроенного веб-интерфейса через lighttpd
Quote:
Originally Posted by
Alexander B.
Веб-интерфейс роутера крутится на своем встроенном веб-сервере, настройки которого сводятся только к выбору порта. С одной стороны, хочется иметь доступ и к этому интерфейсу снаружи. С другой - безопасностью там и не пахнет: нет поддержки SSL, авторизация plain-text, наличие уязвимостей во встроенном веб-сервере - большой вопрос.
Никто не сталкивался с таким вопросом? Прошу поделиться опытом решения и/или идеями, если таковые есть.
Я недавно захотел сделать, именно то, о чем Вы тут говорите. И вот что у меня получилось.
Надо: ходить в веб-интерфейс роутера и в другие внутренние ресурсы через https.
При помощи lighttpd версии 1.4.20 сделать это показалось мне невозможным, ибо он не позволяет использовать прокси (mod_proxy) с одновременным условным переписыванием запроса (mod_rewrite), о чем говорит вот этот баг в трекере. Там же предлагается использовать версию 1.5.
На форуме нашел тему, где автор поделился результатами сбоорки lighttpd 1.5 под mipsel. Версия экспериментальная, пререлизная, но вполне рабочая, в чем я сам убедился.
Дальше все просто, настраиваем proxy и получаем доступ к веб-морде роутера, модема и вообще чего угодно(я, например, прикрутил веб-интерфейс amule).
PHP Code:
server.modules += "mod_proxy_core"
server.modules += "mod_proxy_backend_http"
$HTTP["url"] =~ "^/router_admin/" {
proxy-core.backends = ( "127.0.0.1:8081" )
proxy-core.protocol = "http"
proxy-core.max-pool-size = 2
proxy-core.rewrite-request = (
"_uri" => ( "^/router_admin/(.*)" => "/$1" )
)
}
Единственное, чего я не понял - как заставить ссылки http://domain.name/router_admin и http://domain.name/router_admin/ обрабатываться одинаковым образом... Видимо, надо regexp написать похитрее :)
Пролемы с запуском lighttpd+php-fcgi
При загрузке роутера через раз стартует php-fcgi (строки красным - отсутствуют), хотя lighttpd стартует нормально.
Quote:
145 AL 4456 S /opt/bin/php-fcgi -b 1026
152 AL 1544 S /opt/sbin/lighttpd -f /opt/etc/lighttpd/lighttpd.conf
201 AL 4872 S /opt/bin/php-fcgi -b 1026
Запуск из post-mount:
Quote:
...
mount -obind /tmp/harddisk/opt /opt
i=0
while [ $i -le 30 ]
do
if [ -d /opt/etc ]
then
break
fi
sleep 1
logger "While mount /tmp/harddisk/opt"
i=`expr $i + 1`
done
/tmp/harddisk/opt/etc/init.d/S45php start
/tmp/harddisk/opt/etc/init.d/S80lighttpd start
...
Что не так?