Наши партнеры








Книги по Linux (с отзывами читателей)

Библиотека сайта rus-linux.net

Глава 21. Серверное программное обеспечение (файловый сервис)

Linux Samba сервер

Краткий обзор.

Крупные организации часто используют много разных операционных систем, и им нужно объединять их в сеть для совместного использования файлов и принтеров. Работники могут работать на рабочих станциях Linux, Microsoft Windows 95/98/NT, OS/2 или Novel, и им необходим доступ к серверам для повседневной работы. Linux-сервер с поддержкой Samba может быть использован для этих целей.

Samba это надежный сетевой сервис для организации совместного использования файлов и принтеров, который работает на большинстве операционных систем доступных сегодня. Когда он хорошо настроен администратором, это более быстрый и безопасный файловый сервис, чем родная реализация на машинах Microsoft Windows.

Как описано в файле README для Samba:

Samba это протокол, при помощи которого на большинстве PC-машин совместно используются файлы, принтеры и другая информация такая, как списки доступных файлов и принтеров. Встроенную поддержку этого протокола имеют Windows 95/98/NT, OS/2 и Linux, а с помощью дополнительного пакета DOS, Windows, VMS, Unix всех других видов, MVS и многие другие. Apple Mac и некоторые веб-браузеры также понимают его. Альтернативу SMB составляют Netware, NFS, AppleTalk, Banyan Vines, Decnet и др., многие из них имеют большие возможности, но ни один не имеет общедоступной спецификации и широкой реализации на настольных машинах. Программное обеспечение Samba включает SMB-сервер, предоставляющий файловый и принтерный сервис в стиле Windows NT и LAN Manager SMB-клиентам (Windows 95, Warp Server, smbfs и др), NetBIOS (rfc1001/1002) сервер имен, который среди многих других вещей, дает возможность ftp-подобного просмотра ресурсов (дисков и принтеров) из Unix, Netware и других ОС, и расширение tar для клиентов для резервного копирования PC.

Эти инструкции предполагают.
Unix-совместимые команды.
Путь к исходным кодам /var/tmp (возможны другие варианты).
Инсталляция была проверена на Red Hat Linux 6.1 и 6.2.
Все шаги инсталляции осуществляются суперпользователем root.
Samba версии 2.0.7.

Пакеты.
Домашняя страница Samba: http://us1.samba.org/samba/samba.html,
FTP-сервер Samba: 63.238.153.11,
Вы должны скачать: samba-2.0.7.tar.gz.

Архивы.
Хорошей идеей будет создать список файлов, установленных в Вашей системе до инсталляции Samba и после, в результате, с помощью утилиты diff, Вы сможете узнать, какие файлы были установлены. Например, до инсталляции:
find /* > Samba1
После инсталляции:
find /* > Samba2
Для получения списка установленных файлов:
diff Samba1 Samba2 > Samba-Installed

Раскройте архив:

[root@deep /]# cp samba-version.tar.gz /var/tmp
[root@deep /]# cd /var/tmp
[root@deep tmp]# tar xzpf samba-version.tar.gz

Конфигурирование

Перейдите в каталог Samba, а затем в подкаталог source.

Шаг 1.

Редактируйте файл smbsh.in (vi +3 smbwrapper/smbsh.in) и измените строку:
SMBW_LIBDIR=${SMBW_LIBDIR-@builddir@/smbwrapper}
на:
SMBW_LIBDIR=${SMBW_LIBDIR-/usr/bin}

Это изменит месторасположение каталога lib Samba под каталог /usr/bin.

Шаг 2.

Редактируйте файл Makefile.in (vi +28 Makefile.in) и измените строки:
SBINDIR = @bindir@
На:
SBINDIR = @sbindir@
VARDIR = @localstadir@
на:
VARDIR = /var/log/samba

Эти изменения определят каталог /usr/sbin для двоичных файлов Samba, и каталог /var для файлов регистрации Samba (/var/log/samba).

Шаг 3.

Редактируйте файл convert_smbpasswd (vi +10 script/convert_smbpasswd) и измените в нем строку:

nawk 'BEGIN {FS=":"}
на:
gawk 'BEGIN {FS=":"}

Это изменение определит использование версии GNU Linux утилиты обработки текста awk, основанной на Bell Labs research версии программы awk для программы smbpasswd.

Шаг 4.

Редактируйте файл smbmount.c (vi +98 client/smbmount.c) и измените строку:

static void close_our_files(int client_fd)
{
  int i;

  for (i = 0; i < 256; i++)
  {
    if (i == client_fd) continue;
    close(i);
  }
на:
static void close_our_files(int client_fd)
{
  struct rlimit limits;
  int i;

  getrlimit(RLIMIT_NOFILE,&limits);
  for (i = 0; i < limits.rlim_max; i++)
  {
    if (i == client_fd) continue;
    close(i);
  }

Этот шаг сделает файл smbmount.c совместимым с библиотекой Red Hat glibc 2.1.

Компиляция и оптимизация

Шаг 1.

Введите следующие команды на Вашем терминале:

CC="egcs"
./configure --prefix=/usr --libdir=/etc --with-lockdir=/var/lock/samba \
            --with-privatedir=/etc --with-swatdir=/usr/share/swat \
            --with-pam --with-mmap --without-sambabook

ЗАМЕЧАНИЕ Опция --with-mmap может улучшить производительность на некоторых машинах, на других ничего не изменится, ну а на третьих она может упасть.

Эти опции говорят Samba:

  • Включить поддержку базы данных PAM-паролей, поддерживаемых для лучшей безопасности.
  • Включить экспериментальную поддержку MMAP для улучшения производительности Samba.
  • Не инсталлировать книги, поставляемые с дистрибутивом Samba.

Шаг 2.

Сейчас мы должны инсталлировать Samba на нашем Linux-сервере:

[root@deep source]# make all
[root@deep source]# make install
[root@deep source]# install -m 755 script/mksmbpasswd.sh /usr/bin
[root@deep source]# rm -rf /usr/share/swat
(если Вы мне позволите совет, не позволяйте пользователям настраивать
Samba через браузер).
[root@deep source]# rm -f /usr/sbin/swat
[root@deep source]# rm -f /usr/man/man8/swat.8
[root@deep source]# mkdir -p /var/lock/samba
[root@deep source]# mkdir -p /var/spool/samba
(требуется только, если Вы планируете совместное использование принтера).
[root@deep source]# chmod 1777 /var/spool/samba
(требуется только, если Вы планируете совместное использование принтера).

Команда install инсталлирует скрипт mksmbpasswd.sh в каталог /usr/bin. Этот скрипт нужен, чтобы пользователи Samba могли подключаться к серверу, используя файл smbpasswd. О том, как использовать пароли Samba, читайте дальше в этой книге.

Команда rm удалит каталог /usr/share/swat и все файлы в нем, также она удалит исполняемый файл swat из каталога /usr/sbin. SWAT это конфигурационная утилита, имеющая веб-интерфейс, которая позволяет настраивать файл smb.conf из веб-браузера. Она может открыть брешь в безопасности Вашего сервера , поэтому я рекомендую удалить ее. Команда mkdir создаст каталог /var/spool/samba, который используется при печати на принтере. Конечно, он необходим, если Вы планируете использовать Samba для предоставление принтера в совместное использование. Так как мы не настраиваем наш сервер Samba на предоставление сервиса печати, нам не нужен этот каталог (/var/spool/samba), и соответственно нет необходимости в команде chmod, устанавливающей sticky-бит для /var/spool/samba, чтобы только владелец файла мог удалить его из каталога.

Очистка после работы.
[root@deep /]# cd /var/tmp
[root@deep tmp]# rm -rf samba-version/ samba-version.tar.gz

Команда rm будет удалять все файлы с исходными кодами, которые мы использовали при компиляции и инсталляции Samba. Также будет удален сжатый архив Samba из каталога /var/tmp.

Конфигурации

Конфигурационный файл для разных сервисов очень специфичен и сильно зависит от того, что Вам нужно. Некоторые хотят инсталлировать сервер Samba, рассчитывая на одно клиентское соединение, а некоторые на тысячу. Все программное обеспечение, описанное в книге, имеет определенный каталог и подкаталог в архиве floppy.tgz, включающем все конфигурационные файлы для всех программ. Если Вы скачаете этот файл, то Вам не нужно будет вручную воспроизводить файлы из книги, чтобы создать свои файлы конфигурации. Скопируйте файлы, связанные с Samba, из архива, измените их под свои требования и поместите в нужное место так, как это описано ниже. Файл с конфигурациями Вы можете скачать с адреса: http://www.openna.com/books/floppy.tgz.

Для запуска веб-сервера Apache следующие файлы должны быть созданы или скопированы на Ваш сервер.

Копируйте файлы smb.conf и lmhosts в каталог /etc.
Копируйте smb в каталог /etc/rc.d/init.d.
Копируйте samba в каталог /etc/logrotate.d.
Копируйте samba в каталог /etc/pam.d.

Вы можете взять эти файлы из архива floppy.tgz.

Конфигурационный файл /etc/smb.conf

Файл /etc/smb.conf это основной конфигурационный файл сервера Samba, в котором Вы можете определить каталоги, к которым предоставляете доступ, с каких IP-адресов разрешен доступ и пр. Первые несколько строк в секции [global] содержат глобальные конфигурационные директивы, которые являются общими для всех разделяемых ресурсов (пока они не переписаны в конкретных секциях для каждого ресурса), далее идут секции, отвечающие за конкретные ресурсы. Существует множество опций, и нужно обязательно прочитать документацию, поставляемую вместе с Samba, чтобы получить информацию о каждой из них.

Следующий пример представляет из себя минимальную рабочую конфигурацию для Samba с поддержкой шифрованных паролей. Также, замечу, что мы прокомментируем только те параметры, которые связаны с безопасностью и оптимизацией, а остальные оставим для Вашего собственного последующего изучения.

В нашем примере, мы создаем только один каталог, [tmp], и позволяем доступ только машинам с IP-адресами из диапазона класса C. Также мы не используем сервис печати.

Редактируйте файл smb.conf (vi /etc/smb.conf) и добавьте/измените следующие параметры:

[global]
   workgroup = OPENNA
   server string = R&D of Open Network Architecture Samba Server
   encrypt passwords = True
   security = user
   smb passwd file = /etc/smbpasswd
   log file = /var/log/samba/log.%m
   socket options = IPTOS_LOWDELAY TCP_NODELAY
   domain master = Yes
   local master = Yes
   preferred master = Yes
   os level = 65
   dns proxy = No
   name resolve order = lmhosts host bcast
   bind interfaces only = True
   interfaces = eth0 192.168.1.1
   hosts deny = ALL
   hosts allow = 192.168.1.4 127.0.0.1
   debug level = 1
   create mask = 0644
   directory mask = 0755
   level2 oplocks = True
   read raw = no
   write cache size = 262144

[homes]
   comment = Home Directories
   browseable = no
   read only = no
   invalid users = root bin daemon nobody named sys tty disk mem kmem users

[tmp]
   comment = Temporary File Space
   path = /tmp
   read only = No
   valid users = admin
   invalid users = root bin daemon nobody named sys tty disk mem kmem users

Эта опции говорят Samba следующее:
[global]

workgroup = OPENNA
Опция workgroup определяет рабочую группу, в которую входит Ваш сервер. Важно, чтобы клиенты и сервер входили в одну и ту же группу.

server string = R&D of Open Network Architecture Samba Server
Опция server string определяет строку, которую получат пользователи в блоке комментария к принтеру в менеджере принтеров, или при IPC-соединении по команде net view на Windows-машинах.

encrypt passwords = True
Опция encrypt passwords, если установлена в True, инструктирует Samba использовать шифрованные пароли вместо паролей с открытым текстом. Снифферы не смогут определить Ваш пароль, если он зашифрован. Эту опцию из соображений безопасности нужно установить в True.

security = user
Опция security, если установлена в user, определяет, что клиент должен вначале пройти аутентификацию по правильному имени и паролю, или соединение будет разорвано. При этом способе имя пользователя и пароль должны существовать в файле /etc/passwd Linux-сервера и в файле /etc/smbpasswd Samba-сервера, или соединение с клиентом не состоится. Смотрите "Безопасность samba" в этой главе для получения большей информации о файле smbpasswd.

smb passwd file = /etc/smbpasswd
Опция smb passwd file определяет путь к файлу с шифрованными паролями smbpasswd. Файл smbpasswd это копия файла /etc/passwd Linux-системы, содержащий разрешенные имена и пароли клиентов, которым разрешен доступ к серверу Samba. Samba читает этот файл, когда получает запрос на соединение.

log file = /var/log/samba/log.%m
Опция log file определяет месторасположение и имена файлов регистрации Samba. С расширением %m у Вас будут создаваться независимые файлы регистрации для каждого пользователя или машины, присоединяющихся к Вашему Samba-серверу (например, log.machine1).

socket options = IPTOS_LOWDELAY TCP_NODELAY
Опция socket options определяет параметры, которые Вы можете включить в Вашу конфигурацию Samba для настройки и улучшения сервера samba на оптимальную производительность. По умолчанию, мы выбрали настройку сервера на локальную сеть и улучшили производительность сервера Samba при пересылке файлов.

domain master = Yes
Опция domain master определяет, что один из демонов Samba, nmbd, будет установлен как домен мастер-браузер для данной рабочей группы. Эта опция обычно устанавливается в Yes только на одном сервере Samba в некоторой сети и рабочей группе.

local master = Yes
Опция local master позволяет nmbd становится локальным мастер-браузером в подсети. Подобно предыдущей опции, эта опция должна быть установлена в Yes только на одном Samba-сервере в подсети.

preferred master = Yes
Опция preferred master определяет и контролирует является ли nmbd привилегированным (preferred) мастер-браузером рабочей группы. Опять же, эта опция обычно выставляется в Yes на одном сервере на Вашей сети.

os level = 65
Опция os level определяет значение, имеет ли nmbd шанс стать локальным мастер-браузером для рабочей группы в локальной широковещательной области. Число 65 позволит победить любой NT-сервер. Если в Вашей сети есть NT-сервер, и Вы хотите, чтобы Linux Samba-сервер стал локальным мастер-браузером, Вы должны установить этот параметр равным 65. Эта опция должна быть определена только на одном Linux Samba-сервере в сети, а на остальных ее надо отключить.

dns proxy = No
Опция dns proxy, если установлена в Yes, определяет, что nmbd, когда выступает как WINS-сервер и определяет, что Net BIOS имя не было зарегистрировано, должен интерпретировать Net BIOS имя слово в слово как DNS-имя и делает lookup на DNS-сервер, действуя от имени клиента, запрашивающего данное имя. Так как мы не настраиваем Samba-сервер как WINS-сервер, нам не нужно устанавливать эту опцию в Yes. Устанавливая эту опцию в Yes мы ухудшим производительность Samba.

name resolve order = lmhosts host bcast
Опция name resolve order определяет, в каком порядке используются сервисы имен для преобразования имени хоста в IP-адрес. Параметр, который мы выбрали, говорит использовать в первую очередь локальный lmhosts-файл.

bind interfaces only = True
Опция bind interfaces only, если установлена в True, позволяет Вам ограничивать интерфейсы, на которых будет принимать запросы smb. Это возможность улучшающая безопасность системы. Опция interfaces = eth0 192.168.1.1 дополняет данную опцию.

interfaces = eth0 192.168.1.1
Опция interfaces позволяет Вам переписать список интерфейсов по умолчанию, на которых Samba будет обрабатывать запросы. По умолчанию, Samba принимает список из всех активных интерфейсов и любые интерфейсы (исключая 127.0.0.1), на которых поддерживается возможность широковещательных запросов. С этой опцией, Samba будет слушать только интерфейс eth0 с IP-адресом 192.168.1.1. Это возможность улучшающая безопасность, и дополняет ранее приведенную опцию bind interfaces only = True.

hosts deny = ALL
Опция hosts deny определяет список хостов, которым запрещен доступ к сервису Samba, если определенные сервисы не имеют собственных списков доступа. Для простоты, мы запрещаем доступ всем хостам по умолчанию, и разрешаем доступ некоторым компьютерам в опции hosts allow =, приведенной ниже.

hosts allow = 192.168.1.4 127.0.0.1
Опция hosts allow определяет, каким хостам разрешен доступ к Samba-сервису. По умолчанию, мы пускаем компьютер с IP-адресом класса C 192.168.1.4 и наш localhost 127.0.0.1. Заметим, что доступ с localhost должен быть всегда разрешен, иначе Вы будете получать сообщения об ошибках.

debug level = 1
Опция debug level позволяет Вам определить уровень регистрации. Если Вы установите уровень отладки больше, чем 2, то это приведет к падению производительности. Это связано с тем, что сервер сбрасывает информацию в файл регистрации после каждой операции, которые могут быть очень интенсивными.

create mask = 0644
Опция create mask определяет и устанавливает нужные права доступа, связывая таким образом режимы DOS с правами UNIX. С этой опцией, установленной в 0644, все файлы копируемые или создаваемые из Windows-систем на Unix будут иметь права доступа 0644.

directory mask = 0755
Опция directory mask определяет и устанавливает режим, который используется для конвертирования DOS-режимов в UNIX-режимы, когда создается UNIX-каталог. С этой опцией, установленной в 0755, все каталоги копируемые или создаваемые из Windows-систем на Unix будут иметь права доступа 0755.

level2 oplocks = True
Опция level2 oplocks, если установлена в True, увеличит производительность множественного доступа к файлам, которые обычно не записываются (такие, как файлы приложений .EXE).

read raw = no
Опция read raw контролирует, будет или нет сервер осуществлять необработанное (raw) чтение SMB-запросов, когда пересылает данные клиенту. Заметим, что распределение памяти не использует операцию "read raw". Таким образом, Вы можете обнаружить, что распределение памяти более эффективно, если Вы отключите "read raw", используя параметр "read raw = no".

write cache size = 262144
Опция write cache size позволяет Samba улучшить производительность систем, у которых дисковая подсистема является узким местом. Значение этой опции определяется в байтах, следовательно, 262144 представляет 256k кэш на файл.

[tmp]

comment = Temporary File Space
Опция comment позволяет Вам определить комментарии, которые появляются, когда клиент организует запросы на сервер.

path = /tmp
Опция path определяет каталог, в который пользователю разрешается доступ. В нашем примере, это каталог tmp.

read only = No
Опция read only определяет, должен ли пользователь иметь доступ только на чтение или нет. В нашем примере, так как это конфигурация для каталога tmp, пользователь может иметь больший доступ, чем только на чтение.

valid users = admin
Опция valid users определяет список пользователей, которые могут подключаться к этому сервису. В нашем примере, только пользователю admin разрешен доступ к каталогу /tmp.

invalid users = root bin daemon nobody named sys tty disk mem kmem users
Опция invalid users определяет список пользователей, которым не разрешается подключаться к этому сервису. Это абсолютно "параноидальная" проверка, которая гарантирует, что неправильные установки не нарушат безопасность системы. Рекомендуется, чтобы Вы включили в эту строку всех пользователей, созданных в системе по умолчанию, от имени которых запускаются демоны на сервере.

Конфигурация файла /etc/lmhosts

Настроим файл /etc/lmhosts. Он содержит соответствия между Samba Net BIOS именами и IP-адресами. По формату этот файл подобен /etc/hosts, за исключением того, что компоненты имени хоста соответствуют формату имен Net BIOS.

Создадим файл lmhosts (touch /etc/lmhosts) и внесем в него клиентские компьютеры:

# Пример Samba файла lmhosts.
127.0.0.1        localhost
192.168.1.1      deep
192.168.1.4      win

В нашем примере lmhots содержит три соответствия между IP и Net BIOS именами. localhost (127.0.0.1), клиент с именем deep (192.168.1.1) и клиент с именем win (192.168.1.4).

Конфигурация файла /etc/pam.d/samba

Настроим файл /etc/pam.d/samba для использования pam-аутентификации. Создайте файл samba (touch /etc/pam.d/samba) и добавьте в него следующие строки:

Auth required /lib/security/pam_pwdb.so nullok shadow
Account required /lib/security/pam_pwdb.so

Конфигурация файла /etc/logrotate.d/samba

Сконфигурируем файл /etc/logrotate.d/samba на автоматическую еженедельную ротацию Ваших файлов регистрации. Создайте файл samba (touch /etc/logrotate.d/samba) и добавьте в него следующие строки:

/var/log/samba/log.nmb
{
  notifempty
  missingok
  postrotate
    /usr/bin/killall -HUP nmbd
  endrotate
}
/var/log/samba/log.smb
{
  notifempty
  missingok
  postrotate
    /usr/bin/killall -HUP smbd
  endrotate
}

Создание файла с шифрованными паролями Samba

В файле /etc/smbpasswd хранятся шифрованные пароли Samba. Он хранит имя пользователя, Unix UID, хешированный пароль SMB, информационный флаг учетной записи и время последнего изменения пароля. Важно создать этот файл с паролями и включить в него всех пользователей до того, как они будут подключаться к Вашему серверу Samba. Без этого никто не сможет подключиться к нему.

Шаг 1.

Для создания учетной записи Samba, Вы должны, для начала, завести пользователя Linux. Поэтому, вначале, создайте в файле /etc/passwd всех пользователей, которые должны подключаться к серверу Samba. Добавьте нового пользователя в файл /etc/passwd, используя следующую команду:

[root@deep /]# useradd smbclient

Определите пароль для этого пользователя, используя команду:

[root@deep /]# passwd smbclient
Changing password for user smbclient
New UNIX password:
Retype new UNIX password:
passwd: all authentication tokens updated successfully

Шаг 2.

После того, как Вы внесли всех пользователей в файл /etc/passwd, Вы можете создать файл smbpasswd, используя /etc/passwd. Для этого введите следующую команду:

[root@deep /]# cat /etc/passwd | mksmbpasswd.sh > /etc/smbpasswd

Шаг 3.

В заключении, на последнем шаге, мы должны создать пользователя в нашем файле /etc/smbpasswd. Для создания учетной записи пользователя Samba:

[root@deep /]# smbpasswd -a smbclient
(помните, что smbclient должен быть реальным пользователем Linux).
New SMB password:
Retype new SMB password:
Added user smbclient.
Password changed for user smbclient.

Шаг 4.

Не забудьте изменить права доступа к Вашему новому файлу smbpasswd на чтение-запись только для пользователя root (0600/-rw-------). Это делается из соображения безопасности:

[root@deep /]# chmod 600 /etc/smbpasswd
[root@deep /]# testparm
(Эта команда проверит файл smb.conf на наличие ошибок).

ЗАМЕЧАНИЕ. Смотрите файл ENCRYPTION.txt, находящийся в дистрибутиве Samba в каталоге /doc/texts, для сбора большей информации.

Конфигурация скрипта /etc/rc.d/init.d/smb

Настроим скрипт /etc/rc.d/init.d/smb, который отвечает за запуск и остановку демонов Samba smbd и nmbd. Создайте скрипт smb (touch /etc/rc.d/init.d/smb) и добавьте в него следующие строки:

#!/bin/sh
#
# chkconfig: - 91 35
# описание: запуск и остановка демонов Samba smbd и nmbd \
# используемых для предоставления сетевого сервиса SMB.
# Библиотека исходных функций.
. /etc/rc.d/init.d/functions
# Исходная сетевая конфигурация.
. /etc/sysconfig/network
# Проверки наличия сети.
[ ${NETWORKING} = "no" ] && exit 0
# Проверка наличия файла smb.conf.
[ -f /etc/smb.conf ] || exit 0
RETVAL=0
# See how we were called.
case "$1" in
  start)
    echo -n "Starting SMB services: "
    daemon smbd -D
    RETVAL=$?
    echo
    echo -n "Starting NMB services: "
    daemon nmbd -D
    RETVAL2=$?
    echo
    [ $RETVAL -eq 0 -a $RETVAL2 -eq 0 ] && touch /var/lock/subsys/smb || \
    RETVAL=1
  ;;
  stop)
    echo -n "Shutting down SMB services: "
    killproc smbd
    RETVAL=$?
    echo
    echo -n "Shutting down NMB services: "
    killproc nmbd
    RETVAL2=$?
    [ $RETVAL -eq 0 -a $RETVAL2 -eq 0 ] && rm -f /var/lock/subsys/smb
    echo ""
  ;;
  restart)
    $0 stop
    $0 start
    RETVAL=$?
  ;;
  reload)
    echo -n "Reloading smb.conf file: "
    killproc -HUP smbd
    RETVAL=$?
    echo
  ;;
  status)
    status smbd
    status nmbd
    RETVAL=$?
  ;;
  *)
    echo "Usage: $0 {start|stop|restart|status}"
    exit 1
esac
exit $RETVAL

Сейчас мы должны сделать этот скрипт исполняемым и изменить права доступа к нему:

[root@deep /]# chmod 700 /etc/rc.d/init.d/smb

Создадим символическую ссылку в rc.d для Samba:

[root@deep /]# chkconfig --add smb

Скрипт Samba не будет автоматически стартовать демоны smbd и nmbd, когда система перезагружена. Чтобы изменить это, выполните следующую команду:

[root@deep /]# chkconfig --level 345 smb on

Запустите сервер Samba вручную:

[root@deep /]# /etc/rc.d/init.d/smb start
Starting SMB services:            [ OK ]
Starting NMB services:            [ OK ]

Организация защиты Samba

Иммунизация важных конфигурационных файлов

Бит постоянства используется для предотвращения случайного удаления или переписывания файлов, которые защищаются. Он также не дает создавать символические ссылки к этим файлам. Так как файлы smb.conf и lmhosts уже настроены, хорошей идеей будет иммунизировать их:

[root@deep /]# chattr +i /etc/smb.conf
[root@deep /]# chattr +i /etc/lmhosts

Оптимизация Samba

Установка параметра wide links= в конфигурационном файле Samba.

Большой ошибкой будет установить параметр wide links в no в конфигурационном файле Samba /etc/smb.conf. Эта опция, если установлена в no, говорит Samba не следовать по символическим ссылкам вне экспортируемой области. Чтобы определить, находится ли ссылка вне области, Samba следует по символической ссылке, а затем выполняет directory path lookup, чтобы определить, где на файловой системе символическая ссылка завершилась. Эта операция добавляет шесть дополнительных системных вызовов на каждый файловый lookup, а Samba просматривает имена файлов очень много раз. Тесты, которые были опубликованы, показали, что установка этого параметра снижает производительность Samba-сервера на 25-30 процентов.

Настройка кэша буфера.

Модификация параметров, влияющих на настройку кэша файловой системы, может значительно улучшить производительность файлового сервера Linux. Linux будет пытаться использовать память, не используемую для других целей, для кэширования файловой системы. Специальный демон, называемый bdflush, будет периодически сбрасывать на диск содержимое "грязных" буферов (буфер, который содержит модифицированные данные файловой системы или метаданные).

Секрет хорошей производительности это сохранение в памяти так много данных, как это возможно. Запись на диск является самой медленной операцией при работе с любой файловой системой. Как и с большинством настраиваемых параметров ядра, Вы можете изменять эти опции на лету, при помощи специальных файлов /proc.

Параметры по умолчанию для bdflush под Red Hat Linux:

"40 500 64 256 500 3000 500 1884 2"

Чтобы изменить значения bdflush, введите следующие команды на Вашем терминале:
Под Red Hat Linux 6.1

[root@deep /]# echo "80 500 64 64 15 6000 6000 1884 2" >/proc/sys/vm/bdflush

Вы должны добавить вышеприведенную команду в скрипт /etc/rc.d/rc.local, чтобы она выполнялась при каждой загрузке компьютера автоматически.

Под Red Hat Linux 6.2
Редактируйте файл /etc/sysctl.conf и добавьте следующие строки:

# Улучшение производительности файловой системы
vm.bdflush = 80 500 64 64 15 6000 6000 1884 2

Вы должны перезагрузить сетевые настройки, чтобы изменения вступили в силу:

[root@deep /]# /etc/rc.d/init.d/network restart
Setting network parameters           [ OK ]
Bringing up interface lo             [ OK ]
Bringing up interface eth0           [ OK ]
Bringing up interface eth1           [ OK ]

Эта строка говорит bdflush не беспокоиться о записи грязных блоков на диск, пока кэш буферов файловой системы не заполнится на 80 процентов. Другое значение определяют максимальное количество грязных буферов, которое может быть записано за одну операцию (500), как долго разрешается грязному буферу существовать (60*HZ) и т. д. Полное описание всех параметров Вы можете найти в документации, поставляемой вместе с ядром 2.2, в файле linux/Documentation/sysctl/vm.txt, и также, Вы можете прочитать главу 4, "Общая системная оптимизация" этой книги.

Настройка buffermem.

Другая полезная настройка должна сообщить Linux следующее: использовать минимум 60 процентов памяти для кэширования буферов, сокращать только когда процент используемой памяти для кэша буферов преодолеет 10 процентов (этот параметр сейчас не используется), и позволять расти до 60 процентов всей памяти (этот параметр сейчас тоже не используется).

По умолчанию значения, установленные для buffermem в Red Hat Linux, равны:

"2 10 60"

Чтобы изменить значения buffermem, введите следующую команду на Вашем терминале:
Под Red Hat Linux 6.1

[root@deep /]# echo "60 10 60" >/proc/sys/vm/buffermem

Вы должны добавить вышеприведенную команду в скрипт /etc/rc.d/rc.local, чтобы она выполнялась при каждой загрузке компьютера автоматически. Полное описание всех параметров Вы можете найти в документации, поставляемой вместе с ядром 2.2, в файле linux/Documentation/sysctl/vm.txt, и также, Вы можете прочитать главу 4, "Общая системная оптимизация" этой книги.

Под Red Hat Linux 6.2
Редактируйте файл /etc/sysctl.conf и добавьте следующую строку:

# Улучшение производительности виртуальной памяти
vm.buffermem = 60 10 60

Вы должны перезагрузить сетевые настройки, чтобы изменения вступили в силу:

[root@deep /]# /etc/rc.d/init.d/network restart
Setting network parameters            [ OK ]
Bringing up interface lo              [ OK ]
Bringing up interface eth0            [ OK ]
Bringing up interface eth1            [ OK ]

Напоминаем, что последние два параметра (10 и 60) сейчас не используются, поэтому мы не будем их изменять.

Дополнительная документация

Для получения большей информации Вы можете прочитать следующие страницы руководства:

$ man Samba (7) Файл-сервер Windows SMB/CIFS для UNIX
$ man smb.conf (5) Конфигурационный файл для Samba
$ man smbclient (1) ftp-подобный клиент для доступа к SMB/CIFS ресурсам
$ man smbd (8) сервер, предоставляющий SMB/CIFS сервисы клиентам
$ man smbmnt (8) mount smb file system
$ man smbmount (8) монтирование файловой системе smb
$ man smbpasswd (5) файл с шифрованными паролями Samba
$ man smbpasswd (8) изменение SMB-пароля пользователя
$ man smbrun (1) интерфейсная программа между smbd и внешними программами
$ man smbsh (1) Позволяет доступ к файловой системе Windows NT, используя UNIX-команды
$ man smbstatus (1) отчет о текущих соединениях Samba
$ man smbtar (1) shell-скрипт для резервного копирования совместных ресурсов SMB напрямую на накопители на магнитной ленте UNIX
$ man smbumount (8) размонтирование для нормальных пользователей
$ man testparm (1) проверка конфигурационного файла smb.conf на внутренние ошибки
$ man testprns (1) проверка имени принтера на соответствие правилам smbd.

Административные утилиты Samba

Команды, описанные ниже, мы будем часто использовать, но на самом деле их много больше, и Вы должны изучить страницы руководства (man) и документацию, чтобы получить более подробную информацию.

smbstatus

Утилита smbstatus это очень простая программа, показывающая текущие соединения Samba:

[root@deep /]# smbstatus
Samba version 2.0.7
Service uid       gid       pid  machine
----------------------------------------------
tmp     webmaster webmaster 3995 gate (192.168.1.3) Sat Sep 25 19:40:54 1999

No locked files

Share mode memory usage (bytes):
1048464(99%) free + 56(0%) used + 56(0%) overhead = 1048576(100%) total

Утилиты пользователя Samba

Команды, описанные ниже, мы будем часто использовать, но на самом деле их много больше, и Вы должны изучить страницы руководства (man) и документацию, чтобы получить более подробную информацию.

smbclient

Утилита smbclient работает подобно ftp-программам, но для Samba. Эта небольшая программа позволяет Вам забирать файлы с сервера на локальную машину, перекладывать файлы с локальной машины на сервер, передавать информацию о каталогах с сервера и пр.

Для соединения с Windows-машиной при помощи утилиты smbclient, используйте команду:

[root@deep /]# smbclient //sbmserver/sharename -U smbclient
[root@deep /]# smbclient //gate/tmp -U smbclient
Password:
Domain=[OPENNA] OS=[Windows NT 4.0] Server=[NT LAN Manager 4.0]
smb: \> ls
.                               D     0         Tue Mar 14 15:31:50 2000
..                              D     0         Tue Mar 14 15:31:50 2000
PostgreSQL                      D     0         Tue Mar 14 15:32:22 2000
Squid                           D     0         Tue Mar 14 15:32:28 2000
Imap                            D     0         Tue Mar 14 15:32:38 2000
E_comm                          D     0         Tue Mar 14 15:32:42 2000
StackGuard.pdf                  A     61440     Tue Dec 21 20:41:34 1999
installation-without-XFree86    A     448       Tue Dec 21 20:41:28 1999
lcap-0_0_3-2_src.rpm            A     13481     Thu Jan 13 01:50:12 2000
mirc561t.exe                    A     948224    Tue Dec 21 20:41:54 1999

             65510 blocks of size 32768. 5295 blocks available

smb: \>

где //sbmserver это имя сервера, к которому Вы хотите подключиться. /sharename каталог на этом сервере, а smbclient это имя пользователя, под которым Вы подключаетесь к серверу.

Инсталлированные файлы

> /etc/rc.d/init.d/smb
> /etc/rc.d/rc0.d/K35smb
> /etc/rc.d/rc1.d/K35smb
> /etc/rc.d/rc2.d/K35smb
> /etc/rc.d/rc3.d/S91smb
> /etc/rc.d/rc4.d/S91smb
> /etc/rc.d/rc5.d/S91smb
> /etc/rc.d/rc6.d/K35smb
> /etc/pam.d/samba
> /etc/logrotate.d/samba
> /etc/codepages
> /etc/codepages/codepage.437
> /etc/codepages/unicode_map.437
> /etc/codepages/codepage.737
> /etc/codepages/unicode_map.737
> /etc/codepages/codepage.775
> /etc/codepages/codepage.850
> /etc/codepages/unicode_map.850
> /etc/codepages/codepage.852
> /etc/codepages/unicode_map.852
> /etc/codepages/codepage.861
> /etc/codepages/unicode_map.861
> /etc/codepages/codepage.932
> /etc/gshadow-
> /usr/bin/smbclient
> /usr/bin/smbspool
> /usr/bin/testparm
> /usr/bin/testprns
> /usr/bin/smbstatus
> /usr/bin/rpcclient
> /usr/bin/smbpasswd
> /usr/bin/make_smbcodepage
> /usr/bin/make_unicodemap
> /usr/bin/nmblookup
> /usr/bin/make_printerdef
> /usr/bin/smbtar
> /usr/bin/addtosmbpass
> /usr/bin/convert_smbpasswd
> /usr/bin/mksmbpasswd.sh
> /usr/man/man1/make_smbcodepage.1
> /usr/man/man1/make_unicodemap.1
> /usr/man/man1/nmblookup.1
> /usr/man/man1/smbclient.1
> /usr/man/man1/smbrun.1
> /usr/man/man1/smbsh.1
> /usr/man/man1/smbstatus.1
> /etc/codepages/unicode_map.932
> /etc/codepages/codepage.866
> /etc/codepages/unicode_map.866
> /etc/codepages/codepage.949
> /etc/codepages/unicode_map.949
> /etc/codepages/codepage.950
> /etc/codepages/unicode_map.950
> /etc/codepages/codepage.936
> /etc/codepages/unicode_map.936
> /etc/codepages/codepage.1251
> /etc/codepages/unicode_map.ISO8859-1
> /etc/codepages/unicode_map.ISO8859-2
> /etc/codepages/unicode_map.ISO8859-5
> /etc/codepages/unicode_map.ISO8859-7
> /etc/codepages/unicode_map.KOI8-R
> /etc/lmhosts
> /etc/smb.conf
> /etc/smbpasswd
> /usr/man/man1/smbtar.1
> /usr/man/man1/testparm.1
> /usr/man/man1/testprns.1
> /usr/man/man5/lmhosts.5
> /usr/man/man5/smb.conf.5
> /usr/man/man5/smbpasswd.5
> /usr/man/man7/samba.7
> /usr/man/man8/nmbd.8
> /usr/man/man8/smbd.8
> /usr/man/man8/smbmnt.8
> /usr/man/man8/smbmount.8
> /usr/man/man8/smbpasswd.8
> /usr/man/man8/smbspool.8
> /usr/man/man8/smbumount.8
> /usr/sbin/smbd
> /usr/sbin/nmbd
> /var/log/samba
> /var/lock/samba

Linux FTP сервер

Краткий обзор.

Несмотря на прошедшие годы, использование File Transfer Protocol (FTP) является одним из самых популярных способов пересылки файлов с одной машины на другую через сеть. Клиенты и серверы написаны для каждой из популярных платформ, присутствующих на рынке, делая таким образом FTP наиболее удобным способом пересылки файлов.

Существует много различных путей настройки Вашего FTP-сервера. Один из них приватный, только для пользователей системы, который является конфигурацией по умолчанию FTP-сервера: приватный FTP-сервер позволяет пользователям Linux-системы соединяться с сервером по протоколу FTP и получать доступ к их файлам.

Другой тип ftp сервера: анонимный FTP. Такой сервер позволяет кому угодно соединяться с сервером и передавать файлы без получения учетной записи. Из-за потенциального риска безопасности системы, должны быть приняты меры, чтобы позволить доступ только к определенным каталогам системы.

Конфигурация, которую мы охватываем здесь, предоставляет FTP-полубезопасную область файловой системы (chroot, гостевой FTP-доступ). Она позволит пользователю получить доступ к каталогу FTP-сервера, при этом он не сможет перейти на более высокий уровень. Это наиболее безопасная конфигурация для FTP-сервера.

Эти инструкции предполагают.
Unix-совместимые команды.
Путь к исходным кодам /var/tmp (возможны другие варианты).
Инсталляция была проверена на Red Hat Linux 6.1 и 6.2.
Все шаги инсталляции осуществляются суперпользователем root.
wu-ftpd версии 2.6.0.

Пакеты.
Домашняя страница Wu-ftpd: http://www.wu-ftpd.org,
FTP-сервер Wu-ftpd: 205.133.13.68,
Вы должны скачать: wu-ftpd-2.6.0.tar.gz.

Раскройте архив:

[root@deep /]# cp wu-ftpd-version.tar.gz /var/tmp
[root@deep /]# cd /var/tmp
[root@deep tmp]# tar xzpf wu-ftpd-version.tar.gz

Компиляция и оптмизация

Перейдите в новый каталог Wu-ftpd и введите следующие команды на Вашем терминале:

Шаг 1.

Редактируйте файл ftpcount.c (vi +241 src/ftpcount.c) и измените строку:
#if defined (LINUX)
на:
#if defined (LINUX_BUT_NOT_REDHAT_6_0)

Шаг 2.

Редактируйте файл pathnames.h.in (vi +42 src/pathnames.h.in) и измените в нем строку:
#define _PATH_EXECPATH "/bin/ftp-exec"
на:
#define _PATH_EXECPATH "/usr/bin/ftp-exec"

Мы изменили каталог /bin/ftp-exec на /usr/bin/ftp-exec для Red Hat Linux.

Шаг 3.

Введите следующие команды на Вашем терминале для конфигурирования Wu-ftpd:

CC="egcs"
CFLAGS="-O9 -funroll-loops -ffast-math -malign-double -mcpu=pentiumpro \
        -march=pentiumpro -fomit-frame-pointer -fno-exceptions"
./configure --prefix=/usr --sysconfdir=/etc --localstatedir=/var \
            --disable-dnsretry --enable-quota --enable-pam \
            --disable-daemon --disable-newlines --disable-virtual \
            --disable-plsm --disable-pasvip --disable-anonymous \
            --enable-ls --enable-numericuid

Эти опции означают следующее:

  • Не повторять ошибочный DNS lookups для улучшения производительности.
  • Добавить поддержку квот для большей безопасности (только, если Ваша OS поддерживает это).
  • Добавить поддержку PAM для большей безопасности.
  • Не разрешать запускать как автономный демон, позволять контролировать FTPD при помощи TCP-Wrappers.
  • Подавлять некоторые дополнительные пустые строки.
  • Не поддерживать виртуальные серверы.
  • Отключить блокирование PID ожидания сообщений (для загруженных серверов).
  • Не требовать идентичного IP для пассивного соединения.
  • Не разрешать анонимный ftp-доступ для лучшей безопасности.
  • Использовать новую внутреннюю команду ls из Wu-ftpd вместо системной ls из Linux для большей безопасности.
  • Внутренняя ls выводит UID вместо имен пользователей для лучшей производительности.

Шаг 4.

Сейчас мы должны инсталлировать Wu-ftpd на Linux-сервер:

[root@deep wu-ftpd-2.6.0]# make
[root@deep wu-ftpd-2.6.0]# make install
[root@deep wu-ftpd-2.6.0]# install -m 755 util/xferstats /usr/sbin
[root@deep wu-ftpd-2.6.0]# touch /var/log/xferlog
[root@deep wu-ftpd-2.6.0]# chmod 600 /var/log/xferlog
[root@deep wu-ftpd-2.6.0]# cd /usr/sbin
[root@deep sbin]# ln -sf in.ftpd /usr/sbin/wu.ftpd
[root@deep sbin]# ln -sf in.ftpd /usr/sbin/in.wuftpd
[root@deep sbin]# strip /usr/bin/ftpcount
[root@deep sbin]# strip /usr/bin/ftpwho
[root@deep sbin]# strip /usr/sbin/in.ftpd
[root@deep sbin]# strip /usr/sbin/ftpshut
[root@deep sbin]# strip /usr/sbin/ckconfig
[root@deep sbin]# strip /usr/sbin/ftprestart

Команды make и make install настроят программное обеспечение под Вашу систему и проверят ее функциональность на наличие необходимых библиотек, скомпилируют все файлы с исходными кодами в исполняемые двоичные программы и проинсталлируют их вместе с сопутствующими файлами в необходимые места.

Команда install -m будет инсталлировать программу xferstats, используемую для просмотра информации о переданных файлах. Команда touch создаст файл регистрации для xferstats в каталоге /var/log. chmod изменит права доступа к файлу xferlog на чтение-запись только пользователю root. Затем, мы создаем символическую ссылку для исполняемого файла in.ftpd, и, в заключение, удаляем отладочную информацию из всех исполняемых файлов, относящихся к Wu-ftpd.

Очистка после работы.
[root@deep /]# cd /var/tmp
[root@deep tmp]# rm -rf wu-ftpd-version/ wu-ftpd-version.tar.gz

Команда rm будет удалять все файлы с исходными кодами, которые мы использовали при компиляции и инсталляции Wu-ftpd. Также будет удален сжатый архив Wu-ftpd из каталога /var/tmp.

Настройка пользователя FTP без командного процессора (shell)

Чрезвычайно важно, чтобы Ваши пользователи FTP не имели реального командного процессора. В этом случае, если они по каким-либо причинам смогут покинуть chroot-окружение FTP, то не смогут выполнить никаких задач, так как не имеют командного процессора.

Первое, создайте нового пользователя, которому Вы планируете разрешить подключаться к Вашему FTP-серверу. Это должна быть учетная запись независимая от регулярно используемых, в связи с особенностями работы chroot-окружения. Chroot создаст пользователю ощущение, будто каталог, в который его поместили, находится на самом верху файловой системы.

Шаг 1.

Используйте следующие команды для создания пользователя в файле /etc/passwd. Этот шаг должен выполняться для каждого пользователя, кому нужен доступ к FTP-серверу:

[root@deep /]# mkdir /home/ftp
[root@deep /]# useradd -d /home/ftp/ftpadmin/ -s /dev/null ftpadmin > \
                       /dev/null 2>&1
[root@deep /]# passwd ftpadmin
Changing password for user ftpadmin
New UNIX password:
Retype new UNIX password:
passwd: all authentication tokens updated successfully

Команда mkdir создаст каталог ftp в /home для хранения всех домашних каталогов FTP-пользователей. Команда useradd добавит нового пользователя с именем ftpadmin в Вашей системе. В заключение, команда passwd установит пароль для него. После того, как каталог /home/ftp создан, Вам не нужно будет создавать его для каждого нового пользователя.

Шаг 2.

Редактируйте файл /etc/shells (vi /etc/shells) и добавьте в него несуществующий командный процессор, например, null. Этот ложный shell ограничит доступ FTP-пользователям к системе:

[root@deep /]# vi /etc/shells
/bin/bash
/bin/sh
/bin/ash
/bin/bsh
/bin/tcsh
/bin/csh
/dev/null
(это Ваш несуществующий командный процессор)

ЗАМЕЧАНИЕ. В Red Hat Linux специальное имя устройства (/dev/null) существует для подобных целей.

Шаг 3.

Сейчас редактируйте Ваш файл /etc/passwd и вручную добавьте подстроку /./, разделяющую каталоги /home/ftp и /ftpadmin, где ftpadmin должен автоматически изменить каталог. Этот шаг должен быть выполнен для каждого FTP-пользователя, добавляемого в файл passwd.

Редактируйте файл passwd (vi /etc/passwd) и добавьте/измените строку для пользователя ftpadmin:

ftpadmin:x:502:502::/home/ftp/ftpadmin/:/dev/null
на:
ftpadmin:x:502:502::/home/ftp/./ftpadmin/:/dev/null

Обратите внимание, что путь к домашнему каталогу пользователя ftpadmin немного нечеткий. Первая часть /home/ftp показывает файловую систему, которая должна стать новый корневым каталогом. Разделяющая точка . говорит, что из текущего каталога необходимо автоматически переходить в /ftpadmin. Еще раз отметим, что часть /dev/null отключает вход в систему как регулярного пользователя. С этим изменением пользователь ftpadmin имеет ложный командный процессор вместо реального, тем самым имея ограничения в доступе к системе.

Установка пользовательского окружения chroot

Далее Вы должны создать основу корневой файловой системы с достаточным количеством необходимых компонентов (исполняемые файлы, файлы парлей и т.д.), чтобы позволить Unix выполнить chroot, когда пользователь входит в систему. Заметим, что если Вы использовали опцию --enable-ls во время компиляции, как мы предлагали выше, то каталоги /home/ftp/bin и /home/ftp/lib не нужны, так как Wu-ftpd будет использовать собственную функцию ls. Мы остановимся на демонстрации старого метода, при котором люди копируют /bin/ls в chroot FTP-каталог (/home/ftp/bin) и создают соответствующие библиотеки, связанные с ls.

Необходимо выполнить следующие шаги, чтобы запустить Wu-ftpd в chroot-окружении:

Шаг 1.

Создадим все каталоги chroot-окружения:

[root@deep /]# mkdir /home/ftp/dev
[root@deep /]# mkdir /home/ftp/etc
[root@deep /]# mkdir /home/ftp/bin
(требуется, если Вы не использовали опцию --enable-ls)
[root@deep /]# mkdir /home/ftp/lib
(требуется, если Вы не использовали опцию --enable-ls)

Шаг 2.

Измените права доступа к новым каталогам на 0511 из соображений безопасности:

[root@deep /]# chmod 0511 /home/ftp/dev
[root@deep /]# chmod 0511 /home/ftp/etc
[root@deep /]# chmod 0511 /home/ftp/bin
(требуется, если Вы не использовали опцию --enable-ls)
[root@deep /]# chmod 0511 /home/ftp/lib
(требуется, если Вы не использовали опцию --enable-ls)

Команда chmod изменит права доступа к chroot-каталогам dev, etc, bin и lib на чтение и исполнение для root и исполнение для группы и всех остальных пользователей.

Шаг 3.

Копируйте исполняемый файл /bin/ls в каталог /home/ftp/bin и измените права доступа к нему на 0111 (Вы не хотите позволять пользователям модифицировать этот файл):

[root@deep /]# cp /bin/ls /home/ftp/bin
(требуется, если Вы не использовали опцию --enable-ls)
[root@deep /]# chmod 0111 /bin/ls /home/ftp/bin/ls
(требуется, если Вы не использовали опцию --enable-ls)

ЗАМЕЧАНИЕ. Этот шаг необходим только, если Вы не использовали при конфигурировании опцию --enable-ls. Смотрите секцию "Компиляция и оптимизация" в этой главе.

Шаг 4.

Найдите разделяемые библиотеки, от которых зависит программа ls:

[root@deep /]# ldd /bin/ls
(требуется, если Вы не использовали опцию --enable-ls)
libc.so.6 => /lib/libc.so.6 (0x00125000)
/lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x00110000)

Копируйте их в новый каталог lib, расположенный в /home/ftp:

[root@deep /]# cp /lib/libc.so.6 /home/ftp/lib
(требуется, если Вы не использовали опцию --enable-ls)
[root@deep /]# cp /lib/ld-linux.so.2 /home/ftp/lib
(требуется, если Вы не использовали опцию --enable-ls)

ЗАМЕЧНИЕ. Эти библиотеки нужны для работы команды ls. Также, как и шаг 3, это необходимо сделать, если Вы во время конфигурирования Wu-ftpd не указали опцию --enable-ls для использования внутренней команды ls.

Шаг 5.

Создайте файл /home/ftp/dev/null:

[root@deep /]# mknod /home/ftp/dev/null c 1 3
[root@deep /]# chmod 666 /home/ftp/dev/null

Шаг 6.

Копируйте файлы group и passwd в каталог /home/ftp/etc. Они не должны быть такими же, как оригиналы. Мы удалим из них всех не FTP-пользователей, исключая root:

[root@deep /]# cp /etc/passwd /home/ftp/etc
[root@deep /]# cp /etc/group /home/ftp/etc

Редактируйте файл passwd (vi /home/ftp/etc/passwd) и удалите из него все элементы, кроме root и Ваших FTP-пользователей. Файл должен иметь следующий вид:

root:x:0:0:root:/:/dev/null
ftpadmin:x:502:502::/ftpadmin/:/dev/null

ЗАМЕЧАНИЕ. Мы отметим здесь две вещи: первое, домашний каталог всех пользователей был изменен (например, /home/ftp/./ftpadmin на /ftpadmin), и второе, командный процессор для пользователя root был изменен на /dev/null.

Редактируйте файл group (vi /home/ftp/etc/group) и удалите все элементы, исключая root и всех FTP-пользователей. Файл group должен соответствовать Вашему нормальному файлу групп:

root:x:0:root
ftpadmin:x:502:

Шаг 7.

Сейчас мы должны иммунизировать файлы passwd и group, находящиеся в chroot-окружении.

Установим бит постоянства на файл passwd:

[root@deep /]# cd /home/ftp/etc
[root@deep /]# chattr +i passwd

Установим бит постоянства на файл group:

[root@deep /]# cd /home/ftp/etc
[root@deep /]# chattr +i group

Конфигурации

Все программное обеспечение, описанное в книге, имеет определенный каталог и подкаталог в архиве floppy.tgz, включающем все конфигурационные файлы для всех программ. Если Вы скачаете этот файл, то Вам не нужно будет вручную воспроизводить файлы из книги, чтобы создать свои файлы конфигурации. Скопируйте файлы, связанные с Wu-ftpd, из архива, измените их под свои требования и поместите в нужное место так, как это описано ниже. Файл с конфигурациями Вы можете скачать с адреса: http://www.openna.com/books/floppy.tgz.

Для запуска ftp-сервера следующие файлы должны быть созданы или скопированы на Ваш сервер.

Копируйте файлы ftpaccess в каталог /etc.
Копируйте файлы ftpusers в каталог /etc.
Копируйте файлы ftphosts в каталог /etc.
Копируйте файлы ftpgroups в каталог /etc.
Копируйте файлы ftpconversion в каталог /etc.
Копируйте ftpd в каталог /etc/logrotate.d.
Копируйте ftp в каталог /etc/pam.d.

Вы можете взять эти файлы из архива floppy.tgz.

Конфигурация файла /etc/ftpaccess

Файл /etc/ftpaccess это основной конфигурационный файл, используемый для конфигурирования сервера Wu-ftpd. Этот файл первоначально предназначен для определения того, какие пользователи, сколько пользователей, могут получить доступ к Вашему серверу, и прочих важных элементов настройки безопасности сервера.

Шаг 1.

Редактируйте файл ftpaccess (vi /etc/ftpaccess) и добавьте/измените в нем следующие строки:

class      openna      guest        208.164.186.*

limit openna 20 MoTuWeTh,Fr0000-1800 /home/ftp/.too_many.msg
email admin@openna.com

loginfails 3

readme README*    login
readme README*    cwd=*

message /home/ftp/.welcome.msg login
message .message         cwd=*
compress         yes     all
tar              yes     all
chmod            yes     guest
delete           yes     guest
overwrite        yes     guest
rename           yes     guest

log commands real,guest
log transfers real,guest inbound,outbound

guestgroup ftpadmin
guestgroup webmaster

# We don't want users being able to upload into these areas.
upload /home/ftp/* /       no
upload /home/ftp/* /etc    no
upload /home/ftp/* /dev    no

# We'll prevent downloads with noretrieve.
noretrieve /home/ftp/etc
noretrieve /home/ftp/dev

log security real,guest

guest-root /home/ftp ftpadmin webmaster
restricted-uid ftpadmin webmaster
restricted-gid ftpadmin webmaster

greeting terse
keepalive yes
noretrieve .notar

Шаг 2.

Сейчас мы должны изменить права доступа на 600:

[root@deep /]# chmod 600 /etc/ftpaccess

Эти параметры конфигурационного файла говорят следующее:

class openna guest 208.164.186.*
Опция class определяет классы пользователей, которые имеют доступ к Вашему FTP-серверу. Вы можете определить столько классов, сколько хотите. В нашем случае, например, мы определяем класс с именем openna, и позволяем пользователю guest с учетными записями на ftp-сервере доступ к их домашним каталогам через FTP, если они заходят с адреса 208.164.186.*. Важно заметить, что существует три различных типа пользователей: anonymous, guest и real. Пользователи Anonymous это любой пользователь сети, который подключается к серверу и пересылает файлы, не имея учетной записи на нем. Пользователь Guest это реальный пользователь системы, для которых сессии настроены также, как и для анонимных пользователей FTP (это то, что мы определили в нашем примере), и пользователь Real должен иметь учетную запись и командный процессор (shell) (это может приводить к риску для безопасности) на сервере для доступа к нему.

limit openna 20 MoTuWeTh,Fr0000-1800 /home/ftp/.too_many.msg
Опция limit определяет число пользователей данного класса, которым разрешается подключаться к серверу, и разрешенное время суток. В нашем примере к FTP-серверу из класса openna может подключаться максимум 20 пользователей, в понедельник, вторник, среду и четверг целый день, а в пятницу с полуночи до 6:00 вечера Fr0000-1800. Также, если количество пользователей достигло предела (20), то вновь подключаемым пользователям будет выдаваться сообщение из файла /home/ftp/.too_many.msg. Это очень полезный параметр для контроля за ресурсами сервера.

loginfails 3
Опция loginfails определяет число ошибочных попыток подключений к серверу, которое может осуществить пользователь до того, как будет отсоединен от сервера. В нашем примере мы отключаем пользователя от FTP-сервера после трех попыток.

readme README* login
readme README* cwd=*

Опция readme определяет сообщение, выдаваемое клиенту во время регистрации на сервере, или во время использования команды смены каталога, которая определяет файлы в текущем каталоге, измененные в последнее время. В нашем примере мы устанавливаем имя файла README* относительно каталога FTP, и условия вывода сообщения: при успешном входе в систему login или входе в новый каталог cwd=*.

message /home/ftp/.welcome.msg login
message .message cwd=*

Опция message определяет специальные сообщения, отображаемые клиентам, когда они либо вошли в систему, либо используют команду смены рабочего каталога. В нашем примере мы показываем месторасположение и имя выводимых файлов /home/ftp/.welcome.msg или .message, и условия при которых они выводятся: при успешной регистрации в системе login, или когда клиент входит в новый каталог cwd=*. Для опций readme и message, когда Вы определяете путь для анонимных пользователей, Вы должны использовать абсолютный путь относительно анонимного FTP-каталога.

compress yes all
tar yes all
chmod yes guest
delete yes guest
overwrite yes guest
rename yes guest
Опции compress, tar, chmod, delete, overwrite и rename определяют права, которые Вы хотите дать Вашим пользователям на выполнение этих команд. В нашем примере мы даем права группе guest на команды chmod, delete, overwrite и rename и позволяем всем пользователям сервера (all) использовать команды compress и tar. Если Вы не определите следующие директивы, они по умолчанию будут выставлены в yes для всех.

log commands real,guest
Опция log commands включает регистрацию команд пользователей из соображений безопасности. В нашем примере мы регистрируем все индивидуальные команды пользователей классов real и guest (real,guest). Результаты регистрации сохраняются в файле /var/log/message.

log transfers real,guest inbound,outbound
Опция log transfers включает регистрацию всех FTP-пересылок из соображения безопасности. В нашем примере мы регистрируем все пересылки пользователей классов real и guest (real,guest), параметры inbound и outbound (inbound, outbound) определяют направления пересылки, в нашем случае входящие и исходящие. Результаты сохраняются в файле /var/log/xferlog.

guestgroup ftpadmin
guestgroup webmaster
Опция guestgroup определяет всех реальных пользователей, относящихся к группе гостей, сессии которых настроены также, как и в анонимном FTP (ftpadmin и webmaster). Файл /home/ftp/etc/group имеет входы для каждой из этих групп, каждая из которых имеет только одного члена. Важно, что в конфигурационном файле в одной строке должна быть записана одна гостевая группа.

log security real,guest
Опция log security включает регистрацию нарушений правил безопасности для реальных, гостевых и/или анонимных FTP-клиентов. В нашем примере мы разрешаем регистрацию нарушений для пользователей, использующих FTP-сервер для доступа с реальных учетных записей и гостевых логинов (real, guest).

guest-root /home/ftp ftpadmin webmaster
restricted-uid ftpadmin webmaster
restricted-gid ftpadmin webmaster
Эти опции, guest-root, restricted-uid, restricted-gid, определяют и контролируют могут или нет пользователи guest получить доступ к области FTP-сервера вне их домашних каталогов (это важная функция повышения безопасности). В нашем примере мы определяем chroot-путь для пользователей ftpadmin и webmaster в /home/ftp, и они не могут получить доступа к другим файлам, потому что ограничены своими домашними каталогами (restricted-uid ftpadmin webmaster, restricted-gid ftpadmin webmaster). Несколько диапазонов UID может задаваться в этой строке. Если для пользователя выбран guest-root, то домашний каталог пользователя из файла root-dir/etc/passwd используется для определения начального каталога, а их домашний каталог в масштабе всей системы из файла /etc/passwd не используется.

greeting terse
Опция greeting определяет, как много системной информации будет выводится до того, как удаленный пользователь войдет в систему. Здесь Вы можете использовать три значения: full используется по умолчанию, показывает имя хоста и версию демона, brief только имя хоста и terse просто сообщает "FTP server ready".

keepalive yes
Опция keepalive определяет, должна ли система посылать сообщения keep alive на удаленный FTP-сервер. Если установлена в yes, то сервер получит необходимое предупреждение о разрыве соединения или падении удаленной машины.

Конфигурация файла /etc/ftphosts

Файл /etc/ftphosts используется для определения следующего: может ли пользователь входить в систему с определенной машины или ему будет запрещен доступ.

Шаг 1.

Создайте файл ftphosts (touch /etc/ftphosts) и добавьте, например, в него следующие строки:

# Пример файла host access
#
# Все, что после '#', это комментарии, пустые строки игнорируются
allow ftpadmin  208.164.186.1 208.164.186.2 208.164.186.4
deny  ftpadmin  208.164.186.5

В нашем примере мы разрешаем пользователю ftpadmin соединяться с FTP-сервером из явно заданного списка адресов 208.164.186.1 208.164.186.2 208.164.186.4, и запрещаем пользователю ftpadmin соединяться с сервера 208.164.186.5.

Шаг 2.

Измените права доступа на 600:

[root@deep /]# chmod 600 /etc/ftphosts

Конфигурация файла /etc/ftpusers

Файл /etc/ftpusers определяет пользователей, которым не разрешен доступ на FTP-сервер.

Шаг 1.

Создайте файл ftpusers (touch /etc/ftpusers) и добавьте в него следующих пользователей:

root
bin
daemon
adm
lp
sync
shutdown
halt
mail
news
uucp
operator
games
nobody

Шаг 2.

Измените права доступа к файлу на 600:

[root@deep /]# chmod 600 /etc/ftpusers

Конфигурация файла /etc/ftpconversions

Файл /etc/ftpconversions содержит инструкции, которые разрешают Вам по требованию сжимать файлы перед пересылкой.

Шаг 1.

Редактируйте файл ftpconversions (vi /etc/ftpconversions) и добавьте в него следующие строки:

:.Z   : : :/bin/compress -d -c %s:T_REG|T_ASCII:O_UNCOMPRESS:UNCOMPRESS
:     : :.Z:/bin/compress -c %s:T_REG:O_COMPRESS:COMPRESS
:.gz: : :/bin/gzip -cd %s:T_REG|T_ASCII:O_UNCOMPRESS:GUNZIP
:     : :.gz:/bin/gzip -9 -c %s:T_REG:O_COMPRESS:GZIP
:     : :.tar:/bin/tar -c -f - %s:T_REG|T_DIR:O_TAR:TAR
:     : :.tar.Z:/bin/tar -c -Z -f
         -%s:T_REG|T_DIR:O_COMPRESS|O_TAR:TAR+COMPRESS
:     : :.tar.gz:/bin/tar -c -z -f
         -%s:T_REG|T_DIR:O_COMPRESS|O_TAR:TAR+GZIP
:     : :.crc:/bin/cksum %s:T_REG::CKSUM
:     : :.md5:/bin/md5sum %s:T_REG::MD5SUM

Шаг 2.

Измените права доступа на 600:

[root@deep /]# chmod 600 /etc/ftpconversions

Конфигурация файла /etc/pam.d/ftp

Сконфигурируйте файл /etc/pam.d/ftp для использования pam-аутентификации.

Создайте файл ftp (touch /etc/pam.d/ftp) и добавьте в него следующие строки:

#%PAM-1.0
auth required /lib/security/pam_listfile.so item=user sense=deny
     file=/etc/ftpusers onerr=succeed
auth required /lib/security/pam_pwdb.so shadow nullok
auth required /lib/security/pam_shells.so
account required /lib/security/pam_pwdb.so
session required /lib/security/pam_pwdb.so

Конфигурация файла /etc/logrotate.d/ftpd

Настройте файл /etc/logrotate.d/ftpd на автоматическую ротацию файлов регистрации каждую неделю.

Создайте файл ftpd (touch /etc/logrotate.d/ftpd) и добавьте в него следующие строки:

/var/log/xferlog
{
  # ftpd должным образом не обрабатывает SIGHUP
  nocompress
}

Настройка ftpd на использование tcp-wrappers из суперсервера inetd

Tcp-wrappers должен быть включен на запуск и остановку ftpd-сервера. inetd читает настроечную информацию из своего конфигурационного файла /etc/inetd.conf. Для каждого поля этого файла должно обязательно присутствовать его значение, поля разделяются пробелами или символами табуляции.

Шаг 1.

Редактируйте файл inetd.conf (vi /etc/inetd.conf) и добавьте или проверьте на наличие следующие строки:

ftp  stream  tcp  nowait   root   /usr/sbin/tcpd in.ftpd -l -a

Чтобы изменения вступили в силу, пошлите демону inetd сигнал SIGHUP, используя следующую команду:

[root@deep /]# killall -HUP inetd

Шаг 2.

Редактируйте файл hosts.allow (vi /etc/hosts.allow) и добавьте, например, следующую строку:

in.ftpd: 192.168.1.4 win.openna.com

Которая говорит, что клиенту с IP-адресом 192.168.1.4 и именем хоста win.openna.com разрешен FTP-доступ на сервер.

Административные утилиты FTP

ftpwho

Программа ftpwho выводит всех активных пользователей ftp, и их текущие процессы в системе. Выходные данные выдаются в формате, напоминающем команду /bin/ps.

[root@deep /]# ftpwho
Service class openna:
5443  ?      S      0:00 ftpd: win.openna.com: ftpadmin: IDLE
- 1 users (20 maximum)

Здесь Вы видите, что к системе подключен один пользователь с именем ftpadmin, пришедший с хоста win.openna.com. Всего к серверу может подключиться до 20 пользователей.

ftpcount

Утилита ftpcount это упрощенная версия ftpwho. Она показывает только количество пользователей, подключенных к системе в данный момент, и общее количество, которое может подключиться:

[root@deep /]# ftpcount
Service class openna - 1 users ( 20 maximum)

Организация защиты FTP

Файл ftpusers

Важно удостовериться, что Вы настроили файл /etc/ftpusers. В нем определяются пользователи, которым не разрешено соединяться с Вашим FTP-сервером. В него должны быть включены, как минимум, следующие пользователи: root, bin, daemon, adm, lp, sync, shutdown, halt, mail, news, uucp, operator, games, nobody и ВСЕ другие определенные по умолчанию пользователи, доступные в Вашем файле /etc/passwd.

Анонимный FTP

Для отключения анонимного FTP, удалите пользователя ftp из Вашего файла паролей и проверьте, что пакет anonftp-version.i386.rpm не инсталлирован. Для удаления пользователя ftp выполните следующую команду:

[root@deep /]# userdel ftp

Для проверки, что RPM пакет анонимного FTP не инсталлирован у Вас на системе выполните следующую команду:

[root@deep /]# rpm -q anonftp
package anonftp is not installed
Команда upload

По умолчанию сервер Wu-ftpd разрешает upload всем пользователям. Параметр upload позволяет удаленным пользователям загружать и размещать файлы на FTP-сервере. Для оптимальной безопасности, мы не хотим разрешать пользователям загружать файлы в подкаталоги bin, etc, dev и lib каталога /home/ftp. В нашем файле /etc/ftpaccess мы уже сменили корневой каталог (chroot) пользователей на /home/ftp, и поэтому они не имеют доступа к другим областям файловой системы.

Редактируйте файл ftpaccess (vi /etc/ftpaccess) и добавьте следующие строки, которые запретят upload в определенные области:

# Мы не хотим, чтобы пользователи могли закачивать файлы в эти области.
upload /home/ftp/* / no
upload /home/ftp/* /etc no
upload /home/ftp/* /dev no
upload /home/ftp/* /bin no
(требуется только, если Вы не использовали опцию --enable-ls)
upload /home/ftp/* /lib no
(требуется только, если Вы не использовали опцию --enable-ls)

Вышеприведенные строки запрещают upload в подкаталоги /, /etc, /dev, /bin и /lib chroot-каталога /home/ftp.

Специальный файл .notar

Хотите ли Вы разрешать упаковывать командой tar каталоги или нет, Вы должны сделать так, чтобы нельзя было выполнить команду tar в областях, где запрещен upload.

Шаг 1.

Чтобы сделать это, создайте специальный файл .notar в каждом каталоге FTP:

[root@deep /]# touch /home/ftp/.notar
[root@deep /]# touch /home/ftp/etc/.notar
[root@deep /]# touch /home/ftp/dev/.notar
[root@deep /]# touch /home/ftp/bin/.notar
(требуется только, если Вы не использовали опцию --enable-ls)
[root@deep /]# touch /home/ftp/lib/.notar
(требуется только, если Вы не использовали опцию --enable-ls)
[root@deep /]# chmod 0 /home/ftp/.notar
[root@deep /]# chmod 0 /home/ftp/etc/.notar
[root@deep /]# chmod 0 /home/ftp/dev/.notar
[root@deep /]# chmod 0 /home/ftp/bin/.notar
(требуется только, если Вы не использовали опцию --enable-ls)
[root@deep /]# chmod 0 /home/ftp/lib/.notar
(требуется только, если Вы не использовали опцию --enable-ls)

Шаг 2.

Файл нулевой длины .notar может привести в замешательство некоторые веб-клиенты и FTP-прокси, чтобы решить эту проблему, надо запретить пересылку этого файла.

Редактируйте файл ftpaccess (vi /etc/ftpaccess) и добавьте следующую строку, чтобы промаркировать файл .notar как непересылаемый:

noretrieve .notar
Команда noretrieve.

Параметр noretrieve сервера Wu-ftpd позволяет Вам запретить пересылку выбранных каталогов или файлов. Хорошей идеей будет предотвращение передачи некоторых подкаталогов (bin, etc, dev и lib) из каталога /home/ftp при помощи команды noretrieve в файле /etc/ftpaccess. Редактируйте файл ftpaccess (vi /etc/ftpaccess) и добавьте следующие строки для предотвращения передачи ряда каталогов:

# Мы предотвращаем перекачку при помощи noretrieve.
noretrieve /home/ftp/etc
noretrieve /home/ftp/dev
noretrieve /home/ftp/bin
(требуется только, если Вы не использовали опцию --enable-ls)
noretrieve /home/ftp/lib
(требуется только, если Вы не использовали опцию --enable-ls)

Инсталлированные файлы

> /etc/pam.d/ftp
> /etc/logrotate.d/ftpd
> /etc/ftpaccess
> /etc/ftpconversions
> /etc/ftpgroups
> /etc/ftphosts
> /etc/ftpusers
> /home/ftp/
> /usr/man/man5/ftpconversions.5
> /usr/man/man5/xferlog.5
> /usr/man/man8/ftpd.8
> /usr/man/man8/ftpshut.8
> /usr/man/man8/ftprestart.8
> /usr/sbin/in.ftpd
> /usr/sbin/ftpshut
> /usr/sbin/ckconfig
> /usr/bin/ftpcount
> /usr/bin/ftpwho
> /usr/man/man1/ftpcount.1
> /usr/man/man1/ftpwho.1
> /usr/man/man5/ftpaccess.5
> /usr/man/man5/ftphosts.5
> /usr/sbin/ftprestart
> /usr/sbin/xferstats
> /usr/sbin/wu.ftpd
> /usr/sbin/in.wuftpd
> /var/log/xferlog