Принт-сервер на 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 не буду загострювати багато уваги, тим більше, що статей на цю тему предостатньо. Наведу посилання на досить непогану статтю — 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 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), тобто в веб браузері відкриваємо

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.
Диспетчер сервера → Ad Ds → 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 with the continues
# next entry.
#
# Legal entries are:
#
# compat Use compatibility setup
# nisplus Use NIS+ (NIS version 3)
# nis Use NIS (NIS version 2), also called YP
# Use dns 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
маски: 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 world but not 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


Спасибі за увагу!
Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.