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

Обсуждаем сайт и форум.

Модератор: f0s

Аватара пользователя
mastertron
мл. сержант
Сообщения: 107
Зарегистрирован: 2009-02-06 20:48:53
Откуда: Украина, Одесса

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

Непрочитанное сообщение mastertron » 2011-07-06 11:59:49

Часто в нете встречал темы (вопросы) типа « 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, но при таком объеме пользователей ... :)
Посмотрю, может писануть парочку скриптов для прочесывания пользовательских папок, тестить на наличие всяких излишеств и правильно на это дело реагировать. В принципе, можно сделать себе на машину сетевой диск с доступом к верхнему каталогу всех пользовательских папок и шерстить от себя. Можно и никсовый антивирь подцепить и ... .
Делай как нибудь, а как надо - само получится!

Хостинговая компания Host-Food.ru
Хостинг HostFood.ru
 

Услуги хостинговой компании Host-Food.ru

Хостинг HostFood.ru

Тарифы на хостинг в России, от 12 рублей: https://www.host-food.ru/tariffs/hosting/
Тарифы на виртуальные сервера (VPS/VDS/KVM) в РФ, от 189 руб.: https://www.host-food.ru/tariffs/virtualny-server-vps/
Выделенные сервера, Россия, Москва, от 2000 рублей (HP Proliant G5, Intel Xeon E5430 (2.66GHz, Quad-Core, 12Mb), 8Gb RAM, 2x300Gb SAS HDD, P400i, 512Mb, BBU):
https://www.host-food.ru/tariffs/vydelennyi-server-ds/
Недорогие домены в популярных зонах: https://www.host-food.ru/domains/

Аватара пользователя
mastertron
мл. сержант
Сообщения: 107
Зарегистрирован: 2009-02-06 20:48:53
Откуда: Украина, Одесса

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

Непрочитанное сообщение mastertron » 2011-07-07 0:37:10

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

Аватара пользователя
mastertron
мл. сержант
Сообщения: 107
Зарегистрирован: 2009-02-06 20:48:53
Откуда: Украина, Одесса

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

Непрочитанное сообщение mastertron » 2011-07-10 23:58:59

Понятно, что сдешним гуру такое ненужно, но раз начал …
Как говорят — первый бля вунитаз. Стоило завести юзерам папки с ВИНдонутыми именами …
И ваще идея менять маску на каталоги — чушь.
Но задача то осталась! Буду решать …
И того: Всю писанину и юзеров — вунитаз. Для реализации задуманного нужно создать в системе двух пользователей, при этом один должен иметь группу другого.
Создаем первого «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
У каждого свой каталог, каждому назначаем допустимый объем инфы, при достижении которого он теряет право на создание чего либо нового, но продолжает работать со своими доками.
Вроде достиг достигаемого.
Делай как нибудь, а как надо - само получится!