Рубрика:
Администрирование /
Продукты и решения
|
Facebook
Мой мир
Вконтакте
Одноклассники
Google+
|
Павел Семенец
Строим бюджетный сервер для малых или средних компаний
Часть 1
Каждый системный администратор наверняка хочет собрать и настроить сервер, который бы отвечал требованиям компании и не доставлял огромное число проблем при администрировании, при этом затратив минимум материальных средств на программное и аппаратное обеспечение. Как добиться таких результатов?
В сети ведется очень много разговоров на тему Windows vs. Samba. Возможно, единственный останавливающий фактор для тех, кто не решается использовать Samba, – это отсутствие стоящей документации по настройке Samba как части информационного комплекса в целом.
В статье я покажу вам, как исключить Windows из сети в качестве доменного контроллера «как класс», заменив его предлагаемым комплексом программного обеспечения. Для того чтобы понять, почему это нужно делать, расскажу маленькую историю.
В одно прекрасное утро, придя на работу, я обнаружил, что «повис» основной доменный контроллер на Windows 2003 Enterprise Server (доставшийся в наследство от предыдущих администраторов). После перезагрузки Windows оказалось, что операционная система отказалась инициализировать один из интерфейсов. Попытки поднять интерфейс не увенчались успехом. А переустановка операционной системы была не возможна из-за угрозы потерять большое количество информации, которая ко всему прочему находилась на программном Raid10. Вот тогда-то и появилась идея реализовать все на Samba. Покопавшись некоторое время в Интернете, я понял, что большинство документации по настройке Samba либо составлена из фрагментов, работоспособность в целом которых не была проверена, либо представляют собой некую частную ситуацию, соответствующую исключительным особенностям авторской установки. Кроме того, многие статьи по данной теме противоречивы или даже не соответствуют действительности. Чтобы исправить эту досадную ситуацию, я решил описать процесс настройки комплекса «с нуля».
Итак, в наличии имеем:
- Установочный диск FreeBSD 6.2 RELEASE.
- Cервер следующей конфигурации (допускаются варианты):
- CPU – AMD Opteron 265.
- RAM – 512 Мб.
- HDD – 2x400 Гб Hitachi DeskStar7.
- MB – Tyan Tomcat K8SD.
Стоимость оборудования такой конфигурации легко укладывается в 30-35 тысяч рублей.
- Подключение к Интернету.
- Зарегистрированное доменное имя (предположим, example.com).
- Берем произвольное имя сервера (предположим, srv.example.com).
- Определяемся с внутренней подсетью (предположим, 172.16.0.0/24).
Используемое программное обеспечение
- Samba3 – CIFS-сервер, обеспечивающий функции доменного контроллера Windows NT 4.0.
- Exim – один из самых гибких в настройке MTA-агентов.
- DSPAM – быстрый и надежный антиспам-фильтр.
- Courier-IMAP – один из лучших POP3/IMAP-сервер.
- SquirrelMail – красивый веб-интерфейс для любителей Mail.ru и т. д.
- Squid – мощный прокси-сервер с большим количеством настроек.
- PowerDNS – маленький и удобный в настройке сервер имен DNS.
- OpenLDAP – сетевой каталог для хранения учетной информации.
- LigHTTPD – маленький и быстрый http-сервер с поддержкой cgi-скриптов.
- SNMP – сервер для получения статистической информации.
Приступаем к настройке комплекса
Для начала надо установить операционную систему на сервер. Как это делать, очень хорошо описано в официальной документации на сайте www.freebsd.org, установить коллекцию портов и запастись терпением.
Собираем OpenLDAP
Собирать OpenLDAP мы будем с некоторыми дополнительными ключами:
# cd /usr/ports/net/openldap23-server
# make all install clean
Выбираем опции, с которыми будем собирать OpenLDAP:
- SLAPI
- TCP_WRAPPERS
- DBD
- DYNAMIC_BACKENDS
- SLURPD
Конфигурируем сервер OpenLDAP
Получаем зашифрованную hash-последовательность пароля, мною был выбран пароль «password» в качестве примера:
# /usr/local/sbin/slapasswd
New password:
Re-enter new password:
{SSHA}j8ztWZaAL/kSxPei4TT8+pxs6bmqHSdy
|
Любым удобным для вас текстовым редактором приводим файл /usr/local/etc/openldap/slapd.conf к следующему виду. Некоторые файлы схем изначально отсутствуют после сборки сервера. Мы их скопируем чуть позже:
# Подключаем схемы
include /usr/local/etc/openldap/schema/core.schema
include /usr/local/etc/openldap/schema/cosine.schema
include /usr/local/etc/openldap/schema/inetorgperson.schema
include /usr/local/etc/openldap/schema/nis.schema
include /usr/local/etc/openldap/schema/samba.schema
include /usr/local/etc/openldap/schema/dnsdomain2.schema
pidfile /var/run/openldap/slapd.pid
argsfile /var/run/openldap/slapd.args
# Подключаем внешние модули хранилищ
modulepath /usr/local/libexec/openldap
moduleload back_ldbm
# Распределяем права доступа к некоторым атрибутам хранилища
access to attrs=userPassword
by self write
by anonymous auth
by * none
access to attrs=sambaLMPassword
by self write
by anonymous auth
by * none
access to attrs=sambaNTPassword
by self write
by anonymous auth
by * none
access to *
by self write
by anonymous read
by * none
# Описываем хранилище
# Указываем, какой тип хранилища используем
database ldbm
# Задаем контейнер верхнего уровня
suffix "dc=example,dc=com"
# Задаем контейнер администратора сервера
rootdn "cn=root,dc=example,dc=com"
# Записываем полученную ранее hash-последовательность для авторизации на сервере
rootpw {SSHA}j8ztWZaAL/kSxPei4TT8+pxs6bmqHSdy
# Указываем, где находится хранилище
directory /var/db/openldap-data
# Описываем важные для нас индексы поиска по дереву
index objectClass,uidNumber,gidNumber eq
index cn,sn,uid,displayName pres,sub,eq
index memberUid,mail,givenname eq,subinitial
index sambaSID,sambaPrimaryGroupSID,sambaDomainName eq
index aRecord pres,eq
index associatedDomain pres,eq,sub
За более подробной информацией можно обратиться к справочному руководству по пакету OpenLDAP (это минимальные настройки сервера для обеспечения работы нашего домен-контроллера).
Собираем Samba
# cd /usr/ports/net/samba3
# make all install clean
Выбираем следующие ключи для компиляции Samba:
Копируем схему для работы Samba с OpenLDAP:
# cp /usr/local/share/examples/samba/LDAP/samba.schema /usr/local/etc/openldap/schema/
Собираем PowerDNS
# cd /usr/ports/dns/powerdns
# make all install clean
Выбираем ключи для компиляции:
# cd /usr/ports/dns/powerdns-recursor
# make all install clean
Выбираем ключи для компиляции:
Для хранения записей DNS-сервера в директории LDAP, PowerDNS использует схему dnsdomain2.schema которую почему-то разработчики не потрудились вложить в дистрибутив.
Поэтому ее придется скачать и положить в директорию /usr/local/etc/openldap/schema:
# cd /usr/local/etc/openldap/schema
# fetch http://www.linuxnetworks.de/pdnsldap/dnsdomain2.schema
Запускаем OpenLDAP
Добавляем строки в /etc/rc.conf для запуска OpenLDAP.
Активируем запуск OpenLDAP при загрузке системы:
slapd_enable="YES"
Указываем флаги для запуска OpenLDAP:
slapd_flags='-h "ldapi://%2fvar%2frun%2fopenldap%2fldapi/ ldap://127.0.0.1/ ldap://172.16.0.1/"'
- ldapi://%2fvar%2frun%2fopenldap%2fldapi/ – предписываем серверу «работать» через созданный сокет;
- ldap://127.0.0.1/ – предписываем серверу «слушать» локальный интерфейс;
- ldap://172.16.0.1/ – предписываем серверу «слушать» внутренний интерфейс.
Указываем сокет для локальных подключений:
slapd_sockets="/var/run/openldap/ldapi"
Переименовываем скрипты для запуска в требуемой последовательности:
# cd /usr/local/etc/rc.d
# mv slapd.sh 010.slapd.sh
# mv pdns.sh 020.pdns.sh
# mv pdns-recursor 015.pdnsr.sh
# mv samba 025.samba.sh
Удаляем старую базу OpenLDAP (если она есть), чтобы избежать дальнейших возможных проблем:
# rm -rf /var/db/openldap-data/*
Запускаем cервер OpenLDAP:
# /usr/local/etc/rc.d/010.slapd start
Конфигурируем Samba
Добавляем записи в rc.conf для запуска Samba:
samba_enable="YES"
smbd_enable="YES"
nmbd_enable="YES"
Запускаем Samba:
# /usr/local/etc/rc.d/030.samba.sh start
Вычисляем локальный sid домена и записываем его в файл. Он нам в дальнейшем понадобится для формирования конфигурационного файла smbldap-tools:
# net getlocalsid | awk ‘BEGIN{FS=”is: “}{print $2}’ >~/localsid
# cat ~/localsid
S-1-5-21-4089634979-3265135400-2542302168
|
Останавливаем Samba:
# /usr/local/etc/rc.d/030.samba.sh stop
Приводим конфигурационный файл Samba /usr/local/etc/smb.conf к следующему виду:
[global]
# Указываем Samba перекодировать имена файлов, для того чтобы и на самом сервере,
# и у клиента они отображались в правильной кодировке. Так как у меня на сервере
# системная локаль ru_RU.KOI8-R, то следующие 3 строчки будут выглядеть как показано ниже.
# Если у вас другая системная локаль, обратитесь к документации Samba для получения
# более подробной информации
dos charset = 866
unix charset = KOI8-R
display charset = KOI8-R
# Описываем наш сервер и домен
workgroup = EXAMPLE
server string = Samba PDC %v (Example.com)
netbios name = SRV
update encrypted = yes
obey pam restrictions = yes
# Указываем Samba использовать LDAP
passdb backend = ldapsam:ldap://127.0.0.1/
pam password change = yes
passwd chat debug = yes
# Указываем Samba, где хранить логи
log level = 1
log file = /var/log/samba/log.%m
max log size = 1000
# Активируем сервер времени для клиентов Samba
time server = yes
# Указываем несколько параметров для увеличения быстродействия сервера
socket options = SO_KEEPALIVE IPTOS_LOWDELAY SO_SNDBUF=8192 SO_RCVBUF=8192
max xmit = 16644
use sendfile = no
large readwrite = no
# Указываем скрипты для работы с учетными записями
# (cкрипты используются при выполнении команды net)
add user script = /usr/local/sbin/smbldap-useradd -a -m "%u"
delete user script = /usr/local/sbin/smbldap-userdel -r "%u"
add group script = /usr/local/sbin/smbldap-groupadd -p "%g"
delete group script = /usr/local/sbin/smbldap-groupdel "%g"
add user to group script = /usr/local/sbin/smbldap-groupmod -m "%u" "%g"
delete user from group script = /usr/local/sbin/smbldap-groupmod -x "%u" "%g"
set primary group script = /usr/local/sbin/smbldap-usermod -g"%u" "%g"
add machine script = /usr/local/sbin/smbldap-useradd -w "%u"
# Указываем Samba, какой скрипт запускать при логине пользователя
logon script = logon.cmd
# Указываем Samba, где хранить перемещаемые профили пользователей
logon path = \\%L\%U\profile
logon drive = Z:
logon home = \\%L\%U
# Указываем Samba работать в качестве первичного доменного контроллера
# и мастера браузера сети
domain logons = yes
os level = 255
preferred master = yes
domain master = yes
local master = yes
# Описываем, где Samba должна искать информацию об учетных записях в OpenLDAP
# и как она там хранится
ldap admin dn = cn=root,dc=example,dc=com
ldap delete dn = yes
ldap user suffix = ou=Users
ldap group suffix = ou=Groups
ldap machine suffix = ou=Computers
ldap passwd sync = yes
ldap suffix = dc=example,dc=com
ldap ssl = no
host msdfs = yes
# Указываем логины пользователей, используемые для администрирования сервера
admin users = smbroot
# Описываем права доступа к серверу
hosts allow = 172.16.0. 127.
profile acls = yes
# Описываем общедоступные ресурсы
[netlogon]
comment = Network Logon Service
path = /home/samba/netlogon/
write list = root "@Domain Admins"
browseable = no
read only = no
guest ok = yes
# Описываем директории пользователей
[homes]
comment = Homefolder
path = /home/samba/%U
hide files = /.*/
valid users = %S "@Domain Admins"
read only = No
create mask = 0644
directory mask = 0775
Устанавливаем набор скриптов smbldap-tools
# cd /usr/ports/net/smbldap-tools/
# make all install clean
Конфигурируем smbldap-tools:
# cd /usr/local/etc/smbldap-tools
Приводим файл smbldap.conf к следующему виду:
# Указываем полученный ранее локальный sid, находящийся в файле ~/localsid
SID="S-1-5-21-4089634979-3265135400-2542302168"
# Указываем имя нашего домена
sambaDomain="EXAMPLE"
# Указываем подключение к OpenLDAP-серверу (так как у нас
# один сервер, то первичный и вторичный сервер указываем одинаковые)
slaveLDAP="127.0.0.1"
slavePort="389"
masterLDAP="127.0.0.1"
masterPort="389"
# Отключаем ssl tls-шифрование
ldapTLS="0"
verify="require"
cafile="/etc/opt/IDEALX/smbldap-tools/ca.pem"
clientcert="/etc/opt/IDEALX/smbldap-tools/smbldap-tools.pem"
clientkey="/etc/opt/IDEALX/smbldap-tools/smbldap-tools.key"
# Описываем, как хранятся записи в дереве LDAP
suffix="dc=example,dc=com"
usersdn="ou=Users,${suffix}"
computersdn="ou=Computers,${suffix}"
groupsdn="ou=Groups,${suffix}"
idmapdn="ou=Idmap,${suffix}"
sambaUnixIdPooldn="sambaDomainName=EXAMPLE,${suffix}"
scope="sub"
hash_encrypt="SSHA"
crypt_salt_format="%s"
# Описываем параметры по умолчанию
userLoginShell="/usr/sbin/nologin"
userHome="/home/samba/%U"
userHomeDirectoryMode="700"
userGecos="System User"
defaultUserGid="513"
defaultComputerGid="515"
skeletonDir="/etc/skel"
defaultMaxPasswordAge="999"
userSmbHome="\\SRV\%U"
userProfile="\\SRV\%U\profile"
userHomeDrive="Z:"
userScript="logon.cmd"
mailDomain="example.ru"
with_smbpasswd="0"
smbpasswd="/usr/bin/smbpasswd"
with_slappasswd="0"
slappasswd="/usr/sbin/slappasswd"
Приводим smbldap_bind.conf к следующему виду:
slaveDN="cn=root,dc=example,dc=ru"
slavePw="password"
masterDN="cn=root,dc=example,dc=ru"
masterPw="password"
Устанавливаем пакет nss_ldap
# cd /usr/ports/net/nss_ldap
# make all install clean
Конфигурируем nss_ldap:
# cd /usr/local/etc
# touch nss_ldap.conf
Вписываем в созданный файл следующее:
base dc=example,dc=com
bind_policy soft
bind_timelimit 10
host 127.0.0.1
idle_timelimit 3600
ldap_version 3
nss_base_group ou=Groups,dc=example,dc=com?one
nss_base_passwd ou=Users,dc=example,dc=com?one
nss_base_passwd ou=Computers,dc=example,dc=com?one
nss_base_shadow ou=Users,dc=example,dc=com?one
nss_connect_policy persist
nss_paged_results yes
pagesize 1000
port 389
scope one
timelimit 30
pam_password md5
ssl no
Правим файл /etc/nsswitch.conf и приводим к следующему виду:
group: files ldap
group_compat: nis
hosts: files dns
networks: files
passwd: files ldap
passwd_compat: nis
shells: files
Создаем файл для доступа остальных сервисов к OpenLDAP:
# echo “password” > /etc/ldap.secret
# chmod 0600 /etc/ldap.secret
Удаляем старую базу Samba во избежание дальнейших проблем:
# rm -rf /usr/local/etc/samba/*
Создаем запись в secret.tdb для подключения Samba к OpenLDAP:
# /usr/local/bin/smbpasswd -w password
Setting stored password for "cn=root,dc=example,dc=com"
in secrets.tdb
|
Инициализируем директории OpenLDAP:
# /usr/local/sbin/smbldap-populate -a smbroot -b guest
adding new entry "dc=example,dc=com"
..........
..........
|
После того как скрипт отработает, будет выведено приглашение ввести пароль для пользователя smbroot. Вводим наш пароль «password».
Проверяем существование записей в OpenLDAP:
# slapcat | grep dn
..........................
..........................
|
После ввода данной команды будет выведен довольно длинный список добавленных записей. Если этого не произошло, проверьте конфигурацию сервисов, проверьте, запущен ли сервис slapd, загляните в файл /var/log/messages, чтобы определить причину.
На данном этапе оставляем конфигурацию Samba, вернемся к ней чуть-чуть позже, а пока сконфигурируем PowerDNS.
Создаем файл zone.ldiff для добавления записей о DNS-зонах в OpenLDAP. Предлагаю для этих целей выделить служебную директорию, дабы в последующем не набирать эти файлы снова.
# cd /usr/local/etc && mkdir ldapfiles && cd ldapfiles
# touch zone.ldiff
# Создаем ветку для харнения записей DNS
dn: ou=dns,dc=example,dc=com
objectClass: top
objectClass: organizationalUnit
ou: dns
description: domain zones
# Создаем ветку для хранения корневой зоны.
# Так как корневой зоной для нас является «com», то
dn: dc=com,ou=dns,dc=example,dc=com
objectClass: dNSDomain2
objectClass: domainRelatedObject
dc: com
associateddomain: com
# Создаем SOA-запись для хранения зоны.
# Так как FQDN имя нашего домена «example.com», то
dn: dc=example,dc=com,ou=dns,dc=example,dc=com
objectClass: dNSDomain2
objectClass: domainRelatedObject
dc: example
SOARecord: ns.example.com root@example.com 1 1800 3600 86400 7200
NSRecord: ns.example.com
MXRecord: 10 mail.example.com
ARecord: 172.16.0.1
associatedDomain: example.com
# Создаем запись вида ns IN A 172.16.0.1
dn: dc=ns,dc=example,dc=com,ou=dns,dc=example,dc=com
objectClass: dNSDomain2
objectClass: domainRelatedObject
dc: ns
ARecord: 172.16.0.1
associatedDomain: ns.example.com
# Создаем запись вида mail IN CNAME ns для Mail-сервера
dn: dc=mail,dc=example,dc=com,ou=dns,dc=example,dc=com
objectClass: dNSDomain2
objectClass: domainRelatedObject
dc: mail
CNAMERecord: ns.example.com
associatedDomain: mail.example.com
# Создаем запись вида ldap IN CNAME ns
# для OpenDLDAP-сервера
dn: dc=ldap,dc=example,dc=com,ou=dns,dc=example,dc=com
objectClass: dNSDomain2
objectClass: domainRelatedObject
dc: ldap
CNAMERecord: ns.example.com
associatedDomain: ldap.example.com
# Создаем запись вида srv IN CNAME ns для нашего сервера
dn: dc=srv,dc=example,dc=com,ou=dns,dc=example,dc=com
objectClass: dNSDomain2
objectClass: domainRelatedObject
dc: srv
CNAMERecord: ns.example.com
associatedDomain: srv.example.com
За более подробной информацией о записях LDAP обратитесь к официальной документации.
Добавляем записи DNS в OpenLDAP:
# /usr/local/bin/ldapadd -x -D "cn=root,dc=example, dc=com" -w password -f zone.ldiff
Конфигурируем PowerDNS
# cd /usr/local/etc/pdns/
Приводим файл pdns.conf к следующему виду:
ldap-host=127.0.0.1
ldap-basedn=ou=dns,dc=example,dc=com
ldap-method=strict
allow-recursion=127.0.0.1,172.16.0.0/24
launch=ldap
local-address=172.16.0.1
recursor=127.0.0.1
config-dir=/usr/local/etc/pdns
daemon=yes
guardian=yes
disable-tcp=no
disable-axfr=no
module-dir=/usr/local/lib/
socket-dir=/var/run
version-string=powerdns
Приводим файл recursor.conf к следующему виду:
daemon=yes
local-address=127.0.0.1
local-port=53
quiet=yes
Добавляем записи в rc.conf для запуска PowerDNS:
pdns_enable="YES"
pdns_recursor_enable="YES"
Запускаем PowerDNS:
# /usr/local/etc/rc.d/015.pdnsr.sh start
# /usr/local/etc/rc.d/020.pdns.sh start
Проверяем работу PowerDNS:
# nslookup 172.16.0.1
Server: 172.16.0.1
Address: 172.16.0.1#53
1.0.16.172.in-addr.arpa name = ns.example.com.
1.0.16.172.in-addr.arpa name = example.com.
# nslookup example.com
Server: 172.16.0.1
Address: 172.16.0.1#53
Name: example.com
Address: 172.16.0.1
|
Возвращаемся к конфигурации и проверке работы Samba. Запускаем Samba:
# /usr/local/etc/rc.d/030.samba.sh start
Подключаем нашу машину к своему же домену. Данная операция требуется для корректной работы сервера:
# net rpc join -U smbroot%password
Joined domain EXAMPLE
|
Проверяем, все ли правильно мы сделали:
# net prc testjoin -U smbroot%password
Join to 'EXAMPLE' is OK
# net prc info -U smbroot%password
Domain Name: EXAMPLE
Domain SID: S-1-5-21-4089634979-3265135400-2542302168
Sequence Number: 1185975879
Num users: 2
Num domain groups: 4
Num local groups: 0
# smbclient -L SRV -U smbroot%password
Domain=[EXAMPLE] OS=[Unix] Server=[Samba 3.0.25a]
Sharename Type Comment
--------- ------ -------
IPC$ IPC IPC Service (Samba PDC 3.0.25a (Example.com))
smbroot Disk Homefolder
Domain=[EXAMPLE] OS=[Unix] Server=[Samba 3.0.25a]
Server Comment
-------- -------------
SRV Samba PDC 3.0.25a (Example.сom)
Workgroups Master
---------------- ---------
EXAMPLE SRV
|
На этом этапе конфигурация Samba как основного PDC закончена. Теперь можно идти и подключать клиентские компьютеры к новому PDC.
Заключение
Итак, давайте подведем итог, что мы получили в результате наших действий.
- Мы получили Primary Domain Controller, по функциональным возможностям не уступающий Windows NT 4.0 Server.
- Мощный и быстрый сервер DNS.
- Операционную систему, устойчивую к всевозможным сбоям, которым подвержены операционные системы семейства Windows.
В следующей статье мы поговорим с вами про настройку почтового сервера и всего, что с ним связано.
Facebook
Мой мир
Вконтакте
Одноклассники
Google+
|