CentOS 5.x и Motion: Просмотр видео потока после авторизации

в 8:52, , рубрики: CentOS, linux, motion, perl, Песочница, метки: , ,

Я не нашел в данном пакете встроенного механизма авторизации для просмотра потока в браузере через интернет. Из-за этого сервис будет постоянно доступен для всех. Доступ конечно можно ограничить через нужный 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:

#!/usr/bin/perl

$ENV{PATH} = "/usr/bin";

print "Content-type: text/html nn";

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 nn";

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 

Автор: SergeyShibka

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js