Red Hat Training

A Red Hat training course is available for RHEL 8

10.2. CUPS サーバーでの TLS 暗号化の設定

CUPS は TLS 暗号化接続をサポートしており、デフォルトでは、サービスは認証を必要とするすべてのリクエストに対して暗号化接続を強制します。証明書が設定されていない場合、CUPS は秘密鍵と自己署名証明書を作成します。これで十分なのは、ローカルホスト自体から CUPS にアクセスする場合だけです。ネットワーク経由でセキュアに接続するには、認証局 (CA) によって署名されたサーバー証明書を使用します。

警告

暗号化を使用しなかった場合、または自己署名証明書を使用した場合、中間者 (MITM) 攻撃により、次のような情報が漏洩する可能性があります。

  • Web インターフェイスを使用して CUPS を設定する際の管理者の認証情報
  • ネットワーク経由で印刷ジョブを送信する際の機密データ

前提条件

  • CUPS が設定されている
  • 秘密鍵の作成 が完了していて、その秘密鍵に対するサーバー証明書が CA から発行されている。
  • 中間証明書をサーバー証明書にアタッチしている (サーバー証明書を検証するために中間証明書が必要な場合)。
  • CUPS にはサービスが鍵を読み取るときにパスワードを入力するオプションがないため、秘密鍵はパスワードで保護されません。
  • 証明書の正規名 (CN) またはサブジェクト代替名 (SAN) フィールドが、次のいずれかと一致する。

    • CUPS サーバーの完全修飾ドメイン名 (FQDN)
    • DNS によってサーバーの IP アドレスに解決されるエイリアス
  • 秘密鍵とサーバー証明書ファイルが、Privacy Enhanced Mail (PEM) 形式を使用している。
  • クライアントが CA 証明書を信頼している。

手順

  1. /etc/cups/cups-files.conf ファイルを編集し、次の設定を追加して自己署名証明書の自動作成を無効にします。

    CreateSelfSignedCerts no
  2. 自己署名証明書と秘密鍵を削除します。

    # rm /etc/cups/ssl/<hostname>.crt /etc/cups/ssl/<hostname>.key
  3. オプション: サーバーの FQDN を表示します。

    # hostname -f
    server.example.com
  4. オプション: 証明書の CN フィールドと SAN フィールドを表示します。

    # openssl x509 -text -in /etc/cups/ssl/server.example.com.crt
    Certificate:
      Data:
        ...
        Subject: CN = server.example.com
        ...
        X509v3 extensions:
          ...
          X509v3 Subject Alternative Name:
            DNS:server.example.com
      ...
  5. サーバー証明書の CN または SAN フィールドにサーバーの FQDN とは異なるエイリアスが含まれている場合は、ServerAlias パラメーターを /etc/cups/cupsd.conf ファイルに追加します。

    ServerAlias alternative_name.example.com

    この場合、以降の手順で FQDN の代わりに代替名を使用します。

  6. 秘密鍵とサーバー証明書を /etc/cups/ssl/ ディレクトリーに保存します。次に例を示します。

    # mv /root/server.key /etc/cups/ssl/server.example.com.key
    # mv /root/server.crt /etc/cups/ssl/server.example.com.crt
    重要

    CUPS では、秘密鍵に <fqdn>.key、サーバー証明書ファイルに <fqdn>.crt という名前を付ける必要があります。エイリアスを使用する場合は、ファイルに <alias>.key および <alias>.crt という名前を付ける必要があります。

  7. root ユーザーのみがこのファイルを読み取ることができるように、秘密鍵にセキュアなパーミッションを設定します。

    # chown root:root /etc/cups/ssl/server.example.com.key
    # chmod 600 /etc/cups/ssl/server.example.com.key

    証明書は、セキュアな接続を確立する前のクライアントとサーバー間の通信の要素であるため、どのクライアントも認証なしで証明書を取得できます。したがって、サーバー証明書ファイルに厳密なパーミッションを設定する必要はありません。

  8. SELinux コンテキストを復元します。

    # restorecon -Rv /etc/cups/ssl/
  9. デフォルトでは、CUPS は、Web インターフェイスの /admin ページで管理タスクを実行する場合など、タスクで認証が必要な場合にのみ暗号化接続を強制します。

    CUPS サーバー全体の暗号化を強制するには、/etc/cups/cupsd.conf ファイル内のすべての <Location> ディレクティブに Encryption Required を追加します。次に例を示します。

    <Location />
      ...
      Encryption Required
    </Location>
  10. CUPS を再起動します。

    # systemctl restart cups

検証

  1. ブラウザーを使用して、https://<hostname>:631/admin/ にアクセスします。接続が成功すれば、CUPS で TLS 暗号化が正しく設定されています。
  2. サーバー全体の暗号化を必須とするように設定した場合は、http://<hostname>:631/ にアクセスします。この場合、CUPS は Upgrade Required というエラーを返します。

トラブルシューティング

  • cups サービスの systemd ジャーナルエントリーを表示します。

    # journalctl -u cups

    HTTPS プロトコルを使用した Web インターフェイスへの接続に失敗した後、ジャーナルに Unable to encrypt connection: Error while reading file というエラーが含まれている場合は、秘密鍵とサーバー証明書ファイルの名前を確認します。