четверг, января 03, 2013

Использование hosts.deny и hosts.allow

С помощью файлов hosts.{deny,allow} можно закрывать и открывать нужным хостам/подсетям доступ к сервису. Обычно это делают с помощью iptables. Но с помощью этих файлов можно произвести какие-то дополнительные действия. Например можно записать лог файл, отправить письмо, сообщить клиенту почему ему запрещен доступ к хосту. И такое можно применить к любому сервису. Если же использовать эти файлы как firewall, то это плохая идея. Iptables справится с этим лучше.

Простой пример как запретить доступ ко всем сервисам:

file hosts.deny
ALL : ALL

file hosts.allow
<must be empty>

Если надо открыть доступ только для ssh (для всех):

file hosts.allow
sshd : ALL

Или если надо открыть доступ к ssh только для подсети:

file hosts.allow
sshd : 192.168.1.

Или только для хоста:

file hosts.allow
sshd : 192.168.1.41
Т.е. в начале читается файл hosts.allow, если есть совпадение правил поиск прекращается, доступ разрешается. Если совпадений нет, поиск производится уже в hosts.deny.

Как видно синтаксис прост:

daemon_list : client_list : option : option ...
daemon_list - список сервисов через пробел
client_list - список клиентов через пробел
option - ALLOW, DENY, spawn, twist, severity
Вот spawn, twist уже куда интересней. Хотя severity тож интересно. Итак надо писать лог-файл когда кто-то заходит по ssh. Напишем скрипт который будет писать лог-файл:

file /root/test
#!/bin/bash
echo `date`" $1" >> /root/log

file hosts.deny
ALL : ALL

file hosts.allow
sshd : 192.168.1.41 : spawn (/root/test "%d(%p) client_ip=%a usename=%u access=allow")
В результате получим файл /root/log:

Thu Jan 3 02:55:43 MSK 2013 sshd(2448) client_ip=192.168.1.41 usename=unknown access=allow
Да, да sshd сам пишет лог. Но это, так сказать, для себя, просто понятней. Это простой пример как можно использовать свой скрипт. При помощи этого инструмента можно поменять PATH для пользователя. Или отправить письмо или еще какие действия в системе сотворить. В общем применение широкое.

Теперь давайте сообщать пользователю почему ему запрещен доступ к сервису.

file /root/test
#!/bin/bash
echo `date`" $1" >> /root/log

file hosts.deny
ALL : ALL spawn (/root/test "%d(%p) client_ip=%a usename=%u access=deny") : twist /bin/echo "You are not welcome to use %d from %h."

file hosts.allow
sshd : ALL EXCEPT 192.168.1.41
Смысл такой - разшеить всем доступ к сервису, запретить только для хоста 192.168.1.41. Чтоб увидеть сообщение надо запустить ssh с ключом -v:

debug1: ssh_exchange_identification: You are not welcome to use sshd from 192.168.1.41.
А в лог-файле будет:

Thu Jan 3 03:14:50 MSK 2013 sshd(2494) client_ip=192.168.1.41 usename=unknown access=deny
В общем широкое применение. Дополнительно надо читать:

man 5 hosts_options
man 5 hosts_access
man tcpd

1 комментарий: