...

среда, 26 октября 2016 г.

[Из песочницы] Принт-сервер на linux с интеграцией в AD

В данной статье я хотел поселиться опытом по созданию принт-сервера на базе linux с интеграцией в AD. Под интеграцией понимается ввод linux сервера в домен Windows и расшаривание Cups принтеров через Samba, включая драйвера принтеров. Возможно коряво выразился, но если проще, то это выглядит так — для того, чтобы установить принтер пользователю Windows, достаточно нажать«установить новый принтер», вывести список принтеров в AD и клацнуть на нужный принтер — принтер установится автоматически с установкой всех необходимых драйверов. При этом, все права на управление, доступ, печать подтянутся из AD.

Часть 1. Тонкости настроек


Исходные данные


  • Домен контроллер — Windows Server 2008 R2 (AD, DNS, DHCP) IP — 10.10.15.31
  • Имя домена — INITIAL
  • Принт сервер — ОС linux (я использую OpenSUSE 13.2 x64, kernel 3.16.7-42-default) IP — 10.10.15.11
  • kerberos 1.12.2-24.1
  • winbind 4.2.4-40.1
  • LDAP 2.4.39-8.9.1
  • Samba 4.2.4-40.1
  • CUPS 1.5.4-21.9.1

Предположим, что ОС linux уже установлена и установлены все необходимые пакеты.
На вводе linux в домен Winodws не буду заострять много внимания, тем более, что статей на эту тему предостаточно. Приведу ссылку на довольно неплохую статью — http://ift.tt/2eKM2Q5
Остановлюсь лишь на важных моментах. Так же, ниже выложу все свои рабочие конфиги вышеуказанных сервисов. Настраивал по разным статьям и мануалам.

Синхронизация времени


Время на linux сервере должно быть идентичным с домен контроллером, иначе в домен не вогнать.
Для этого есть несколько вариантов: на домен контроллере и нашем принт сервере указать одни и те же ntp сервера синхронизации времени или на принт сервере указать IP домен контроллера в качестве ntp сервера. Я настроил по второму варианту.
/etc/ntp.conf
server 10.10.15.31 iburst


Проверить синхронизацию можно так:
print-01:~ # ntpq -p
     remote           refid      st t when poll reach   delay   offset  jitter
==============================================================================
*10.10.15.31     85.236.191.80    3 u  888 1024  377    0.698    6.690   7.232


Winbind


/etc/nsswitch.conf
passwd: files winbind
group: files winbind
shadow: files winbind
hosts:  files mdns4_minimal [NOTFOUND=return] dns wins


Многие утверждают, что данные настройки вообще не нужны для samba, как и kerberos и LDAP, но я люблю все по феншую ))). Ранее я настраивал samba в качестве PDC (Primary Domain Controller) без kerberos и LDAP и все это работало с WinXP клиентами, подтверждаю.
/etc/samba/smb.conf
winbind separator = /
winbind enum users = Yes
winbind enum groups = Yes
winbind use default domain = Yes
winbind nss info = rfc2307
winbind refresh tickets = Yes


Samba


/etc/samba/smb.conf
idmap uid = 500-10000000
idmap gid = 500-10000000
idmap backend = ldap:ldap://10.10.15.31


Данные настройки не рекомендуются самой samba, начиная с каких то версий 3.Х, но во многих статьях они указываются. Если указать данные параметры в новых версиях самбы, то testparm выдаст:
print-01:/etc/samba # testparm -v
Load smb config files from /etc/samba/smb.conf
WARNING: The "idmap backend" option is deprecated
WARNING: The "idmap gid" option is deprecated
WARNING: The "idmap uid" option is deprecated


параметр realm — имя домена должно быть указано заглавными буквами!
realm = DOMAIN.COM


Kerberos


Секция realms — имя домена должно быть указано заглавными буквами!
/etc/krb5.conf
[realms]
DOMAIN.COM = {...


Иначе, можно получить такую ошибку при проверке kerberos
kinit username@DOMAIN.COM
kinit(v5): KDC reply did not match expectations while getting initial credentials


Предположим, что вы настроили необходимые сервисы и успешно ввели linux машину в домен Windows. Перейдем к настройкам CUPS.

CUPS


/etc/cups/cupsd.conf
# Изменим уровень логирования на период отладки
LogLevel debug 

# Системная группа (добавлять, удалять принтеры, менять их конфигурацию может только root)
SystemGroup root

# Слушаем соединения на порту 631 / Listen for connections on Port 631.
Port 631
Listen /run/cups/cups.sock
BrowseLocalProtocols CUPS
BrowseRemoteProtocols CUPS

# Расшариваем принтеры в локальной сети / Show shared printers on the local network.
Browsing On
BrowseOrder allow,deny
BrowseAllow all
BrowseAddress 10.10.15.0/24
BrowseAddress 172.19.2.0/24
BrowseAddress 172.19.3.0/24
BrowseAddress 172.19.4.0/24
# Default authentication type, when authentication is required...
DefaultAuthType Basic
WebInterface Yes


Здесь поясню.
BrowseOrder allow,deny — порядок рассмотрения системой разрешающих и запрещающих директив: все что не разрешено — запрещено.
BrowseAllow all — отображения всех доступных принтеров локальной сети
BrowseAddress — указываем все подсети, из которых нужен доступ к принтерам
DefaultAuthType — тип аутентификации. По умолчанию — Basic.

На счет последнего. Заметил в логох следующее:
/var/log/cups/error_log
cupsdAuthorize: No authentication data provided.


Рекомендации на эту тему нашел две:

— отключить шаринг принтеров в самбе полностью (очень полезно, особенно для сервера печати)
— заменить Basic на None везде, где есть данная опция в cupsd.conf (не почувствовал разницы)

На cups.org вычитал, что значений данной опции может быть 2 — Basic и Negotiate, последняя для аутентификации с использованием kerberos.

В любом случае, данная ошибка никак не влияет на работу cups'a.

# Разрешаем доступ к серверу печати со всех машин локальной сети.
<Location />
  # Allow remote access...
  Order allow,deny
  Allow all
</Location>


Я указал доступ для всех локальных подсетей. В принципе в директиве Allow можно указать разные подсети, так же, как я делал это в BrowseAddress.

Далее настраиваем доступ к административной панели и конфигурационным файлам. Здесь можно так же прописать директиву Allow (в каждую секцию) с указанием подсетей или отдельного IP адреса, с которого/которых можно будет администрировать принтеры. Если не добавлять эту директиву — админить можно будет с любой подсети локалки — равнозначно Allow all.

<Location /admin>
 Order allow,deny
</Location>
<Location /admin/conf>
  AuthType Default
  Require user @SYSTEM
</Location>


На этом настройка cups закончена. Рестартим его. В OpenSUSE это делается через systemctl
systemctl restart cups.service


Теперь можно приступить к настройке принтеров через web интерфейс cups'a. Есть небольшая тонкость — для изменения, добавления, удаления принтеров необходимо заходить в web интерфейс cups по ssl (https), т.е. в веб браузере открываем
http://ift.tt/2euhdR3 


Иначе получим такую ошибку:

Добавлять принтеры в cups через web интерфейс задача — довольно тривиальная, поэтому описывать не буду. Единственное, рекомендую на вкладе «Администрирование» проверить включены ли опции:

— Разрешить совместный доступ к принтерам, подключенным к этой системе
— Разрешить печать из Интернета

И при установке принтера, не забывать включать опцию «Разрешить совместный доступ к этому принтеру».

Кто не хочет заморачиваться с samba, в cups есть возможность печати посредством протокола ipp (Internet Printing Protocol). В Windows принтер устанавливается так: панель управления → принтеры → установка принтера → сетевой принтер → подключиться к принтеру в интернете («выбрать общий принтер по имени» для Win7/8/10) в качестве url указываем полный путь:

Например http://ift.tt/2eKKOEp 
Или http://Print-01:631/printers/Kyocera_6525_PTO


Полный путь до принтера можно скопировать из адресной строки браузера в web интерфейсе cups.

Единственное, при данном способе система запросит драйвер принтера. Его нужно будет предварительно скачать и скормить ей при установке.

ГРАБЛЯ_№1: в WinXP протокол ipp включен по дефолту в сервис пак начиная с SP2, в Windows7/8/10 компонент «Интернет печать» может быть не включен.

Устанавливается через панель управления → программы и компоненты — включение и отключение компонентов Windows. В серверных Windows, данный протокол точно отключен по дефолту. Включаем через диспетчер сервера → компоненты → добавить компоненты → клиент печати через Интернет.

Я промучался с этой проблемой 2 дня. При попытке установки принтера данным способом вылезала ошибка — «Windows не удается подключиться к принтеру». При этом в логах cups и samba — ничего криминального нет. Это был мегатреш. Я дошел до разбора всего потока сетевого интерфейса с помощью tcpdump и wireshark, но ларчик то просто открывался. Проблема была на стороне винды.


Часть 2. Установка драйверов


Предположим, что принтеры в cups установлены, теперь приступим к копированию и регистрированию драйверов принтеров для Windows.

Можно вручную скопировать установленные драйверы в Windows — %WINDIR%\system32\spool\drivers\W32X86 и \x64 в папку с шарой для драйверов samba — /var/lib/samba/drivers/W32X86 и ./x64 и потом регистрировать их с помощью консольной утилиты rpcclient, но это нереальный квест и занятие не для слабонервных.

Мы пойдем более простым путем. Логинимся на виндовой машине с учеткой Domain Admin в наш домен. Буду показывать на примере WinXP (далее расскажу как действовать с Win7). Открываем проводник, в адресной строке вбиваем адрес принт сервера по IP или имени: \\Print-01\ или \\10.10.15.11\, переходим в папку Принтеры и факсы.

Клацаем правой кнопкой мыши на принтере → свойства.

На предложение установить драйвер, говорим Нет.

Идем во вкладку «дополнительно» → сменить.


Установить с диска и указываем папку с драйвером. Выбираем принтер в списке и нажимаем ОК.

ВАЖНО — в начале необходимо указать папу с 32-битными драйверами, даже, если система у вас 64-битная! 64-битные дрова установить можно будет после.


Идет копирование драйверов в расшаренную папку samba.


Переходим во вкладку «доступ» → отмечаем галочку «Внести в Active Diectory» → применить. Если нужны 64-битные драйвера, нажимаем Дополнительные драйвера"


И отмечаем галочку х64 → ОК. Система запросит папку с драйверами — аналогично скармливаем ей ее.


При желании, на вкладке «Общие», можно переименовать сетевой принтер. Эти названия будут отображаться при переходе в проводнике на принтсервер \\Print-01\ или \\10.10.15.11\.


В AD имена принтеров будут теми же, как вы называли их в cups.


Удаление принтеров из AD.


Диспетчер сервера → Доменные службы Active Directory → Active Directory пользователи и компьютеры → выбираем домен правой кнопкой мыши → найти → выбираем группу из ниспадающего списка «принтеры» → найти.

Находим в списке принтер, который хотим удалить → правой кнопкой мыши «удалить»

Установка драйверов в Windows 7/8/10.


В Windows 7/8/10 установить драйвера на принт-сервер можно из оснастки printmanagement.msc. Пуск → выполнить → printmanagement.msc

ПРИМЕЧАНИЕ В Home и Home Premium этой тулзы нет. Запускать эту оснастку нужно из под учетки Domain Admin. Сначала нужно добавить наш сервер печати по IP или имени.

Далее, здесь можно управлять принтерами сервера печати по аналогии c вышеуказанной инструкцией.

Так же здесь удобно управлять драйверами сервера печати — удалять/добавлять.

Что не удалось пока решить


В Windows Server 2012 R2 ну никак не хотят устанавливаться расшаренные принтеры. Ошибок в логах cups и samba нет. Принер начинает устанавливаться, драйвера копируются, но на этапе «завершение установки» выскакивает вышеуказанная ошибка «Windows не удается подключиться к принтеру». Думаю это какой-то косяк винды и скорее всего протокола ipp, хотя компонент «Клиент интернет печати» установлен.

В заключении, поделюсь секретом установки принтера Panasonic KX-FLB883RU в CUPS. Для данного принтера нет драйверов для linux, но чудесным образом подошел ljet2p.ppd (Panasonic KX-P4410 Foomatic/ljet2p), входящий в стандартный пакет OpenPrintingPPDs. Настройка принтера в CUPS через socket://IP_address/. Все работает без глюков. Надеюсь, кому-то пригодится.

Следующая моя статья будет посвящена удаленной автоматизированной системе установки принтеров пользователям домена. Или как то так)

Мои рабочие конфиги см. ниже.

/etc/krb5.conf
[libdefaults]
        ticket_lifetime = 24000
        default_realm = INITIAL.LOCAL
        dns_lookup_realm = false
        dns_lookup_kds = false
        clockskew = 300
# -------------------------------------
        kdc_timesync = 1
        ccache_type = 4
        forwardable = true
        proxiable = true

[realms]
INITIAL.LOCAL = {
        kdc = dc-01.initial.local
        default_domain = initial.local
#       admin_server = kerberos.initial.local:749
        admin_server = dc-01.initial.local
}

# EXAMPLE.COM = {
#       kdc = kerberos.example.com
#       admin_server = kerberos.example.com
# }

[logging]
        kdc = FILE:/var/log/krb5/krb5kdc.log
        admin_server = FILE:/var/log/krb5/kadmind.log
        default = SYSLOG:NOTICE:DAEMON
[domain_realm]
        .initial.local = INITIAL.LOCAL
        .INITIAL.local = INITIAL.LOCAL
        .INITIAL = INITIAL.LOCAL
        initial.local = INITIAL.LOCAL
[appdefaults]
pam = {
        debug = false
        ticket_lifetime = 1d
        renew_lifetime = 1d
        forwardable = true
        proxiable = false
        retain_after_close = false
        minimum_uid = 1
        use_shmem = sshd
        clockskew = 300
}



/etc/nsswitch.conf
# /etc/nsswitch.conf
#
# An example Name Service Switch config file. This file should be
# sorted with the most-used services at the beginning.
#
# The entry '[NOTFOUND=return]' means that the search for an
# entry should stop if the search in the previous entry turned
# up nothing. Note that if the search failed due to some other reason
# (like no NIS server responding) then the search continues with the
# next entry.
#
# Legal entries are:
#
#       compat                  Use compatibility setup
#       nisplus                 Use NIS+ (NIS version 3)
#       nis                     Use NIS (NIS version 2), also called YP
#       dns                     Use DNS (Domain Name Service)
#       files                   Use the local files
#       [NOTFOUND=return]       Stop searching if not found so far
#
# For more information, please read the nsswitch.conf.5 manual page.
#

# passwd: files nis
# shadow: files nis
# group:  files nis

# passwd:       compat winbind
# group:        compat winbind
# shadow:       compat winbind

passwd: files winbind
group:  files winbind
shadow: files winbind

# hosts:        files mdns4_minimal [NOTFOUND=return] dns wins
# hosts:        files [dns] wins
hosts:  files mdns4_minimal [NOTFOUND=return] dns wins

networks:       files dns
services:       files
protocols:      files
rpc:    files
ethers: files
netmasks:       files
netgroup:       files nis
publickey:      files

bootparams:     files
automount:      files nis
aliases:        files



/etc/openldap/ldap.conf
#
# LDAP Defaults
#

# See ldap.conf(5) for details
# This file should be world readable but not world writable.

#BASE   dc=example,dc=com
#URI    ldap://ldap.example.com ldap://ldap-master.example.com:666

#SIZELIMIT      12
#TIMELIMIT      15
#DEREF          never
URI     ldap://10.10.15.31
BASE    DC=initial,DC=local



/etc/samba/smb.conf
# smb.conf is the main Samba configuration file. You find a full commented
# version at /usr/share/doc/packages/samba/examples/smb.conf.SUSE if the
# samba-doc package is installed.
[global]
        workgroup = INITIAL
#       passdb backend = smbpasswd
        printing = cups
        printcap name = cups
        printcap cache time = 750
        cups options = raw
        map to guest = Bad User
        logon path = \\%L\profiles\.msprofile
        logon home = \\%L\%U\.9xprofile
        logon drive = P:
        usershare allow guests = Yes
        add machine script = /usr/sbin/useradd  -c Machine -d /var/lib/nobody -s /bin/false %m$
        domain logons = No
        domain master = No
        security = ADS
        encrypt passwords = yes
#       idmap backend = ldap:ldap://10.10.15.31
        ldap admin dn = admin@initial.local
        ldap group suffix = ou=Groups
        ldap idmap suffix = ou=Idmap
        ldap machine suffix = ou=Computers
        ldap passwd sync = Yes
        ldap suffix = DC=initial,DC=local
        ldap user suffix = ou=Users
        ldap ssl = Off
        ldapsam:trusted = yes
        ldapsam:editposix = yes
#       idmap gid = 500-10000000
#       idmap uid = 500-10000000
        netbios name = print-01
        name resolve order = lmhost wins host bcast
        wins server = 10.10.15.31
        wins support = No
        usershare max shares = 100
        kerberos method = system keytab
## --------------------------------------
        winbind separator = /
        winbind enum users = yes
        winbind enum groups = yes
        winbind nested groups = yes
        winbind use default domain = yes
        winbind nss info = rfc2307
        winbind uid = 10000-20000
        winbind gid = 10000-20000
        realm = INITIAL.LOCAL
        template homedir = /home/%D/%U
        winbind refresh tickets = yes
        template shell = /bin/bash

# [homes]
#       comment = Home Directories
#       valid users = %S, %D%w%S
#       browseable = No
#       read only = No
#       inherit acls = Yes

# [profiles]
#       comment = Network Profiles Service
#       path = %H
#       read only = No
#       store dos attributes = Yes
#       create mask = 0600
#       directory mask = 0700

# [users]
#       comment = All users
#       path = /home
#       read only = No
#       inherit acls = Yes
#       veto files = /http://ift.tt/1eN8RJ6
#       guest ok = No

# [groups]
#       comment = All groups
#       path = /home/groups
#       read only = No
#       inherit acls = Yes

[printers]
        comment = All Printers
        path = /var/spool/samba
        printable = Yes
        create mask = 0664
        browseable = Yes
        read only = No
        guest ok = Yes

[print$]
        comment = Printer Drivers
        path = /var/lib/samba/drivers
        write list = @ntadmin root
        force group = ntadmin
        create mask = 0664
        directory mask = 0700
        read only = No
        guest ok = Yes
        writable = yes
#       inherit permissions = yes
# --------------------------------
        use client driver = yes

# [netlogon]



/etc/cups/cupsd.conf
LogLevel debug
SystemGroup root
# Allow remote access
Port 631
Listen /run/cups/cups.sock
Browsing On
BrowseLocalProtocols CUPS
BrowseRemoteProtocols CUPS
BrowseOrder allow,deny
BrowseAllow all
BrowseAddress 10.10.15.0/24
BrowseAddress 172.19.2.0/24
BrowseAddress 172.19.3.0/24
BrowseAddress 172.19.4.0/24
DefaultAuthType Basic
WebInterface Yes
<Location />
  # Allow remote access...
  Order allow,deny
  Allow all
</Location>
<Location /admin>
  Order deny,allow
</Location>
<Location /admin/conf>
  AuthType Default
  Require user @SYSTEM
</Location>
<Policy default>
  JobPrivateAccess default
  JobPrivateValues default
  SubscriptionPrivateAccess default
  SubscriptionPrivateValues default
  <Limit Create-Job Print-Job Print-URI Validate-Job>
    Order deny,allow
  </Limit>
  <Limit Send-Document Send-URI Hold-Job Release-Job Restart-Job Purge-Jobs Set-Job-Attributes Create-Job-Subscription Renew-Subscription Cancel-Subscription Get-Notifications Reprocess-Job Cancel-Current-Job Suspend-Current-Job Resume-Job Cancel-My-Jobs Close-Job CUPS-Move-Job CUPS-Get-Document>
    Require user @OWNER @SYSTEM
    Order deny,allow
  </Limit>
  <Limit CUPS-Add-Modify-Printer CUPS-Delete-Printer CUPS-Add-Modify-Class CUPS-Delete-Class CUPS-Set-Default CUPS-Get-Devices>
    AuthType Default
    Require user @SYSTEM
    Order deny,allow
  </Limit>
  <Limit Pause-Printer Resume-Printer Enable-Printer Disable-Printer Pause-Printer-After-Current-Job Hold-New-Jobs Release-Held-New-Jobs Deactivate-Printer Activate-Printer Restart-Printer Shutdown-Printer Startup-Printer Promote-Job Schedule-Job-After Cancel-Jobs CUPS-Accept-Jobs CUPS-Reject-Jobs>
    AuthType Default
    Require user @SYSTEM
    Order deny,allow
  </Limit>
  <Limit Cancel-Job CUPS-Authenticate-Job>
    Require user @OWNER @SYSTEM
    Order deny,allow
  </Limit>
  <Limit All>
    Order deny,allow
  </Limit>
</Policy>
<Policy authenticated>
  JobPrivateAccess default
  JobPrivateValues default
  SubscriptionPrivateAccess default
  SubscriptionPrivateValues default
  <Limit Create-Job Print-Job Print-URI Validate-Job>
    AuthType Default
    Order deny,allow
  </Limit>
  <Limit Send-Document Send-URI Hold-Job Release-Job Restart-Job Purge-Jobs Set-Job-Attributes Create-Job-Subscription Renew-Subscription Cancel-Subscription Get-Notifications Reprocess-Job Cancel-Current-Job Suspend-Current-Job Resume-Job Cancel-My-Jobs Close-Job CUPS-Move-Job CUPS-Get-Document>
    AuthType Default
    Require user @OWNER @SYSTEM
    Order deny,allow
  </Limit>
  <Limit CUPS-Add-Modify-Printer CUPS-Delete-Printer CUPS-Add-Modify-Class CUPS-Delete-Class CUPS-Set-Default>
    AuthType Default
    Require user @SYSTEM
    Order deny,allow
  </Limit>
  <Limit Pause-Printer Resume-Printer Enable-Printer Disable-Printer Pause-Printer-After-Current-Job Hold-New-Jobs Release-Held-New-Jobs Deactivate-Printer Activate-Printer Restart-Printer Shutdown-Printer Startup-Printer Promote-Job Schedule-Job-After Cancel-Jobs CUPS-Accept-Jobs CUPS-Reject-Jobs>
    AuthType Default
    Require user @SYSTEM
    Order deny,allow
  </Limit>
  <Limit Cancel-Job CUPS-Authenticate-Job>
    AuthType Default
    Require user @OWNER @SYSTEM
    Order deny,allow
  </Limit>
  <Limit All>
    Order deny,allow
  </Limit>
</Policy>
<Policy allowallforanybody>
  JobPrivateAccess all
  JobPrivateValues none
  SubscriptionPrivateAccess all
  SubscriptionPrivateValues none
  <Limit All Validate-Job Cancel-Jobs Cancel-My-Jobs Close-Job CUPS-Get-Document>
    Order deny,allow
    Allow from all
  </Limit>
</Policy>
DefaultPolicy default



Спасибо за внимание!

Комментарии (0)

    Let's block ads! (Why?)

    Комментариев нет:

    Отправить комментарий