В данной статье я хотел поселиться опытом по созданию принт-сервера на базе linux с интеграцией в AD. Под интеграцией понимается ввод linux сервера в домен Windows и расшаривание Cups принтеров через Samba, включая драйвера принтеров. Возможно коряво выразился, но если проще, то это выглядит так — для того, чтобы установить принтер пользователю Windows, достаточно нажать«установить новый принтер», вывести список принтеров в AD и клацнуть на нужный принтер — принтер установится автоматически с установкой всех необходимых драйверов. При этом, все права на управление, доступ, печать подтянутся из AD.
Содержание
▍ Теперь бегло рассмотрим теорию, как это работает
CUPS на стороне клиента приступает к работе. Условно будем считать, что работаем с файлом, ну хорошо, не условно, в юниксах всё файл 🙂
- Файл принимается.
- Разглядываем его исходный формат, либо нам его сообщили, либо определили сами (man mime.types).
- Прикидываем в каком формате его надо отдать (в файле описания ppd, потом придётся рассказать).
- Преобразовываем различными фильтрами (filters).
- Решаем, куда его надо отдать (backend).
- Передаём.
- Дожидаемся результата печати и сообщаем его в место получения файла, а если что-то пошло не по плану, также доводим до сведения отправителя файла.
На сервере печати CUPS вытворяет то же самое.
Вся эта теория имеется в документации CUPS, но несколько бестолково изложено, либо я не был готов сразу вчитать и систематизировать такое количество информации. Совсем немного содержится в статье википедии на русском языке. А теперь сравните её с английской страничкой. Вся информация внятно изложена на 3-х экранах и двух схемах (схема фильтрации — шикарна).
▍ С общей теорией покончено, пора приступать к практике
Как развернуть CUPS на рабочей станции/сервере и добавить принтеры я писать не буду, т.к. это реально просто, и в сети информации достаточно. Отмечу только, что url вида ipp://printer/ipp
внутри купса будут развёрнуты в http://printer:631/ipp
(а также ipps->https) и могут всюду использоваться равноценно (пруф Chapter 1: Overview of IPP). Используйте как удобнее или больше нравится.
Сначала будем подключать бодрого старичка HP m3027MFP, предположительно родившегося в 2010 году (на картинке из интернета он белый, но все сохранившиеся экземпляры уже жёлтого цвета). К слову, драйверов в системе (файлы .PPD) аж целых 5 штук.
На клиента водружаем драйвер “HP LaserJet M3027 MFP pcl3, hpcups 3.15.9“, по идее ведь неважно, что серверу печати скармливаем? Пусть разбирается. И тут первый облом, трофея мы не дождались. На сервере начинаем разглядывать логи (уровень детализации задаётся в файле /etc/cupsd.conf
опция LogLevel
). Для этого в админке купса на страничке принтера узнаём номер задания, далее с этим номерком обращаемся к journalctl:
$ journalctl -u cups JID=43
или если у нас журнал ведётся в файлах:
# grep Job\ 43 /var/log/cups/error_log
Смотрим и ничего криминального не замечаем. Видим, что на вход пришло application/vnd.cups-raster
, навешано 5 фильтров, один из которых бэкэнд, все отрапортовали “exited with no errors.” В конце издевательская надпись “Job completed“.
авг 30 14:04:03 cupsd[6597]: [Job 43] Applying default options...
авг 30 14:04:03 cupsd[6597]: [Job 43] Adding start banner page "none".
авг 30 14:04:03 cupsd[6597]: [Job 43] Queued on "HP3027" by "alef13".
авг 30 14:04:03 cupsd[6597]: [Job 43] File of type application/postscript queued by "alef13".
авг 30 14:04:03 cupsd[6597]: [Job 43] Adding end banner page "none".
авг 30 14:04:03 cupsd[6597]: cupsdCheckJobs: Job 43 - dest="HP3027", printer=(nil), state=3, cancel_time=0, hold_until=1660043943, kill_time=0, pending_cost=0, pending_timeout=0
авг 30 14:04:03 cupsd[6597]: [Job 43] time-at-processing=1660043043
авг 30 14:04:03 cupsd[6597]: [Job 43] 4 filters for job:
авг 30 14:04:03 cupsd[6597]: [Job 43] gstopdf (application/postscript to application/pdf, cost 0)
авг 30 14:04:03 cupsd[6597]: [Job 43] pdftopdf (application/pdf to application/vnd.cups-pdf, cost 66)
авг 30 14:04:03 cupsd[6597]: [Job 43] gstoraster (application/vnd.cups-pdf to application/vnd.cups-raster, cost 99)
авг 30 14:04:03 cupsd[6597]: [Job 43] hpcups (application/vnd.cups-raster to printer/320-HP3027, cost 0)
авг 30 14:04:03 cupsd[6597]: [Job 43] job-sheets=none,none
авг 30 14:04:03 cupsd[6597]: [Job 43] argv[0]="HP3027"
авг 30 14:04:03 cupsd[6597]: [Job 43] argv[1]="43"
авг 30 14:04:03 cupsd[6597]: [Job 43] argv[2]="alef13"
авг 30 14:04:03 cupsd[6597]: [Job 43] argv[3]="Test Page"
авг 30 14:04:03 cupsd[6597]: [Job 43] argv[4]="1"
авг 30 14:04:03 cupsd[6597]: [Job 43] argv[5]="job-uuid=urn:uuid:ad538100-5dab-34bb-7a54-be4bcf445b96 job-originating-host-name=192.168.1.13 date-time-at-creation= date-time-at-processing= time-at-creation=1660043043 time-at-processing=1660043043"
...
авг 30 14:04:03 cupsd[6597]: [Job 43] backendWaitLoop(snmp_fd=5, addr=0x562c4243edc8, side_cb=0x562c4240c2e0)
авг 30 14:04:03 cupsd[6597]: [Job 43] No pages left, outputting empty file.
авг 30 14:04:03 cupsd[6597]: [Job 43] PID 7098 (/usr/lib/cups/filter/gstopdf) exited with no errors.
авг 30 14:04:03 cupsd[6597]: [Job 43] Input is empty, outputting empty file.
авг 30 14:04:03 cupsd[6597]: [Job 43] Input is empty, outputting empty file.
авг 30 14:04:03 cupsd[6597]: [Job 43] PID 7099 (/usr/lib/cups/filter/pdftopdf) exited with no errors.
авг 30 14:04:03 cupsd[6597]: [Job 43] PID 7100 (/usr/lib/cups/filter/gstoraster) exited with no errors.
авг 30 14:04:03 cupsd[6597]: [Job 43] PID 7101 (/usr/lib/cups/filter/hpcups) exited with no errors.
авг 30 14:04:03 cupsd[6597]: [Job 43] PID 7102 (/usr/lib/cups/backend/ipp) exited with no errors.
авг 30 14:04:03 cupsd[6597]: [Job 43] time-at-completed=1660043043
авг 30 14:04:03 cupsd[6597]: [Job 43] Job completed.
Если ещё разок глянуть чуть внимательнее, то видны строчки «Input is empty, outputting empty file.». Идентифицировать, кто конкретно их вписал, нет возможности, но мы почти точно уверены, что это фильтры. И становится понятно, почему принтеру ничего не досталось. Сволочи они.
Немного поразмышляв, придумываем себе правило номер 1 — слишком много фильтров это плохо. Надо постараться сделать минимальное количество преобразований файла при печати. Т.е. на стороне клиента и на сервере желательно ставить одинаковые драйвера.
Пишут что лучшие результаты даёт драйвер hplip производства Хьюлита-Паккарда. По сути это плугин к купс, и CUPS показывает его как установленный принтер. Строчку для подключения формируем утилитой hp-makeuri, только учтите, что с сетевыми принтерами она работает через протокол JetDirect (tcp/9100). Именно недоступность данного сетевого взаимодействия на моём стенде не дало дописать сюда ещё пару страниц.
Следующий пациент — рикошечка 2352. Это такое относительно небольшое (видал и поболе), но и не маленькое (дома уже не поставить) МФУ. Соответствующих драйверов в коробку с линуксом не положили 🙁
Собственно драйвер для конкретной модели принтера понятие несколько надуманное. Сделано для облегчения жизни конечного пользователя, чтобы не вгонять его в сомнения о правильности действий при настройке оборудования.
На самом деле команд/протоколов общения с принтерами весьма ограниченное количество, и различаются железяки между собой прежде всего дизайном и некоторыми дополнительными возможностями: дуплексы, лотки, сшиватели, жесткие диски, софт, встроенные шрифты и т.д.
Также, началось активное продвижение IPP Everywere, т.е. один драйвер на всё. Не сильно погружался, но думаю, что это либо сильно упрощённая и урезанная по своим возможностям печать, либо опрос у конечного оборудования какие суперспособности оно имеет. В любом случае пока мимо — первое неудобно, второе в больших конторах пока не применимо из-за возраста железа.
А там пусто, неужели кто-то утащил наш документ? Опять читаем логи сервера и ничего подозрительного там тоже не видно, всё отработано и передано нашему аппарату. Штош, полистаем сенсорный экран на МФУ. Видим, что наши тестовые странички улетели в журнал ошибок с кодом 91 — ошибка данных. Лечить это мы не будем, т.к. официального сервиса нет и не предвидится.
Помните, у нас ведь в запасе ещё пара-тройка драйверов — пробуем сначала мягкие методы. Берём ppd файл из каталога PXL, устанавливаем, запускаем проверочную страничку и получаем желаемую распечатку. Переходим на клиента. Вспоминаем наше правило №1 и ставим драйвер «PXL», который сразу же отказался сотрудничать 🙂
На сервере печати задание вывалилось с ошибкой фильтра.
Фильтр это фактически основная фишка купса. Конечно они были и раньше, например мне давным-давно приходилось через пайпы фильтровать файлы на вход lpr, но купс спрятал все эти кишочки от пользователя и теперь видим их только мы, сисадмины. Как применять фильтры определяет файл mime.convs — читаем man, ищем в системе файлы ‘.convs’. Всё просто и понятно, вот только значение поля cost неочевидно. В интернетах пишут, что оно определяет «цену» фильтра от 0 до 100. Предположу что если найдётся цепочка фильтров преобразований с суммарной стоимостью менее чем фильтр, делающий то-же самое, но в одиночку, то купс предпочтёт прогнать данные именно через эту цепочку.
Что делать если купс в логах рисует фильтры, которые в конфигурационных файлах вы не нашли? Правильно, заглянуть в файл PPD — там тоже это встречается 🙂
Ниже привожу кусочек из файла Ricoh-Aficio_MP_2352_PXL.PPD
*cupsVersion: 1.1 *cupsManualCopies: False *cupsCommands: "" *cupsFilter: "application/vnd.cups-postscript 0 foomatic-rip" *cupsFilter: "application/vnd.cups-pdf 0 foomatic-rip" *FoomaticRIPCommandLine: "(printf '\033%%[email protected]\[email protected] JOB\[email protected] SET COPIES=&copies;\n'%G|perl -p -e "s/\x26copies\x3b/1/"); (gs -q -dBATCH -dPARANOIDSAFER -dNOPAUSE -dNOINTERPOLATE %B%A%C %D%E | perl -p -e "s/^\x1b\x25-12345X//" | perl -p -e "s/\xc1\x01\x00\xf8\x31\x44/\x44/g"); (printf '@PJL\[email protected] EOJ\n\033%%-12345X')" *End *FoomaticRIPUserEntityMaxLength: 8
авг 30 16:18:13 cupsd[6597]: [Job 66] Cannot process \"/var/spool/cups/d00066-001\": Unknown filetype.
авг 30 16:18:13 cupsd[6597]: [Job 66] Process is dying with \"Could not print file /var/spool/cups/d00066-001
авг 30 16:18:13 cupsd[6597]: [Job 66] \", exit stat 2
рекомендация
Велик соблазн отрубить на сервере все эти драйвера / фильтры и использовать raw-очереди — всё равно клиент уже подготовил данные в необходимом формате. Но в логах сервера получаем запись «Queue printer is a raw queue, which is deprecated.», которая как-бы намекает, что это быстрое решение, но не правильное. В свежую систему тащить легаси некомильфо. В списках рассылки купса этому есть пояснение.
И напоследок, ещё одна довольно полезная, на мой взгляд, опция: в файле /etc/cups/cupsd.conf
найдите JobPrivateValues и поставьте значение none. Таким образом, в интерфейсе управления cups будут отображаться нормальные значения имени пользователя и названия задания.
Часть 2. Установка драйверов
Предположим, что принтеры в cups установлены, теперь приступим к копированию и регистрированию драйверов принтеров для Windows.
Можно вручную скопировать установленные драйверы в Windows — %WINDIR%\system32\spool\drivers\W32X86 и \x64 в папку с шарой для драйверов samba — /var/lib/samba/drivers/W32X86 и ./x64 и потом регистрировать их с помощью консольной утилиты rpcclient, но это нереальный квест и занятие не для слабонервных.
На предложение установить драйвер, говорим Нет.
Установить с диска и указываем папку с драйвером. Выбираем принтер в списке и нажимаем ОК.
ВАЖНО — в начале необходимо указать папу с 32-битными драйверами, даже, если система у вас 64-битная! 64-битные дрова установить можно будет после.
Идет копирование драйверов в расшаренную папку samba.
При желании, на вкладке «Общие», можно переименовать сетевой принтер. Эти названия будут отображаться при переходе в проводнике на принтсервер \\Print-01\ или \\10.10.15.11\.
В AD имена принтеров будут теми же, как вы называли их в cups.
Удаление принтеров из AD.
Установка драйверов в Windows 7/8/10.
Далее, здесь можно управлять принтерами сервера печати по аналогии 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/. Все работает без глюков. Надеюсь, кому-то пригодится.
Следующая моя статья будет посвящена удаленной автоматизированной системе установки принтеров пользователям домена. Или как то так)
Мои рабочие конфиги см. ниже.
[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
#
# 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
#
# 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
# 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 = [email protected]
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]
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
Спасибо за внимание!
Часть 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 [email protected]
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 интерфейс задача — довольно тривиальная, поэтому описывать не буду. Единственное, рекомендую на вкладе «Администрирование» проверить включены ли опции:
— Разрешить совместный доступ к принтерам, подключенным к этой системе
— Разрешить печать из Интернета
И при установке принтера, не забывать включать опцию «Разрешить совместный доступ к этому принтеру».
Например 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 компонент «Интернет печать» может быть не включен.
Я промучался с этой проблемой 2 дня. При попытке установки принтера данным способом вылезала ошибка — «Windows не удается подключиться к принтеру». При этом в логах cups и samba — ничего криминального нет. Это был мегатреш. Я дошел до разбора всего потока сетевого интерфейса с помощью tcpdump и wireshark, но ларчик то просто открывался. Проблема была на стороне винды.
▍ Финал
Вот коротенько и всё, что я хотел написать про CUPS, а также где и как разбираться с отказами печати. И, разумеется, этими двумя случаями траблы не исчерпываются — впереди ещё много железа и софта с их уникальными глюками. Ну а если кто помнит старину ГГ, заголовок статьи — это не проклятие, а весьма душевное приветствие 🙂
Конкурс статей от RUVDS.COM. Три денежные номинации. Главный приз — 100 000 рублей.
Настройка с нуля принтсервера CUPS с доменной авторизацией и без нее в сети с разными ОС
Вступление
Итак. Предположительно, сервис печати CUPS — это мощное решение, позволяющее организовать централизованное управление принтерами в компании. Так оно и есть, но в процессе настройки потребуется провести некоторое время в поисках решения в Google множества мелких неочевидных проблем, особенно, если ваша необходимость выходит за рамки стандартных мануалов по настройке.
В статье будет описана установка принтсервера CUPS на Ubuntu Server в сети с работающим доменом Active Directory, хотя его наличие совершенно не обязательно и инструкции по настройке взаимодействию с ним можно будет смело пропустить, его настройка, а также настройка клиентских машин Linux и Windows для взаимодействия с данным принт-сервером.
В инструкции домен будет именоваться example.com, сам принтсервер — cupsserver (cupsserver.example.com) с IP адресом 10.10.100.50, а клиентские машины linux1, linux2, linux3 и т.д для клиентских машин Linux и windows1, windows2, windows3 и т.д. для клиентских машин Windows соответственно.
Настройка принтсервера
В первую очередь мы настроим принтсервер, а точнее, настроим административный доступ на него, затем настроим печать на него, а затем опишем настройку клиентских машин.
Заходим на принтсервер любым удобным способом и обновим на нем пакеты:
[email protected]:~# apt update && apt upgrade -y
Далее проверим, установлен ли CUPS на сервере:
[email protected]:~# which cupsd
Если вывод выглядит как то так:
/usr/bin/cupsd
то CUPS установлен, если вывода нет — устанавливаем CUPS:
[email protected]:~# apt install cups -y
Теперь настроим административный доступ к веб-интерфейсу CUPS. Все файлы конфигурации находятся по пути /etc/cups/. Для начала, на всякий случай сделаем резервные копии основных файлов конфигурации CUPS:
[email protected]:~# cp /etc/cups/cupsd.conf /etc/cups/cupsd.conf.original
[email protected]:~# cp /etc/cups/cups-files.conf /etc/cups/cups-files.conf.original
[email protected]:~# cp /etc/cups/cups-browsed.conf /etc/cups/cups-browsed.conf.original
[email protected]:~# cupsd -t
Если вы что-то напутали, опечатались или использовали опцию, которая уже не поддерживается CUPS’ом, то вывод команды отразит данные ошибки.
Но приступим наконец к настройке. После любых изменений файлов в папке /etc/cups/ для получения эффекта необходимо перезапускать сервис CUPS:
[email protected]:~# service cups restart
или
[email protected]:~# systemctl restart cups
или
[email protected]:~# /etc/init.d/cups restart
А если вы отредактировали файл /etc/cups/cups-browsed.conf, то за него отвечает отдельный сервис cups-browsed, который тоже нужно перезапустить:
[email protected]:~# service cups-browsed restart
или
[email protected]:~# systemctl restart cups-browsed
или
[email protected]:~# /etc/init.d/cups-browsed restart
[email protected]:~# nano /etc/cups/cupsd.conf
Первой незакомментированной опцией является
LogLevel warn
Она определяет минимальную информативность логов CUPS. Лог-файлы CUPS находятся по пути /var/log/cups/. На время установки, настройки и отладки принтсервера будет разумным перевести логгирование в debug-режим. Для этого изменим warn на debug2:
LogLevel debug2
По умолчанию CUPS слушает входящие подключения только от localhost, то бишь на loopback интерфейсе. Чтобы убедится в этом, можете выполнить команду
[email protected]:~# netstat -plutn
Одна из строк будет выглядеть приблизительно так:
tcp 0 0 127.0.0.1:631 0.0.0.0:* LISTEN 737/cupsd
Дальнейшие действия зависят от степени вашей паранойи. Вы можете добавить в блоке, который условно начинается с комментария #Only listen for connections from the local machine несколько строк с указанием IP адресов или подсетей, откуда CUPS’у будет позволено слушать подключения.
# Only listen for connections from the local machine.
Listen localhost:631
Listen /run/cups/cups.sock
#Слушать подключения с определенного IP адреса
Listen 10.10.100.67:631
#Слушать подключения с подсети бухгалтерии
Listen 172.16.0.0:631
Либо же вы можете разрешить CUPS’у слушать подключения со всех адресов
# Only listen for connections from the local machine.
Listen /run/cups/cups.sock
Port 631
Следующий момент настройки — это обнаружение сетевых и расшаренных принтеров.
# Show shared printers on the local network.
Browsing Off
BrowseLocalProtocols dnssd
На мой взгляд эта опция так и должна остаться выключенной, так как она определяет, будет ли рассылаться широковещательная информация по сети о подключенных к принтсерверу принтерах. А они ведь будут подключены к ней все. И соответственно у всех клиентских машин будут отображаться сразу все принтера. Наш принтсервер должен искать и обнаруживать все принтера в сети, но не рассылать их бездумно по всей сети.
Далее идут настройки аутентификации:
# Default authentication type, when authentication is required...
DefaultAuthType Basic
[email protected]:~# usermod -a -G lpadmin user
Вообще, группы, которым позволен административный доступ к CUPS, определяются в файле конфигурации cups-files.conf в блоке
# Administrator user group, used to match @SYSTEM in cupsd.conf policy rules...
# This cannot contain the Group value for security reasons...
SystemGroup lpadmin
Теперь перейдем к блоку <Location />:
# Restrict access to the server...
<Location />
Order allow,deny
</Location>
# Restrict access to the server...
<Location />
Order allow,deny
Allow from cupsserver # разрешение подключатся к самому себе по имени хоста
Allow from cupsserver.example.com # разрешение подключатся к самому себе по FQDN
Allow from localhost # разрешение подключатся к самому себе через loopback интерфейс
Allow from 10.10.100.* # Если хотите разрешить
Allow from linux4.example.com # доступ на печать с
Allow from 172.168.5.125 # определенных подсетей, IP или хостов
</Location>
Для полной уверености и отладки, можно оставить, пока не настроите все остальное, такую констукцию, которая позволит печать отовсюду:
# Restrict access to the server...
<Location />
Order allow,deny
Allow from all
</Location>
Приступим к настройке административного доступа к CUPS на принтсервере. Определитесь, с какого/каких IP и/или подсетей вы собираетесь подключаться к CUPS, и добавить их по аналогии с блоком <Location />:
# Restrict access to the admin pages...
<Location /admin>
Order allow,deny
Allow from localhost
Allow from 10.10.100.*
Allow from admin.example.com
</Location>
# Restrict access to configuration files...
<Location /admin/conf>
Order allow,deny
Allow from localhost
Allow from 10.10.100.*
Allow from admin.example.com
</Location>
# Restrict access to log files...
<Location /admin/log>
Order allow,deny
Allow from localhost
Allow from 10.10.100.*
Allow from admin.example.com
</Location>
Еще, по желанию, можно добавить язык интерфейса по умолчанию. Список доступных языков можно посмотреть с помощью команды:
[email protected]:~# ls /usr/share/cups/locale
Если нужная вам локализация, например ru, есть, то добавьте строчку в /etc/cups/cupsd.conf:
DefaultLanguage ru
Чтобы к вашему принтсерверу cupsserver.example.com можно было обращатся по его хосту (hostname), необходимо создать в папке /etc/cups/ файл client.conf с таким содержимым:
ServerName имя_хоста
Самым простым способом это можно сделать так:
[email protected]:/etc/cups# echo "ServerName $(cat /etc/hostname)" > /etc/cups/client.conf
Поскольку мы предполагаем, что в сети есть DNS сервер, то будет предпочтительным, чтобы можно было обращатся к принтсерверу по его доменному имени (cupsserver.example.com). Также серверу может быть присвоен CNAME псевдоним на DNS сервере, например print или cups. Чтобы принтсервер принимал подключения по таким обращениям, необходимо добавить такую строчку в файл /etc/cups/cupsd.conf:
ServerAlias cupsserver.example.com print cups
Если вы хотите, чтобы принтсервер примимал любые обращения, или не хотите заморачиваться, то можно добавить это:
ServerAlias *
Еще нужно взглянуть внутрь файла /etc/cups/cups-browsed.conf. Этот файл управляет тем, как принтсервер будет искать принтеры в сети и проводить широковещательную рассылку своих принтеров. Я предлагаю совершенно отключить опцию рассылки. Принтсервер будет искать принтера в сети, но с него принтеры на клиентские машины будут подключатся вручную. Ниже будет описано, почему. Пока же мы находим строку BrowseRemoteProtocols dnssd cups:
# Which protocols will we use to discover printers on the network?
# Can use DNSSD and/or CUPS and/or LDAP, or 'none' for neither.
BrowseRemoteProtocols dnssd cups
Благодаря этой опции принтсервер ищет расшаренные принтера в сети. Ее мы оставляем включенной, так как в наших интересах, чтобы принтсервер искал принтера в сети. Но нам совершенно не нужно, чтобы принтсервер рассылал вообще все подключенные к нему принтеры, иначе возникнет большая путаница. Для предотвращения такого сценария находим следующую опцию #BrowseLocalProtocols none и раскомментируем ее:
# Which protocols will we use to broadcast shared local printers to the network?
# Can use DNSSD and/or CUPS, or 'none' for neither.
# Only CUPS is actually supported, as DNSSD is done by CUPS itself (we ignore DNSSD in this directive).
BrowseLocalProtocols none
На этом настройку принтсервера приостанавливаем и переходим к настройке клиентких машин Windows и Linux. Требования к ним такие — позволять посылать на себя задания печати принтсерверу, и посылать задания на печать именно (и только) на принтсервер в случае необходимости печати на сетевой принтер.
Теперь выполним аналогичную операцию на клиентской машине Linux c именем хоста linux1. Вообще, данная часть будет куда объемнее, так как у клиентской машины есть свой сервис CUPS и его тоже нужно настроить во многом так же, как и принтсервер, за исключением его подчиненной роли в организации печати.
Исправление ошибки обращения к CUPS через loopback по имени хоста
Есть неприятный момент. Если вы введете linux1 в домен, настроите на нем CUPS по этим инструкциям, то можете заметить абсурдную ситуацию, когда на WEB-интерфейс linux1 можно зайти снаружи, но на самом хосте этого сделать нельзя! И графические приложения для локальной настройки принтеров, вроде приложения system-config-printer в Linux Mint, отказываются работать. При попытке подключения на свой же CUPS по по адресу http://linux1:631/
будет сообщение “Запрещено” или “Bad Request”. Это известная и толком не решенная на множестве форумов интернета проблема.
В большинстве инструкций по введению Linux в домен одним из пунктов является приведение файла /etc/hosts приблизительно к такому виду:
127.0.0.1 localhost
127.0.1.1 linux1.example.com linux1
# The following lines are desirable for IPv6 capable hosts
::1 ip6-localhost ip6-loopback
fe02::2 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
Почему то CUPS не в силах ассоциировать обращение через 127.0.1.1, то есть через Loopback интерфейс, с именем хоста.
Исправляется эта ошибка двумя способами. Если в вашей сети IP адреса статичные, то в файле /etc/hosts исправьте 127.0.1.1 на IP адрес внешнего сетевого интерфейса клиентской машины, например:
127.0.0.1 localhost
192.168.1.50 linux1.example.com linux1
Либо же, раз уж вы вводите Linux в домен, то это предполагает, что в вашей сети работает DHCP и DNS сервер Active Directory. В таком случае просто закомментируйте данную строчку:
127.0.0.1 localhost
# 127.0.1.1 linux1.example.com linux1
Разницы в работоспособности или проблем от данного действия пока обнаружено не было.
Настройка адресов прослушивания подключений к CUPS у клиентских машин Linux
Заходим на linux1 любым удобным способом. Редактируем файл /etc/cups/cupsd.conf:
[email protected]:~$ sudo nano /etc/cups/cupsd.conf
Находим, добавляем или изменяем в нем строки:
DefaultLanguage ru # Если язык присутствует в папке /usr/share/cups/locale
ServerAlias linux1.example.com linux1 [CNAME псевдоним присвоенный на DNS сервере]
или
ServerAlias * # Если неохота вникать в особенности
Listen /run/cups/cups.sock
Listen localhost:631 # Слушать localhost
Listen 10.10.100.50:631 # IP адрес нашего принтсервера.
Listen cupsserver:631 # Доменное имя принтсервера. Рекомендую чтобы его IP тоже был, на всякий случай
Listen linux1:631 #
или
Port 631 # Будет слушать подключения со всех адресов
Listen /run/cups/cups.sock
Browsing off # Выключено. Машина будет посылать информацию только принтсерверу
DefaultAuthType Basic # Без изменений. Есть вариант с авторизацией Kerberos, но там много подводных камней
Настройка адресов прослушивания подключений к CUPS
# Restrict access to the server...
<Location />
Order allow,deny # Определяет политику доступа "Что не разрешено, то запрещено"
Allow from localhost # Позволяет печатать самой linux1
Allow from linux1 # Печать на свое имя хоста. Проблемы этого действия описаны выше
Allow from cupsserver # Если CUPS нормально взаимодействует с DNS, то сработает. Увы, не всегда это так
Allow from cupsserver.example.com # FQDN принтсервера
Allow from 10.10.100.50 # Разрешение на печать с IP принтсервера **cupsserver**
</Location>
# Restrict access to the admin pages...
<Location /admin>
Order allow,deny # Аналогично предыдущему
Allow from localhost # Необходимо для возможности добавлять принтеры
Allow from linux1 # Аналогично предыдущему
Allow from 10.10.101.71 # Предположим, это IP админа
Allow from 10.20.50.* # Предположим, это подсеть вашего IT отдела
AuthType Default # То есть CUPS спросит логин и пароль. Подробнее ниже
Require user @SYSTEM # Определение группы доступа к CUPS
</Location>
# Restrict access to configuration files...
<Location /admin/conf>
#Блок идентичен предыдущему
Order allow,deny # Аналогично предыдущему
Allow from localhost # Необходимо для возможности добавлять принтеры
Allow from linux1 # Аналогично предыдущему
Allow from 10.10.101.71 # Предположим, это IP админа
Allow from 10.20.50.* # Предположим, это подсеть вашего IT отдела
AuthType Default # То есть CUPS спросит логин и пароль. Подробнее ниже
Require user @SYSTEM # Определение группы доступа к CUPS
</Location>
# Restrict access to log files...
<Location /admin/log>
#Блок идентичен предыдущему
Order allow,deny # Аналогично предыдущему
Allow from localhost # Необходимо для возможности добавлять принтеры
Allow from linux1 # Аналогично предыдущему
Allow from 10.10.101.71 # Предположим, это IP админа
Allow from 10.20.50.* # Предположим, это подсеть вашего IT отдела
AuthType Default # То есть CUPS спросит логин и пароль. Подробнее ниже
Require user @SYSTEM # Определение группы доступа к CUPS
</Location>
Настройка раздачи и получения широковещательной рассылки сетевых принтеров
Еще у клиетской машины Linux, в данном случае linux1, необходимо отредактировать файл /etc/cups/cups-browsed.conf:
[email protected]:~$ sudo nano /etc/cups/cups-browsed.conf
BrowseRemoteProtocols none # Пишем none чтобы не получить кучу принтеров автоматически.
BrowseLocalProtocols cups # Показывать подключеные принтеры в сеть. DNSSD указывать не надо, его директива в cupsd.conf
BrowseOrder Allow,Deny # Аналогично директиве Order в cupsd.conf - необходимо явно указать, куда МОЖНО посылать информацию о подключенных принтерах
BrowseAllow 10.10.100.50 # IP принтсервера
BrowseAllow cupsserver # Имя хоста принтсервера
BrowseAllow cupsserver.example.com # Полное доменное имя принтсервера
Настройка административного доступа
Еще пару слов по поводу административного доступа, как на WEB-интерфейс CUPS на принтсервере, так и на любой клиентской машине Linux. Даже при условии наличия 30-50 компьютеров нужно унифицировать авторизацию на CUPS, а не держать в голове или еще где пароли каждой машины. И это важно на всех Linux машинах, ведь чтобы добавить принтер на сервер, его сперва нужно установить локально. Я вижу несколько путей.
[email protected]:~$ sudo usermod -a -G lpamin printeradmin
[email protected]:~$ sudo groupadd printersadmins
[email protected]:~$ sudo usermod -a -G printersadmins printeradmin
[email protected]:~$ sudo usermod -a -G printersadmins user
Затем нужно найти в файле /etc/cups/cups-files.conf строку
# Administrator user group, used to match @SYSTEM in cupsd.conf policy rules...
# This cannot contain the Group value for security reasons...
SystemGroup lpadmin
и добавить через пробел одну или несколько групп пользователей с правом администрировать CUPS.
# Administrator user group, used to match @SYSTEM in cupsd.conf policy rules...
# This cannot contain the Group value for security reasons...
SystemGroup lpadmin printersadmins somegroup
И наконец, третий вариант. Сделать администраторами принтсервера и CUPS’ов клиентских машин доменную группу пользователей. Для этого принтсервер и клиентские машины Linux должны быть присоединены к домену AD. Есть несколько методов подключения Linux к домену Windows, но, насколько я знаю, основные это подключение с помощью winbind и с помощью SSSD(realmd). Описание данных методов не входит в статью, поэтому остановлюсь только на моментах которые касаются конкретно CUPS’а.
Настройка использования доменных групп пользователей для администрирования CUPS
Каждый метод присоединения к системе централизованной авторизации в Linux создает специальный файл-“трубу” (pipe), сквозь который приложения могут посмотреть список пользователей домена. Чтобы так мог сделать CUPS, нужно разрешить ему использовать pipe в AppArmor’е для аутентификации пользователей. AppArmor — модуль безопасности Linux по управлению доступом. Ограничивает определенные программы набором перечисленных в его политиках файлов. Чтобы добавить CUPS’у право использовать пользователей и группы домена через winbindd, нужно добавить в файл /etc/apparmod.d/local/usr.sbin.cupsd такую строку:
/var/lib/samba/winbindd_privileged/pipe rw
Если Linux введен в домен через SSSD, то необходимо указать расположение его pipe в /etc/apparmod.d/local/usr.sbin.cupsd, добавив туда строку:
/var/lib/sss/pipes/private/pam rw
К тому же, в случае с SSSD это позволяет пройти аутентификацию (узнать кто заходит), но чтобы пройти авторизацию (узнать есть ли право у пользователя управлять CUPS) необходимо также добавить в файл конфигурации SSSD /etc/sssd/sssd.conf строку:
ad_gpo_map_interactive = +cups
Это, условно выражаюсь, дает CUPS’у право “заглядывать” в SSSD.
К тому же, в силу того, что CUPS теперь зависит от сервиса SSSD, нужно указать CUPS’у что он должен запускаться после SSSD, иначе он будет отваливаться при включении и его будет необходимо каждый раз включать вручную.
[Unit]
Description=CUPS Scheduler
Documentation=man:cupsd(8)
After=sssd.service
Авторизация может быть настроена и иначе, но принцип (pipe-файл) в целом универсален и есть шанс настроить и для LDAP, FreeIPA и прочих служб каталогов по аналогии.
Установка принтера в Linux
Установить принтер на Linux это часто специфическая задача, разная для разных марок и даже моделей. Поэтому не вижу смысла описывать установку принтера и примем за факт, что на хосте linux1 установлен принтер Kyocera-1024FP с именем Kyocera-1024FP, и страница принтера доступна по ссылке http://linux1:631/printers/Kyocera-1024FP
.
Теперь, когда сервер и клиенские машины Linux настроены, к некоторым из них присоединены принтеры, а также есть машины на Windows, которым и с которых нужно печатать, и вся эта система должна быть стабильной и в случае, если на одном из ПК необходимо заменить принтер, то это не должно повлечь за собой перенастройку доброй половины всех ПК, если не всех. К тому же нужно как можно меньше проблем с драйверами. И это вполне возможно.
Группы принтеров (Classes)
Теперь у нас есть группа printer-windows1 с принтером Canon-MF4400 в ней. Страница этой группы доступна так же как и страница принтера Canon-MF4400 с оговоркой на немного другой путь — http://cupsserver:631/classes/printer-windows1
.
Теперь подключим принтер Kyocera-1024FP с хоста linux1 через принтсервер cupsserver к хосту windows1 с системой Windows 8 на борту без какой либо дополнительной(!) установки драйверов. Для этого мы при подключении принтера выбираем “Выбрать общий принтер по имени”. В общем случае мы пишем http://имя_принтcервера:631/classes/название_группы
. В нашем конкретном случае — http://cupsserver:631/classes/printer-linux1
. При запросе на выбор драйвера указываем марку “Generic”, модель — “MS Publisher Imagesetter”. Все подтверждаем далее, и имеем подключенный принтер с название вроде printer-linux1 на http://cupsserver:631
. Если до сих пор никаких ошибок и подводных камней при настойке не возникло, то попытка пробной печати приведет к успешной печати на Kyocera-1024FP.
Теперь подключим принтер Canon-MF4400 с хоста windows1 через принтсервер cupsserver к хосту linux1 с системой Linux на борту без какой либо дополнительной(!) установки драйверов. Для этого мы при подключении принтера действуем аналогично тому, как подключали Kyocera-1024FP к принтсерверу cupsserver. То есть при добавлении принтера на linux1 выбираем метод подключения “Протокол интернет печати (http)”, в качестве расположения принтера (Canon-MF4400) ссылку на его группу на принтсервере — http://cupsserver:631/classes/printer-windows1
. При запросе на выбор драйвера указываем марку “Generic”, модель — “IPP Everywhere”. Называем его как угодно, можно назвать так же как группу — printer-windows1. Теперь принтер доступен на linux1 по ссылке http://linux1:631/printers/printer-windows1
, и мы уже можем отправлять на печать документы.
Главная прелесть данного метода в том, что если на любом из ПК заменяется принтер, заменяется сам компьютер, или то и другое сразу, то это никак не влияет на тех, кто был к ним подключен через группу на принтсервере. Единственная настройка производится на принтсервере — к принтсерверу подключается новый принтер, затем из группы, в которой состоял старый принтер, он удаляется, и добавляется новый принтер на замену старому. И никаких дополнительных настроек на любом количестве ПК, только на принтсервере и собственно ПК на котором меняли принтер. Драйвера “IPP Everywhere” и “MS Publisher Imagesetter” содержат большое количество настроек бумаги, печати и т.д., так что нет проблем настроить нужный вид печати через них.
Заключение
Тема слишком обширна, чтобы изложить сколько-нибудь подробно, и даже так статья вышла крайне объемной. Любые уточнения, указания на ошибки, нераскрытые вопросы и советы, данные в комментариях к данной статье, будут приняты во внимание и в случае необходимости включены в статью.