CUPS

Einführung

Als zentraler Druckdienst ist CUPS auf dem Caipirinha-Server eingerichtet. Am Server selbst hängen zwei Drucker:

  • EPSON Stylus C84 (Farbdrucker DIN A4)
  • HP DeskJet 9800 (Farbdrucker DIN A3)

Diese Drucker stehen sowohl für lokale Benutzer (auf dem Caipirinha-Server selbst) als auch für entfernte Benutzer zur Verfügung, und zwar sowohl für Benutzer aus dem eigenen Subnetz als auch für Benutzer aus dem Internet. Letzteres erfordert aber, dass am DSL-Router der Port 631 (IPP) auf den Caipirinha-Server durchgeschaltet wird.

Um CUPS benutzen zu können, müssen folgende Pakete installiert werden:

  • cups
  • cups-client
  • cups-drivers
  • cups-libs
  • cups-libs-32bit
  • gutenprint

Konfigurationsdatei

Danach muss die Konfigurationsdatei /etc/cups/cupsd.conf konfiguriert werden, so dass sie so aussieht:

# CUPS-Konfiguration
#
# 31.07.2010, Gabriel Rüeck
#

AutoPurgeJobs Yes
Browsing Off
DefaultAuthType BasicDigest
DefaultCharset utf-8
DefaultEncryption IfRequested
DefaultLanguage de
ErrorPolicy retry-job
JobRetryInterval 300
JobRetryLimit 864
Port 631
Listen /var/run/cups/cups.sock
LogLevel warn
MaxLogSize 10485760
PreserveJobFiles Yes
ServerAdmin administrator@caipirinha.homelinux.org
ServerCertificate /etc/apache2/ssl.crt/server.crt
ServerKey /etc/apache2/ssl.key/server.key
ServerTokens Minimal

# Restrict access to the server...
<Location />
  Allow from all
</Location>

<Location /jobs>
  AuthType BasicDigest
  Require valid-user
  Allow from all
</Location>

<Location /printers>
  Allow from all
</Location>

<Location /printers/EPSON_Stylus_C84>
  Order Deny,Allow
  Deny from  all
  Allow from @LOCAL
  Allow from 88.84.145.229
</Location>

<Location /printers/EPSON_Stylus_C84_extern>
  AuthType BasicDigest
  Require valid-user
  Order Allow,Deny
  Allow from all
  Deny from localhost
  Deny from 88.84.145.229
</Location>

<Location /printers/HP_Deskjet_9800>
  Order Deny,Allow
  Deny from  all
  Allow from @LOCAL
  Allow from 88.84.145.229
</Location>

<Location /printers/HP_Deskjet_9800_extern>
  AuthType BasicDigest
  Require valid-user
  Order Allow,Deny
  Allow from all
  Deny from localhost
  Deny from 88.84.145.229
</Location>

<Location /admin>
  AuthType BasicDigest
  Require user root
  Encryption Required
  Allow from all
</Location>

Einige Einstellungen sollen näher erläutert werden:

  • DefaultAuthType legt den Typ der Authentifizierungsmethode fest. Die sicherste Methode wäre, ausschließlich auf Digest zu setzen, aber damit hatten bei mir verschiedene Drucker-Clients nicht funktioniert. Deswegen habe ich hier BasicDigest eingestellt.
  • DefaultEncryption ist hier auf IfRequested eingestellt. Damit lässt man auch unverschlüsselte Verbindungen zu. Das ist unschön, aber leider unterstützt gerade der CUPS-client noch immer keine verschlüsselten Verbindungen auf entfernte CUPS-Server. Da ich auch Druck-Jobs von entfernten Linux-Maschinen annehme, konnte ich hier nicht die sichere Einstellung Required nehmen.
  • Die Einstellungen für ErrorPolicy, JobRetryInterval und JobRetryLimit legen fest, dass bei Problemen mit dem Drucker alle 300s versucht wird, den Druck-Job erneut zum Drucker zu schicken, und das insgesamt 864-mal, also genau 3 Tage lang.
  • LogLevel ist eine nützliche Option, wenn es beim Einrichten oder im späteren Betrieb zu Problemen kommt. Der hier eingestellte Modus warn hält die Log-Datei auf einer moderaten Größe, bietet aber bereits mehr Information als der Modus error. Die Modi info und debug können bei einer gezielten Fehlersuche nützlich sein, lassen allerdings die Log-Datei auch schnell anwachsen.
  • PreserveJobFiles Yes ermöglicht es, einmal gedruckte Dokumente erneut auf den Drucker zu schicken. So kann man einen Druck-Job nochmals starten, wenn sich beim entfernten Drucken das Papier im Drucker verheddert und der Ausdruck Müll geworden ist. Druckt man aber geheime Dokumente, ist dies allerdings ein Sicherheitsrisiko, und mann sollte diese Option deaktivieren.
  • Als alleiniger Port wird Port 631 benutzt, und zwar sowohl für die verschlüsselte als auch für die nicht verschlüsselte Kommunikation.
  • Als Server-Zertifikat und ServerKey für den SSL-Betrieb verweisen wir auf die jeweiligen Apache-Dateien, damit nicht unnötigerweise mehrere SSL-Zertifikate für verschiedene Applikationen erstellt werden müssen.

Am Ende der Konfigurationsdatei befinden sich dann die Einstellungen, welche spezifisch für einzelne Verzeichnisse und für die installierten Drucker gelten. Es ist auffällig, dass jeder Drucker zweimal aufgelistet ist. Ursprünglich war meine Idee hier einmal, dass Benutzer auf dem Caipirinha-Server die Variante mit lokaler Filterung (also Verarbeitung und Rasterung) benutzen, während alle anderen Benutzer, und zwar sowohl die Benutzer aus dem LAN als auch diejenigen aus dem Internet die Variante ohne lokale Filterung benutzen sollten. Dafür müssen natürlich alle fremde Benutzer den entsprechenden Druckertreiber für die beiden eingesetzten Drucker installiert haben, was dann eben auch zahlreiche Einstellmöglichkeiten beim Ausdruck bietet. Die Varianten ohne Filterung verlangen auch eine Authentifizierung, so dass nicht einfach jeder aus dem Internet einen Druck-Job auf meine Drucker schicken kann. Leider ergaben sich dabei einige Probleme, und zwar:

  • Windows XP konnte über Port 631 auf den Caipirinha-Server drucken und dabei eine gültige Authentifizierung durchführen. Windows Vista und Windows 7 schaffen dies leider nicht mehr. Aus unerfindlichen Gründen hat Microsoft das Protokoll geändert. Deswegen musste ich die Varianten ohne Authentifizierung, und das sind eben die mit lokaler Filterung, für Benutzer im LAN freigeben.

Auf einer meiner Maschinen ([rueeck.name]) ist lediglich ein CUPS-Client installiert, der keine lokale Filterung vornehmen kann. Deswegen muss diese Maschine auf die Varianten mit der lokalen Filterung zugreifen.

Diese komplexen Regeln werden nun von den Allow– und Deny-Einträgen in den verschiedenen Varienten umgesetzt. Dabei kommt auch die statische IP-Adresse von [rueeck.name], 88.84.145.229, zum Tragen.

Bei den Verzeichnis-spezifischen Einstellungen ist noch zu beachten:

Drucker-Definitionen

Mit CUPS eingerichtete Drucker finden sich in der Datei /etc/cups/printers.conf wieder, so wie hier:

# Printer configuration file for CUPS v1.3.11
# Written by cupsd on 2010-07-28 09:37
<DefaultPrinter EPSON_Stylus_C84>
Info Farbdrucker DIN A4
Location Ostpreußendamm 18 b, 12207 Berlin
DeviceURI usb://EPSON/Stylus%20C84
State Idle
StateTime 1280302648
Accepting Yes
Shared Yes
JobSheets none none
QuotaPeriod 0
PageLimit 0
KLimit 0
OpPolicy default
ErrorPolicy retry-job
</Printer>
<Printer EPSON_Stylus_C84_extern>
Info Farbdrucker DIN A4 (ohne Filterung)
Location Ostpreußendamm 18b, 12207 Berlin
DeviceURI usb://EPSON/Stylus%20C84
State Idle
StateTime 1280302648
Accepting Yes
Shared Yes
JobSheets none none
QuotaPeriod 0
PageLimit 0
KLimit 0
OpPolicy default
ErrorPolicy retry-job
</Printer>
<Printer HP_Deskjet_9800>
Info Farbdrucker DIN A3
Location Ostpreußendamm 18b, 12207 Berlin
DeviceURI usb://HP/Deskjet%209800?serial=MY593110Y9046K
State Idle
StateTime 1279120090
Accepting Yes
Shared Yes
JobSheets none none
QuotaPeriod 0
PageLimit 0
KLimit 0
OpPolicy default
ErrorPolicy retry-job
</Printer>
<Printer HP_Deskjet_9800_extern>
Info Farbdrucker DIN A3 (ohne Filterung)
Location Ostpreußendamm 18b, 12207 Berlin
DeviceURI usb://HP/Deskjet%209800?serial=MY593110Y9046K
State Idle
StateTime 1280005739
Accepting Yes
Shared Yes
JobSheets none none
QuotaPeriod 0
PageLimit 0
KLimit 0
OpPolicy default
ErrorPolicy retry-job
</Printer>

Wichtig ist, dass bei ErrorPolicy der Wert retry-job eingetragen wird. Ansonsten wird die jeweilige Drucker-Warteschlange deaktiviert, wenn ein Benutzer einen Druckauftrag schickt und der Drucker ausgeschaltet ist. Mit dem Wert retry-job versucht CUPS aber periodisch immer wieder einen Ausdruck und der Druckauftrag bleibt so lange in der Drucker-Warteschlange, bis der Drucker eingeschaltet wird und der Ausdruck komplett durchgelaufen ist oder bis die Anzahl der in /etc/cups/cupsd.conf festgelegten Versuche erreicht worden ist.

Ausdrucke aus der Shell und aus Skripten

Damit auch Ausdrucke aus einer Shell heraus gelingen, ist es noch notwendig, in /etc/cups/lpoptions einige Einstellungen zu definieren. Die für den Caipirinha-Server gültige Datei sieht so aus:

Default EPSON_Stylus_C84 cpi=12 lpi=6 page-border=none page-bottom=30 page-left=60 page-right=25 page-top=25
Dest HP_Deskjet_9800 media=A3 cpi=16 lpi=8 pageSize=A3 page-border=none page-bottom=40 page-left=40 page-right=40 page-top=40

Darin befinden sich für beide Drucker Einstellungen bezüglich der:

  • Druckdichte (cpi)
  • Zeilendichte (lpi)
  • Seitengröße (media)
  • Seitenränder (page-bottom, page-left, page-right, page-top)
  • Umrandung (page-border)

Man kann dazu entweder nach dem Einrichten der Drucker die Datei /etc/cups/lpoptions mit einem Texteditor bearbeiten oder die jeweiligen Optionen mit dem Befehl lpoptions eintragen lassen (siehe man lpoptions). Die entsprechenden Werte für die Seitenränder muss man allerdings durch Herumexperimentieren heraus finden, was durchaus einige Ausdrucke kosten kann.

Administrator

Schließlich muss man noch Benutzer anlegen, welche Zugriffsrechte für die eingeschränkten CUPS-Verzeichnisse haben. Dies macht man mit dem Befehl:

lppasswd -a Benutzername

Die damit angelegten Benutzer und ihre Passworte befinden sich in der Datei /etc/cups/passwd.md5 mit den Zugriffsrechten:

-rw------- 1 lp   lp     85 Nov  7  2008 passwd.md5

In dieser Datei finden sich beim Caipirinha-Server der Benutzer Gabriel und der Benutzer root, wobei beide Benutzer nicht mit Systembenutzern verwechselt werden dürfen. Den Benutzer Gabriel und sein Passwort habe ich an alle Maschinen und Benutzer verteilt, die auch auf dem Caipirinha-Server drucken können sollen. Der Benutzer root und sein Passwort wird ausschließlich für die Administration des CUPS-Dienstes benutzt, könnte aber auch zum Zugriff auf die Drucker benutzt werden.

Ausdruck im RAW-Modus

Um im RAW-Modus (ungefiltert) auf die sonst der Filterung unterliegenden Varianten EPSON_Stylus_C84 und HP_Deskjet_9800 ausdrucken zu können, müssen noch Anpassungen in den Dateien /etc/cups/mime.types und /etc/cups/mime.convs vorgenommen werden. In der Datei /etc/cups/mime.types muss im Abschnitt Raw print file support… in der Zeile

#application/octet-stream

das Kommentarzeichen # entfernt werden. In der Datei /etc/cups/mime.convs muss im Abschnitt Raw filter… in der Zeile

#application/octet-stream application/vnd.cups-raw 0 -

das Kommentarzeichen # entfernt werden.

Nun startet man CUPS mit /etc/init.d/cups start und kontrolliert gleich die beiden Log-Dateien:

  • /var/log/cups/error_log
  • /var/log/cups/access_log

Im Regelfall sollte jetzt alles funktionieren.

Weitere Konfigurationen

Konfiguration auf caipiroska.homelinux.org

Der Caipiroska-Server ist ein Linux-Server, der fast identisch zum Caipirinha-Server konfiguriert ist. Er ist allerdings bei einem Freund untergebracht. Deswegen sind dort ein lokal vorhandener HP-Drucker (HP_Deskjet_6800) und die beiden bei mir zu Hause stehenden Drucker-Varianten EPSON_Stylus_C84_extern und HP_Deskjet_9800_extern eingerichtet. Der CUPS-Dienst dort ist nicht vom Internet aus zu erreichen; deshalb kann die Konfiguration etwas offener als beim Caipirinha-Server sein. Sie ist aber im Wesentlichen ähnlich aufgebaut, und das oben Beschriebene gilt auch hier für /etc/cups/cupsd.conf:

# CUPS-Konfiguration
#
# 31.07.2010, Gabriel Rüeck
#

AutoPurgeJobs Yes
Browsing Off
DefaultAuthType BasicDigest
DefaultCharset utf-8
DefaultEncryption IfRequested
DefaultLanguage de
ErrorPolicy retry-job
JobRetryInterval 300
JobRetryLimit 864
Port 631
Listen /var/run/cups/cups.sock
LogLevel warn
MaxLogSize 10485760
PreserveJobFiles Yes
ServerAdmin administrator@caipiroska.homelinux.org
ServerCertificate /etc/apache2/ssl.crt/server.crt
ServerKey /etc/apache2/ssl.key/server.key
ServerTokens Minimal

# Restrict access to the server...
<Location />
  Allow from all
</Location>

<Location /jobs>
  AuthType BasicDigest
  Require valid-user
  Allow from all
</Location>

<Location /printers>
  Allow from all
</Location>

<Location /admin>
  AuthType BasicDigest
  Require user root#  Encryption Required
  Allow from all
</Location>

In der Datei /etc/cups/printers.conf sind dann alle 3 Drucker aufgelistet:

# Printer configuration file for CUPS v1.3.11
# Written by cupsd on 2010-08-01 12:40
<DefaultPrinter HP_Deskjet_6800>
Info LAN-Drucker
Location geheime_Location
DeviceURI socket://192.168.2.10:9100
State Idle
StateTime 1280581453
Accepting Yes
Shared Yes
JobSheets none none
QuotaPeriod 0
PageLimit 0
KLimit 0
OpPolicy default
ErrorPolicy retry-job
</Printer>
<Printer EPSON_Stylus_C84>
Info Farbdrucker DIN A4
Location Ostpreussendamm 18b, 12207 Berlin
DeviceURI ipp://Gabriel:geheimes_Passwort@caipirinha.homelinux.org:631/printers/EPSON_Stylus_C84_extern
State Idle
StateTime 1280659172
Accepting Yes
Shared Yes
JobSheets none none
QuotaPeriod 0
PageLimit 0
KLimit 0
OpPolicy default
ErrorPolicy retry-job
</Printer>
<Printer HP_Deskjet_9800>
Info Farbdrucker DIN A3
Location Ostpreussendamm 18b, 12207 Berlin
DeviceURI ipp://Gabriel:geheimes_Passwort@caipirinha.homelinux.org:631/printers/HP_Deskjet_9800_extern
State Idle
StateTime 1280581991
Accepting Yes
Shared Yes
JobSheets none none
QuotaPeriod 0
PageLimit 0
KLimit 0
OpPolicy default
ErrorPolicy retry-job
</Printer>

Hier gibt es nun die Besonderheit, dass bei den DeviceURIs der entfernten Drucker der für die Authentifizierung erforderliche Benutzername und das dazu gehörende Passwort im Klarnamen angegeben sind. Dabei muss natürlich geheimes_Passwort durch das tatsächliche Passwort ersetzt werden. Die Angabe im Klartext zeigt einmal mehr, dass man aus Sicherheitsgründen keinesfalls die Passwörter der System-Logins benutzen sollte.

Gleichermaßen ist geheime_Location bei der Druckerdefinition des HP_Deskjet_6800 natürlich durch den tatsächlichen bei der Druckerdefinition angegebenen Ort zu ersetzen.

Konfiguration auf rueeck.name

Auf der Maschine rueeck.name (statische IP-Adresse: 88.84.145.229) ist kein CUPS-Server installiert, sondern nur die für den Client-Betrieb erforderlichen Pakete:

  • cups-client
  • cups-libs
  • cups-libs-32bit

Deswegen gibt es auch keine Konfigurationsdatei für den CUPS-Server, sondern nur eine für den CUPS-Client, nämlich /etc/cups/client.conf. In dieser Datei sind lediglich zwei wichtige Einträge enthalten:

...
ServerName caipirinha.homelinux.org

Mit dem Parameter ServerName wird die Maschine caipirinha.homelinux.org als alleiniges Ziel sämtlicher Druckaufträge festgelegt. Mit dem Kommando lpstat -a kann man sich nun die Stati aller verfügbaren Drucker anschauen. Hier sieht man dann folgende Liste:

EPSON_Stylus_C84 accepting requests since Wed Jul 28 09:37:28 2010
EPSON_Stylus_C84_extern accepting requests since Wed Jul 28 09:37:28 2010
HP_Deskjet_9800 accepting requests since Wed Jul 14 17:08:10 2010
HP_Deskjet_9800_extern accepting requests since Sat Jul 24 23:08:59 2010

Die 4 aufgelisteten Drucker täuschen allerdings darüber hinweg, dass man von der Maschine rueeck.name tatsächlich nur auf zwei Drucker, nämlich auf EPSON_Stylus_C84 und HP_Deskjet_9800, zugreifen kann. So wurden nämlich die Zugriffsrechte für die IP-Adresse 88.84.145.229 in /etc/cups/cupsd.conf auf dem Caipirinha-Server festgelegt. Dies macht auch Sinn, denn wir müssen die Filterung ja auf dem Caipirinha-Server durchführen. Mit der auf dem Caipirinha-Server eingesetzten Konfiguration bedeutet dies aber auch, dass der Druck-Job von rueeck.name ohne Autentifizierung und ohne Verschlüsselung durchs Internet geschickt wird. Ausdrucken sollte man daher nur solche Dokument, die unverfänglich sind und keine Passwörter enthalten.

Weiterführende Dokumentation zu diesem Thema findet sich auf [1] und auf [2].

Posted on: 2010-08-10Gabriel Rüeck