Добавление правил в IPFW через web-интерфейс

в 17:43, , рубрики: freebsd, ipfw, ssh, Серверное администрирование, системное администрирование, метки: , ,

Имеем FreeBSD-7.4-RELEASE с apache+nginx+php+mysql

Иногда случается такое что нужно получить удаленный доступ по ssh, но в IPFW данные IP не прописаны. Это может быть вызвано разными причинами. Другие сети и так далее.
Да и открывать доступ всем к ssh нет смысла, так как это прямая угроза безопасности. Смена ssh-порта тоже не даст результата. Вернее даст, но на первое время. Потом сканер портов сделает свое грязное дело и подбор логинов/паролей по ssh продолжится.

Так как на удаленной машине, к которой нужно получить доступ, стоит связка apache+nginx+php+mysql (останавливаться на установке сейчас не буду), то решение выбрал следующее:

1. Добавил виртуальный хост на 443 порту
2. Создал сертификаты
3. Создал 2 файлика, с помощью которых буду добавлять правила в IPFW

index.php

<?
$IP=$_SERVER['REMOTE_ADDR'];
?>
<form action="ipfwadd.php" name="myform" method="post">
<table border="1">
<tr>
    <td>Номер правила:</td><td><input type="text" name="rules" maxlength="15" size="5"></td>
</tr>
<tr>
    <td>IP:</td><td><? echo $IP ?>
</tr>
<tr>
    <td>pass/deny</td><td>
	<select name=passdeny size=1>
		<option value=pass>pass</option>
		<option value=deny>deny</option>
	</select>
    </td>
</tr>
<tr>
    <td>UDP/TCP:</td><td>
	<select name=tcpudp size=1>
		<option value=tcp>TCP</option>
		<option value=udp>UDP</option>
	</select>
    </td>
</tr>
<tr>
    <td>Порт:</td><td><input type="text" name="ports" maxlength="6" size="8"></td>
</tr>
</table>
<input name="Submit" type=submit value="Добавить правило">
</form>

ipfwadd.php

<meta http-equiv="refresh" content="0; url=/">
<?
$rules = $_POST['rules'];
$IP = $_SERVER['REMOTE_ADDR'];
$ports = $_POST['ports']; 
$tcpudp = $_POST['tcpudp'];
$passdeny = $_POST['passdeny'];
$grepip = shell_exec("sudo ipfw add $rules $passdeny $tcpudp from $IP to me $ports");
?>

4. Далее ставим sudo из портов
[anton@raccoon ~]$ su -
Password:
[root@raccoon ~]# whereis sudoers
sudoers: /usr/ports/security/sudo/
[root@raccoon ~]# cd /usr/ports/security/sudo/
[root@raccoon /usr/ports/security/sudo]# make install

5. Редактируем /usr/local/etc/sudoers для того чтобы пользователю, от которго запускается web-сервер был доступ к ipfw. У меня этот пользователь www. Соответственно добавил такую строку
www ALL=NOPASSWD:/etc/rc.d/ipfw, /sbin/ipfw

6. Естественно не забываем защитить виртуальный хост или http-авторизацией или через сертификат

7. После чего пробуем добавить данные в ipfw через web. Если все сделано правильно, то в messages увидим примерно следующее:
# cat /var/log/messages|grep ipfw
Feb 10 13:16:03 raccoon sudo: www : TTY=unknown ; PWD=/usr/local/www/ssl ; USER=root ; COMMAND=/sbin/ipfw add 150 pass tcp from 213.130.11.4 to me 80,88
Feb 11 20:24:06 raccoon sudo: www : TTY=unknown ; PWD=/usr/local/www/ssl ; USER=root ; COMMAND=/sbin/ipfw add 150 pass tcp from 88.155.65.100 to me 80,88
Feb 17 18:43:51 raccoon sudo: www : TTY=unknown ; PWD=/usr/local/www/ssl ; USER=root ; COMMAND=/sbin/ipfw add 150 pass tcp from 88.155.91.120 to me 80,88
Mar 3 22:19:02 raccoon sudo: www : TTY=unknown ; PWD=/usr/local/www/ssl ; USER=root ; COMMAND=/sbin/ipfw add 150 pass tcp from 88.155.8.131 to me 80,88
Mar 9 10:03:48 raccoon sudo: www : TTY=unknown ; PWD=/usr/local/www/ssl ; USER=root ; COMMAND=/sbin/ipfw add 150 pass tcp from 88.155.81.41 to me 80,88

Вот в принципе и все. Писалось без «защиты от дурака», так как делалось лично для своих целей. Теперь просто, будучи с телефона, планшета и так далее, попасть в рабочую сеть

Автор: toxxxa13

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


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