CUPS - Administration eines LINUX-Clusters
Linux-Klienten mit CUPS sind heute in der Regel so eingerichtet, dass die Benutzer ohne zusätzliche Konfiguration lokal drucken können, sofern CUPS-Drucker im Netz gefunden werden. Soll ein lokales Netz mit speziellen Rechten eingerichtet werden, dann müssen Server und Klienten entsprechend konfiguriert werden. Einige wichtige Grundlagen sollen hier beschrieben werden.
Konfiguration eines CUPS-Servers
- unter CUPS-Server versteht man einen Rechner, der direkt mit einem Drucker kommuniziert (entweder lokal angeschlossen oder über Netz)
- dazu läuft ein Daemon cupsd (i.allg. als root), der Funktionalität eines WEB-Servers hat und an Port 631 lauscht
- Die Konfiguration des CUPS-Servers (Daemon cupsd) erfolgt in /etc/cups/cupsd.conf
ACHTUNG: vor Beginn von Änderungen immer eine Sicherungskopie der zuvor funktionierenden cupsd.conf anfertigen ! - zur Anpassung der Optionen gibt es mehrere Möglichkeiten:
- mit dem KDE-Print-Manager: Einrichtung des CUPS-Servers
KDE-Print nutzt eine eigene cupsd.conf - mit dem WEB-Browser von CUPS: https://localhost:631/admin/ Konfigurationsdatei bearbeiten
ACHTUNG: hier erfolgt im Prinzip einfaches Editieren der cupsd.conf ! Bei Fehlern kann ggf. der cupsd nicht mehr gestartet werden ! - Editieren von /etc/cups/cupsd.conf
- mit dem KDE-Print-Manager: Einrichtung des CUPS-Servers
Servereinstellungen konfigurieren
Aufbau Server-Konfiguration
- Konfigurationsdaten für Server stehen in /etc/cups/cupsd.conf (Beispiel aus SL5)
die Optionen sind im Referenz-Manual zu cupsd.conf beschrieben - besteht aus einzelnen Direktiven im Stile des Apache-WEB-Servers
- jede Direktive beschreibt bestimmte Eigenschaften, von denen einige wichtige im Folgenden diskutiert werden.
Logging
- Größe der Log-Dateien und Menge der Informationen (error_log) ist konfigurierbar
MaxLogSize 2000000000 # Dateien werden bei Erreichen rotiert (5 Zyklen) MaxLogSize 1m # 0 bedeutet kein Rotate LogLevel info # Logging des cupsd
- AccessLog : logged alle HTTP-Reqests
default: /var/log/cups/access_log - ErrorLog : Fehler und Warnungen von cupsd
default: /var/log/cups/error_log
1. Byte der Meldungen gibt LogLevel an:
x Emergency (emerg) A Alert (alert) c kritischer Fehler (crit) E Fehler aufgetreten (error) W Warning - Server konnte eine Aktion nicht ausführen (warn) N Nachricht (notice) I Information (info) D Debug Nachricht (debug) d detaillierte Debug Nachricht (debug2)
- PageLog : seitenweises Jobprotokoll
default: /var/log/cups/page_log
printer user job-id date-time pagenum numcopies billing
Zugriffskontrolle
- Server lauscht am Port 631 - per default nur lokal:
Listen localhost:631
Freischaltung als Server für andere Klienten erfolgt mit:
*Listen *:631 - bevor Freischaltung des Ports erfolgt, sollte genau überlegt werden, welche Hosts oder Nutzer Zugriff haben - Steuerung mit Allow und Auth... in einzelnen Direktiven
- Zugrifssmechanismen:
<Location /ressource> AuthClass admin AuthGroupName admgroup AuthType Basic # oder Digest Order allow,deny Allow localhost Deny 134.109.2.* </Location>
- folgende Ressourcen sind möglich:
/admin # Admin-Interface /classes # alle Drucker-Klassen /classes/name # Name einer Klasse /jobs # alle Jobs /jobs/id # eine spezielle Job-Nr. /printers # alle Drucker-Queues /printers/name # Name einer Queue /printers/name.ppd # zugehörige PPD
- die angeg. Ressourcen sind alle im WEB-Broswer im URL angebbar
Authentisierung für Benutzer
- Benutzerauthentisierung: per Passwort oder Zertifikat (AuthType)
- Basic : mit UNIX-Name und Passwort aus /etc/passwd und PAM
- Basic + Encryption : zur verschlüsselten PW-Übergabe !
# Typ der Authentifizierung festlegen: DefaultAuthType Basic <Location /pinters/pr1> AuthType Basic Encryption Required </Location>
- Digest : CUPS-eigene MD5-sum Passworte (nutzen wir zur CUPS-Admin.)
- Digest-Auth. verlangt anlegen von Nutzern (Gruppen) für CUPS
- Digest-Daten stehen unter /etc/cups/passwd.md5
- Beispiel Gruppenauthentisierung:
# Benutzer der CUPS-Gruppe SYSTEM festlegen # vgl. Direktive Require SystemGroup sys root <Location /pinters/pr1> AuthType Digest AuthClass Group AuthGroupName cupsadm Encryption Required </Location>
Zugriffskontrolle für Hosts
- Host-basiert in Location oder Policy: Allow 134.109.200.*
<Location /pinters/pr1> Deny all Allow 134.109.200.* Allow *.hrz.tu-chemnitz.de </Location>
- letzte Angabe erfordert Einschalten des DNS (Performance !)
HostnameLookups on
Zugriffskontrolle zu Printer-Queues
- neben den bisher beschriebenen Methoden gibt es eine Direktive Policy zur detaillierten Zugriffssteuerung der IPP-Requests
Verteilung von Drucker-Informationen
- mittels Browsing kann Server seine lokalen Drucker im Netz bekannt machen (Broadcast)
- dazu dienen verschiedene Browse* Direktiven:
# Show shared printers on the local network. Browsing On # Browsing/Broadcast einschalten (Empfang) BrowseOrder allow,deny # (Change '@LOCAL' to 'ALL' if using directed # broadcasts from another subnet ??? ) BrowseAllow @LOCAL # Broadcast in lokales Subnetz (Senden)
- bei Einschalten des Browsing sollte immer Zugriffskontrolle zu Druckerqueues geprüft werden !
Verschlüsselung
- Cups unterstützt 128-Bit Verschlüsselung
- CUPS kann auf 2 Arten mit Verschlüsselung arbeiten:
- als verschlüsselter WEB-Server: SSLPort 443
- Verschlüsselung für bestimmte Dienste wie Passwort-Abfragen
vgl. später in <Location> : "Encryption Required"
- /etc/cups/ssl/server.crt enthält ein Standard-Zertifikat
- diese Konfiguration wird i.allg. noch nicht benutzt
Konfiguration verteilter CUPS-Klienten
CUPS-Klient ist jeder Rechner, der Jobs zu anderen Rechnern zum Drucken schickt.Methoden der Konfiguration
- manuelle Konfiguration von Drucker-Queues
- Spezifikation eines einzelnen CUPS-Servers zum Drucken
- automatische Konfig. von Print-Queues
- Spezifikation mehrerer Server zum Drucken
- Relaying - Vermittlung von Serverinformationen
- manuelle Konfiguration
- per Kommando:
lpadmin -p pr1 -E -v ipp://server/printers/pr1 - rel. hoher admin. Aufwand bei großen Netzen
- Single Point of Failure
- per Kommando:
- Spezifikation eines einzelnen Servers
- in /etc/cups/client.conf : ServerName hostname
- es wird kein lokaler cupsd benutzt (auch wenn er läuft nicht !)
- Jobs werden nicht lokal gespoolt, sofort zum Server geschickt
- automatische Konfiguration von Queues
- hierunter versteht man das Browsen und Pollen von Drucker-Informationen
- es gibt 2 Arten:
- passiv: Browsen im gleichen Subnetz (Broadcast):
Server: BrowseAddress 134.109.201.255:631
Klient: Browsing On (ist per default gesetzt) - aktiv: Pollen - Klient fragt explit CUPS-Server ab:
Klient: BrowsePoll server1
- passiv: Browsen im gleichen Subnetz (Broadcast):
- Spezifikation mehrerer Server
- durch Angabe mehrerer BrowsePoll Direktiven
BrowsePoll server1
BrowsePoll server2
- durch Angabe mehrerer BrowsePoll Direktiven
- Relaying
- bei vielen Subnetzen ist Pollen ineffizient
- Relaying heißt die Methode, mit der man einzelne Klienten veranlassen kann, das Pollen für ein Subnetz zu übernehmen und die gepollten Informationen dann im Subnetz zu verteilen (Browsing/Broadcast):
BrowsePoll server
BrowseRelay 127.0.0.1 134.109.x.255
Load Balancing und Failsafe
- basiert auf den Methoden des Polling und Browsing
- relisiert durch Implizite Klassen
- gleiche Drucker auf mehreren Servern vorhanden CUPS-Ann.:
gleicher Name == gleicher Drucker
pr1@server1 == pr1@server2
damit wird automatisch eine implizite Klasse pr1 gebildet - automatische Lastverteilung: ist server1 aktiv, dann sende Job zu server2
- Ausfall von server1 : disable pr1@server1
- wird in diesem Fall die Bildung von impliziten Klassen NICHT gewünscht:
cupsd.conf: ImplicitClass off
- gleiche Drucker auf mehreren Servern vorhanden CUPS-Ann.:
Setzen von Default-Optionen
- Default-Optionen sind an Drucker-Queues gebunden
- es gibt mehrere Möglichkeiten, solche Optionen zu setzen:
- auf Server in printers.conf (per WEB oder lpadmin -o ...)
diese Optionen gelten global für alle Klienten - auf Klienten in printers.conf (wie auf Server)
die Optionen gelten dann nur für Klienten - auf Klienten mit lpoptions als root (/etc/cups/lpoptions)
gilt für alle Nutzer auf Klienten - lpoptions als Benutzer
erzeugt Eintrag in $HOME/.lpoptions
VORSICHT: im URZ KEINEN Default-Drucker eintragen
- auf Server in printers.conf (per WEB oder lpadmin -o ...)
Drucken von externen Klienten
LPD-Klienten
- CUPS unterstützt das Drucken von lpd-Klienten
- wird realisiert per cups-lpd per inetd:
printer stream tcp nowait lp /usr/lib/cups/daemon/cups-lpd cups-lpd - cups-lpd besitzt eingeschränkte Funktionalität:
keine automatische Klienten-Konfig.; keine lpd-Optionen, damit auch keine Verschlüsselung
Windows-Klienten
- es gibt umfangreiche Unterstützung per Samba : smb.conf
cups server = hostname cups options = "raw,secret" printing = cups printcap name = cups printing = sysv print command = lp -d%p -oraw %s; rm -f %s
- Samba unterstützt Bereitstellung von CUPS-Druckertreibern
cupsaddsmb -a # erzeugt Treiber in print$ Share
Vor. ist Einrichten einer print$-Share in smb.conf
[print$] comment = Printer Drivers path = /etc/samba/drivers browseable = yes guest ok = yes read only = yes write list = root
- neuere Windows-Versionen (ab Win98) haben IPP-Protokoll implementiert
- es gibt eigene IPP-Implementation in IIS (Internet Information Service)
- CUPS-Drucker können direkt als Netzdrucker angelegt werden durch Angabe des CUPS-URI :
http://cupsserver:631/printers/pr1 - im gleichen Subnetz wird für einfache SW-Postscript-Drucker von CUPS ein Default-Treiber bereitgestellt (Windows 2000), der auch explizit installiert werden kann
- mit diesem Treiber sind allgemeine PPD's nutzbar:
generische Postscript-PPD
generische PCL6-PPD
Filter-Programme
- Filterprogramme dienen Formatumwandlung und Jobauswertung
- Filter arbeit nach Pipeline-Prinzip (UNIX-like)
- Basis sind mime.types (Typerkennung) und mime.convs (Filterauswahl)
- benutzen CLI - Argumente sind:
printer job user title copies options [filename] - benutzen ggf. Menge von Environment-Variablen, z.B.
CHARSET benutzter Code für Job CONTENT_TYPE Original Dokument Format (application/postscript) DEVICE_URI URI der benutzten Drucker-Queue PPD Dateiname der benutzten PPD PRINTER Name der Drucker-Queue USER Name des Filter-Nutzers ...
- triviales Filter-Programm zur Analyse der Seitenzahl von PS-Dateien
Printer Treiber
- sind spezielle Filterprogramme, die Konvertierung der Daten in druckerspezifisches Format realisieren
- bei NICHT-Postscript-Drucker Wandlung von Raster Image in Printer Image
- bei PS-Druckern z.B. Wandlung PS Level 3 in 2
- Grundlage sind Angaben in PPD des Druckers
in den PPD's stehen umfangreiche Spezifikationen und Optionen (s.o.) - Filter stehen unter /usr/lib/cups/filter
- spezielle Angabe in PPD (CUPS-Erweiterung) kann weitere Filter auswählen:
cupsFilter: "text/* 0 texttohp" cupsFilter: "application/vnd-cups-raster 0 rastertohp"
CUPS Backends
- Spezialfilter die direkt mit physischem Drucker kommunizieren (eigtl. Datenausgabe)
- VORSICHT: laufen i.allg. mit root-Rechten
- Aufruf OHNE Argument: dient sogenanntem "discovery"
Aufruf liefert Funktionalität des Backends
siehe: lpinfo -v - Backends stehen unter /usr/lib/cups/backends
VORSICHT: JEDE DATEI in diesem Verzeichnis wird von Browser angezeit ! - bei fehlerhaftem return (RC=1) stopped Scheduler die Queue
- Beispiel accurz (nicht veröffentlicht)
CUPS Notification
- CUPS bietet Möglichkeiten, in speziellen Situationen Nachrichten per E-Mail an Benutzer zu senden
- für Nutzer z.B. bei Jobende
- für Admin z.B. als Warnung in Fehlerfällen
- hier nicht weiter betrachtet
CUPS-Programmierung
- CUPS liefert 2 Bibliotheken zur Kommunikation mit CUPS:
- libcups zur Kommunikation mit Server
- libcupsimage für RIP-Filter
- Header-Files beschreiben Interface (API)
cups.h common CUPS Definitionen http.h HTTP-Interface image.h RIP Image Infos ipp.h IPP-Interface language.h I18N Internationalisierung md5.h digest Interface - CUPS passwd ppd.h PPD Datei-Interface raster.h RIP Raster Definitions
- Bibl-Rufe der Art:
cupsGetDefault(); liefert Default Drucker cupsGetPrinters(); liefert Liste aller Drucker
- Übersetzung:
gcc -o output -l cups -l nsl -l socket input.c
Übersicht zu Server-Optionen
- die folgenden Optionen werden alle in /etc/cup/cupsd.conf spezifiziert
- Serveroptionen
ServerName cupsserver.hrz.tu-chemnitz.de ServerAdmin cupsadmin@hrz.tu-chemnitz.de DefaultLanguage de Printcap /etc/printcap.cups
- Netzwerkoptionen
HostnameLookups On # DNS (default off) KeepAliveTimeout 60 # Trennen nichtaktiver Verbindungen MaxClients 100 # gleichzeitige CUPS-Klienten MaxRequestSize 0m # max. Job-Size (unbegrenzt) Timeout 300 # Timeout aktiver HTTP-Requests Listen *:631 # öffnen des Netzzugangs (lauschen nach CUPS-Servern) !! Listen *:443 # lauschen am https port
- Sicherheit
RemoteRoot admin # erlaubt unauthenticated root requests SystemGroup sys root ServerCertificate /etc/cups/ssl/server.crt ServerKey /etc/cups/ssl/server.key defaultauthtype Basic
- Zugriff auf spezielle Queues
AuthType Basic # PAM-Auth. aller Nutzer Require user @SYSTEM # Zugang für alle Nutzer in /etc/passwd Encryption Required # Verschlüsselung gefordert Satisfy All # alle Zugriffs-Kriterien sind zu erfüllen Order allow,deny # alles verboten, außer explizit erlaubt Allow 134.109.200.* # erlaubt ist Zugriff von Domaine hrz
- Protokolle
AccessLog /var/log/cups/access_log # http-log ErrorLog /var/log/cups/error_log # cupsd error messages PageLog /var/log/cups/page_log # PS Page Accounting MaxLogSize 9999m # 0 = unbegrenzt LogLevel info # none, error, warn, info, debug, debug2
- Druckaufträge
PreserveJobHistory On # Jobinformationen aufheben PreserveJobFiles Off # Jobdaten aufheben (Speicherplatz !) MaxJobs 0 # Anzahl auf dem Server gespeicherter Jobinformationen MaxJobsPerPrinter 0 # max. Anzahl aktiver Jobs pro Drucker MaxJobsPerUser 0 # max. Anzahl aktiver Jobs pro Nutzer LimitRequestBody 50m # max. Jobgröße
- Filter
User lp # ID unter der cups-Programme laufen (außer cupsd) Group lp1 # GID ... RIPCache 8m # Cache Size für RIP Programme FilterLimit 0 # fiktiver Kostenfaktor für laufende Jobs
- CUPS-Verzeichnisse auf Server
DataDir /usr/share/cups # z.B. Treiber-PPDs (model); Testpage (data) DocumentRoot /usr/share/cups/doc # WEB-Help-Dokumente FontPath /usr/share/cups/fonts # Standard-CUPS-Fonts für PS-Konvertierung RequestRoot /var/spool/cups # Job-Queues ServerBin /usr/lib/cups # Serverprogramme: Filter, Backends, CGI, ... ServerRoot /etc/cups # Konfigurationsverzeichnis (cupsd.conf) TempDir /var/spool/cups/tmp # temp. Verz. für Konvertierungsprogramme
- Browsing (IPP Suchfunktionen)
Browsing On # sucht im Netz nach IPP-Druckern BrowseProtocols CUPS # benutzte Protokolle: CUPS (LDAP, SLP) BrowsePort 631 # Portnr. 631 (443 https) BrowseInterval 30 # max. Zeit zwischen browse updates BrowseTimeout 300 # Zeit zum Löschen nicht antwortender IPP-Drucker BrowseAllow @LOCAL # Netzmaske für Hosts von denen IPP-Drucker erlaubt sind BrowseOrder allow,deny # alle Requests verboten, nur explizit erlaubte o.k. BrowseShortNames Yes # erlaubt kurze IPP-Namen anstelle printer@server1 ImplicitClasses On # Druckerklassen gleichen Typs zulassen (Auswahl erster freier) ImplicitAnyClasses Off # anlegen von ImplicitClasses erlaubt HideImplicitMembers Yes # Drucker in ImplicitClasses sind nicht sichtbar
- Policies - Zugriffskontrolle für IPP Operationen
ist umfangreiches Kapitel detaillierter Zugriffsmechanismen, z.B.
<policy default> <limit Cancel-Job CUPS-Authenticate-Job> require user @OWNER @SYSTEM order deny,allow </limit> </policy>
-- Main.MatthiasEhrig - 18 Apr 2007