Я не нашел в данном пакете встроенного механизма авторизации для просмотра потока в браузере через интернет. Из-за этого сервис будет постоянно доступен для всех. Доступ конечно можно ограничить через нужный IP адрес правилами в iptables, но это неудобно, т.к. IP адрес может быть динамическим, к примеру, интернет на смартфоне.
В таком случае, сделаем авторизацию через Apache+IPTables.
Предположим, что в системе уже установлены пакеты Motion, Apache и IPTatables. Есть сайт доступный в интернете mysite.ru
Физически на диске он расположен:
#/home/www/mysite.ru/cgi-bin
#/home/www/mysite.ru/www
Нам нужно создать файл webcam.cgi, положить в папку /home/www/mysite.ru/cgi-bin и назначить на него права доступа 775:
#touch /home/www/mysite.ru/cgi-bin/webcam.cgi
#chmod 755 /home/www/mysite.ru/cgi-bin/webcam.cgi
Содержимое файла webcam.cgi:
Теперь, если набрать в браузере mysite.ru/cgi-bin/webcam.cgi, то этот файл будет транслировать поток, который отдает motion на порту 8081.
Далее создаем файл паролей для авторизации через apache, выполняем:
#htpasswd -cb /home/www/mysite.ru/.htpasswd user parol
Далее создаем файл .htaccess в /home/www/mysite.ru/cgi-bin:
#touch /home/www/mysite.ru/cgi-bin/.htaccess
Содержимое файла .htaccess:
Теперь, если набрать в браузере mysite.ru/cgi-bin/webcam.cgi, то появится панель авторизации для ввода логина и пароля.
Всё это хорошо, логин с паролем уже есть, но поток всё еще можно видеть по прямому адресу mysite.ru:8081 минуя страницу файла вызова webcam.cgi
Вот теперь самое интересное.
Создаем файл webcam_ipt.cgi и кладем в папку /home/www/mysite.ru/
#touch /home/www/mysite.ru/webcam_ipt.cgi
#chmod 755 /home/www/mysite.ru/webcam_ipt.cgi
Содержимое файла webcam_ipt.cgi:
Далее нам необходимо, чтобы файл webcam_ipt.cgi выполнялся при выполнении webcam.cgi.
Приводим файл webcam.cgi к виду:
Мы уже стали ближе к цели, но работать не будет, необходимо следующее. Чтобы запускать perl скрипты из ВЕБ от имени root, необходимо установить пакет:
#yum install perl-suidperl
Файлам, которые необходимо запускать нужно, установить UID при выполнении chmod 4755 file.cgi
Т.е. чтобы наш файл webcam_ipt.cgi запускался от имени root выполняем:
#chmod 4755 /home/www/mysite.ru/webcam_ipt.cgi
Попытаюсь описать на пальцах, как это работает.
Заходим в браузер, вводим mysite.ru/cgi-bin/webcam.cgi, появляется запрос авторизации apache, вводим логин и пароль, если авторизация пройдена в скрипте webcam.cgi выполняется:
$ip_for_ipt = "$ENV{'REMOTE_ADDR'}"; # получение IP адреса
system("/home/www/mysite.ru/webcam_ipt.cgi $ip_for_ipt"); # выполнение скрипта webcam_ipt.cgi которому на вход подан IP адрес
Далее выполняется файл webcam_ipt.cgi, в нем полученный IP адрес подставляется в команду iptables, которая открывает порт 8081 для полученного IP адреса.
Правило создано, порт открыт, и файл webcam.cgi начинает гнать поток видео с mysite.ru:8081
Теперь нужно позаботиться о том, чтобы порт закрылся. Делаем это просто и кардинально, добавляем в файл crontab запись * * * * * root /sbin/iptables -F Motion-Port-INPUT > /dev/null
#echo "* * * * * root /sbin/iptables -F Motion-Port-INPUT > /dev/null" >> /etc/crontab
Результат выполнения будет таков, что команда iptables будет очищать все правила таблицы в цепочке Motion-Port-INPUT и порт 8081 через минуту будет закрыт.
Содержимое файла c расположением цепочек и правил в них /etc/sysconfig/iptables:
В таком случае, сделаем авторизацию через Apache+IPTables.
Предположим, что в системе уже установлены пакеты Motion, Apache и IPTatables. Есть сайт доступный в интернете mysite.ru
Физически на диске он расположен:
#/home/www/mysite.ru/cgi-bin
#/home/www/mysite.ru/www
Нам нужно создать файл webcam.cgi, положить в папку /home/www/mysite.ru/cgi-bin и назначить на него права доступа 775:
#touch /home/www/mysite.ru/cgi-bin/webcam.cgi
#chmod 755 /home/www/mysite.ru/cgi-bin/webcam.cgi
Содержимое файла webcam.cgi:
#!/usr/bin/perl $ENV{PATH} = "/usr/bin"; print "Content-type: text/html \n\n"; print <<HTML; <html> <head> <title> Веб - камера </title> <meta http-equiv="Content-Type" content="text/html; charset=windows-1251"> </head> <body> <center> <img src="http://mysite.ru:8081"> </center> </body> </html> HTML
Теперь, если набрать в браузере mysite.ru/cgi-bin/webcam.cgi, то этот файл будет транслировать поток, который отдает motion на порту 8081.
Далее создаем файл паролей для авторизации через apache, выполняем:
#htpasswd -cb /home/www/mysite.ru/.htpasswd user parol
Далее создаем файл .htaccess в /home/www/mysite.ru/cgi-bin:
#touch /home/www/mysite.ru/cgi-bin/.htaccess
Содержимое файла .htaccess:
AuthType Basic AuthName "Monitor MySite.Ru" AuthUserFile /www/mysite.ru/.htpasswd require valid-user
Теперь, если набрать в браузере mysite.ru/cgi-bin/webcam.cgi, то появится панель авторизации для ввода логина и пароля.
Всё это хорошо, логин с паролем уже есть, но поток всё еще можно видеть по прямому адресу mysite.ru:8081 минуя страницу файла вызова webcam.cgi
Вот теперь самое интересное.
Создаем файл webcam_ipt.cgi и кладем в папку /home/www/mysite.ru/
#touch /home/www/mysite.ru/webcam_ipt.cgi
#chmod 755 /home/www/mysite.ru/webcam_ipt.cgi
Содержимое файла webcam_ipt.cgi:
#!/usr/bin/perl $ENV{PATH} = "/usr/bin"; foreach $arg_ip (@ARGV){ if ($arg_ip =~ /^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$/){ $arg_ip =~ /(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})/; $ip_on = "$1.$2.$3.$4"; system("/sbin/iptables -A Motion-Port-INPUT -p tcp -m state -m tcp -s $ip_on --dport 8081 --state NEW -j ACCEPT"); } }
Далее нам необходимо, чтобы файл webcam_ipt.cgi выполнялся при выполнении webcam.cgi.
Приводим файл webcam.cgi к виду:
#!/usr/bin/perl $ENV{PATH} = "/usr/bin"; $ip_for_ipt = "$ENV{'REMOTE_ADDR'}"; system("/home/www/mysite.ru/webcam_ipt.cgi $ip_for_ipt"); print "Content-type: text/html \n\n"; print <<HTML; <html> <head> <title> Веб - камера </title> <meta http-equiv="Content-Type" content="text/html; charset=windows-1251"> </head> <body> <center> <img src="http://mysite.ru:8081"> </center> </body> </html> HTML
Мы уже стали ближе к цели, но работать не будет, необходимо следующее. Чтобы запускать perl скрипты из ВЕБ от имени root, необходимо установить пакет:
#yum install perl-suidperl
Файлам, которые необходимо запускать нужно, установить UID при выполнении chmod 4755 file.cgi
Т.е. чтобы наш файл webcam_ipt.cgi запускался от имени root выполняем:
#chmod 4755 /home/www/mysite.ru/webcam_ipt.cgi
Попытаюсь описать на пальцах, как это работает.
Заходим в браузер, вводим mysite.ru/cgi-bin/webcam.cgi, появляется запрос авторизации apache, вводим логин и пароль, если авторизация пройдена в скрипте webcam.cgi выполняется:
$ip_for_ipt = "$ENV{'REMOTE_ADDR'}"; # получение IP адреса
system("/home/www/mysite.ru/webcam_ipt.cgi $ip_for_ipt"); # выполнение скрипта webcam_ipt.cgi которому на вход подан IP адрес
Далее выполняется файл webcam_ipt.cgi, в нем полученный IP адрес подставляется в команду iptables, которая открывает порт 8081 для полученного IP адреса.
Правило создано, порт открыт, и файл webcam.cgi начинает гнать поток видео с mysite.ru:8081
Теперь нужно позаботиться о том, чтобы порт закрылся. Делаем это просто и кардинально, добавляем в файл crontab запись * * * * * root /sbin/iptables -F Motion-Port-INPUT > /dev/null
#echo "* * * * * root /sbin/iptables -F Motion-Port-INPUT > /dev/null" >> /etc/crontab
Результат выполнения будет таков, что команда iptables будет очищать все правила таблицы в цепочке Motion-Port-INPUT и порт 8081 через минуту будет закрыт.
Содержимое файла c расположением цепочек и правил в них /etc/sysconfig/iptables:
*filter :FORWARD ACCEPT [0:0] :INPUT ACCEPT [0:0] :Motion-Port-INPUT - [0:0] :RH-Firewall-1-INPUT - [0:0] :OUTPUT ACCEPT [0:0] ### Цепочка Motion-Port-INPUT -A INPUT -j Motion-Port-INPUT ### ### Цепочка RH-Firewall-1-INPUT -A RH-Firewall-1-INPUT -i lo -j ACCEPT -A RH-Firewall-1-INPUT -p icmp --icmp-type any -j ACCEPT -A RH-Firewall-1-INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT -A RH-Firewall-1-INPUT -p tcp -m tcp -m state --dport 21 --state NEW -j ACCEPT -A RH-Firewall-1-INPUT -p tcp -m tcp -m state --dport 22 --state NEW -j ACCEPT -A RH-Firewall-1-INPUT -p tcp -m state -m tcp --dport 80 --state NEW -j ACCEPT -A INPUT -j RH-Firewall-1-INPUT -A RH-Firewall-1-INPUT -j REJECT ### COMMIT