OpenBSD: Аутентификационный шлюз на базе authpf(8)


Мини-руководство "шаг за шагом"

Усложняем проведение сетевых атак типа ARP- и IP-spoofing:

# vi /etc/ssh/sshd_config
Protocol 2
ClientAliveInterval 15
ClientAliveCountMax 3

После внесения изменений даем указание демону перечитать свой конфиг:

# kill -HUP `head -1 /var/run/sshd.pid`

В конец файла login.conf(5) заносим сведения о новом классе authpf:

# vi /etc/login.conf
authpf:\
	:shell=/usr/sbin/authpf:\
	:tc=default:

Обновляем хэшированную базу данных /etc/login.conf.db:

# cap_mkdb /etc/login.conf

Так как будем использовать дефолтные значения директив anchor и table, оставляем /etc/authpf/authpf.conf пустым:

# echo -n > /etc/authpf/authpf.conf

Подготавливаем приветственное сообщение, аналог /etc/motd:

# echo 'Please play nice.' > /etc/authpf/authpf.message

Создаем нового пользователя, который принадлежит классу authpf, входит в группу authpf и в качестве оболочки получает /usr/sbin/authpf:

# useradd -m -c 'authpf nat user' -g authpf -L authpf -s /usr/sbin/authpf andrey
# passwd andrey

Создаем набор правил файервола для пользователя andrey:

# mkdir -p /etc/authpf/users/andrey
# vi /etc/authpf/users/andrey/authpf.rules
ext_if = "fxp0"

nat on $ext_if inet from $user_ip to any -> ($ext_if)

Рассмотрим еще один пример. Допустим, нам "извне"нужно получить доступ к серверу терминалов, расположенному за шлюзом. Создаем нового пользователя rdp и определяем для него специальный набор правил файервола:

# useradd -m -c 'authpf rdp user' -g authpf -L authpf -s /usr/sbin/authpf rdp
# passwd rdp
# mkdir -p /etc/authpf/users/rdp
# vi /etc/authpf/users/rdp/authpf.rules
ext_if = "fxp0"
rdp_server = "192.168.1.3"

rdr pass on $ext_if inet proto tcp from $user_ip to port 3389 \
	-> $rdp_server port 3389

Вносим необходимые изменения в /etc/pf.conf:

# vi /etc/pf.conf
nat-anchor "authpf/*"
rdr-anchor "authpf/*"
#binat-anchor "authpf/*"
anchor "authpf/*"

Перезагружаем набор рулесетов файервола:

# pfctl -f /etc/pf.conf

Чтобы получить доступ в интернет с любого клиентского компьютера из подсети 192.168.1.0/24, пользователь andrey сначала должен аутентифицироваться на шлюзе:

c:\putty> plink.exe -pw secret andrey@192.168.1.1
Hello andrey. You are authenticated from host "192.168.1.2"
Please play nice.

Для получения доступа "извне" к серверу терминалов вводим следующую команду:

c:\putty> plink.exe -pw secret rdp@85.140.23.36
Hello rdp. You are authenticated from host "81.211.12.32"
Please play nice.

Теперь порт 3389/tcp для IP-адреса 81.211.12.32 открыт, можно запускать TS Client:

c:\putty> mstsc.exe /v:85.140.23.36:3389


OpenBSD.ru www@openbsd.ru
$RuOBSD: authpf.html,v 1.13 2010/11/01 10:57:48 dinar Exp $