Имеем 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