RHEL 8 以降でのスマートカードのサポート
弊社では、一般的なスマートカードの一般的なタイプを Red Hat Enterprise Linux でサポートするように努めています。しかし、すべての IC カードに対応することは不可能であるため、本書では弊社が対象とする IC カードについて規定します。また、RHEL がカードと互換性がないどうかの調査方法に関する情報についても説明します。
RHEL 7 のスマートカード対応について検索する場合は、 RHEL 7.4 以降におけるスマートカードサポート に関する記事を参照してください。
スマートカードは通常、複数のレイヤーと複数のコンポーネントで処理されるので、簡単な背景を説明し、以下の点に関するコンテキストを提供します。
下層では、OS が PC/SC プロトコルを用いてスマートカードリーダーと通信を行い、この通信は pcsc-lite デーモン により実行されます。デーモンは受け取ったコマンドを、通常 USB 経由でカードリーダーに転送して、下層の CCID ドライバーが これを処理します。
PC/SC の下層での通信は、アプリケーションレベルではほとんど見られません。RHEL では、アプリケーションは主に、OASIS PKCS #11 API というカード通信を暗号オブジェクト (秘密鍵など) を操作する特定のコマンドに抽象化した上位の API を経由して、スマートカードにアクセスします。スマートカードのベンダーは通常、PKCS #11 API に準拠した共有モジュール (.so ファイル) を提供し、カード用のドライバーとして機能させます。その共有モジュールをアプリケーションからインポートし、カードと直接通信するために使用できます。オープンソースの世界では、複数の IC カードドライバーを 1 つの共有モジュールにまとめた OpenSC のようなプロジェクトがあります。たとえば、RHEL8.0 に搭載されている OpenSC モジュールでは、Yubikey、Nitrokey、米国政府の PIV カードや CAC カードなど、さまざまなカードを 1 つのモジュールでサポートしています。スマートカードベンダーの方には、OpenSC ライブラリーを使用したカードへの対応を強くお勧めします。
サポート対象のカード
Red Hat Enterprise Linux 8 以降では、以下のカードがサポートされています。
- Red Hat Certificate System (RHCS) が対象とするすべてのカード (すなわち CAC、PIV、CoolKey アプレットを持つカード)。
- PKCS#15 のカードの一部。このファミリーのカードは複数サポートされていますが、これらのカードにはさまざまな設定やオプションがあるため、RHEL と互換性のない特殊なカードについては、お客様の担当者にお問い合わせください。
- その他のカードは、Red Hat の判断でサポートされる場合があります。
サポート対象のカードリーダー
Red Hat Enterprise Linux では、スマートカードリーダーのハードウェアサポートに関して、pcsc-lite upstream project に準拠します。ほとんどの CCID 対応リーダーで問題なく使用できます。Red Hat は定期的にアップストリームプロジェクトをもとに Red Hat の pcsc-lite-ccid
ドライバーの USB 識別子を更新します。 さらに、Red Hat の判断により、追加のリーダーもサポートされる可能性があります。以下のスマートカードリーダーのリストは、Red Hat によってテストされ、検証されています。
- SCR331/SCR3310
- Omnikey 3121 (SC650 カードのパーツ番号 R31210399 でなければなりません)
こちらが アップストリームのプロジェクトでサポートされているハードウェアの一覧 です。
利用可能な PKCS#11 ドライバー
RHEL8 以降では、スマートカードには OpenSC PKCS#11 モジュールを介してアクセスします。 OpenSC の アップストリームドキュメント でサポートされているカードで、上記のサポート対象一覧のカテゴリーに分類されない場合には、Red Hat は、商業的に合理的な方法で継続的にサポートを提供する 点にご注意ください。
OpenSC での新規カードの有効化
Red Hat は、以下の条件で新しいカードを有効にすることができます。
- 新しいカードは、弊社のサポートポリシー に記載されているフルサポートフェーズでのみ有効化できます。
- サンプルハードウェアを Red Hat に提供する 必要 があります。Red Hat エンジニアリングがハードウェアを有効にするためのサンプルと、Red Hat Quality Engineering が使用するサンプルを 1 つずつ提供してください。これはハード要件であり、提出されたサンプルは顧客が使用するカードと同一でなければなりません。一般に入手できない特別なツールでカードをプロビジョニングする必要がある場合には、指定のカードをプロビジョニングする必要があります。
- カードは、上記のサポートに準拠する必要があります。つまり、CAC、PIV、CoolKey アプレット付きカードまたは PKCS#15 カードを指します。
PKCS #11 URI
PKCS#11 URI スキームは、システム内でスマートカード、トークン、およびシステム上のオブジェクトを一貫して識別するために使用されます。RHEL 8 以降のほとんどのツールで使用されており、スマートカード用のアプリケーションの設定を簡素化できます。サポート対象のアプリケーションや URI の使用方法については、別の ブログ記事 で紹介しています。
登録されたモジュールやオブジェクトの一覧表示
システム全体に登録されている PKCS#11 モジュールの一覧を表示するには、次のコマンドを使用します。
$ p11-kit list-modules
スマートカードを使用するアプリケーションを扱う場合には通常、トークンおよび、トークンに格納されているオブジェクトの URI を把握しておくことは有用です。
登録されている PKCS#11 モジュールの識別 URI は、以下のコマンドで確認できます (これは、gnutls-utils
コンポーネントの p11tool を使用します)。
$ p11tool --list-tokens
登録されたモジュールの全証明書を一覧表示するには、次のコマンドを使用します。
$ p11tool --list-all-certs [URI]
RHEL 7 からの移行
RHEL 7 には CoolKey スマートカードドライバーが同梱されていましたが、RHEL 8 以降では非推奨となり、提供されなくなりました。現在のドライバー OpenSC は、これまで CoolKey で対応していたすべてのカードに対応しています。詳しくは、RHEL 7.4 以降におけるスマートカードサポート の記事を参照してください。
GNOME でのログイン
RHEL7 の Gnome では、NSS を介したスマートカードへのアクセスには pam_pkcs11
に依存していました。RHEL8 以降では、デスクトップログインは System Security Services Daemon (SSSD) で管理されています。IdM にスマートカードでログインできるようにするための設定方法は、RHEL 8 の製品ドキュメント「アイデンティティー管理の設定」に記載されています。
IdM に登録されていないシステムでローカルユーザーを設定するには、いくつかの手順を踏む必要があります。
authselect
(RHEL8+ では後継のauthconfig に
) を使ってシステムを設定します。以下に例を示します。
authselect select sssd with-smartcard --force
- スマートカードの CA ファイルを
/etc/sssd/pki/sssd_auth_ca_db.pem
に格納します。 sssd.conf
のpam
セクションでpam_cert_auth = True
を有効にします。- たとえば、
sssd.conf
で証明書マッピングを作成します (testuser
はユーザー名と適切な証明書マッピングに置き換えてください)。
[domain/shadowutils]
id_provider = files
[certmap/shadowutils/testuser]
matchrule = <SUBJECT>.*CN=testuser.*
- 再起動します。
SSH ログイン
RHEL8 以降の OpenSSH は、RHEL8 の Consistent PKCS #11 サポート の一部として PKCS #11 URI をサポートしています。従来、設定には PKCS#11 共有オブジェクトへのフルパスが必要でした。これは必要なくなり、スマートカードの秘密鍵を ssh で使用する例として、pkcs11:
uri スキームを使用することが最小限必要です。
$ ssh -i pkcs11: example.com
Firefox ブラウザーまたは Thunderbird でスマートカードが利用可能に
RHEL7 では、PKCS #11 モジュールを GUI から手動で Firefox NSS DB に追加する必要がありました。RHEL 8 以降では,p11-kit に登録されているすべての PKCS #11 モジュールを自動的にロードします (次章参照)。
サードパーティー製 PKCS#11 モジュールの p11-kit への登録
RHEL 8 以降では、暗号ハードウェアへのアクセスを統一するために、PKCS #11 モジュールのシステム全体のレジストリーを使用しています。デフォルトでは、OpenSC PKCS #11 モジュールのみが登録されています。お使いのスマートカードが OpenSC に対応しておらず、別の PKCS#11 モジュールをお持ちの場合は、/usr/share/p11-kit/modules/
に以下の構文でファイルを新規作成するだけです。
module: /path/to/example-pkcs11.so
/path/to/example-pkcs11.so
のパスは、PKCS #11 モジュールの共有オブジェクトの場所に変更します。これにより、ほとんどのシステムアプリケーションがスマートカードで動作するようになります。
スマートカードに関する問題のデバッグ
スマートカードは何重もの抽象化を経ているため、まずは問題の原因を特定する必要があります。
- USB:
- USB 層でトークン/リーダーは検出されていますか?
lsusb -v
- USB 層でトークン/リーダーは検出されていますか?
- PC/SC:
pcsc-lite、pcsc-lite-ccid、pcsc-tools
パッケージ- リーダーはサポート対象ですか?
- PC/SC 層でカードが検出されますか?
pcsc_scan
- PC/SC レベルのトレース (APDU メッセージの交換) を生成します。
sudo systemctl stop pcscd; sudo LIBCCID_ifdLogLevel=0x000F pcscd --foreground --debug --apdu --color | tee log.txt
- PKCS#11:
opensc
パッケージ- PKCS #11 層でカードが検出されますか?
pkcs11-tool -L
- カード内のオブジェクトをリストアップできますか?
pkcs11-tool -O
- カードにログインできますか?
pkcs11-tool --login -O
- 下層の PKCS #11 テストを実行します。
pkcs11-tool --test --login
- OpenSC のデバッグログを生成します。
OPENSC_DEBUG=9 pkcs11-tool --test --login
- PKCS #11 層でカードが検出されますか?
- アプリケーション:
sssd
sssd.conf
でdebug_level = 9
を使用し、sssd
デーモンを再起動して/var/log/sssd/
にあるログを調査します。
Q&A
OpenSC で PIV カードを使用しているが署名ごとに PIN が要求される。(RHEL7 では CoolKey で発生していなかった)
すべての PIV デジタル署名鍵運用において信頼できるセキュリティーレベルを確保するため、以下の NIST 文書 に記述されているように、明示的なユーザーのアクションが必要です。この要件は、OpenSC の /etc/opensc-*.conf
で pin_cache_ignore_user_consent
を設定して、これらの操作に対する PIN キャッシュを有効にすることで弱めることが可能です。
1 種類のカードしか使っていないにも拘らず、検出に時間がかかりすぎる。
OpenSC はほとんどのカードのサポートを実装していますが、1 つか 2 つしか使わないことが分かっている場合は、ランタイムを /etc/opensc.conf
で設定できます (x86_64
アーキテクチャーの場合)。app default の
項目で、card_drivers
オプションを使用し、対象のドライバーを設定します。opensc-tool --list-drivers
を使用すると、サポート対象の全ドライバーを一覧表示することができます。たとえば、CAC と PIV ドライバーのみを許可する場合は、以下のように設定します。
card_drivers = cac, PIV-II;
当社の PIV カードには多くの証明書があり、その検出には非常に時間がかかります。
PIV ドライバーのみを選択してもカード検出が遅い場合は、/etc/opensc-*.conf
の framework pkcs15
セクションに以下のスニペットを追加して、証明書データのファイルキャッシュを有効にすることが可能です。
use_file_caching = true;
file_cache_dir = /var/cache/mfa/;
なお、ユースケースにより異なりますが、スマートカード、一般的には pkcs 11 モジュール (Firefox、openssh など) を使用する sssd
の特権プロセスまたは他のアプリケーションなどを使用してアプリケーションから file_cache_dir
にアクセスできる必要があります。悪意のあるユーザーによるこのキャッシュの改ざんを回避するには、このディレクトリーを、グローバルで書き込み可能に設定しないようにしてください。
今回は PIV カードでテストしましたが、他の種類のカードでも性能向上が期待できます。
これは RHEL 8.4 以降のデフォルトであることに注意してください (rhbz#1892810)。
スマートカードリーダーにピンパッドがあるのでこの機能を使ってセキュリティーを向上させたい
OpenSC はピンパッドリーダーの使用をサポートしていますが、一部のリーダーは CCID の仕様に準拠していないため、この機能はデフォルトでオフになっています。/etc/opensc.conf
の app default
と reader_driver pcsc
セクションで enable_pinpad = true
オプションを設定すると、リーダーでピンパッドを有効にできます。ピンパッドが固定長のピンを必要とする場合には、fixed_pinlength
オプションで微調整することが可能です。
Comments