Страница 1 из 1

Урезанная SAMBA с небольшим наворотом. USERS - IP+MAC.

Добавлено: 2011-07-06 11:59:49
mastertron
Часто в нете встречал темы (вопросы) типа « SAMBA - контроль по IP+MAC » или что-то в этом роде, но чистых ответов не было, в основном - поднимать дополнительные службы в системе.
Вот и меня, по определенным причинам, заинтересовало решение задачи подобного плана.
Данный вариант - экспериментальный и доморощенный. Хотелось получить простой вариант на базе одной службы и Бэ-Мэ функциональный.
Такой подход может удовлетворить небольшую сеть с индивидуальными компами, где требуется:
- нескольким пользователям подключить сетевые папки для документов ( или ...), каждому свою, с привязкой по IP
- возможность иметь общие папки ( внутри своих) между некоторыми пользователями для совместного доступа
- исключить доступ с других ПК ( и даже видимость в сетевом окружении)
- избежать подключения с «левого» компа ( смена IP ) посредством контроля MAC адреса
- контролировать превышение объема ( значение одно на всех ) информации в каждой директории, выделенной каждому пользователю.

Решение реализовано на скриптах, вызываемых директивами root preexec и root postexec .
При подключении пользователя к службе контролируется ( с помощью утилиты arp-scan , просто arp гребет из кэша ) физический адрес в связке с IP и сравнивается со списком в файле. Если находит идентичное сочетание IP_MAC - вытягивает с этого же файла путь к директории пользователя (для пользовательских директорий создана отдельная директория /home/archive) и создает симлинк в директорию /home/samba с именем IP клиента, /home/samba предназначена чисто для этих линков. Этот линк удаляется при завершении сеанса пользователя в винде или завершении самой службы самбы. Линк может остаться в некоторых случаях (нажали на резет, питание сбойнуло ...) , и чтоб не было проблем — в скрипте подключения сделал контрольное удаление симлинка.
Если нужна общая папка между юзерами - создаем папку «join» и, все тем же линком, отражаем в папку другого пользователя (лей), пусть общаются.
Объем информации контролирую посредством утилиты 'du' так же при подключении ( можно и при отключении), размерность блоковая, для упрощения сравнения в скрипте. Если лимит превышен - меняем разрешение на директорию юзера на 750, при этом он продолжает читать и редактировать файлы, но удалять или создавать ( закачивать ) не сможет. Естественно ожидаем возмущения, делаем мозговливание, заставляем удалить все лишнее и возобновляем полноправный доступ. Хотелось бы получить возможность предупреждения, но ...
nmbd - не используется. Samba запускаем с директивой: smbd -D
Для создания сетевой папки на винде подключаем сетевой диск и указываем путь : \\192.168.0.1\docs , этот путь у всех одинаков. Ярлык можно бросить на рабочий стол. До подключения на ярлыке горит симпатичный красный вопросительный знак :)
Вобсчем - и так все понятно.
Все это дело крутится на OpenBSD47, пока на 12 пользователей.
Вот конфиг и скрипты. Пользователя samba без прав создадите в системе сами :)

smb.conf

Код: Выделить всё

[global]
   security = share
   guest account= samba
   log file = /var/log/smbd.%m
   max log size = 50
   hosts allow = 192.168.0.
   socket address = 192.168.0.1
   create mask = 0770
   
[docs]
    root preexec = /etc/samba/pre %I
    comment = Document Archive
    path = /home/samba/%I
    public = yes
    writable = yes
    printable = no
    root postexec = /etc/samba/post %I
Скрипт для создания пользователей (точнее не пользователей, а ... даже не знаю :)

Код: Выделить всё

#!/bin/sh -
# add user IP<->MAC
fil='/etc/samba/access'
echo -n " Вводим IP - "
read V_IP
ping -w 1 -c 1 $V_IP > /dev/null
if [ $? -eq 0 ]
then
  echo  -n " Вводим имя директории юзера - "  
  read V_U
  echo  -n " Коротко опишем, что за фрукт - "  
  read V_O
  V_S=`arp-scan -q --interface=em1 $V_IP |sed -n '3p' | sed -e 's/[ 	]/_/g'`'_'
  V_P='/home/archive/'$V_U
  mkdir $V_P
  chmod 770 $V_P
  echo '_____' >> $fil
  echo $V_O >> $fil
  echo $V_S$V_P >> $fil
  #  Control
  echo 'И того ...'
  echo 'Дано IP_MAC:  '$V_S
  echo 'Создана папка юзера:  '$V_U
  echo 'Для -  '$V_O
  sleep 5
else  
  echo 'Извени ... - IP щас недоступен! Пробуй позжее.'
  sleep 3
  exit
fi
Скрипт подключения

Код: Выделить всё

#!/bin/sh -
# pre execute  

rm /home/samba/$1
R=`/usr/local/bin/arp-scan -q --interface=em1 $1 | sed -n '3p' | sed 's/[ 	]/_/g'`'_'
S=`grep -c -w $R /etc/samba/access`
P=`grep $R /etc/samba/access | sed -e 's/.*_//g'`
if test $S -eq 0
then
  echo 'gavnuk zavelsya- '$R >> /home/samba/log
else
  echo '\b ok - '$R >> /home/samba/log
  ln -s $P /home/samba/$1
#  Test size dir
  siz=`du -sL /home/samba/$1 | sed -e 's/[	].*//g'`
  if [ $siz -gt 4000000 ]; then
     echo 'Накачал, блин - '$1 >> /home/samba/log
     chmod -R -H g-w /home/samba/$1
  fi
fi
Скрипт отключения

Код: Выделить всё

!/bin/sh -
#  post execute
rm /home/samba/$1
Скрипт восстановления прав на запись.

Код: Выделить всё

#!/bin/sh -
# unblock w for IP 

echo -n 'Разблокировать IP - '
read V_IP
chmod -R -H g+w /home/samba/$V_IP
echo ' OK!'
sleep 2
В некоторых строках между “[“ и “]” - один пробел и один таб.

Конечно же не профессионально, но интересно, и работает.
Пробовал держать инфу в MySQL, но при таком объеме пользователей ... :)
Посмотрю, может писануть парочку скриптов для прочесывания пользовательских папок, тестить на наличие всяких излишеств и правильно на это дело реагировать. В принципе, можно сделать себе на машину сетевой диск с доступом к верхнему каталогу всех пользовательских папок и шерстить от себя. Можно и никсовый антивирь подцепить и ... .

Re: Урезанная SAMBA с небольшим наворотом. USERS - IP+MAC.

Добавлено: 2011-07-07 0:37:10
mastertron
На некоторых ПК опробовал еще одну фичу:
Сетевой диск не подключал, написал скрипт архивирования документов "7z a \\IP сервака\docs доки" и в планировщик. Юзер о своем сетевом ресурсе и не догадывается. Samba на время транзакции открывает соединение, создается линк, по окончании обращения все вертается взад.

Re: Урезанная SAMBA с небольшим наворотом. USERS - IP+MAC.

Добавлено: 2011-07-10 23:58:59
mastertron
Понятно, что сдешним гуру такое ненужно, но раз начал …
Как говорят — первый бля вунитаз. Стоило завести юзерам папки с ВИНдонутыми именами …
И ваще идея менять маску на каталоги — чушь.
Но задача то осталась! Буду решать …
И того: Всю писанину и юзеров — вунитаз. Для реализации задуманного нужно создать в системе двух пользователей, при этом один должен иметь группу другого.
Создаем первого «smbfull» в группе «smbfull», nologin ... Второго «smblim» в группе «smbfull».
Создаем тех же для самбы: smbpasswd -n -d smbfull и ткаже для smblim . Каталоги созданных юзеров удалил и создал /home/smbusers для каталогов пользователей, и /home/smbses для, так называемых, сессионных каталогов.
Пишем конфиг и скрипты:
(кое что подсмотрел на форуме linux.org.ru у товарисча robux, но идея частичная )

Код: Выделить всё

[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
Скрипт залогинивания

Код: Выделить всё

#!/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 'mudak!!! - '$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 
Скрипт отключения

Код: Выделить всё

#!/bin/sh -
rm /home/smbses/$1
Скрипт создания пользователей

Код: Выделить всё

#!/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
У каждого свой каталог, каждому назначаем допустимый объем инфы, при достижении которого он теряет право на создание чего либо нового, но продолжает работать со своими доками.
Вроде достиг достигаемого.