Pull to refresh

Принт-сервер на linux с интеграцией в AD

Reading time 12 min
Views 46K
В данной статье я хотел поселиться опытом по созданию принт-сервера на базе 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 не буду заострять много внимания, тем более, что статей на эту тему предостаточно. Приведу ссылку на довольно неплохую статью — https://habrahabr.ru/post/143190/
Остановлюсь лишь на важных моментах. Так же, ниже выложу все свои рабочие конфиги вышеуказанных сервисов. Настраивал по разным статьям и мануалам.

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


Время на 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 [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), т.е. в веб браузере открываем

https://10.10.15.11:631/ 

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



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

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

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



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

Например http://10.10.15.11:631/printers/Kyocera_6525_PTO 
Или 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

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 = /aquota.user/groups/shares/
#	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


Спасибо за внимание!
Tags:
Hubs:
+26
Comments 29
Comments Comments 29

Articles