Ниже представлена попытка без лишних усложнений решить задачу контроля по IP+MAC в Samba без запуска дополнительных служб в системе.В операционной системе создаются всего два системных пользователя с атрибутом nologin (smbfull с smblim). Данные о работающих в Samba пользователях хранятся в текстовом файле, с таким форматом:
nicname_ФИО и дополнительная информация _IPaddress_MACaddress_limitsize(block)
Итого пять полей с разделителем "_" (если в имени пользователя допускается знак подчеркивания, в приведенном ниже скрипте следует заменить "_", допустим, на "|").
При превышении указанного объема клиент может продолжать работать со своими документами, редактировать их, но добавить (создать) что-либо или удалить не сможет.
Такой подход может удовлетворить небольшую сеть с индивидуальными ПК, где требуется:
*** нескольким пользователям подключить сетевые папки для документов, каждому свою, с привязкой по IP;
*** возможность иметь общие папки (внутри своих) между двумя или более пользователями для совместного доступа
*** исключить доступ с других ПК (и даже видимость в сетевом окружении)
*** избежать подключения с "левого" ПК (смена IP) посредством контроля MAC адреса
*** контролировать превышение объема информации в каждой директории, выделенной каждому пользователю.
Часть решения подсказал некий robux на форуме linux.org.ru, у него просто авторизировались системные пользователи по IP.
Создаем системных пользователей, первого "smbfull" в группе "smbfull", nologin. Второго "smblim" в группе "smbfull"
Создаем тех же для самбы:
smbpasswd -n -d smbfull
smbpasswd -n -d smblim
Каталоги созданных пользователей удалим и создадим общие /home/smbusers для каталогов пользователей и /home/smbses для, так называемых, сессионных каталогов.
Пример файла конфигурации smb.conf
[global]
security = user
passdb backend = smbpasswd:/etc/samba/smbpasswd
username map script = /etc/samba/login.sh %I
nullpasswords = yes
directory mask = 755
create mask = 755
inherit owner = yes
inherit permissions = yes
log file = /var/log/smbd.%I
max log size = 20
hosts allow = 192.168.0.0/24
socket address = 192.168.0.1
[docs]
path = /home/smbses/%I
public = yes
writable = yes
printable = no
root postexec = /etc/samba/exit.sh %I
Скрипт залогинивания login.sh
#!/bin/sh -
fses='/home/smbses/'$1
rm $fses
v_ipmac=`/usr/local/bin/arp-scan -q --interface=rl1 $1 | sed -n '3p' | sed 's/[ ]/_/g'`
res=''
res=`grep $v_ipmac /etc/samba/access`
if [ "$res" == "" ]
then
echo 'Blocked!!! - '$v_ipmac >> /home/smbusers/log
exit
fi
v_nic=`echo $res | cut -d_ -f1`
v_sz=`echo $res | cut -d_ -f5`
v_dir='/home/smbusers/'$v_nic
ln -s $v_dir $fses
siz=`du -sL $fses | sed -e 's/[ ].*//g'`
if [ $siz -gt $v_sz ]
then
echo 'limit exceeded! - '$v_nic' '$v_ipmac >> /home/smbusers/log
echo 'smblim'
else
echo 'smbfull'
fi
Скрипт отключения exit.sh
#!/bin/sh -
rm /home/smbses/$1
Скрипт создания пользователей addusmb
#!/bin/sh -
fil='/etc/samba/access'
echo `date` >> $fil
echo -n ' User (nicname) - '
read v_nic
res=`grep -c "^$v_nic" $fil`
if [ $res != 0 ]
then
echo 'nicname '\"$v_nic\"' busy!!!'
sleep 2
exit
fi
echo -n ' Fullname user - '
read v_fn
echo -n ' User IP - '
read v_ip
res=`grep -c "$v_ip" $fil`
if [ $res != 0 ]
then
echo 'IP-'$v_ip' busy!!!'
sleep 2
exit
fi
ping -w 1 -c 1 $v_ip >/dev/null
if [ $? != 0 ]; then
echo 'IP address unavailable :('
sleep 2
exit
fi
echo -n ' Allowable size of files (Mb)- '
read v_sm
let "v_sz=$v_sm * 2048"
v_ipmac=`/usr/local/bin/arp-scan -q --interface=rl1 $v_ip | sed -n '3p' | sed -e 's/[ ]/_/g'`
# nicname_fullname_ip_mac_limit
echo $v_nic'_'$v_fn'_'$v_ipmac'_'$v_sz >> /etc/samba/access
v_dir='/home/smbusers/'$v_nic
mkdir $v_dir
chmod 755 $v_dir
chown smbfull $v_dir
chgrp smbfull $v_dir
echo ' Ok!'
sleep 1
В скриптах между "[" и "]" введен один пробел и один ТАБ.
У каждого свой каталог, каждому назначаем допустимый объем информации, при достижении которого он теряет право на создание чего либо нового, но продолжает работать со своими документами.
При подключении (либо сетевой диск, либо просто ярлык на ресурс) проверяется соответствие IP_MAC, и, если есть совпадение в файле access, то вытягивается с этой строки nicname и допустимый объем.
Создается симлинк директории пользователя с /home/smbusers/user в /home/smbses/~IP
Проверяется размер директории пользователя, сравнивается с дозволенным. Если значение меньше допустимого, то входим под пользователем smbfull с полными правами, если лимит превышен - входим под smblim. По завершении сеанса в Windows линк удаляется.
Для организации общего ресурса между двумя или более пользователями ( с одинаковыми правами в этой папке!) просто делаем симлинк внутренней папки пользователя в папку другого (других).
Можно еще добавить шару и делать так же симлинк какой-то папки пользователя в шару для публикаций файлов, при этом не бояться за их исчезновение или редактирование.
При тестах не стоит спешить, при подключении (при обращении) создается линк и процесс сессии, при отключении от самбы (достаточно отключить сетевой диск или закрыть папку) линк с /home/smbses/ удаляется быстро, а вот процесс может еще повисеть.
Пока процесс висит - самба вас помнит, и конфигурацию при подключении не перечитает. Можно дождаться закрытия процесса или убить вручную, тогда при подключении вступят в силу внесенные изменения.
URL:
Обсуждается: http://www.opennet.dev/tips/info/2601.shtml